|
|
@@ -19,6 +19,7 @@
|
|
|
#include <linux/i2c-dev.h>
|
|
|
#include <errno.h>
|
|
|
#include "head.h"
|
|
|
+#include "ch423s.h"
|
|
|
|
|
|
#if defined IO_CHIP_CH423S
|
|
|
|
|
|
@@ -65,44 +66,51 @@
|
|
|
#define BIT_IO6_DAT 0x40 // 写入双向输入输出引脚的输出寄存器,当IO_OE=1,IO6为0输出低电平,为1输出高电平
|
|
|
#define BIT_IO7_DAT 0x80 // 写入双向输入输出引脚的输出寄存器,当IO_OE=1,IO7为0输出低电平,为1输出高电平
|
|
|
|
|
|
-struct t_dev_cfg
|
|
|
+
|
|
|
+/**< led配置结构体 */
|
|
|
+struct t_config_led
|
|
|
{
|
|
|
uint8_t uc_port;
|
|
|
uint8_t uc_pin;
|
|
|
+ uint8_t uc_en; /**< 使能标志 */
|
|
|
+ uint8_t uc_mode; /**< 模式 0灭 1亮 2闪烁 */
|
|
|
+ uint8_t uc_state; /**< 目前状态 */
|
|
|
+ uint32_t ul_time; /**< 翻转时间 */
|
|
|
+ uint32_t ul_count; /**< 翻转计时 */
|
|
|
};
|
|
|
|
|
|
-struct t_dev_cfg t_ch423_gpio[] =
|
|
|
+static struct t_config_led mst_led_cfg[LED_MAX_NUM] =
|
|
|
{
|
|
|
- {CH423_OC_L_CMD, 0},
|
|
|
- {CH423_OC_L_CMD, 1},
|
|
|
- {CH423_OC_L_CMD, 2},
|
|
|
- {CH423_OC_L_CMD, 3},
|
|
|
- {CH423_OC_L_CMD, 4},
|
|
|
- {CH423_OC_L_CMD, 5},
|
|
|
- {CH423_OC_L_CMD, 6},
|
|
|
- {CH423_OC_L_CMD, 7},
|
|
|
- {CH423_OC_H_CMD, 8},
|
|
|
- {CH423_OC_H_CMD, 9},
|
|
|
- {CH423_OC_H_CMD, 10},
|
|
|
- {CH423_OC_H_CMD, 11},
|
|
|
- {CH423_OC_H_CMD, 12},
|
|
|
- {CH423_OC_H_CMD, 13},
|
|
|
- {CH423_OC_H_CMD, 14},
|
|
|
- {CH423_OC_H_CMD, 15},
|
|
|
- {CH423_SET_IO_CMD, 16},
|
|
|
- {CH423_SET_IO_CMD, 17},
|
|
|
- {CH423_SET_IO_CMD, 18},
|
|
|
- {CH423_SET_IO_CMD, 19},
|
|
|
- {CH423_SET_IO_CMD, 20},
|
|
|
- {CH423_SET_IO_CMD, 21},
|
|
|
- {CH423_SET_IO_CMD, 22},
|
|
|
- {CH423_SET_IO_CMD, 23},
|
|
|
+ {CH423_OC_L_CMD, 0, 0, 0, 0, 0},
|
|
|
+ {CH423_OC_L_CMD, 1, 0, 0, 0, 0},
|
|
|
+ {CH423_OC_L_CMD, 2, 0, 0, 0, 0},
|
|
|
+ {CH423_OC_L_CMD, 3, 0, 0, 0, 0},
|
|
|
+ {CH423_OC_L_CMD, 4, 0, 0, 0, 0},
|
|
|
+ {CH423_OC_L_CMD, 5, 0, 0, 0, 0},
|
|
|
+ {CH423_OC_L_CMD, 6, 0, 0, 0, 0},
|
|
|
+ {CH423_OC_L_CMD, 7, 0, 0, 0, 0},
|
|
|
+ {CH423_OC_H_CMD, 8, 0, 0, 0, 0},
|
|
|
+ {CH423_OC_H_CMD, 9, 0, 0, 0, 0},
|
|
|
+ {CH423_OC_H_CMD, 10, 0, 0, 0, 0},
|
|
|
+ {CH423_OC_H_CMD, 11, 0, 0, 0, 0},
|
|
|
+ {CH423_OC_H_CMD, 12, 0, 0, 0, 0},
|
|
|
+ {CH423_OC_H_CMD, 13, 0, 0, 0, 0},
|
|
|
+ {CH423_OC_H_CMD, 14, 0, 0, 0, 0},
|
|
|
+ {CH423_OC_H_CMD, 15, 0, 0, 0, 0},
|
|
|
+ {CH423_SET_IO_CMD, 16, 0, 0, 0, 0},
|
|
|
+ {CH423_SET_IO_CMD, 17, 0, 0, 0, 0},
|
|
|
+ {CH423_SET_IO_CMD, 18, 0, 0, 0, 0},
|
|
|
+ {CH423_SET_IO_CMD, 19, 0, 0, 0, 0},
|
|
|
+ {CH423_SET_IO_CMD, 20, 0, 0, 0, 0},
|
|
|
+ {CH423_SET_IO_CMD, 21, 0, 0, 0, 0},
|
|
|
+ {CH423_SET_IO_CMD, 22, 0, 0, 0, 0},
|
|
|
+ {CH423_SET_IO_CMD, 23, 0, 0, 0, 0},
|
|
|
};
|
|
|
|
|
|
#define I2C_DEV "/dev/i2c-5"
|
|
|
static int sl_ch423s_fd = -1, sl_ch423s_init = -1;
|
|
|
-static uint32_t sul_io_status = 0;
|
|
|
-static unsigned long mtll_updata_ch423s_timer = 0;
|
|
|
+static uint32_t sul_io_status = 0xffffff;
|
|
|
+static uint8_t msuc_test_flag = 0;
|
|
|
|
|
|
/**
|
|
|
* @brief
|
|
|
@@ -115,20 +123,24 @@ static unsigned long mtll_updata_ch423s_timer = 0;
|
|
|
* @retval none
|
|
|
*
|
|
|
* @warning none
|
|
|
- * @note none
|
|
|
+ * @note 注意这个原件没有固定的iic地址 抓数据发现 命令 + 数据 就可以操作
|
|
|
*/
|
|
|
static int ch423_write_data(uint8_t _uc_cmd, uint8_t _uc_state)
|
|
|
{
|
|
|
- uint8_t uca_data[2] = {0};
|
|
|
-
|
|
|
- uca_data[0] = _uc_cmd;
|
|
|
- uca_data[1] = _uc_state;
|
|
|
- if (write(sl_ch423s_fd, &uca_data[0], 2) != 2)
|
|
|
+ /* 使用寄存器地址来寻址 */
|
|
|
+ if (ioctl(sl_ch423s_fd, I2C_SLAVE, _uc_cmd >> 1) < 0)
|
|
|
{
|
|
|
- dp_err_n_c_rt("Failed to send init command: %s", strerror(errno));
|
|
|
+ dp_err_n_c("Failed to set I2C slave address: %s\n", strerror(errno));
|
|
|
|
|
|
return -1;
|
|
|
}
|
|
|
+
|
|
|
+ if (write(sl_ch423s_fd, &_uc_state, 1) != 1)
|
|
|
+ {
|
|
|
+ dp_err_n_c("Failed to write data: %s", strerror(errno));
|
|
|
+
|
|
|
+ return -2;
|
|
|
+ }
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
@@ -147,14 +159,17 @@ static int ch423_write_data(uint8_t _uc_cmd, uint8_t _uc_state)
|
|
|
*/
|
|
|
static void ch423s_updata_port_status(uint8_t _uc_idx, uint8_t _uc_state)
|
|
|
{
|
|
|
- /* 清除原始状态 */
|
|
|
+ uint32_t ul_data_1 = 0, ul_data_2 = 0;
|
|
|
+ ul_data_1 = sul_io_status;
|
|
|
if ((sul_io_status >> _uc_idx) & 0x01)
|
|
|
{
|
|
|
sul_io_status ^= (1 << _uc_idx);
|
|
|
}
|
|
|
+ ul_data_2 = sul_io_status;
|
|
|
|
|
|
/* 重新设置 */
|
|
|
sul_io_status |= _uc_state ? (0 << _uc_idx) : (1 << _uc_idx);
|
|
|
+ // dp_err_n_c_rt("ul_data_1 = 0x%06x, ul_data_2 = 0x%06x, sul_io_status = 0x%06x\r\n", ul_data_1, ul_data_1, sul_io_status);
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
@@ -173,13 +188,6 @@ int ch423sio_updata_status_ontime(void)
|
|
|
uint8_t uca_state[3] = {0};
|
|
|
int l_ret = 0;
|
|
|
|
|
|
- // if (bsp_ustimer_get_duration(mtll_updata_ch423s_timer) < (USTIMER_MS * 50) || sl_ch423s_fd < 0)
|
|
|
- // {
|
|
|
- // return -1;
|
|
|
- // }
|
|
|
-
|
|
|
- mtll_updata_ch423s_timer = bsp_ustimer_get_origin();
|
|
|
-
|
|
|
uca_state[0] = (uint8_t)(sul_io_status & 0xff);
|
|
|
(0 == ch423_write_data(CH423_OC_L_CMD, uca_state[0])) ? l_ret : l_ret--;
|
|
|
|
|
|
@@ -207,31 +215,124 @@ int ch423sio_updata_status_ontime(void)
|
|
|
*/
|
|
|
int ch423sio_set_io(uint8_t _uc_idx, uint8_t _uc_state)
|
|
|
{
|
|
|
- uint8_t uc_num = sizeof(t_ch423_gpio) / sizeof(struct t_dev_cfg);
|
|
|
+ if (_uc_idx >= LED_MAX_NUM || sl_ch423s_init < 0 || _uc_state > 1)
|
|
|
+ {
|
|
|
+ return -1;
|
|
|
+ }
|
|
|
+
|
|
|
+ switch (mst_led_cfg[_uc_idx].uc_port)
|
|
|
+ {
|
|
|
+ case CH423_OC_L_CMD:
|
|
|
+ ch423s_updata_port_status(mst_led_cfg[_uc_idx].uc_pin, _uc_state);
|
|
|
+ break;
|
|
|
+
|
|
|
+ case CH423_OC_H_CMD:
|
|
|
+ ch423s_updata_port_status(mst_led_cfg[_uc_idx].uc_pin, _uc_state);
|
|
|
+ break;
|
|
|
+
|
|
|
+ case CH423_SET_IO_CMD:
|
|
|
+ ch423s_updata_port_status(mst_led_cfg[_uc_idx].uc_pin, _uc_state);
|
|
|
+ break;
|
|
|
+
|
|
|
+ default:
|
|
|
+ return -2;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * @brief 设置io状态
|
|
|
+ * @author lch (lch_work@foxmail.com)
|
|
|
+ * @version 1.0
|
|
|
+ * @date 20251224
|
|
|
+ * @param[in/out] {uint8_t} _uc_idx 下标
|
|
|
+ * @param[in/out] {uint8_t} _uc_state 电平状态
|
|
|
+ * @return * int
|
|
|
+ * @retval none
|
|
|
+ *
|
|
|
+ * @warning none
|
|
|
+ * @note none
|
|
|
+ */
|
|
|
+int ch423sio_set_ioupdata(uint8_t _uc_idx, uint8_t _uc_state)
|
|
|
+{
|
|
|
+ int ret = -1;
|
|
|
+ uint8_t io_val[3] = {0};
|
|
|
|
|
|
- if (_uc_idx >= uc_num || sl_ch423s_init < 0 || _uc_state > 1)
|
|
|
+ if (_uc_idx >= LED_MAX_NUM || sl_ch423s_init < 0 || _uc_state > 1)
|
|
|
{
|
|
|
+ dp_err_n_c("_uc_idx = %d, sl_ch423s_init = %d, _uc_state = %d", _uc_idx, sl_ch423s_init, _uc_state);
|
|
|
return -1;
|
|
|
}
|
|
|
|
|
|
- switch (t_ch423_gpio[_uc_idx].uc_port)
|
|
|
+ switch (mst_led_cfg[_uc_idx].uc_port)
|
|
|
{
|
|
|
case CH423_OC_L_CMD:
|
|
|
- ch423s_updata_port_status(t_ch423_gpio[_uc_idx].uc_pin, _uc_state);
|
|
|
+ ch423s_updata_port_status(mst_led_cfg[_uc_idx].uc_pin, _uc_state);
|
|
|
+ io_val[0] = (uint8_t)(sul_io_status & 0xff);
|
|
|
+ ret = ch423_write_data(CH423_OC_L_CMD, io_val[0]);
|
|
|
break;
|
|
|
|
|
|
case CH423_OC_H_CMD:
|
|
|
- ch423s_updata_port_status(t_ch423_gpio[_uc_idx].uc_pin, _uc_state);
|
|
|
+ ch423s_updata_port_status(mst_led_cfg[_uc_idx].uc_pin, _uc_state);
|
|
|
+ io_val[1] = (uint8_t)((sul_io_status & 0xff00) >> 8);
|
|
|
+ ret = ch423_write_data(CH423_OC_H_CMD, io_val[1]);
|
|
|
break;
|
|
|
|
|
|
case CH423_SET_IO_CMD:
|
|
|
- ch423s_updata_port_status(t_ch423_gpio[_uc_idx].uc_pin, _uc_state);
|
|
|
+ ch423s_updata_port_status(mst_led_cfg[_uc_idx].uc_pin, _uc_state);
|
|
|
+ io_val[2] = (uint8_t)((sul_io_status & 0xff0000) >> 16);
|
|
|
+ ret = ch423_write_data(CH423_SET_IO_CMD, io_val[2]);
|
|
|
break;
|
|
|
|
|
|
default:
|
|
|
return -2;
|
|
|
break;
|
|
|
}
|
|
|
+ return ret;
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * @brief io测试
|
|
|
+ * @author lch (lch_work@foxmail.com)
|
|
|
+ * @version 1.0
|
|
|
+ * @date 20251230
|
|
|
+ * @return * int
|
|
|
+ * @retval none
|
|
|
+ *
|
|
|
+ * @warning none
|
|
|
+ * @note none
|
|
|
+ */
|
|
|
+static int ch423sio_run_test(void)
|
|
|
+{
|
|
|
+ int i = 0;
|
|
|
+
|
|
|
+ for (i = 0; i < LED_MAX_NUM; i++)
|
|
|
+ {
|
|
|
+ ch423sio_set_ioupdata(i, 1);
|
|
|
+ usleep(1000 * 100);
|
|
|
+ }
|
|
|
+ usleep(1000 * 500);
|
|
|
+
|
|
|
+ for (i = (LED_MAX_NUM - 1); i >= 0; i--)
|
|
|
+ {
|
|
|
+ ch423sio_set_ioupdata(i, 0);
|
|
|
+ usleep(1000 * 100);
|
|
|
+ }
|
|
|
+ usleep(1000 * 500);
|
|
|
+
|
|
|
+ for (i = 0; i < LED_MAX_NUM; i++)
|
|
|
+ {
|
|
|
+ ch423sio_set_ioupdata(i, 1);
|
|
|
+ }
|
|
|
+ usleep(1000 * 500);
|
|
|
+
|
|
|
+ for (i = 0; i < LED_MAX_NUM; i++)
|
|
|
+ {
|
|
|
+ ch423sio_set_ioupdata(i, 0);
|
|
|
+ }
|
|
|
+ usleep(1000 * 100);
|
|
|
+
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
@@ -256,6 +357,7 @@ int ch423sio_init_dev(void)
|
|
|
|
|
|
return -1;
|
|
|
}
|
|
|
+ dp_err_n_c_rt("sl_ch423s_fd %d", sl_ch423s_fd);
|
|
|
|
|
|
ch423_write_data(CH423_SYS_CMD, BIT_IO_OE); /* 将IO7~IO0设置为输出 其它参数使用默认值 */
|
|
|
ch423_write_data(CH423_OC_L_CMD, 0xff);
|
|
|
@@ -263,6 +365,9 @@ int ch423sio_init_dev(void)
|
|
|
ch423_write_data(CH423_SET_IO_CMD, 0xff);
|
|
|
|
|
|
sl_ch423s_init = 0;
|
|
|
+
|
|
|
+ ch423sio_run_test();
|
|
|
+
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
@@ -288,4 +393,99 @@ int ch423sio_exit_dev(void)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+/**
|
|
|
+ * @brief 控制led驱动
|
|
|
+ *
|
|
|
+ * @param[in] {uint8_t} _uc_idx 硬件地址
|
|
|
+ * @param[in] {uint8_t} _uc_set 模式 0灭 1亮
|
|
|
+ */
|
|
|
+static void ch423_control_drive(uint8_t _uc_idx, uint8_t _uc_set)
|
|
|
+{
|
|
|
+ if (_uc_idx >= LED_MAX_NUM || _uc_set >= e_io_mode_max)
|
|
|
+ return;
|
|
|
+
|
|
|
+ switch (_uc_set)
|
|
|
+ {
|
|
|
+ case e_io_mode_off:
|
|
|
+ ch423sio_set_io(_uc_idx, e_io_mode_off);
|
|
|
+ mst_led_cfg[_uc_idx].uc_state = e_io_mode_off;
|
|
|
+ break;
|
|
|
+
|
|
|
+ case e_io_mode_on:
|
|
|
+ ch423sio_set_io(_uc_idx, e_io_mode_on);
|
|
|
+ mst_led_cfg[_uc_idx].uc_state = e_io_mode_on;
|
|
|
+ break;
|
|
|
+
|
|
|
+ default:
|
|
|
+ return;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * @brief 切换led模式
|
|
|
+ *
|
|
|
+ * @details 闪烁模式一直在计时,uc_en使能标志不会清零
|
|
|
+ */
|
|
|
+void ch423sio_handle_mode(void)
|
|
|
+{
|
|
|
+ uint8_t uc_updata = 0;
|
|
|
+
|
|
|
+ for (uint8_t i = 0; i < LED_MAX_NUM; i++)
|
|
|
+ {
|
|
|
+ if (mst_led_cfg[i].uc_en == 0)
|
|
|
+ continue;
|
|
|
+
|
|
|
+ mst_led_cfg[i].ul_count += 100;
|
|
|
+ if (mst_led_cfg[i].ul_count > mst_led_cfg[i].ul_time)
|
|
|
+ {
|
|
|
+ mst_led_cfg[i].ul_count = 0;
|
|
|
+ uc_updata = 1;
|
|
|
+ if (mst_led_cfg[i].uc_mode != e_io_mode_shine)
|
|
|
+ {
|
|
|
+ mst_led_cfg[i].uc_en = 0;
|
|
|
+ ch423_control_drive(i, mst_led_cfg[i].uc_mode);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ if (e_io_mode_on == mst_led_cfg[i].uc_state)
|
|
|
+ {
|
|
|
+ ch423_control_drive(i, e_io_mode_off);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ ch423_control_drive(i, e_io_mode_on);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (1 == uc_updata)
|
|
|
+ {
|
|
|
+ ch423sio_updata_status_ontime();
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * @brief
|
|
|
+ *
|
|
|
+ * @param[in] {uint8_t} _uc_idx led映射
|
|
|
+ * @param[in] {enum e_mode_ch423} _e_mode 模式 0灭 1亮 2闪烁
|
|
|
+ * @param[in] {uint32_t} _ul_time 闪烁时间
|
|
|
+ * @return int
|
|
|
+ * @retval 0设置模式成功
|
|
|
+ * @details none
|
|
|
+ */
|
|
|
+int ch423sio_control_state(uint8_t _uc_idx, enum e_mode_ch423 _e_mode, uint32_t _ul_time)
|
|
|
+{
|
|
|
+ if (_uc_idx >= LED_MAX_NUM || _e_mode >= e_io_mode_max)
|
|
|
+ return -1;
|
|
|
+
|
|
|
+ mst_led_cfg[_uc_idx].uc_en = 1;
|
|
|
+ mst_led_cfg[_uc_idx].uc_mode = _e_mode;
|
|
|
+ if (_e_mode == e_io_mode_shine)
|
|
|
+ mst_led_cfg[_uc_idx].ul_time = _ul_time;
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
#endif /* TMP_CHIP_AHT20 */
|