初始提交
This commit is contained in:
		
							
								
								
									
										473
									
								
								driver/extern/ext-io/src/iot_gpio_ex_tpt29555.c
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										473
									
								
								driver/extern/ext-io/src/iot_gpio_ex_tpt29555.c
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,473 @@
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright(c) 2019 by Aerospace C.Power (Chongqing) Microelectronics. ALL RIGHTS RESERVED.
 | 
			
		||||
 *
 | 
			
		||||
 * This Information is proprietary to Aerospace C.Power (Chongqing) Microelectronics and MAY NOT
 | 
			
		||||
 * be copied by any method or incorporated into another program without
 | 
			
		||||
 * the express written consent of Aerospace C.Power. This Information or any portion
 | 
			
		||||
 * thereof remains the property of Aerospace C.Power. The Information contained herein
 | 
			
		||||
 * is believed to be accurate and Aerospace C.Power assumes no responsibility or
 | 
			
		||||
 * liability for its use in any way and conveys no license or title under
 | 
			
		||||
 * any patent or copyright and makes no representation or warranty that this
 | 
			
		||||
 * Information is free from patent or copyright infringement.
 | 
			
		||||
 *
 | 
			
		||||
 * ****************************************************************************/
 | 
			
		||||
#include "os_types.h"
 | 
			
		||||
#include "iot_errno.h"
 | 
			
		||||
 | 
			
		||||
#include "iot_i2c_api.h"
 | 
			
		||||
#include "iot_gpio_api.h"
 | 
			
		||||
#include "gpio.h"
 | 
			
		||||
#include "gpio_mtx.h"
 | 
			
		||||
#include "i2c_hw.h"
 | 
			
		||||
#include "os_utils.h"
 | 
			
		||||
#include "iot_io_api.h"
 | 
			
		||||
#include "iot_board_api.h"
 | 
			
		||||
#include "os_lock.h"
 | 
			
		||||
#include "iot_gpio_ex.h"
 | 
			
		||||
 | 
			
		||||
/* The iic config of tpt29555. */
 | 
			
		||||
#define TPT29555_IIC_PHY_ADDR            (0x24)
 | 
			
		||||
#define TPT29555_INIT_COMPLETED          (1)
 | 
			
		||||
#define TPT29555_INIT_UNCOMPLETED        (0)
 | 
			
		||||
#define TPT29555_IIC_DEF_PORT            (0)    /* Port#0. */
 | 
			
		||||
#define TPT29555_IIC_DEF_SPEED           (100)  /* 100K. */
 | 
			
		||||
#define TPT29555_IIC_DEF_NACK_NUM        (1)    /* N-ACK number. */
 | 
			
		||||
 | 
			
		||||
/* TPT29555 reg op cmd. */
 | 
			
		||||
#define  TPT29555_INPUT_PORT_REGA        (0x00) //read data from gpio.
 | 
			
		||||
#define  TPT29555_INPUT_PORT_REGB        (0x01)
 | 
			
		||||
#define  TPT29555_OUTPUT_PORT_REGA       (0x02) //output data to gpio.
 | 
			
		||||
#define  TPT29555_OUTPUT_PORT_REGB       (0x03)
 | 
			
		||||
#define  TPT29555_INVER_PORT_REGA        (0x04) //polarity inversion to gpio.
 | 
			
		||||
#define  TPT29555_INVER_PORT_REGB        (0x05)
 | 
			
		||||
#define  TPT29555_CONFIG_PORT_REGA       (0x06) //set the directions of gpio.
 | 
			
		||||
#define  TPT29555_CONFIG_PORT_REGB       (0x07)
 | 
			
		||||
 | 
			
		||||
#define  TPT29555_REGISTER_RESPONSE_TM   (10) // tpt29555 response time: ms
 | 
			
		||||
 | 
			
		||||
/* each port has 8 gpios, gpio7 ~ gpio0. */
 | 
			
		||||
#define GPIO_EX_PORT_NUMBER              (8)
 | 
			
		||||
#define TPT29555_GPIO_EX_PORTA           (0x00)
 | 
			
		||||
#define TPT29555_GPIO_EX_PORTB           (0x01)
 | 
			
		||||
#define GPIO_EX_GET_GPIO(gpio)           ((gpio) % GPIO_EX_PORT_NUMBER)
 | 
			
		||||
#define GPIO_EX_GET_PORT(gpio)           ((gpio) / GPIO_EX_PORT_NUMBER)
 | 
			
		||||
#define GPIO_EX_VALID(gpio)              (((gpio) >= 0) && \
 | 
			
		||||
    ((gpio) < GPIO_EX_PORT_NUMBER))
 | 
			
		||||
#define GPIO_PORT_VALID(port)            ((port) == TPT29555_GPIO_EX_PORTA || \
 | 
			
		||||
    (port) == TPT29555_GPIO_EX_PORTB)
 | 
			
		||||
 | 
			
		||||
typedef struct _tpt29555_iic_cfg {
 | 
			
		||||
    uint8_t inited;             /* IIC initialization done. 0-not yet, 1-done.*/
 | 
			
		||||
    uint8_t port;               /* IIC port number. */
 | 
			
		||||
    uint32_t baud;              /* IIC baudrate, unit is Kb. */
 | 
			
		||||
    uint8_t nack_wait_num;      /* wait nack number. */
 | 
			
		||||
    uint16_t gpio_scl;          /* SCL gpio pin. */
 | 
			
		||||
    uint16_t gpio_sda;          /* SDA gpio pin. */
 | 
			
		||||
} tpt29555_iic_cfg_t;
 | 
			
		||||
 | 
			
		||||
static tpt29555_iic_cfg_t tpt29555_iic_cfg =
 | 
			
		||||
{
 | 
			
		||||
    TPT29555_INIT_UNCOMPLETED,           /* IIC initialization uncompleted. */
 | 
			
		||||
    TPT29555_IIC_DEF_PORT,               /* IIC device port number. */
 | 
			
		||||
    TPT29555_IIC_DEF_SPEED,              /* Baudrate, unit is Kb. */
 | 
			
		||||
    TPT29555_IIC_DEF_NACK_NUM,           /* Wait nack number. */
 | 
			
		||||
    0,                                   /* SCL gpio pin. */
 | 
			
		||||
    0                                    /* SDA gpio pin. */
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static os_mutex_h gpio_ext_mutex = NULL;
 | 
			
		||||
static uint32_t register_opt_tm = 0; /* operate register timestamp: 1ms */
 | 
			
		||||
 | 
			
		||||
static uint8_t tpt29555_i2c_write_reg(uint8_t reg_addr, uint8_t val)
 | 
			
		||||
{
 | 
			
		||||
    uint8_t ret = ERR_FAIL;
 | 
			
		||||
    char buf[2] = {0};
 | 
			
		||||
    uint32_t cur_opt_tm = os_boot_time32();
 | 
			
		||||
    uint32_t delay_tm;
 | 
			
		||||
    buf[0] = reg_addr;
 | 
			
		||||
    buf[1] = val;
 | 
			
		||||
 | 
			
		||||
    gpio_debug_printf("[%s][info] arg1:%d, arg2:%d\n", __FUNCTION__, reg_addr,
 | 
			
		||||
        val);
 | 
			
		||||
 | 
			
		||||
    delay_tm = (uint32_t)(cur_opt_tm - register_opt_tm);
 | 
			
		||||
    if (delay_tm < TPT29555_REGISTER_RESPONSE_TM) {
 | 
			
		||||
        os_delay(TPT29555_REGISTER_RESPONSE_TM - delay_tm);
 | 
			
		||||
    }
 | 
			
		||||
    ret = iot_i2c_write(tpt29555_iic_cfg.port, TPT29555_IIC_PHY_ADDR, buf, 2);
 | 
			
		||||
 | 
			
		||||
    if (ret != ERR_OK) {
 | 
			
		||||
        iot_printf("[%s][err] i2c write data  error\n", __FUNCTION__);
 | 
			
		||||
        goto out;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
out:
 | 
			
		||||
    register_opt_tm = os_boot_time32();
 | 
			
		||||
    return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static uint8_t tpt29555_i2c_read_reg(uint8_t reg_addr, uint8_t *data,
 | 
			
		||||
    uint8_t len)
 | 
			
		||||
{
 | 
			
		||||
    uint8_t ret = ERR_FAIL;
 | 
			
		||||
    char buf[2] = {0};
 | 
			
		||||
    buf[0] = reg_addr;
 | 
			
		||||
    uint32_t cur_opt_tm = os_boot_time32();
 | 
			
		||||
    uint32_t delay_tm;
 | 
			
		||||
 | 
			
		||||
    gpio_debug_printf("[%s][info] arg1:%d, arg2:%d, arg3:%d\n", __FUNCTION__,
 | 
			
		||||
        reg_addr, *data, len);
 | 
			
		||||
 | 
			
		||||
    if ((data == NULL) || (len == 0)) {
 | 
			
		||||
        return ERR_FAIL;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    delay_tm = (uint32_t)(cur_opt_tm - register_opt_tm);
 | 
			
		||||
    if (delay_tm < TPT29555_REGISTER_RESPONSE_TM) {
 | 
			
		||||
        os_delay(TPT29555_REGISTER_RESPONSE_TM - delay_tm);
 | 
			
		||||
    }
 | 
			
		||||
    ret = iot_i2c_write(tpt29555_iic_cfg.port, TPT29555_IIC_PHY_ADDR, buf, 1);
 | 
			
		||||
 | 
			
		||||
    if (ret != ERR_OK) {
 | 
			
		||||
        iot_printf("[%s][err] i2c write data  error\n", __FUNCTION__);
 | 
			
		||||
        goto out;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    os_delay(TPT29555_REGISTER_RESPONSE_TM);
 | 
			
		||||
    ret = iot_i2c_read(tpt29555_iic_cfg.port, TPT29555_IIC_PHY_ADDR,
 | 
			
		||||
        (char *)data, len);
 | 
			
		||||
 | 
			
		||||
    if (ret != ERR_OK) {
 | 
			
		||||
        iot_printf("[%s][err] i2c read data  error\n", __FUNCTION__);
 | 
			
		||||
        goto out;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
out:
 | 
			
		||||
    register_opt_tm = os_boot_time32();
 | 
			
		||||
    return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static uint8_t tpt29555_gpio_ex_open_as_out(uint8_t gpio_num, uint8_t gpio_port)
 | 
			
		||||
{
 | 
			
		||||
    uint8_t ret = ERR_FAIL;
 | 
			
		||||
    uint8_t data;
 | 
			
		||||
    uint8_t reg_addr;
 | 
			
		||||
 | 
			
		||||
    gpio_debug_printf("[%s][info] arg1:%d, arg2:%d\n", __FUNCTION__, gpio_num,
 | 
			
		||||
        gpio_port);
 | 
			
		||||
 | 
			
		||||
    if ((!GPIO_EX_VALID(gpio_num))
 | 
			
		||||
        ||!GPIO_PORT_VALID(gpio_port)) {
 | 
			
		||||
        return ERR_FAIL;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    os_acquire_mutex(gpio_ext_mutex);
 | 
			
		||||
 | 
			
		||||
    if (gpio_port == TPT29555_GPIO_EX_PORTA) {
 | 
			
		||||
        reg_addr = TPT29555_CONFIG_PORT_REGA;
 | 
			
		||||
    } else if (gpio_port == TPT29555_GPIO_EX_PORTB) {
 | 
			
		||||
        reg_addr = TPT29555_CONFIG_PORT_REGB;
 | 
			
		||||
    } else {
 | 
			
		||||
        IOT_ASSERT(0);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    ret = tpt29555_i2c_read_reg(reg_addr, &data, 1);
 | 
			
		||||
 | 
			
		||||
    if (ret != ERR_OK) {
 | 
			
		||||
        iot_printf("[%s][err] open gpio ext as output mode error!\n", __FUNCTION__);
 | 
			
		||||
        goto out;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    data &= ~(1 << gpio_num);
 | 
			
		||||
 | 
			
		||||
    ret = tpt29555_i2c_write_reg(reg_addr, data);
 | 
			
		||||
 | 
			
		||||
    if (ret != ERR_OK) {
 | 
			
		||||
        iot_printf("[%s][err] open gpio ext as output mode error!\n", __FUNCTION__);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
out:
 | 
			
		||||
    os_release_mutex(gpio_ext_mutex);
 | 
			
		||||
 | 
			
		||||
    return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static uint8_t tpt29555_gpio_ex_open_as_in(uint8_t gpio_num, uint8_t gpio_port)
 | 
			
		||||
{
 | 
			
		||||
    uint8_t ret = ERR_FAIL;
 | 
			
		||||
    uint8_t data;
 | 
			
		||||
    uint8_t reg_addr;
 | 
			
		||||
 | 
			
		||||
    gpio_debug_printf("[%s][info] arg1:%d, arg2:%d\n", __FUNCTION__, gpio_num,
 | 
			
		||||
        gpio_port);
 | 
			
		||||
 | 
			
		||||
    if ((!GPIO_EX_VALID(gpio_num))
 | 
			
		||||
        ||!GPIO_PORT_VALID(gpio_port)) {
 | 
			
		||||
        return ERR_FAIL;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    os_acquire_mutex(gpio_ext_mutex);
 | 
			
		||||
 | 
			
		||||
    if (gpio_port == TPT29555_GPIO_EX_PORTA) {
 | 
			
		||||
        reg_addr = TPT29555_CONFIG_PORT_REGA;
 | 
			
		||||
    } else if (gpio_port == TPT29555_GPIO_EX_PORTB) {
 | 
			
		||||
        reg_addr = TPT29555_CONFIG_PORT_REGB;
 | 
			
		||||
    } else {
 | 
			
		||||
        IOT_ASSERT(0);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    ret = tpt29555_i2c_read_reg(reg_addr, &data, 1);
 | 
			
		||||
 | 
			
		||||
    if (ret != ERR_OK) {
 | 
			
		||||
        iot_printf("[%s][err] open gpio ext as input mode error!\n",
 | 
			
		||||
            __FUNCTION__);
 | 
			
		||||
        goto out;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    data |= 1 << gpio_num;
 | 
			
		||||
 | 
			
		||||
    ret = tpt29555_i2c_write_reg(reg_addr, data);
 | 
			
		||||
 | 
			
		||||
    if (ret != ERR_OK) {
 | 
			
		||||
        iot_printf("[%s][err] open gpio ext as input mode error!\n",
 | 
			
		||||
            __FUNCTION__);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
out:
 | 
			
		||||
    os_release_mutex(gpio_ext_mutex);
 | 
			
		||||
 | 
			
		||||
    return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int iot_gpio_ext_hw_set_mode(int gpio, int mode)
 | 
			
		||||
{
 | 
			
		||||
    uint8_t ret = ERR_FAIL;
 | 
			
		||||
    uint8_t gpio_num = GPIO_EX_GET_GPIO(gpio);
 | 
			
		||||
    uint8_t gpio_port = GPIO_EX_GET_PORT(gpio);
 | 
			
		||||
 | 
			
		||||
    gpio_debug_printf("[%s][info] arg1:%d, arg2:%d, arg3:%d\n", __FUNCTION__,
 | 
			
		||||
        gpio_num, gpio_port, mode);
 | 
			
		||||
 | 
			
		||||
    if (TPT29555_INIT_COMPLETED != tpt29555_iic_cfg.inited) {
 | 
			
		||||
        iot_printf("[%s][err] The chip is not initialized!\n", __FUNCTION__);
 | 
			
		||||
        return ERR_FAIL;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if ((!GPIO_EX_VALID(gpio_num))
 | 
			
		||||
        ||!GPIO_PORT_VALID(gpio_port)) {
 | 
			
		||||
        return ERR_FAIL;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    os_acquire_mutex(gpio_ext_mutex);
 | 
			
		||||
 | 
			
		||||
    if (GPIO_INPUT == mode) {
 | 
			
		||||
        ret = tpt29555_gpio_ex_open_as_in(gpio_num, gpio_port);
 | 
			
		||||
    } else if (GPIO_OUTPUT == mode) {
 | 
			
		||||
       ret = tpt29555_gpio_ex_open_as_out(gpio_num, gpio_port);
 | 
			
		||||
    } else {
 | 
			
		||||
        /* not support */
 | 
			
		||||
        IOT_ASSERT(0);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (ret != ERR_OK) {
 | 
			
		||||
       iot_printf("[%s][err] gpio ext set mode error!\n", __FUNCTION__);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    os_release_mutex(gpio_ext_mutex);
 | 
			
		||||
 | 
			
		||||
    return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int iot_tpt29555_gpio_ex_value_get(int gpio)
 | 
			
		||||
{
 | 
			
		||||
    uint8_t reg_addr, ret = ERR_FAIL;
 | 
			
		||||
    uint8_t value;
 | 
			
		||||
 | 
			
		||||
    uint8_t gpio_num = GPIO_EX_GET_GPIO(gpio);
 | 
			
		||||
    uint8_t gpio_port = GPIO_EX_GET_PORT(gpio);
 | 
			
		||||
 | 
			
		||||
    gpio_debug_printf("[%s][info] arg1:%d, arg2:%d\n", __FUNCTION__, gpio_num,
 | 
			
		||||
        gpio_port);
 | 
			
		||||
 | 
			
		||||
    if (TPT29555_INIT_COMPLETED != tpt29555_iic_cfg.inited) {
 | 
			
		||||
        iot_printf("[%s][err] The chip is not initialized!\n", __FUNCTION__);
 | 
			
		||||
        return ERR_FAIL;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if ((!GPIO_EX_VALID(gpio_num))
 | 
			
		||||
        ||!GPIO_PORT_VALID(gpio_port)) {
 | 
			
		||||
        return ERR_FAIL;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    os_acquire_mutex(gpio_ext_mutex);
 | 
			
		||||
 | 
			
		||||
    if (gpio_port == TPT29555_GPIO_EX_PORTA) {
 | 
			
		||||
        reg_addr = TPT29555_INPUT_PORT_REGA;
 | 
			
		||||
    } else if (gpio_port == TPT29555_GPIO_EX_PORTB) {
 | 
			
		||||
        reg_addr = TPT29555_INPUT_PORT_REGB;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    ret = tpt29555_i2c_read_reg(reg_addr, &value, 1);
 | 
			
		||||
 | 
			
		||||
    if (ERR_OK != ret) {
 | 
			
		||||
        iot_printf("[%s][err] get gpio ext value error!\n", __FUNCTION__);
 | 
			
		||||
        goto out;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    os_release_mutex(gpio_ext_mutex);
 | 
			
		||||
 | 
			
		||||
    return (value >> gpio_num) & 0x01;
 | 
			
		||||
out:
 | 
			
		||||
    os_release_mutex(gpio_ext_mutex);
 | 
			
		||||
 | 
			
		||||
    return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int iot_tpt29555_gpio_ex_value_set(int gpio, int value)
 | 
			
		||||
{
 | 
			
		||||
    uint8_t ret = ERR_FAIL;
 | 
			
		||||
    uint8_t data = 0;
 | 
			
		||||
    uint8_t reg_addr, gpio_num, gpio_port;
 | 
			
		||||
 | 
			
		||||
    gpio_num = GPIO_EX_GET_GPIO(gpio);
 | 
			
		||||
    gpio_port = GPIO_EX_GET_PORT(gpio);
 | 
			
		||||
 | 
			
		||||
    gpio_debug_printf("[%s][info] arg1:%d, arg2:%d, arg3:%d\n", __FUNCTION__,
 | 
			
		||||
        gpio_num, gpio_port, value);
 | 
			
		||||
 | 
			
		||||
    if (TPT29555_INIT_COMPLETED != tpt29555_iic_cfg.inited) {
 | 
			
		||||
        iot_printf("[%s][err] The chip is not initialized!\n", __FUNCTION__);
 | 
			
		||||
        return ERR_FAIL;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if ((!GPIO_EX_VALID(gpio_num))
 | 
			
		||||
        ||!GPIO_PORT_VALID(gpio_port)) {
 | 
			
		||||
        return ERR_FAIL;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    os_acquire_mutex(gpio_ext_mutex);
 | 
			
		||||
 | 
			
		||||
    if (gpio_port == TPT29555_GPIO_EX_PORTA) {
 | 
			
		||||
        reg_addr = TPT29555_OUTPUT_PORT_REGA;
 | 
			
		||||
    } else if (gpio_port == TPT29555_GPIO_EX_PORTB) {
 | 
			
		||||
        reg_addr = TPT29555_OUTPUT_PORT_REGB;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    ret = tpt29555_i2c_read_reg(reg_addr, &data, 1);
 | 
			
		||||
 | 
			
		||||
    if (ERR_OK != ret) {
 | 
			
		||||
        iot_printf("[%s][err] get gpio ext value error!\n", __FUNCTION__);
 | 
			
		||||
        goto out;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (0 == value) {
 | 
			
		||||
        data &= ~(1 << gpio_num);
 | 
			
		||||
    } else {
 | 
			
		||||
        data |= 1 << gpio_num;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    ret = tpt29555_i2c_write_reg(reg_addr, data);
 | 
			
		||||
    if (ret != ERR_OK) {
 | 
			
		||||
        iot_printf("[%s][err] set gpio ext value error!\n", __FUNCTION__);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
out:
 | 
			
		||||
    os_release_mutex(gpio_ext_mutex);
 | 
			
		||||
 | 
			
		||||
    return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int iot_tpt29555_gpio_ex_init(void)
 | 
			
		||||
{
 | 
			
		||||
    iot_i2c_module_cfg_t iic_cfg;
 | 
			
		||||
    uint8_t value;
 | 
			
		||||
 | 
			
		||||
    if (gpio_ext_mutex == NULL) {
 | 
			
		||||
        gpio_ext_mutex = os_create_mutex(IOT_DRIVER_MID);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (gpio_ext_mutex == NULL) {
 | 
			
		||||
        IOT_ASSERT(0);
 | 
			
		||||
        goto err;
 | 
			
		||||
    }
 | 
			
		||||
    if (tpt29555_iic_cfg.inited == TPT29555_INIT_COMPLETED) {
 | 
			
		||||
        return ERR_OK;
 | 
			
		||||
    }
 | 
			
		||||
    tpt29555_iic_cfg.gpio_scl = iot_board_get_gpio(GPIO_EX_IO_I2C_SCL);
 | 
			
		||||
    tpt29555_iic_cfg.gpio_sda = iot_board_get_gpio(GPIO_EX_IO_I2C_SDA);
 | 
			
		||||
    if ((tpt29555_iic_cfg.gpio_scl == GPIO_NO_VALID) ||
 | 
			
		||||
        (tpt29555_iic_cfg.gpio_sda == GPIO_NO_VALID)) {
 | 
			
		||||
        iot_printf("[%s] init gpio ext chip TPT29555 invalid!\n",
 | 
			
		||||
            __FUNCTION__);
 | 
			
		||||
        goto err;
 | 
			
		||||
    }
 | 
			
		||||
    iic_cfg.baud = tpt29555_iic_cfg.baud;
 | 
			
		||||
    iic_cfg.gpio.scl = tpt29555_iic_cfg.gpio_scl;
 | 
			
		||||
    iic_cfg.gpio.sda = tpt29555_iic_cfg.gpio_sda;
 | 
			
		||||
    iic_cfg.nack_wait_num = tpt29555_iic_cfg.nack_wait_num;
 | 
			
		||||
    iic_cfg.port = tpt29555_iic_cfg.port;
 | 
			
		||||
 | 
			
		||||
    if (ERR_OK != iot_i2c_module_init(&iic_cfg)) {
 | 
			
		||||
        iot_printf("[%s][err] init err!\n", __FUNCTION__);
 | 
			
		||||
        goto err;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /* check device ACK or NACK */
 | 
			
		||||
    if (ERR_OK != tpt29555_i2c_read_reg(TPT29555_INPUT_PORT_REGA, &value, 1)) {
 | 
			
		||||
        iot_printf("[%s][info] read register failed, reg:0x%x, value:0x%x\n",
 | 
			
		||||
            __FUNCTION__, TPT29555_INPUT_PORT_REGA, value);
 | 
			
		||||
        goto err;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    iot_printf("[%s][info] init gpio ext chip TPT29555 successfully!\n",
 | 
			
		||||
        __FUNCTION__);
 | 
			
		||||
 | 
			
		||||
    tpt29555_iic_cfg.inited = TPT29555_INIT_COMPLETED;
 | 
			
		||||
 | 
			
		||||
    return ERR_OK;
 | 
			
		||||
 | 
			
		||||
err:
 | 
			
		||||
    return ERR_FAIL;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int iot_gpio_ext_hw_set_interrupt_mode(int gpio, int mode)
 | 
			
		||||
{
 | 
			
		||||
    (void)gpio;
 | 
			
		||||
    (void)mode;
 | 
			
		||||
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int iot_gpio_ext_hw_get_int_status(int gpio)
 | 
			
		||||
{
 | 
			
		||||
    (void)gpio;
 | 
			
		||||
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int iot_gpio_ext_hw_clear_int_status(int gpio)
 | 
			
		||||
{
 | 
			
		||||
    (void)gpio;
 | 
			
		||||
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int iot_gpio_ext_hw_set_drain_mode(int gpio, int mode)
 | 
			
		||||
{
 | 
			
		||||
    (void)gpio;
 | 
			
		||||
    (void)mode;
 | 
			
		||||
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
iot_gpio_op_t hw_gpio_api_table_ext_tpt29555 = {
 | 
			
		||||
    .gpio_init = iot_tpt29555_gpio_ex_init,
 | 
			
		||||
    .set_gpio_mode = iot_gpio_ext_hw_set_mode,
 | 
			
		||||
    .set_interrupt_mode = iot_gpio_ext_hw_set_interrupt_mode,
 | 
			
		||||
    .set_value = iot_tpt29555_gpio_ex_value_set,
 | 
			
		||||
    .get_value = iot_tpt29555_gpio_ex_value_get,
 | 
			
		||||
    .get_interrupt_status = iot_gpio_ext_hw_get_int_status,
 | 
			
		||||
    .clear_interrupt_status = iot_gpio_ext_hw_clear_int_status,
 | 
			
		||||
    .set_gpio_open_drain = iot_gpio_ext_hw_set_drain_mode,
 | 
			
		||||
};
 | 
			
		||||
		Reference in New Issue
	
	Block a user