From f190cba0ab75a18a96002ded96054c435c21be47 Mon Sep 17 00:00:00 2001 From: LZerro <144687571+LZerro@users.noreply.github.com> Date: Tue, 30 Apr 2024 08:46:12 +0800 Subject: [PATCH] [i2c] adjust the timing for I2C initialization --- .../libraries/HAL_Drivers/drv_soft_i2c.c | 16 +- bsp/acm32/acm32f0x0-nucleo/drivers/Kconfig | 22 +++ .../acm32f0x0-nucleo/drivers/drv_soft_i2c.c | 146 +++++++++--------- .../acm32f0x0-nucleo/drivers/drv_soft_i2c.h | 44 ++++++ .../libraries/rt_drivers/drv_soft_i2c.c | 16 +- bsp/apm32/libraries/Drivers/drv_soft_i2c.c | 17 +- bsp/at32/libraries/rt_drivers/drv_soft_i2c.c | 18 ++- bsp/at91/at91sam9260/drivers/at91_i2c_gpio.c | 10 +- bsp/at91/at91sam9g45/drivers/at91_i2c_gpio.c | 10 +- bsp/avr32/drivers/drv_soft_i2c.c | 16 +- .../libraries/hal_drivers/drv_soft_i2c.c | 18 ++- .../libraries/rt_drivers/drv_soft_i2c.c | 16 +- .../arm/libraries/gd32_drivers/drv_soft_i2c.c | 17 +- .../libraries/gd32_drivers/drv_soft_i2c.c | 17 +- .../libraries/hc32_drivers/drv_soft_i2c.c | 18 ++- bsp/hk32/libraries/rt_drivers/drv_soft_i2c.c | 16 +- bsp/loongson/ls1cdev/drivers/drv_i2c.c | 9 +- bsp/n32/libraries/n32_drivers/drv_i2c.c | 17 +- .../Libraries/rt_drivers/drv_soft_i2c.c | 18 ++- bsp/raspberry-pico/drivers/drv_soft_i2c.c | 16 +- .../libraries/HAL_Drivers/drv_soft_i2c.c | 17 +- .../HAL_Drivers/drivers/drv_soft_i2c.c | 15 +- .../libraries/SWM320_drivers/drv_soft_i2c.c | 21 ++- bsp/w60x/drivers/drv_soft_i2c.c | 18 ++- .../Libraries/ch32_drivers/drv_soft_i2c.c | 18 ++- components/drivers/i2c/i2c-bit-ops.c | 6 + .../drivers/include/drivers/i2c-bit-ops.h | 3 + 27 files changed, 436 insertions(+), 139 deletions(-) create mode 100644 bsp/acm32/acm32f0x0-nucleo/drivers/drv_soft_i2c.h diff --git a/bsp/Infineon/libraries/HAL_Drivers/drv_soft_i2c.c b/bsp/Infineon/libraries/HAL_Drivers/drv_soft_i2c.c index acba72991a..35a8724e07 100644 --- a/bsp/Infineon/libraries/HAL_Drivers/drv_soft_i2c.c +++ b/bsp/Infineon/libraries/HAL_Drivers/drv_soft_i2c.c @@ -47,6 +47,16 @@ static void ifx_i2c_gpio_init(struct ifx_i2c *i2c) rt_pin_write(cfg->sda, PIN_HIGH); } +static void ifx_i2c_pin_init(void) +{ + rt_size_t obj_num = sizeof(i2c_obj) / sizeof(struct ifx_i2c); + + for(rt_size_t i = 0; i < obj_num; i++) + { + ifx_i2c_gpio_init(&i2c_obj[i]); + } +} + /** * This function sets the sda pin. * @@ -112,13 +122,15 @@ static rt_int32_t ifx_get_scl(void *data) static const struct rt_i2c_bit_ops ifx_bit_ops_default = { .data = RT_NULL, + .pin_init = ifx_i2c_pin_init, .set_sda = ifx_set_sda, .set_scl = ifx_set_scl, .get_sda = ifx_get_sda, .get_scl = ifx_get_scl, .udelay = rt_hw_us_delay, .delay_us = 1, - .timeout = 100 + .timeout = 100, + .i2c_pin_init_flag = RT_FALSE }; /** @@ -162,7 +174,7 @@ int rt_hw_i2c_init(void) i2c_obj[i].ops = ifx_bit_ops_default; i2c_obj[i].ops.data = (void *)&soft_i2c_config[i]; i2c_obj[i].i2c_bus.priv = &i2c_obj[i].ops; - ifx_i2c_gpio_init(&i2c_obj[i]); + result = rt_i2c_bit_add_bus(&i2c_obj[i].i2c_bus, soft_i2c_config[i].bus_name); RT_ASSERT(result == RT_EOK); ifx_i2c_bus_unlock(&soft_i2c_config[i]); diff --git a/bsp/acm32/acm32f0x0-nucleo/drivers/Kconfig b/bsp/acm32/acm32f0x0-nucleo/drivers/Kconfig index c885943643..2b263f5e32 100644 --- a/bsp/acm32/acm32f0x0-nucleo/drivers/Kconfig +++ b/bsp/acm32/acm32f0x0-nucleo/drivers/Kconfig @@ -106,6 +106,28 @@ menu "On-chip Peripheral Drivers" select RT_USING_I2C endmenu + menuconfig BSP_USING_SOFT_I2C + bool "Enable Soft I2C" + select RT_USING_I2C + select RT_USING_I2C_BITOPS + select RT_USING_PIN + default n + if BSP_USING_SOFT_I2C + menuconfig BSP_USING_I2C0 + bool "Enable I2C1 BUS (software simulation)" + default n + if BSP_USING_I2C0 + config BSP_I2C0_SCL_PIN + int "i2c0 scl pin number (PD, 6)" + range 0 63 + default 54 + config BSP_I2C0_SDA_PIN + int "I2C0 sda pin number (PD, 7)" + range 0 63 + default 55 + endif + endif + menu "Hardware CAN" config BSP_USING_CAN1 bool "Enable CAN1" diff --git a/bsp/acm32/acm32f0x0-nucleo/drivers/drv_soft_i2c.c b/bsp/acm32/acm32f0x0-nucleo/drivers/drv_soft_i2c.c index 764a6891bc..47b8e9fb06 100644 --- a/bsp/acm32/acm32f0x0-nucleo/drivers/drv_soft_i2c.c +++ b/bsp/acm32/acm32f0x0-nucleo/drivers/drv_soft_i2c.c @@ -1,76 +1,95 @@ /* - * Copyright (c) 2006-2022, RT-Thread Development Team + * Copyright (c) 2006-2024, RT-Thread Development Team * * SPDX-License-Identifier: Apache-2.0 * * Change Logs: * Date Author Notes * 2021-09-13 AisinoChip first implementation. + * 2024-04-23 LZero Modify the I2C framework. */ -#include +#ifdef BSP_USING_SOFT_I2C -#ifdef RT_USING_I2C_BITOPS +#include "drv_soft_i2c.h" -#include -#include +#define DBG_TAG "drv.i2c" +#ifdef DRV_DEBUG + #define DBG_LVL DBG_LOG +#else + #define DBG_LVL DBG_INFO +#endif /* DRV_DEBUG */ -#define I2C_BUS_NAME "i2cs" - -/* user should change this to adapt specific board */ -#define I2C_SCL_PIN GPIO_PIN_6 -#define I2C_SCL_PORT GPIOD -#define I2C_SDA_PIN GPIO_PIN_7 -#define I2C_SDA_PORT GPIOD - -struct acm32_i2c_bit_data +static struct acm32_soft_i2c_config soft_i2c_config[] = { - struct - { - enum_GPIOx_t port; - rt_uint32_t pin; - } scl, sda; +#ifdef BSP_USING_I2C0 + I2C0_BUS_CONFIG, +#endif }; +static struct acm32_i2c i2c_obj[sizeof(soft_i2c_config) / sizeof(soft_i2c_config[0])]; + +static void drv_i2c_gpio_init(struct acm32_i2c* i2c) +{ + struct acm32_soft_i2c_config* cfg = (struct acm32_soft_i2c_config*)i2c->ops.data; + + rt_pin_mode(cfg->scl, PIN_MODE_OUTPUT_OD); + rt_pin_mode(cfg->sda, PIN_MODE_OUTPUT_OD); + + rt_pin_write(cfg->scl, PIN_HIGH); + rt_pin_write(cfg->sda, PIN_HIGH); +} + +static void acm32_i2c_pin_init(void) +{ + rt_size_t obj_num = sizeof(i2c_obj) / sizeof(struct acm32_i2c); + + for(rt_size_t i = 0; i < obj_num; i++) + { + drv_i2c_gpio_init(&i2c_obj[i]); + } +} + static void _set_sda(void *data, rt_int32_t state) { - struct acm32_i2c_bit_data* bd = data; + struct acm32_soft_i2c_config* cfg = (struct acm32_soft_i2c_config*)data; if (state) { - HAL_GPIO_WritePin(bd->sda.port, bd->sda.pin, GPIO_PIN_SET); + rt_pin_write(cfg->sda, PIN_HIGH); } else { - HAL_GPIO_WritePin(bd->sda.port, bd->sda.pin, GPIO_PIN_CLEAR); + rt_pin_write(cfg->sda, PIN_LOW); } } static void _set_scl(void *data, rt_int32_t state) { - struct acm32_i2c_bit_data* bd = data; + struct acm32_soft_i2c_config* cfg = (struct acm32_soft_i2c_config*)data; + if (state) { - HAL_GPIO_WritePin(bd->scl.port, bd->scl.pin, GPIO_PIN_SET); + rt_pin_write(cfg->scl, PIN_HIGH); } else { - HAL_GPIO_WritePin(bd->scl.port, bd->scl.pin, GPIO_PIN_CLEAR); + rt_pin_write(cfg->scl, PIN_LOW); } } static rt_int32_t _get_sda(void *data) { - struct acm32_i2c_bit_data* bd = data; + struct acm32_soft_i2c_config* cfg = (struct acm32_soft_i2c_config*)data; - return HAL_GPIO_ReadPin(bd->sda.port, bd->sda.pin); + return rt_pin_read(cfg->sda); } static rt_int32_t _get_scl(void *data) { - struct acm32_i2c_bit_data* bd = data; + struct acm32_soft_i2c_config* cfg = (struct acm32_soft_i2c_config*)data; - return HAL_GPIO_ReadPin(bd->scl.port, bd->scl.pin); + return rt_pin_read(cfg->scl); } static void acm32_udelay(rt_uint32_t us) @@ -103,55 +122,40 @@ static void acm32_udelay(rt_uint32_t us) } } -static void drv_i2c_gpio_init(const struct acm32_i2c_bit_data* bd) +static const struct rt_i2c_bit_ops acm32_bit_ops_default = { - GPIO_InitTypeDef GPIO_Handle; - - GPIO_Handle.Pin = bd->sda.pin; - GPIO_Handle.Mode = GPIO_MODE_OUTPUT_OD; - GPIO_Handle.Pull = GPIO_PULLUP; - GPIO_Handle.Alternate = GPIO_FUNCTION_0; - HAL_GPIO_Init(bd->sda.port, &GPIO_Handle); - - GPIO_Handle.Pin = bd->scl.pin; - GPIO_Handle.Mode = GPIO_MODE_OUTPUT_OD; - GPIO_Handle.Pull = GPIO_PULLUP; - GPIO_Handle.Alternate = GPIO_FUNCTION_0; - HAL_GPIO_Init(bd->scl.port, &GPIO_Handle); - - _set_sda((void*)bd, 1); - _set_scl((void*)bd, 1); -} + .data = RT_NULL, + .pin_init = acm32_i2c_pin_init, + .set_sda = _set_sda, + .set_scl = _set_scl, + .get_sda = _get_sda, + .get_scl = _get_scl, + .udelay = acm32_udelay, + .delay_us = 1, + .timeout = 100, + .i2c_pin_init_flag = RT_FALSE +}; int rt_soft_i2c_init(void) { - static struct rt_i2c_bus_device i2c_device; - static const struct acm32_i2c_bit_data _i2c_bdata = + rt_err_t result; + + for (rt_size_t i = 0; i < sizeof(i2c_obj) / sizeof(struct acm32_i2c); i++) { - /* SCL */ - { I2C_SCL_PORT, I2C_SCL_PIN}, - /* SDA */ - { I2C_SDA_PORT, I2C_SDA_PIN}, - }; + i2c_obj[i].ops = acm32_bit_ops_default; + i2c_obj[i].ops.data = (void*)&soft_i2c_config[i]; + i2c_obj[i].i2c_bus.priv = &i2c_obj[i].ops; + + result = rt_i2c_bit_add_bus(&i2c_obj[i].i2c_bus, soft_i2c_config[i].bus_name); + RT_ASSERT(result == RT_EOK); - static const struct rt_i2c_bit_ops _i2c_bit_ops = - { - (void*)&_i2c_bdata, - _set_sda, - _set_scl, - _get_sda, - _get_scl, - acm32_udelay, - 1, - 100 - }; + LOG_D("software simulation %s init done, pin scl: %d, pin sda: %d", + soft_i2c_config[i].bus_name, + soft_i2c_config[i].scl, + soft_i2c_config[i].sda); + } - drv_i2c_gpio_init(&_i2c_bdata); - - i2c_device.priv = (void *)&_i2c_bit_ops; - rt_i2c_bit_add_bus(&i2c_device, I2C_BUS_NAME); - - return 0; + return RT_EOK; } INIT_DEVICE_EXPORT(rt_soft_i2c_init); diff --git a/bsp/acm32/acm32f0x0-nucleo/drivers/drv_soft_i2c.h b/bsp/acm32/acm32f0x0-nucleo/drivers/drv_soft_i2c.h new file mode 100644 index 0000000000..fce6a0f0eb --- /dev/null +++ b/bsp/acm32/acm32f0x0-nucleo/drivers/drv_soft_i2c.h @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2006-2024, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2024-04-23 LZero Modify the I2C framework. + */ + +#ifndef __DRV_I2C__ +#define __DRV_I2C__ + +#include +#include +#include +#include +#include + +/* acm32 config class */ +struct acm32_soft_i2c_config +{ + rt_uint8_t scl; + rt_uint8_t sda; + const char *bus_name; +}; +/* acm32 i2c dirver class */ + +struct acm32_i2c +{ + struct rt_i2c_bit_ops ops; + struct rt_i2c_bus_device i2c_bus; +}; + +#ifdef BSP_USING_I2C0 +#define I2C0_BUS_CONFIG \ + { \ + .scl = BSP_I2C0_SCL_PIN, \ + .sda = BSP_I2C0_SDA_PIN, \ + .bus_name = "i2c0", \ + } +#endif + +#endif //__DRV_I2C__ diff --git a/bsp/airm2m/air32f103/libraries/rt_drivers/drv_soft_i2c.c b/bsp/airm2m/air32f103/libraries/rt_drivers/drv_soft_i2c.c index e4815d7aeb..5ca9a4e55b 100644 --- a/bsp/airm2m/air32f103/libraries/rt_drivers/drv_soft_i2c.c +++ b/bsp/airm2m/air32f103/libraries/rt_drivers/drv_soft_i2c.c @@ -56,6 +56,16 @@ static void air32_i2c_gpio_init(struct air32_i2c *i2c) rt_pin_write(cfg->sda, PIN_HIGH); } +static void air32_i2c_pin_init(void) +{ + rt_size_t obj_num = sizeof(i2c_obj) / sizeof(struct air32_i2c); + + for(rt_size_t i = 0; i < obj_num; i++) + { + air32_i2c_gpio_init(&i2c_obj[i]); + } +} + /** * This function sets the sda pin. * @@ -153,13 +163,15 @@ static void air32_udelay(rt_uint32_t us) static const struct rt_i2c_bit_ops air32_bit_ops_default = { .data = RT_NULL, + .pin_init = air32_i2c_pin_init, .set_sda = air32_set_sda, .set_scl = air32_set_scl, .get_sda = air32_get_sda, .get_scl = air32_get_scl, .udelay = air32_udelay, .delay_us = 1, - .timeout = 100 + .timeout = 100, + .i2c_pin_init_flag = RT_FALSE }; /** @@ -201,7 +213,7 @@ int rt_sw_i2c_init(void) i2c_obj[i].ops = air32_bit_ops_default; i2c_obj[i].ops.data = (void*)&soft_i2c_config[i]; i2c_obj[i].i2c_bus.priv = &i2c_obj[i].ops; - air32_i2c_gpio_init(&i2c_obj[i]); + result = rt_i2c_bit_add_bus(&i2c_obj[i].i2c_bus, soft_i2c_config[i].bus_name); RT_ASSERT(result == RT_EOK); air32_i2c_bus_unlock(&soft_i2c_config[i]); diff --git a/bsp/apm32/libraries/Drivers/drv_soft_i2c.c b/bsp/apm32/libraries/Drivers/drv_soft_i2c.c index e9e6b1fcf0..bb488c75b4 100644 --- a/bsp/apm32/libraries/Drivers/drv_soft_i2c.c +++ b/bsp/apm32/libraries/Drivers/drv_soft_i2c.c @@ -86,6 +86,16 @@ static void apm32_soft_i2c_gpio_init(struct apm32_soft_i2c *i2c) rt_pin_write(cfg->sda_pin, PIN_HIGH); } +static void apm32_i2c_pin_init(void) +{ + rt_size_t obj_num = sizeof(i2c_obj) / sizeof(struct apm32_soft_i2c); + + for(rt_size_t i = 0; i < obj_num; i++) + { + apm32_soft_i2c_gpio_init(&i2c_obj[i]); + } +} + /** * @brief This function sets the sda pin. * @@ -199,13 +209,15 @@ static rt_err_t apm32_i2c_bus_unlock(const struct apm32_soft_i2c_config *cfg) static const struct rt_i2c_bit_ops apm32_bit_ops_default = { .data = RT_NULL, + .pin_init = apm32_i2c_pin_init, .set_sda = apm32_soft_i2c_set_sda, .set_scl = apm32_soft_i2c_set_scl, .get_sda = apm32_soft_i2c_get_sda, .get_scl = apm32_soft_i2c_get_scl, .udelay = apm32_soft_i2c_udelay, .delay_us = 1, - .timeout = 100 + .timeout = 100, + .i2c_pin_init_flag = RT_FALSE }; /** @@ -218,12 +230,11 @@ int rt_hw_i2c_init(void) rt_size_t obj_num = sizeof(i2c_obj) / sizeof(struct apm32_soft_i2c); rt_err_t result; - for (int i = 0; i < obj_num; i++) + for (rt_size_t i = 0; i < obj_num; i++) { i2c_obj[i].ops = apm32_bit_ops_default; i2c_obj[i].ops.data = (void *)&soft_i2c_config[i]; i2c_obj[i].i2c_bus.priv = &i2c_obj[i].ops; - apm32_soft_i2c_gpio_init(&i2c_obj[i]); result = rt_i2c_bit_add_bus(&i2c_obj[i].i2c_bus, soft_i2c_config[i].bus_name); diff --git a/bsp/at32/libraries/rt_drivers/drv_soft_i2c.c b/bsp/at32/libraries/rt_drivers/drv_soft_i2c.c index 4938d1c18a..711d1e66f5 100644 --- a/bsp/at32/libraries/rt_drivers/drv_soft_i2c.c +++ b/bsp/at32/libraries/rt_drivers/drv_soft_i2c.c @@ -53,6 +53,16 @@ static void at32_i2c_gpio_init(struct at32_i2c *i2c) rt_pin_write(cfg->sda, PIN_HIGH); } +static void at32_i2c_pin_init(void) +{ + rt_size_t obj_num = sizeof(i2c_obj) / sizeof(struct at32_i2c); + + for(rt_size_t i = 0; i < obj_num; i++) + { + at32_i2c_gpio_init(&i2c_obj[i]); + } +} + /** * this function sets the sda pin. * @@ -151,13 +161,15 @@ static void at32_udelay(rt_uint32_t us) static const struct rt_i2c_bit_ops at32_bit_ops_default = { .data = RT_NULL, + .pin_init = at32_i2c_pin_init, .set_sda = at32_set_sda, .set_scl = at32_set_scl, .get_sda = at32_get_sda, .get_scl = at32_get_scl, .udelay = at32_udelay, .delay_us = 1, - .timeout = 100 + .timeout = 100, + .i2c_pin_init_flag = RT_FALSE }; /** @@ -195,12 +207,12 @@ int rt_hw_i2c_init(void) rt_size_t obj_num = sizeof(i2c_obj) / sizeof(struct at32_i2c); rt_err_t result; - for (int i = 0; i < obj_num; i++) + for (rt_size_t i = 0; i < obj_num; i++) { i2c_obj[i].ops = at32_bit_ops_default; i2c_obj[i].ops.data = (void*)&soft_i2c_config[i]; i2c_obj[i].i2c_bus.priv = &i2c_obj[i].ops; - at32_i2c_gpio_init(&i2c_obj[i]); + result = rt_i2c_bit_add_bus(&i2c_obj[i].i2c_bus, soft_i2c_config[i].bus_name); RT_ASSERT(result == RT_EOK); at32_i2c_bus_unlock(&soft_i2c_config[i]); diff --git a/bsp/at91/at91sam9260/drivers/at91_i2c_gpio.c b/bsp/at91/at91sam9260/drivers/at91_i2c_gpio.c index d863ffed88..09500e5007 100644 --- a/bsp/at91/at91sam9260/drivers/at91_i2c_gpio.c +++ b/bsp/at91/at91sam9260/drivers/at91_i2c_gpio.c @@ -13,7 +13,7 @@ #include -static void at91_i2c_gpio_init() +static void at91_i2c_gpio_init(void) { at91_sys_write(AT91_PMC_PCER, 1 << AT91SAM9260_ID_PIOA); //enable PIOA clock at91_sys_write(AT91_PIOA + PIO_PUER, (1 << 23)); @@ -83,11 +83,11 @@ static const struct rt_i2c_bit_ops bit_ops = { at91_set_scl, at91_get_sda, at91_get_scl, - at91_udelay, - 5, - 100 + 100, + at91_i2c_gpio_init, + RT_FALSE }; int at91_i2c_init(void) @@ -105,8 +105,6 @@ int at91_i2c_init(void) bus->priv = (void *)&bit_ops; - at91_i2c_gpio_init(); - rt_i2c_bit_add_bus(bus, "i2c0"); return 0; diff --git a/bsp/at91/at91sam9g45/drivers/at91_i2c_gpio.c b/bsp/at91/at91sam9g45/drivers/at91_i2c_gpio.c index d229cbd1bb..a25dc11bb2 100644 --- a/bsp/at91/at91sam9g45/drivers/at91_i2c_gpio.c +++ b/bsp/at91/at91sam9g45/drivers/at91_i2c_gpio.c @@ -13,7 +13,7 @@ #include -static void at91_i2c_gpio_init() +static void at91_i2c_gpio_init(void) { AT91C_BASE_PMC->PMC_PCER = 1 << AT91C_ID_PIOA; //enable PIOA clock AT91C_BASE_PIOA->PIO_PUER = (1 << 23); @@ -83,11 +83,11 @@ static const struct rt_i2c_bit_ops bit_ops = { at91_set_scl, at91_get_sda, at91_get_scl, - at91_udelay, - 5, - 100 + 100, + at91_i2c_gpio_init, + RT_FALSE }; int at91_i2c_init(void) @@ -105,8 +105,6 @@ int at91_i2c_init(void) bus->priv = (void *)&bit_ops; - at91_i2c_gpio_init(); - rt_i2c_bit_add_bus(bus, "i2c0"); return 0; diff --git a/bsp/avr32/drivers/drv_soft_i2c.c b/bsp/avr32/drivers/drv_soft_i2c.c index 1aa9bd1856..2f7b15969d 100644 --- a/bsp/avr32/drivers/drv_soft_i2c.c +++ b/bsp/avr32/drivers/drv_soft_i2c.c @@ -39,6 +39,16 @@ static void avr32_i2c_gpio_init(struct avr32_i2c *i2c) gpio_set_gpio_open_drain_pin(cfg->sda); } +static void avr32_i2c_pin_init(void) +{ + rt_size_t obj_num = sizeof(i2c_obj) / sizeof(struct avr32_i2c); + + for(rt_size_t i = 0; i < obj_num; i++) + { + avr32_i2c_gpio_init(&i2c_obj[i]); + } +} + /** * This function sets the SDA pin. * @@ -102,13 +112,15 @@ static rt_int32_t avr32_get_scl(void *data) static const struct rt_i2c_bit_ops avr32_bit_ops_default = { .data = RT_NULL, + .pin_init = avr32_i2c_pin_init, .set_sda = avr32_set_sda, .set_scl = avr32_set_scl, .get_sda = avr32_get_sda, .get_scl = avr32_get_scl, .udelay = rt_hw_us_delay, .delay_us = 1, - .timeout = 100 + .timeout = 100, + .i2c_pin_init_flag = RT_FALSE }; /** @@ -151,7 +163,7 @@ int rt_sw_i2c_init(void) i2c_obj[i].ops = avr32_bit_ops_default; i2c_obj[i].ops.data = (void*)&soft_i2c_config[i]; i2c_obj[i].i2c_bus.priv = &i2c_obj[i].ops; - avr32_i2c_gpio_init(&i2c_obj[i]); + result = rt_i2c_bit_add_bus(&i2c_obj[i].i2c_bus, soft_i2c_config[i].bus_name); RT_ASSERT(result == RT_EOK); avr32_i2c_bus_unlock(&soft_i2c_config[i]); diff --git a/bsp/bluetrum/libraries/hal_drivers/drv_soft_i2c.c b/bsp/bluetrum/libraries/hal_drivers/drv_soft_i2c.c index c76f367978..9d0c383b5d 100644 --- a/bsp/bluetrum/libraries/hal_drivers/drv_soft_i2c.c +++ b/bsp/bluetrum/libraries/hal_drivers/drv_soft_i2c.c @@ -58,6 +58,16 @@ static void ab32_i2c_gpio_init(struct ab32_i2c *i2c) rt_pin_write(cfg->sda, PIN_HIGH); } +static void ab32_i2c_pin_init(void) +{ + rt_size_t obj_num = sizeof(i2c_obj) / sizeof(struct ab32_i2c); + + for(rt_size_t i = 0; i < obj_num; i++) + { + ab32_i2c_gpio_init(&i2c_obj[i]); + } +} + /** * This function sets the sda pin. * @@ -145,13 +155,15 @@ static rt_int32_t ab32_get_scl(void *data) static const struct rt_i2c_bit_ops ab32_bit_ops_default = { .data = RT_NULL, + .pin_init = ab32_i2c_pin_init, .set_sda = ab32_set_sda, .set_scl = ab32_set_scl, .get_sda = ab32_get_sda, .get_scl = ab32_get_scl, .udelay = rt_hw_us_delay, .delay_us = 1, - .timeout = 100 + .timeout = 100, + .i2c_pin_init_flag = RT_FALSE }; /** @@ -189,12 +201,12 @@ int rt_hw_i2c_init(void) rt_size_t obj_num = sizeof(i2c_obj) / sizeof(struct ab32_i2c); rt_err_t result; - for (int i = 0; i < obj_num; i++) + for (rt_size_t i = 0; i < obj_num; i++) { i2c_obj[i].ops = ab32_bit_ops_default; i2c_obj[i].ops.data = (void*)&soft_i2c_config[i]; i2c_obj[i].i2c_bus.priv = &i2c_obj[i].ops; - ab32_i2c_gpio_init(&i2c_obj[i]); + result = rt_i2c_bit_add_bus(&i2c_obj[i].i2c_bus, soft_i2c_config[i].bus_name); RT_ASSERT(result == RT_EOK); ab32_i2c_bus_unlock(&soft_i2c_config[i]); diff --git a/bsp/bouffalo_lab/libraries/rt_drivers/drv_soft_i2c.c b/bsp/bouffalo_lab/libraries/rt_drivers/drv_soft_i2c.c index 4734b3888d..5a4ad8bb50 100644 --- a/bsp/bouffalo_lab/libraries/rt_drivers/drv_soft_i2c.c +++ b/bsp/bouffalo_lab/libraries/rt_drivers/drv_soft_i2c.c @@ -140,6 +140,16 @@ static void bl_i2c_gpio_init(struct bl_i2c *i2c) rt_pin_write(cfg->sda, PIN_HIGH); } +static void bl_i2c_pin_init(void) +{ + rt_size_t obj_num = sizeof(i2c_obj) / sizeof(struct bl_i2c); + + for(rt_size_t i = 0; i < obj_num; i++) + { + bl_i2c_gpio_init(&i2c_obj[i]); + } +} + /** * This function sets the sda pin. * @@ -213,13 +223,15 @@ static void bl_udelay(rt_uint32_t us) static const struct rt_i2c_bit_ops bl_bit_ops_default = { .data = RT_NULL, + .pin_init = bl_i2c_pin_init, .set_sda = bl_set_sda, .set_scl = bl_set_scl, .get_sda = bl_get_sda, .get_scl = bl_get_scl, .udelay = bl_udelay, .delay_us = 1, - .timeout = 100 + .timeout = 100, + .i2c_pin_init_flag = RT_FALSE }; /** @@ -261,7 +273,7 @@ int rt_hw_i2c_init(void) i2c_obj[i].ops = bl_bit_ops_default; i2c_obj[i].ops.data = (void*)&soft_i2c_config[i]; i2c_obj[i].i2c_bus.priv = &i2c_obj[i].ops; - bl_i2c_gpio_init(&i2c_obj[i]); + result = rt_i2c_bit_add_bus(&i2c_obj[i].i2c_bus, soft_i2c_config[i].bus_name); RT_ASSERT(result == RT_EOK); bl_i2c_bus_unlock(&soft_i2c_config[i]); diff --git a/bsp/gd32/arm/libraries/gd32_drivers/drv_soft_i2c.c b/bsp/gd32/arm/libraries/gd32_drivers/drv_soft_i2c.c index 75d976285b..a6a27c355b 100644 --- a/bsp/gd32/arm/libraries/gd32_drivers/drv_soft_i2c.c +++ b/bsp/gd32/arm/libraries/gd32_drivers/drv_soft_i2c.c @@ -53,6 +53,16 @@ static void gd32_i2c_gpio_init(struct gd32_i2c *i2c) rt_pin_write(cfg->sda, PIN_HIGH); } +static void gd32_i2c_pin_init(void) +{ + rt_size_t obj_num = sizeof(i2c_obj) / sizeof(struct gd32_i2c); + + for(rt_size_t i = 0; i < obj_num; i++) + { + gd32_i2c_gpio_init(&i2c_obj[i]); + } +} + /** * @brief This function sets the sda pin. * @param data, state @@ -129,13 +139,15 @@ static void gd32_udelay(rt_uint32_t us) static const struct rt_i2c_bit_ops gd32_bit_ops_default = { .data = RT_NULL, + .pin_init = gd32_i2c_pin_init, .set_sda = gd32_set_sda, .set_scl = gd32_set_scl, .get_sda = gd32_get_sda, .get_scl = gd32_get_scl, .udelay = gd32_udelay, .delay_us = 1, - .timeout = 100 + .timeout = 100, + .i2c_pin_init_flag = RT_FALSE }; /** @@ -175,12 +187,11 @@ int rt_hw_i2c_init(void) rt_size_t obj_num = sizeof(i2c_obj) / sizeof(struct gd32_i2c); rt_err_t result; - for (int i = 0; i < obj_num; i++) + for (rt_size_t i = 0; i < obj_num; i++) { i2c_obj[i].ops = gd32_bit_ops_default; i2c_obj[i].ops.data = (void*)&soft_i2c_config[i]; i2c_obj[i].i2c_bus.priv = &i2c_obj[i].ops; - gd32_i2c_gpio_init(&i2c_obj[i]); result = rt_i2c_bit_add_bus(&i2c_obj[i].i2c_bus, soft_i2c_config[i].bus_name); diff --git a/bsp/gd32/risc-v/libraries/gd32_drivers/drv_soft_i2c.c b/bsp/gd32/risc-v/libraries/gd32_drivers/drv_soft_i2c.c index 956cbdd460..b149131c5c 100644 --- a/bsp/gd32/risc-v/libraries/gd32_drivers/drv_soft_i2c.c +++ b/bsp/gd32/risc-v/libraries/gd32_drivers/drv_soft_i2c.c @@ -53,6 +53,16 @@ static void gd32_i2c_gpio_init(struct gd32_i2c *i2c) rt_pin_write(cfg->sda, PIN_HIGH); } +static void gd32_i2c_pin_init(void) +{ + rt_size_t obj_num = sizeof(i2c_obj) / sizeof(struct gd32_i2c); + + for(rt_size_t i = 0; i < obj_num; i++) + { + gd32_i2c_gpio_init(&i2c_obj[i]); + } +} + /** * @brief This function sets the sda pin. * @param data, state @@ -129,13 +139,15 @@ static void gd32_udelay(rt_uint32_t us) static const struct rt_i2c_bit_ops gd32_bit_ops_default = { .data = RT_NULL, + .pin_init = gd32_i2c_pin_init, .set_sda = gd32_set_sda, .set_scl = gd32_set_scl, .get_sda = gd32_get_sda, .get_scl = gd32_get_scl, .udelay = gd32_udelay, .delay_us = 1, - .timeout = 100 + .timeout = 100, + .i2c_pin_init_flag = RT_FALSE }; /** @@ -175,12 +187,11 @@ int rt_hw_i2c_init(void) rt_size_t obj_num = sizeof(i2c_obj) / sizeof(struct gd32_i2c); rt_err_t result; - for (int i = 0; i < obj_num; i++) + for (rt_size_t = 0; i < obj_num; i++) { i2c_obj[i].ops = gd32_bit_ops_default; i2c_obj[i].ops.data = (void*)&soft_i2c_config[i]; i2c_obj[i].i2c_bus.priv = &i2c_obj[i].ops; - gd32_i2c_gpio_init(&i2c_obj[i]); result = rt_i2c_bit_add_bus(&i2c_obj[i].i2c_bus, soft_i2c_config[i].bus_name); diff --git a/bsp/hc32/libraries/hc32_drivers/drv_soft_i2c.c b/bsp/hc32/libraries/hc32_drivers/drv_soft_i2c.c index 0111e2c95f..273c5079a4 100644 --- a/bsp/hc32/libraries/hc32_drivers/drv_soft_i2c.c +++ b/bsp/hc32/libraries/hc32_drivers/drv_soft_i2c.c @@ -84,6 +84,16 @@ static void hc32_i2c_gpio_init(struct hc32_soft_i2c *i2c) rt_pin_write(cfg->sda_pin, PIN_HIGH); } +static void hc32_i2c_pin_init(void) +{ + rt_size_t obj_num = sizeof(i2c_obj) / sizeof(struct hc32_soft_i2c); + + for(rt_size_t i = 0; i < obj_num; i++) + { + hc32_i2c_gpio_init(&i2c_obj[i]); + } +} + /** * This function sets the sda pin. * @@ -184,13 +194,15 @@ static void hc32_udelay(rt_uint32_t us) static const struct rt_i2c_bit_ops hc32_bit_ops_default = { .data = RT_NULL, + .pin_init = hc_i2c_pin_init, .set_sda = hc32_set_sda, .set_scl = hc32_set_scl, .get_sda = hc32_get_sda, .get_scl = hc32_get_scl, .udelay = hc32_udelay, .delay_us = 1, - .timeout = 100 + .timeout = 100, + .i2c_pin_init_flag = RT_FALSE }; /** @@ -228,12 +240,12 @@ int hc32_soft_i2c_init(void) rt_size_t obj_num = sizeof(i2c_obj) / sizeof(struct hc32_soft_i2c); rt_err_t result; - for (int i = 0; i < obj_num; i++) + for (rt_size_t i = 0; i < obj_num; i++) { i2c_obj[i].ops = hc32_bit_ops_default; i2c_obj[i].ops.data = (void *)&soft_i2c_config[i]; i2c_obj[i].i2c_bus.priv = &i2c_obj[i].ops; - hc32_i2c_gpio_init(&i2c_obj[i]); + result = rt_i2c_bit_add_bus(&i2c_obj[i].i2c_bus, soft_i2c_config[i].bus_name); RT_ASSERT(result == RT_EOK); hc32_i2c_bus_unlock(&soft_i2c_config[i]); diff --git a/bsp/hk32/libraries/rt_drivers/drv_soft_i2c.c b/bsp/hk32/libraries/rt_drivers/drv_soft_i2c.c index 1dcfcf51e4..6daf5b30a3 100644 --- a/bsp/hk32/libraries/rt_drivers/drv_soft_i2c.c +++ b/bsp/hk32/libraries/rt_drivers/drv_soft_i2c.c @@ -55,6 +55,16 @@ static void hk32_i2c_gpio_init(struct hk32_i2c *i2c) rt_pin_write(cfg->sda, PIN_HIGH); } +static void hk32_i2c_pin_init(void) +{ + rt_size_t obj_num = sizeof(i2c_obj) / sizeof(struct hk32_i2c); + + for(rt_size_t i = 0; i < obj_num; i++) + { + hk32_i2c_gpio_init(&i2c_obj[i]); + } +} + /** * This function sets the sda pin. * @@ -152,13 +162,15 @@ static void hk32_udelay(rt_uint32_t us) static const struct rt_i2c_bit_ops hk32_bit_ops_default = { .data = RT_NULL, + .pin_init = hk32_i2c_pin_init, .set_sda = hk32_set_sda, .set_scl = hk32_set_scl, .get_sda = hk32_get_sda, .get_scl = hk32_get_scl, .udelay = hk32_udelay, .delay_us = 1, - .timeout = 100 + .timeout = 100, + .i2c_pin_init_flag = RT_FALSE }; /** @@ -201,7 +213,7 @@ int rt_hw_i2c_init(void) i2c_obj[i].ops = hk32_bit_ops_default; i2c_obj[i].ops.data = (void *)&soft_i2c_config[i]; i2c_obj[i].i2c_bus.priv = &i2c_obj[i].ops; - hk32_i2c_gpio_init(&i2c_obj[i]); + result = rt_i2c_bit_add_bus(&i2c_obj[i].i2c_bus, soft_i2c_config[i].bus_name); RT_ASSERT(result == RT_EOK); hk32_i2c_bus_unlock(&soft_i2c_config[i]); diff --git a/bsp/loongson/ls1cdev/drivers/drv_i2c.c b/bsp/loongson/ls1cdev/drivers/drv_i2c.c index 374b625c70..50c27fc8ba 100644 --- a/bsp/loongson/ls1cdev/drivers/drv_i2c.c +++ b/bsp/loongson/ls1cdev/drivers/drv_i2c.c @@ -81,17 +81,18 @@ static rt_int32_t ls1c_get_scl(void *data) } -static const struct rt_i2c_bit_ops bit_ops = { +static const struct rt_i2c_bit_ops bit_ops = +{ .data = RT_NULL, + .pin_init = ls1c_i2c_gpio_init, .set_sda = ls1c_set_sda, .set_scl = ls1c_set_scl, .get_sda = ls1c_get_sda, .get_scl = ls1c_get_scl, - .udelay = ls1c_udelay, - .delay_us = 20, // 此值为周期(us) .timeout = 10, // 单位为tick + .i2c_pin_init_flag = RT_FALSE }; @@ -102,8 +103,6 @@ int ls1c_i2c_init(void) bus.priv = (void *)&bit_ops; - ls1c_i2c_gpio_init(); - rt_i2c_bit_add_bus(&bus, "i2c3"); return RT_EOK; diff --git a/bsp/n32/libraries/n32_drivers/drv_i2c.c b/bsp/n32/libraries/n32_drivers/drv_i2c.c index d1cec93bf0..6f22c63a93 100644 --- a/bsp/n32/libraries/n32_drivers/drv_i2c.c +++ b/bsp/n32/libraries/n32_drivers/drv_i2c.c @@ -60,6 +60,16 @@ static void n32_i2c_gpio_init(struct n32_i2c *i2c) rt_pin_write(cfg->sda, PIN_HIGH); } +static void n32_i2c_pin_init(void) +{ + rt_size_t obj_num = sizeof(i2c_obj) / sizeof(struct n32_i2c); + + for(rt_size_t i = 0; i < obj_num; i++) + { + n32_i2c_gpio_init(&i2c_obj[i]); + } +} + /** *\*\name n32_set_sda *\*\fun sets the sda pin. @@ -166,13 +176,15 @@ static void n32_udelay(rt_uint32_t us) static const struct rt_i2c_bit_ops n32_bit_ops_default = { .data = RT_NULL, + .pin_init = n32_i2c_pin_init, .set_sda = n32_set_sda, .set_scl = n32_set_scl, .get_sda = n32_get_sda, .get_scl = n32_get_scl, .udelay = n32_udelay, .delay_us = 1, - .timeout = 100 + .timeout = 100, + .i2c_pin_init_flag = RT_FALSE }; @@ -391,13 +403,12 @@ int rt_hw_i2c_init(void) rt_size_t obj_num = sizeof(i2c_obj) / sizeof(struct n32_i2c); rt_err_t result; - for(int i = 0; i < obj_num; i++) + for(rt_size_t i = 0; i < obj_num; i++) { i2c_obj[i].ops = n32_bit_ops_default; i2c_obj[i].ops.data = (void*)&soft_i2c_config[i]; i2c_obj[i].i2c_bus.priv = &i2c_obj[i].ops; - n32_i2c_gpio_init(&i2c_obj[i]); result = rt_i2c_bit_add_bus(&i2c_obj[i].i2c_bus, soft_i2c_config[i].bus_name); RT_ASSERT(result == RT_EOK); diff --git a/bsp/n32g452xx/Libraries/rt_drivers/drv_soft_i2c.c b/bsp/n32g452xx/Libraries/rt_drivers/drv_soft_i2c.c index 63215d1678..2a5bed3033 100644 --- a/bsp/n32g452xx/Libraries/rt_drivers/drv_soft_i2c.c +++ b/bsp/n32g452xx/Libraries/rt_drivers/drv_soft_i2c.c @@ -55,6 +55,16 @@ static void n32_i2c_gpio_init(struct n32_i2c *i2c) rt_pin_write(cfg->sda, PIN_HIGH); } +static void n32_i2c_pin_init(void) +{ + rt_size_t obj_num = sizeof(i2c_obj) / sizeof(struct n32_i2c); + + for(rt_size_t i = 0; i < obj_num; i++) + { + n32_i2c_gpio_init(&i2c_obj[i]); + } +} + /** * This function sets the sda pin. * @@ -152,13 +162,15 @@ static void n32_udelay(rt_uint32_t us) static const struct rt_i2c_bit_ops n32_bit_ops_default = { .data = RT_NULL, + .pin_init = n32_i2c_pin_init, .set_sda = n32_set_sda, .set_scl = n32_set_scl, .get_sda = n32_get_sda, .get_scl = n32_get_scl, .udelay = n32_udelay, .delay_us = 1, - .timeout = 100 + .timeout = 100, + .i2c_pin_init_flag = RT_FALSE }; /** @@ -196,12 +208,12 @@ int rt_hw_i2c_init(void) rt_size_t obj_num = sizeof(i2c_obj) / sizeof(struct n32_i2c); rt_err_t result; - for (int i = 0; i < obj_num; i++) + for (rt_size_t i = 0; i < obj_num; i++) { i2c_obj[i].ops = n32_bit_ops_default; i2c_obj[i].ops.data = (void *)&soft_i2c_config[i]; i2c_obj[i].i2c_bus.priv = &i2c_obj[i].ops; - n32_i2c_gpio_init(&i2c_obj[i]); + result = rt_i2c_bit_add_bus(&i2c_obj[i].i2c_bus, soft_i2c_config[i].bus_name); RT_ASSERT(result == RT_EOK); n32_i2c_bus_unlock(&soft_i2c_config[i]); diff --git a/bsp/raspberry-pico/drivers/drv_soft_i2c.c b/bsp/raspberry-pico/drivers/drv_soft_i2c.c index 1b9421c136..bbda17c61c 100644 --- a/bsp/raspberry-pico/drivers/drv_soft_i2c.c +++ b/bsp/raspberry-pico/drivers/drv_soft_i2c.c @@ -38,6 +38,16 @@ static void pico_i2c_gpio_init(struct pico_i2c *i2c) rt_pin_write(cfg->sda, PIN_HIGH); } +static void pico_i2c_pin_init(void) +{ + rt_size_t obj_num = sizeof(i2c_obj) / sizeof(struct pico_i2c); + + for(rt_size_t i = 0; i < obj_num; i++) + { + pico_i2c_gpio_init(&i2c_obj[i]); + } +} + /** * This function sets the sda pin. * @@ -111,13 +121,15 @@ static void pico_udelay(rt_uint32_t us) static const struct rt_i2c_bit_ops pico_bit_ops_default = { .data = RT_NULL, + .pin_init = pico_i2c_pin_init, .set_sda = pico_set_sda, .set_scl = pico_set_scl, .get_sda = pico_get_sda, .get_scl = pico_get_scl, .udelay = pico_udelay, .delay_us = 1, - .timeout = 100 + .timeout = 100, + .i2c_pin_init_flag = RT_FALSE }; /** @@ -159,7 +171,7 @@ int rt_soft_i2c_init(void) i2c_obj[i].ops = pico_bit_ops_default; i2c_obj[i].ops.data = (void*)&soft_i2c_config[i]; i2c_obj[i].i2c_bus.priv = &i2c_obj[i].ops; - pico_i2c_gpio_init(&i2c_obj[i]); + result = rt_i2c_bit_add_bus(&i2c_obj[i].i2c_bus, soft_i2c_config[i].bus_name); RT_ASSERT(result == RT_EOK); pico_i2c_bus_unlock(&soft_i2c_config[i]); diff --git a/bsp/renesas/libraries/HAL_Drivers/drv_soft_i2c.c b/bsp/renesas/libraries/HAL_Drivers/drv_soft_i2c.c index 3eede605a1..d0cecb7162 100644 --- a/bsp/renesas/libraries/HAL_Drivers/drv_soft_i2c.c +++ b/bsp/renesas/libraries/HAL_Drivers/drv_soft_i2c.c @@ -57,6 +57,16 @@ static void ra_i2c_gpio_init(struct ra_i2c *i2c) rt_pin_write(cfg->sda, PIN_HIGH); } +static void ra_i2c_pin_init(void) +{ + rt_size_t obj_num = sizeof(i2c_obj) / sizeof(struct ra_i2c); + + for(rt_size_t i = 0; i < obj_num; i++) + { + ra_i2c_gpio_init(&i2c_obj[i]); + } +} + /** * This function sets the sda pin. * @@ -154,13 +164,15 @@ static void ra_udelay(rt_uint32_t us) static const struct rt_i2c_bit_ops ra_bit_ops_default = { .data = RT_NULL, + .pin_init = ra_i2c_pin_init, .set_sda = ra_set_sda, .set_scl = ra_set_scl, .get_sda = ra_get_sda, .get_scl = ra_get_scl, .udelay = ra_udelay, .delay_us = 1, - .timeout = 100 + .timeout = 100, + .i2c_pin_init_flag = RT_FALSE }; /** @@ -198,12 +210,11 @@ int rt_hw_i2c_init(void) rt_size_t obj_num = sizeof(i2c_obj) / sizeof(struct ra_i2c); rt_err_t result; - for (int i = 0; i < obj_num; i++) + for (rt_size_t i = 0; i < obj_num; i++) { i2c_obj[i].ops = ra_bit_ops_default; i2c_obj[i].ops.data = (void *)&soft_i2c_config[i]; i2c_obj[i].i2c_bus.priv = &i2c_obj[i].ops; - ra_i2c_gpio_init(&i2c_obj[i]); result = rt_i2c_bit_add_bus(&i2c_obj[i].i2c_bus, soft_i2c_config[i].bus_name); RT_ASSERT(result == RT_EOK); ra_i2c_bus_unlock(&soft_i2c_config[i]); diff --git a/bsp/stm32/libraries/HAL_Drivers/drivers/drv_soft_i2c.c b/bsp/stm32/libraries/HAL_Drivers/drivers/drv_soft_i2c.c index 5592e6c738..37ffde2d40 100644 --- a/bsp/stm32/libraries/HAL_Drivers/drivers/drv_soft_i2c.c +++ b/bsp/stm32/libraries/HAL_Drivers/drivers/drv_soft_i2c.c @@ -56,6 +56,16 @@ static void stm32_i2c_gpio_init(struct stm32_i2c *i2c) rt_pin_write(cfg->sda, PIN_HIGH); } +static void stm32_i2c_pin_init(void) +{ + rt_size_t obj_num = sizeof(i2c_obj) / sizeof(struct stm32_i2c); + + for(rt_size_t i = 0; i < obj_num; i++) + { + stm32_i2c_gpio_init(&i2c_obj[i]); + } +} + /** * This function sets the sda pin. * @@ -119,13 +129,15 @@ static rt_int32_t stm32_get_scl(void *data) static const struct rt_i2c_bit_ops stm32_bit_ops_default = { .data = RT_NULL, + .pin_init = stm32_i2c_pin_init, .set_sda = stm32_set_sda, .set_scl = stm32_set_scl, .get_sda = stm32_get_sda, .get_scl = stm32_get_scl, .udelay = rt_hw_us_delay, .delay_us = 1, - .timeout = 100 + .timeout = 100, + .i2c_pin_init_flag = RT_FALSE }; /** @@ -167,7 +179,6 @@ int rt_hw_i2c_init(void) i2c_obj[i].ops = stm32_bit_ops_default; i2c_obj[i].ops.data = (void*)&soft_i2c_config[i]; i2c_obj[i].i2c_bus.priv = &i2c_obj[i].ops; - stm32_i2c_gpio_init(&i2c_obj[i]); result = rt_i2c_bit_add_bus(&i2c_obj[i].i2c_bus, soft_i2c_config[i].bus_name); RT_ASSERT(result == RT_EOK); stm32_i2c_bus_unlock(&soft_i2c_config[i]); diff --git a/bsp/synwit/libraries/SWM320_drivers/drv_soft_i2c.c b/bsp/synwit/libraries/SWM320_drivers/drv_soft_i2c.c index d2718fb43c..ed9ceb7142 100644 --- a/bsp/synwit/libraries/SWM320_drivers/drv_soft_i2c.c +++ b/bsp/synwit/libraries/SWM320_drivers/drv_soft_i2c.c @@ -91,6 +91,16 @@ static void swm_i2c_gpio_init(struct swm_soft_i2c_device *i2c) rt_pin_write(soft_i2c_cfg->sda, PIN_HIGH); } +static void swm_i2c_pin_init(void) +{ + rt_size_t obj_num = sizeof(i2c_obj) / sizeof(struct swm_soft_i2c_device); + + for(rt_size_t i = 0; i < obj_num; i++) + { + swm_i2c_gpio_init(&i2c_obj[i]); + } +} + /** * This function sets the sda pin. * @@ -191,27 +201,30 @@ static void swm_i2c_udelay(rt_uint32_t us) } static const struct rt_i2c_bit_ops swm_i2c_bit_ops = - { +{ .data = RT_NULL, + .pin_init = swm_i2c_pin_init, .set_sda = swm_i2c_set_sda, .set_scl = swm_i2c_set_scl, .get_sda = swm_i2c_get_sda, .get_scl = swm_i2c_get_scl, .udelay = swm_i2c_udelay, .delay_us = 1, - .timeout = 100}; + .timeout = 100, + .i2c_pin_init_flag = RT_FALSE +}; /* I2C initialization function */ int swm_i2c_init(void) { rt_err_t result; - for (int i = 0; i < sizeof(i2c_obj) / sizeof(struct swm_soft_i2c_device); i++) + for (rt_size_t i = 0; i < sizeof(i2c_obj) / sizeof(struct swm_soft_i2c_device); i++) { i2c_obj[i].ops = swm_i2c_bit_ops; i2c_obj[i].ops.data = (void *)&swm_soft_i2c_cfg[i]; i2c_obj[i].i2c_bus.priv = &i2c_obj[i].ops; - swm_i2c_gpio_init(&i2c_obj[i]); + result = rt_i2c_bit_add_bus(&i2c_obj[i].i2c_bus, swm_soft_i2c_cfg[i].name); RT_ASSERT(result == RT_EOK); diff --git a/bsp/w60x/drivers/drv_soft_i2c.c b/bsp/w60x/drivers/drv_soft_i2c.c index 6b4345c4ca..6cda890ec2 100644 --- a/bsp/w60x/drivers/drv_soft_i2c.c +++ b/bsp/w60x/drivers/drv_soft_i2c.c @@ -61,6 +61,16 @@ static void w60x_i2c_gpio_init(struct w60x_i2c *i2c) tls_gpio_write((enum tls_io_name)sda, 1); } +static void w60x_i2c_pin_init(void) +{ + rt_size_t obj_num = sizeof(i2c_obj) / sizeof(struct w60x_i2c); + + for(rt_size_t i = 0; i < obj_num; i++) + { + w60x_i2c_gpio_init(&i2c_obj[i]); + } +} + /** * This function sets the sda pin. * @@ -143,13 +153,15 @@ static rt_int32_t w60x_get_scl(void *data) static const struct rt_i2c_bit_ops w60x_bit_ops_default = { .data = RT_NULL, + .pin_init = w60x_i2c_pin_init, .set_sda = w60x_set_sda, .set_scl = w60x_set_scl, .get_sda = w60x_get_sda, .get_scl = w60x_get_scl, .udelay = rt_hw_us_delay, .delay_us = 1, - .timeout = 100 + .timeout = 100, + .i2c_pin_init_flag = RT_FALSE }; /** @@ -187,12 +199,12 @@ int rt_soft_i2c_init(void) rt_size_t obj_num = sizeof(i2c_obj) / sizeof(struct w60x_i2c); rt_err_t result; - for (int i = 0; i < obj_num; i++) + for (rt_size_t i = 0; i < obj_num; i++) { i2c_obj[i].ops = w60x_bit_ops_default; i2c_obj[i].ops.data = (void*)&soft_i2c_config[i]; i2c_obj[i].i2c_bus.priv = &i2c_obj[i].ops; - w60x_i2c_gpio_init(&i2c_obj[i]); + result = rt_i2c_bit_add_bus(&i2c_obj[i].i2c_bus, soft_i2c_config[i].bus_name); RT_ASSERT(result == RT_EOK); w60x_i2c_bus_unlock(&soft_i2c_config[i]); diff --git a/bsp/wch/risc-v/Libraries/ch32_drivers/drv_soft_i2c.c b/bsp/wch/risc-v/Libraries/ch32_drivers/drv_soft_i2c.c index 46f3a97d2e..149d2efb62 100644 --- a/bsp/wch/risc-v/Libraries/ch32_drivers/drv_soft_i2c.c +++ b/bsp/wch/risc-v/Libraries/ch32_drivers/drv_soft_i2c.c @@ -50,6 +50,16 @@ static void ch32_i2c_gpio_init(struct ch32_i2c *i2c) rt_pin_write(cfg->sda, PIN_HIGH); } +static void ch32_i2c_pin_init(void) +{ + rt_size_t obj_num = sizeof(i2c_obj) / sizeof(struct ch32_i2c); + + for(rt_size_t i = 0; i < obj_num; i++) + { + ch32_i2c_gpio_init(&i2c_obj[i]); + } +} + /* * This function sets the sda pin. * @@ -148,13 +158,15 @@ static void ch32_udelay(rt_uint32_t us) static const struct rt_i2c_bit_ops ch32_bit_ops_default = { .data = RT_NULL, + .pin_init = ch32_i2c_pin_init, .set_sda = ch32_set_sda, .set_scl = ch32_set_scl, .get_sda = ch32_get_sda, .get_scl = ch32_get_scl, .udelay = ch32_udelay, .delay_us = 1, - .timeout = 100 + .timeout = 100, + .i2c_pin_init_flag = RT_FALSE }; /* @@ -192,12 +204,12 @@ int rt_hw_i2c_init(void) rt_size_t obj_num = sizeof(i2c_obj) / sizeof(struct ch32_i2c); rt_err_t result; - for (int i = 0; i < obj_num; i++) + for (rt_size_t i = 0; i < obj_num; i++) { i2c_obj[i].ops = ch32_bit_ops_default; i2c_obj[i].ops.data = (void*)&soft_i2c_config[i]; i2c_obj[i].i2c_bus.priv = &i2c_obj[i].ops; - ch32_i2c_gpio_init(&i2c_obj[i]); + result = rt_i2c_bit_add_bus(&i2c_obj[i].i2c_bus, soft_i2c_config[i].bus_name); RT_ASSERT(result == RT_EOK); ch32_i2c_bus_unlock(&soft_i2c_config[i]); diff --git a/components/drivers/i2c/i2c-bit-ops.c b/components/drivers/i2c/i2c-bit-ops.c index 1a36ee643e..005cf9035e 100644 --- a/components/drivers/i2c/i2c-bit-ops.c +++ b/components/drivers/i2c/i2c-bit-ops.c @@ -376,6 +376,12 @@ static rt_ssize_t i2c_bit_xfer(struct rt_i2c_bus_device *bus, rt_uint32_t i; rt_uint16_t ignore_nack; + if((ops->i2c_pin_init_flag == RT_FALSE) && (ops->pin_init != RT_NULL)) + { + ops->pin_init(); + ops->i2c_pin_init_flag = RT_TRUE; + } + if (num == 0) return 0; for (i = 0; i < num; i++) diff --git a/components/drivers/include/drivers/i2c-bit-ops.h b/components/drivers/include/drivers/i2c-bit-ops.h index ef278caa2c..2b4ea57990 100644 --- a/components/drivers/include/drivers/i2c-bit-ops.h +++ b/components/drivers/include/drivers/i2c-bit-ops.h @@ -27,6 +27,9 @@ struct rt_i2c_bit_ops rt_uint32_t delay_us; /* scl and sda line delay */ rt_uint32_t timeout; /* in tick */ + + void (*pin_init)(void); + rt_bool_t i2c_pin_init_flag; }; rt_err_t rt_i2c_bit_add_bus(struct rt_i2c_bus_device *bus,