diff options
| author | CYFS <[email protected]> | 2026-07-15 17:54:33 +0800 |
|---|---|---|
| committer | Rbb666 <[email protected]> | 2026-07-16 13:19:57 +0800 |
| commit | 414ff7f3710168dbf99a398e18b2a4ff8448b005 (patch) | |
| tree | 4d29ff0dadc5cb4aa74941deb4e28bb46ff5ad6d /bsp/raspberry-pico | |
| parent | 997de9433af42aacb1988489ccb08b6688f440cc (diff) | |
[bsp][drivers][soft_i2c] unify the software I2C driver
Diffstat (limited to 'bsp/raspberry-pico')
| -rw-r--r-- | bsp/raspberry-pico/RP2040/.ci/attachconfig/ci.attachconfig.yml | 13 | ||||
| -rw-r--r-- | bsp/raspberry-pico/RP2040/board/Kconfig | 44 | ||||
| -rw-r--r-- | bsp/raspberry-pico/RP2350/.ci/attachconfig/ci.attachconfig.yml | 8 | ||||
| -rw-r--r-- | bsp/raspberry-pico/RP2350/board/Kconfig | 44 | ||||
| -rw-r--r-- | bsp/raspberry-pico/libraries/Drivers/SConscript | 3 | ||||
| -rw-r--r-- | bsp/raspberry-pico/libraries/Drivers/drv_soft_i2c.c | 189 | ||||
| -rw-r--r-- | bsp/raspberry-pico/libraries/Drivers/drv_soft_i2c.h | 46 |
7 files changed, 71 insertions, 276 deletions
diff --git a/bsp/raspberry-pico/RP2040/.ci/attachconfig/ci.attachconfig.yml b/bsp/raspberry-pico/RP2040/.ci/attachconfig/ci.attachconfig.yml index e1aa367595..89aed8b014 100644 --- a/bsp/raspberry-pico/RP2040/.ci/attachconfig/ci.attachconfig.yml +++ b/bsp/raspberry-pico/RP2040/.ci/attachconfig/ci.attachconfig.yml @@ -6,7 +6,6 @@ component.cplusplus: <<: *scons kconfig: - CONFIG_RT_USING_CPLUSPLUS=y -# ------ online-packages CI ------ online-packages.rtduino.core: <<: *scons kconfig: @@ -224,4 +223,14 @@ online-packages.multimedia.lvgl-demo: <<: *scons kconfig: - CONFIG_BSP_USING_LVGL=y - - CONFIG_BSP_USING_LVGL_DEMO=y
\ No newline at end of file + - CONFIG_BSP_USING_LVGL_DEMO=y + +devices.soft_i2c: + <<: *scons + kconfig: + - CONFIG_RT_USING_I2C=y + - CONFIG_RT_USING_SOFT_I2C=y + - CONFIG_RT_USING_SOFT_I2C1=y + - CONFIG_RT_SOFT_I2C1_SCL_PIN=2 + - CONFIG_RT_SOFT_I2C1_SDA_PIN=3 + - CONFIG_RT_SOFT_I2C1_BUS_NAME="swi2c1" diff --git a/bsp/raspberry-pico/RP2040/board/Kconfig b/bsp/raspberry-pico/RP2040/board/Kconfig index b1b70a9a38..9df9bf3e2a 100644 --- a/bsp/raspberry-pico/RP2040/board/Kconfig +++ b/bsp/raspberry-pico/RP2040/board/Kconfig @@ -129,27 +129,24 @@ menu "On-chip Peripheral Drivers" endif menuconfig BSP_USING_SOFT_I2C - bool "Enable I2C BUS (software simulation)" + bool "Enable software I2C (swi2c)" default n select RT_USING_I2C - select RT_USING_I2C_BITOPS - select RT_USING_PIN + select RT_USING_SOFT_I2C if BSP_USING_SOFT_I2C - config BSP_USING_SOFT_I2C1 - bool "Enable I2C1 Bus (software simulation)" - default n - if BSP_USING_SOFT_I2C1 - config BSP_SOFT_I2C1_SCL_PIN - int "i2c1 scl pin number (GP)" - range 0 28 - default 2 - config BSP_SOFT_I2C1_SDA_PIN - int "I2C1 sda pin number (GP)" - range 0 28 - default 3 - endif + menuconfig BSP_USING_SOFT_I2C1 + bool "Enable software I2C1 Bus (swi2c1)" + default n + select RT_USING_SOFT_I2C1 + if BSP_USING_SOFT_I2C1 + config RT_SOFT_I2C1_SCL_PIN + int "swi2c1 SCL pin number" + default 2 + config RT_SOFT_I2C1_SDA_PIN + int "swi2c1 SDA pin number" + default 3 + endif endif - menuconfig BSP_USING_SOFT_SPI bool "Enable soft SPI BUS" default n @@ -684,7 +681,6 @@ menu "On-chip Peripheral Drivers" menuconfig BSP_USING_I2C bool "Enable I2C" select RT_USING_I2C - select RT_USING_I2C_BITOPS select RT_USING_PIN default n @@ -810,4 +806,16 @@ menu "On-chip Peripheral Drivers" endmenu + config RT_SOFT_I2C1_HAS_PIN_DEFAULT + bool + default y if RT_USING_SOFT_I2C1 + + config RT_SOFT_I2C1_SCL_PIN_DEFAULT + int + default 2 if RT_USING_SOFT_I2C1 + + config RT_SOFT_I2C1_SDA_PIN_DEFAULT + int + default 3 if RT_USING_SOFT_I2C1 + endmenu diff --git a/bsp/raspberry-pico/RP2350/.ci/attachconfig/ci.attachconfig.yml b/bsp/raspberry-pico/RP2350/.ci/attachconfig/ci.attachconfig.yml new file mode 100644 index 0000000000..4298872332 --- /dev/null +++ b/bsp/raspberry-pico/RP2350/.ci/attachconfig/ci.attachconfig.yml @@ -0,0 +1,8 @@ +devices.soft_i2c: + kconfig: + - CONFIG_RT_USING_I2C=y + - CONFIG_RT_USING_SOFT_I2C=y + - CONFIG_RT_USING_SOFT_I2C1=y + - CONFIG_RT_SOFT_I2C1_SCL_PIN=2 + - CONFIG_RT_SOFT_I2C1_SDA_PIN=3 + - CONFIG_RT_SOFT_I2C1_BUS_NAME="swi2c1" diff --git a/bsp/raspberry-pico/RP2350/board/Kconfig b/bsp/raspberry-pico/RP2350/board/Kconfig index b1b70a9a38..9df9bf3e2a 100644 --- a/bsp/raspberry-pico/RP2350/board/Kconfig +++ b/bsp/raspberry-pico/RP2350/board/Kconfig @@ -129,27 +129,24 @@ menu "On-chip Peripheral Drivers" endif menuconfig BSP_USING_SOFT_I2C - bool "Enable I2C BUS (software simulation)" + bool "Enable software I2C (swi2c)" default n select RT_USING_I2C - select RT_USING_I2C_BITOPS - select RT_USING_PIN + select RT_USING_SOFT_I2C if BSP_USING_SOFT_I2C - config BSP_USING_SOFT_I2C1 - bool "Enable I2C1 Bus (software simulation)" - default n - if BSP_USING_SOFT_I2C1 - config BSP_SOFT_I2C1_SCL_PIN - int "i2c1 scl pin number (GP)" - range 0 28 - default 2 - config BSP_SOFT_I2C1_SDA_PIN - int "I2C1 sda pin number (GP)" - range 0 28 - default 3 - endif + menuconfig BSP_USING_SOFT_I2C1 + bool "Enable software I2C1 Bus (swi2c1)" + default n + select RT_USING_SOFT_I2C1 + if BSP_USING_SOFT_I2C1 + config RT_SOFT_I2C1_SCL_PIN + int "swi2c1 SCL pin number" + default 2 + config RT_SOFT_I2C1_SDA_PIN + int "swi2c1 SDA pin number" + default 3 + endif endif - menuconfig BSP_USING_SOFT_SPI bool "Enable soft SPI BUS" default n @@ -684,7 +681,6 @@ menu "On-chip Peripheral Drivers" menuconfig BSP_USING_I2C bool "Enable I2C" select RT_USING_I2C - select RT_USING_I2C_BITOPS select RT_USING_PIN default n @@ -810,4 +806,16 @@ menu "On-chip Peripheral Drivers" endmenu + config RT_SOFT_I2C1_HAS_PIN_DEFAULT + bool + default y if RT_USING_SOFT_I2C1 + + config RT_SOFT_I2C1_SCL_PIN_DEFAULT + int + default 2 if RT_USING_SOFT_I2C1 + + config RT_SOFT_I2C1_SDA_PIN_DEFAULT + int + default 3 if RT_USING_SOFT_I2C1 + endmenu diff --git a/bsp/raspberry-pico/libraries/Drivers/SConscript b/bsp/raspberry-pico/libraries/Drivers/SConscript index 5afbe70b28..20d95d2b14 100644 --- a/bsp/raspberry-pico/libraries/Drivers/SConscript +++ b/bsp/raspberry-pico/libraries/Drivers/SConscript @@ -10,9 +10,6 @@ if GetDepend('BSP_USING_PIN'): if GetDepend('BSP_USING_UART'): src += ['drv_uart.c'] -if GetDepend('BSP_USING_SOFT_I2C'): - src += ['drv_soft_i2c.c'] - if GetDepend('BSP_USING_SOFT_SPI'): src += ['drv_soft_spi.c'] diff --git a/bsp/raspberry-pico/libraries/Drivers/drv_soft_i2c.c b/bsp/raspberry-pico/libraries/Drivers/drv_soft_i2c.c deleted file mode 100644 index bbda17c61c..0000000000 --- a/bsp/raspberry-pico/libraries/Drivers/drv_soft_i2c.c +++ /dev/null @@ -1,189 +0,0 @@ -/* - * Copyright (c) 2006-2023, RT-Thread Development Team - * - * SPDX-License-Identifier: Apache-2.0 - * - * Change Logs: - * Date Author Notes - * 2023/06/01 chushicheng first version - */ -#include "drv_soft_i2c.h" - -#ifdef BSP_USING_SOFT_I2C -#define DBG_LEVEL DBG_LOG -#include <rtdbg.h> -#define LOG_TAG "DRV.I2C" - -static const struct pico_soft_i2c_config soft_i2c_config[] = -{ -#ifdef BSP_USING_SOFT_I2C1 - I2C1_BUS_CONFIG, -#endif -}; - -static struct pico_i2c i2c_obj[sizeof(soft_i2c_config) / sizeof(soft_i2c_config[0])]; - -/** - * This function initializes the i2c pin. - * - * @param pico i2c dirver class. - */ -static void pico_i2c_gpio_init(struct pico_i2c *i2c) -{ - struct pico_soft_i2c_config* cfg = (struct pico_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 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. - * - * @param pico config class. - * @param The sda pin state. - */ -static void pico_set_sda(void *data, rt_int32_t state) -{ - struct pico_soft_i2c_config* cfg = (struct pico_soft_i2c_config*)data; - if (state) - { - rt_pin_write(cfg->sda, PIN_HIGH); - } - else - { - rt_pin_write(cfg->sda, PIN_LOW); - } -} - -/** - * This function sets the scl pin. - * - * @param pico config class. - * @param The scl pin state. - */ -static void pico_set_scl(void *data, rt_int32_t state) -{ - struct pico_soft_i2c_config* cfg = (struct pico_soft_i2c_config*)data; - if (state) - { - rt_pin_write(cfg->scl, PIN_HIGH); - } - else - { - rt_pin_write(cfg->scl, PIN_LOW); - } -} - -/** - * This function gets the sda pin state. - * - * @param The sda pin state. - */ -static rt_int32_t pico_get_sda(void *data) -{ - struct pico_soft_i2c_config* cfg = (struct pico_soft_i2c_config*)data; - return rt_pin_read(cfg->sda); -} - -/** - * This function gets the scl pin state. - * - * @param The scl pin state. - */ -static rt_int32_t pico_get_scl(void *data) -{ - struct pico_soft_i2c_config* cfg = (struct pico_soft_i2c_config*)data; - return rt_pin_read(cfg->scl); -} - -/** - * The time delay function. - * - * @param microseconds. - */ -static void pico_udelay(rt_uint32_t us) -{ - busy_wait_us_32(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, - .i2c_pin_init_flag = RT_FALSE -}; - -/** - * if i2c is locked, this function will unlock it - * - * @param pico config class - * - * @return RT_EOK indicates successful unlock. - */ -static rt_err_t pico_i2c_bus_unlock(const struct pico_soft_i2c_config *cfg) -{ - rt_int32_t i = 0; - - if (PIN_LOW == rt_pin_read(cfg->sda)) - { - while (i++ < 9) - { - rt_pin_write(cfg->scl, PIN_HIGH); - pico_udelay(100); - rt_pin_write(cfg->scl, PIN_LOW); - pico_udelay(100); - } - } - if (PIN_LOW == rt_pin_read(cfg->sda)) - { - return -RT_ERROR; - } - - return RT_EOK; -} - -/* I2C initialization function */ -int rt_soft_i2c_init(void) -{ - rt_err_t result; - - for (rt_size_t i = 0; i < sizeof(i2c_obj) / sizeof(struct pico_i2c); i++) - { - 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; - - 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]); - - 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 RT_EOK; -} -INIT_DEVICE_EXPORT(rt_soft_i2c_init); - -#endif /* BSP_USING_SOFT_I2C */ diff --git a/bsp/raspberry-pico/libraries/Drivers/drv_soft_i2c.h b/bsp/raspberry-pico/libraries/Drivers/drv_soft_i2c.h deleted file mode 100644 index b5e663b673..0000000000 --- a/bsp/raspberry-pico/libraries/Drivers/drv_soft_i2c.h +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright (c) 2006-2023, RT-Thread Development Team - * - * SPDX-License-Identifier: Apache-2.0 - * - * Change Logs: - * Date Author Notes - * 2023/06/01 chushicheng first version - */ - -#ifndef __DRV_SOFT_I2C__ -#define __DRV_SOFT_I2C__ - -#include <rtdevice.h> -#include "drv_gpio.h" -#include "board.h" - -#ifdef BSP_USING_SOFT_I2C -/* pico i2c dirver class */ -struct pico_i2c -{ - struct rt_i2c_bit_ops ops; - struct rt_i2c_bus_device i2c_bus; -}; - -/* pico config class */ -struct pico_soft_i2c_config -{ - rt_uint8_t scl; - rt_uint8_t sda; - const char *bus_name; -}; - -#ifdef BSP_USING_SOFT_I2C1 -#define I2C1_BUS_CONFIG \ - { \ - .scl = BSP_SOFT_I2C1_SCL_PIN, \ - .sda = BSP_SOFT_I2C1_SDA_PIN, \ - .bus_name = "i2c1", \ - } -#endif - -int rt_soft_i2c_init(void); - -#endif /* BSP_USING_SOFT_I2C */ -#endif |
