summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLZerro <[email protected]>2024-04-30 08:46:12 +0800
committerGitHub <[email protected]>2024-04-29 20:46:12 -0400
commitf190cba0ab75a18a96002ded96054c435c21be47 (patch)
tree79611031f34d819c77317b9905c9669de1786c51
parent4c9d3be98acafeebe1d530bdb8f71222706ef4ad (diff)
[i2c] adjust the timing for I2C initialization
-rw-r--r--bsp/Infineon/libraries/HAL_Drivers/drv_soft_i2c.c16
-rw-r--r--bsp/acm32/acm32f0x0-nucleo/drivers/Kconfig22
-rw-r--r--bsp/acm32/acm32f0x0-nucleo/drivers/drv_soft_i2c.c140
-rw-r--r--bsp/acm32/acm32f0x0-nucleo/drivers/drv_soft_i2c.h44
-rw-r--r--bsp/airm2m/air32f103/libraries/rt_drivers/drv_soft_i2c.c16
-rw-r--r--bsp/apm32/libraries/Drivers/drv_soft_i2c.c17
-rw-r--r--bsp/at32/libraries/rt_drivers/drv_soft_i2c.c18
-rw-r--r--bsp/at91/at91sam9260/drivers/at91_i2c_gpio.c10
-rw-r--r--bsp/at91/at91sam9g45/drivers/at91_i2c_gpio.c10
-rw-r--r--bsp/avr32/drivers/drv_soft_i2c.c16
-rw-r--r--bsp/bluetrum/libraries/hal_drivers/drv_soft_i2c.c18
-rw-r--r--bsp/bouffalo_lab/libraries/rt_drivers/drv_soft_i2c.c16
-rw-r--r--bsp/gd32/arm/libraries/gd32_drivers/drv_soft_i2c.c17
-rw-r--r--bsp/gd32/risc-v/libraries/gd32_drivers/drv_soft_i2c.c17
-rw-r--r--bsp/hc32/libraries/hc32_drivers/drv_soft_i2c.c18
-rw-r--r--bsp/hk32/libraries/rt_drivers/drv_soft_i2c.c16
-rw-r--r--bsp/loongson/ls1cdev/drivers/drv_i2c.c9
-rw-r--r--bsp/n32/libraries/n32_drivers/drv_i2c.c17
-rw-r--r--bsp/n32g452xx/Libraries/rt_drivers/drv_soft_i2c.c18
-rw-r--r--bsp/raspberry-pico/drivers/drv_soft_i2c.c16
-rw-r--r--bsp/renesas/libraries/HAL_Drivers/drv_soft_i2c.c17
-rw-r--r--bsp/stm32/libraries/HAL_Drivers/drivers/drv_soft_i2c.c15
-rw-r--r--bsp/synwit/libraries/SWM320_drivers/drv_soft_i2c.c21
-rw-r--r--bsp/w60x/drivers/drv_soft_i2c.c18
-rw-r--r--bsp/wch/risc-v/Libraries/ch32_drivers/drv_soft_i2c.c18
-rw-r--r--components/drivers/i2c/i2c-bit-ops.c6
-rw-r--r--components/drivers/include/drivers/i2c-bit-ops.h3
27 files changed, 433 insertions, 136 deletions
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 <board.h>
+#ifdef BSP_USING_SOFT_I2C
-#ifdef RT_USING_I2C_BITOPS
+#include "drv_soft_i2c.h"
-#include <rtdevice.h>
-#include <drivers/pin.h>
+#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"
+static struct acm32_soft_i2c_config soft_i2c_config[] =
+{
+#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;
-/* 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
+ rt_pin_mode(cfg->scl, PIN_MODE_OUTPUT_OD);
+ rt_pin_mode(cfg->sda, PIN_MODE_OUTPUT_OD);
-struct acm32_i2c_bit_data
+ rt_pin_write(cfg->scl, PIN_HIGH);
+ rt_pin_write(cfg->sda, PIN_HIGH);
+}
+
+static void acm32_i2c_pin_init(void)
{
- struct
+ rt_size_t obj_num = sizeof(i2c_obj) / sizeof(struct acm32_i2c);
+
+ for(rt_size_t i = 0; i < obj_num; i++)
{
- enum_GPIOx_t port;
- rt_uint32_t pin;
- } scl, sda;
-};
+ 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 =
- {
- /* SCL */
- { I2C_SCL_PORT, I2C_SCL_PIN},
- /* SDA */
- { I2C_SDA_PORT, I2C_SDA_PIN},
- };
+ rt_err_t result;
- static const struct rt_i2c_bit_ops _i2c_bit_ops =
+ for (rt_size_t i = 0; i < sizeof(i2c_obj) / sizeof(struct acm32_i2c); i++)
{
- (void*)&_i2c_bdata,
- _set_sda,
- _set_scl,
- _get_sda,
- _get_scl,
- acm32_udelay,
- 1,
- 100
- };
+ 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);
- drv_i2c_gpio_init(&_i2c_bdata);
-
- i2c_device.priv = (void *)&_i2c_bit_ops;
- rt_i2c_bit_add_bus(&i2c_device, I2C_BUS_NAME);
+ 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);
+ }
- 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 <rtthread.h>
+#include <board.h>
+#include <rtdbg.h>
+#include <rtdevice.h>
+#include <drivers/pin.h>
+
+/* 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 <at91sam926x.h>
-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 <at91sam9g45.h>
-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,