mirror of
https://github.com/RT-Thread/rt-thread.git
synced 2026-02-06 17:12:01 +08:00
Some checks are pending
ToolsCI / Tools (push) Waiting to run
AutoTestCI / ${{ matrix.legs.UTEST }} (map[CONFIG_FILE:cpp11/cpp11.conf QEMU_ARCH:arm QEMU_MACHINE:vexpress-a9 RTT_BSP:bsp/qemu-vexpress-a9 RUN:yes SD_FILE:sd.bin UTEST:components/cpp11]) (push) Waiting to run
AutoTestCI / ${{ matrix.legs.UTEST }} (map[CONFIG_FILE:kernel/atomic.conf QEMU_ARCH:arm QEMU_MACHINE:vexpress-a9 RTT_BSP:bsp/qemu-vexpress-a9 RUN:yes SD_FILE:sd.bin UTEST:kernel/atomic]) (push) Waiting to run
AutoTestCI / ${{ matrix.legs.UTEST }} (map[CONFIG_FILE:kernel/atomic.conf QEMU_ARCH:riscv64 QEMU_MACHINE:virt RTT_BSP:bsp/qemu-virt64-riscv RUN:yes SD_FILE:None UTEST:kernel/atomic/riscv64]) (push) Waiting to run
AutoTestCI / ${{ matrix.legs.UTEST }} (map[CONFIG_FILE:kernel/atomic_c11.conf QEMU_ARCH:arm QEMU_MACHINE:vexpress-a9 RTT_BSP:bsp/qemu-vexpress-a9 RUN:yes SD_FILE:sd.bin UTEST:kernel/atomic_c11]) (push) Waiting to run
AutoTestCI / ${{ matrix.legs.UTEST }} (map[CONFIG_FILE:kernel/atomic_c11.conf QEMU_ARCH:riscv64 QEMU_MACHINE:virt RTT_BSP:bsp/qemu-virt64-riscv RUN:yes SD_FILE:None UTEST:kernel/atomic_c11/riscv64]) (push) Waiting to run
AutoTestCI / ${{ matrix.legs.UTEST }} (map[CONFIG_FILE:kernel/device.conf QEMU_ARCH:arm QEMU_MACHINE:vexpress-a9 RTT_BSP:bsp/qemu-vexpress-a9 RUN:yes SD_FILE:sd.bin UTEST:kernel/device]) (push) Waiting to run
AutoTestCI / ${{ matrix.legs.UTEST }} (map[CONFIG_FILE:kernel/ipc.conf QEMU_ARCH:arm QEMU_MACHINE:vexpress-a9 RTT_BSP:bsp/qemu-vexpress-a9 RUN:yes SD_FILE:sd.bin UTEST:kernel/ipc]) (push) Waiting to run
AutoTestCI / ${{ matrix.legs.UTEST }} (map[CONFIG_FILE:kernel/irq.conf QEMU_ARCH:arm QEMU_MACHINE:vexpress-a9 RTT_BSP:bsp/qemu-vexpress-a9 RUN:yes SD_FILE:sd.bin UTEST:kernel/irq]) (push) Waiting to run
AutoTestCI / ${{ matrix.legs.UTEST }} (map[CONFIG_FILE:kernel/mem.conf QEMU_ARCH:arm QEMU_MACHINE:vexpress-a9 RTT_BSP:bsp/qemu-vexpress-a9 RUN:yes SD_FILE:sd.bin UTEST:kernel/mem]) (push) Waiting to run
AutoTestCI / ${{ matrix.legs.UTEST }} (map[CONFIG_FILE:kernel/mem.conf QEMU_ARCH:riscv64 QEMU_MACHINE:virt RTT_BSP:bsp/qemu-virt64-riscv RUN:yes SD_FILE:None UTEST:kernel/mem/riscv64]) (push) Waiting to run
AutoTestCI / ${{ matrix.legs.UTEST }} (map[CONFIG_FILE:kernel/thread.conf QEMU_ARCH:arm QEMU_MACHINE:vexpress-a9 RTT_BSP:bsp/qemu-vexpress-a9 RUN:yes SD_FILE:sd.bin UTEST:kernel/thread]) (push) Waiting to run
AutoTestCI / ${{ matrix.legs.UTEST }} (map[CONFIG_FILE:kernel/timer.conf QEMU_ARCH:arm QEMU_MACHINE:vexpress-a9 RTT_BSP:bsp/qemu-vexpress-a9 RUN:yes SD_FILE:sd.bin UTEST:kernel/timer]) (push) Waiting to run
AutoTestCI / ${{ matrix.legs.UTEST }} (map[CONFIG_FILE:rtsmart/base.conf QEMU_ARCH:aarch64 QEMU_MACHINE:virt RTT_BSP:bsp/qemu-virt64-aarch64 RUN:no SD_FILE:sd.bin UTEST:rtsmart/aarch64]) (push) Waiting to run
AutoTestCI / ${{ matrix.legs.UTEST }} (map[CONFIG_FILE:rtsmart/base.conf QEMU_ARCH:arm QEMU_MACHINE:vexpress-a9 RTT_BSP:bsp/qemu-vexpress-a9 RUN:no SD_FILE:sd.bin UTEST:rtsmart/arm]) (push) Waiting to run
AutoTestCI / ${{ matrix.legs.UTEST }} (map[CONFIG_FILE:rtsmart/base.conf QEMU_ARCH:riscv64 QEMU_MACHINE:virt RTT_BSP:bsp/qemu-virt64-riscv RUN:yes SD_FILE:None UTEST:rtsmart/riscv64]) (push) Waiting to run
AutoTestCI / ${{ matrix.legs.UTEST }} (map[CONFIG_FILE:utest_self/self.conf QEMU_ARCH:arm QEMU_MACHINE:vexpress-a9 RTT_BSP:bsp/qemu-vexpress-a9 RUN:yes SD_FILE:sd.bin UTEST:components/utest]) (push) Waiting to run
RT-Thread BSP Static Build Check / ${{ matrix.legs.RTT_BSP }} (map[RTT_BSP:ESP32C3 RTT_TOOL_CHAIN:sourcery-riscv32-esp32 SUB_RTT_BSP:[ESP32_C3]]) (push) Waiting to run
RT-Thread BSP Static Build Check / ${{ matrix.legs.RTT_BSP }} (map[RTT_BSP:Infineon_TI_microchip RTT_TOOL_CHAIN:sourcery-arm SUB_RTT_BSP:[Infineon/psoc6-cy8ckit-062S2-43012 Infineon/psoc6-cy8ckit-062-BLE Infineon/psoc6-cy8ckit-062s4 Infineon/psoc6-cy8ckit-062-WIFI-BT Infineon/psoc6-cy8c… (push) Waiting to run
RT-Thread BSP Static Build Check / ${{ matrix.legs.RTT_BSP }} (map[RTT_BSP:RT-Thread Online Packages (STM32F407 RT-Spark) RTT_TOOL_CHAIN:sourcery-arm SUB_RTT_BSP:[stm32/stm32f407-rt-spark]]) (push) Waiting to run
RT-Thread BSP Static Build Check / ${{ matrix.legs.RTT_BSP }} (map[RTT_BSP:RTduino/Arduino Libraries (Raspberry Pico) RTT_TOOL_CHAIN:sourcery-arm SUB_RTT_BSP:[raspberry-pico]]) (push) Waiting to run
RT-Thread BSP Static Build Check / ${{ matrix.legs.RTT_BSP }} (map[RTT_BSP:RTduino/Arduino Libraries (STM32F412 Nucleo) RTT_TOOL_CHAIN:sourcery-arm SUB_RTT_BSP:[stm32/stm32f412-st-nucleo]]) (push) Waiting to run
RT-Thread BSP Static Build Check / ${{ matrix.legs.RTT_BSP }} (map[RTT_BSP:aarch64 RTT_TOOL_CHAIN:sourcery-aarch64 SUB_RTT_BSP:[qemu-virt64-aarch64 raspberry-pi/raspi3-64 raspberry-pi/raspi4-64 phytium/aarch64]]) (push) Waiting to run
RT-Thread BSP Static Build Check / ${{ matrix.legs.RTT_BSP }} (map[RTT_BSP:gd32_n32_apm32 RTT_TOOL_CHAIN:sourcery-arm SUB_RTT_BSP:[gd32/arm/gd32103c-eval gd32/arm/gd32105c-eval gd32/arm/gd32105r-start gd32/arm/gd32107c-eval gd32/arm/gd32205r-start gd32/arm/gd32207i-eval gd32/arm/gd32303… (push) Waiting to run
RT-Thread BSP Static Build Check / ${{ matrix.legs.RTT_BSP }} (map[RTT_BSP:hpmicro RTT_TOOL_CHAIN:RISC-V-GCC-RV32 SUB_RTT_BSP:[hpmicro/hpm6750evkmini hpmicro/hpm6750evk hpmicro/hpm6750evk2 hpmicro/hpm6300evk hpmicro/hpm6200evk hpmicro/hpm5300evk hpmicro/hpm5301evklite hpmicro/hpm6800evk… (push) Waiting to run
RT-Thread BSP Static Build Check / ${{ matrix.legs.RTT_BSP }} (map[RTT_BSP:i386-unknown RTT_TOOL_CHAIN:sourcery-i386-unknown-elf SUB_RTT_BSP:[x86]]) (push) Waiting to run
RT-Thread BSP Static Build Check / ${{ matrix.legs.RTT_BSP }} (map[RTT_BSP:llvm-arm RTT_TOOL_CHAIN:llvm-arm SUB_RTT_BSP:[stm32/stm32l475-atk-pandora]]) (push) Waiting to run
RT-Thread BSP Static Build Check / ${{ matrix.legs.RTT_BSP }} (map[RTT_BSP:mips RTT_TOOL_CHAIN:sourcery-mips SUB_RTT_BSP:[loongson/ls1bdev loongson/ls2kdev loongson/ls1cdev]]) (push) Waiting to run
RT-Thread BSP Static Build Check / ${{ matrix.legs.RTT_BSP }} (map[RTT_BSP:nordic(yml) RTT_TOOL_CHAIN:sourcery-arm SUB_RTT_BSP:[nrf5x/nrf51822 nrf5x/nrf52832 nrf5x/nrf52833 nrf5x/nrf52840 nrf5x/nrf5340]]) (push) Waiting to run
RT-Thread BSP Static Build Check / ${{ matrix.legs.RTT_BSP }} (map[RTT_BSP:nuvoton RTT_TOOL_CHAIN:sourcery-arm SUB_RTT_BSP:[nuvoton/numaker-pfm-m487 nuvoton/numaker-hmi-ma35d1 nuvoton/numaker-iot-m487 nuvoton/numaker-m032ki nuvoton/numaker-iot-m467 nuvoton/numaker-m467hj nuvoton/nk-n9h3… (push) Waiting to run
RT-Thread BSP Static Build Check / ${{ matrix.legs.RTT_BSP }} (map[RTT_BSP:nxp_renesas RTT_TOOL_CHAIN:sourcery-arm SUB_RTT_BSP:[nxp/lpc/lpc55sxx/lpc55s69_nxp_evk nxp/lpc/lpc55sxx/lpc55s28_nxp_evk nxp/lpc/lpc55sxx/lpc55s06_nxp_evk nxp/lpc/lpc55sxx/lpc55s16_nxp_evk nxp/lpc/lpc55sxx/lpc55s… (push) Waiting to run
RT-Thread BSP Static Build Check / ${{ matrix.legs.RTT_BSP }} (map[RTT_BSP:others_at32_hc32_ht32 RTT_TOOL_CHAIN:sourcery-arm SUB_RTT_BSP:[qemu-vexpress-a9 airm2m/air32f103 acm32/acm32f0x0-nucleo CME_M7 apollo2 asm9260t allwinner_tina ft32/ft32f072xb-starter mini2440 at91/at91sam9g45 at9… (push) Waiting to run
RT-Thread BSP Static Build Check / ${{ matrix.legs.RTT_BSP }} (map[RTT_BSP:riscv-none RTT_TOOL_CHAIN:sourcery-riscv-none-embed SUB_RTT_BSP:[k210]]) (push) Waiting to run
RT-Thread BSP Static Build Check / ${{ matrix.legs.RTT_BSP }} (map[RTT_BSP:riscv64-unknown RTT_TOOL_CHAIN:sourcery-riscv64-unknown-elf SUB_RTT_BSP:[bluetrum/ab32vg1-ab-prougen bouffalo_lab/bl60x bouffalo_lab/bl70x]]) (push) Waiting to run
RT-Thread BSP Static Build Check / ${{ matrix.legs.RTT_BSP }} (map[RTT_BSP:simulator RTT_TOOL_CHAIN:gcc SUB_RTT_BSP:[simulator]]) (push) Waiting to run
RT-Thread BSP Static Build Check / ${{ matrix.legs.RTT_BSP }} (map[RTT_BSP:stm32_f2_f4 RTT_TOOL_CHAIN:sourcery-arm SUB_RTT_BSP:[stm32/stm32f207-st-nucleo stm32/stm32f302-st-nucleo stm32/stm32f334-st-nucleo stm32/stm32f401-st-nucleo stm32/stm32f401-weact-blackpill stm32/stm32f405-smdz-br… (push) Waiting to run
RT-Thread BSP Static Build Check / ${{ matrix.legs.RTT_BSP }} (map[RTT_BSP:stm32_f7_g0_h7_mp15_u5_h5_wb5 RTT_TOOL_CHAIN:sourcery-arm SUB_RTT_BSP:[stm32/stm32f746-st-disco stm32/stm32f746-st-nucleo stm32/stm32f767-atk-apollo stm32/stm32f767-fire-challenger-v1 stm32/stm32f767-st-nucleo st… (push) Waiting to run
RT-Thread BSP Static Build Check / ${{ matrix.legs.RTT_BSP }} (map[RTT_BSP:stm32l4_f0_f1 RTT_TOOL_CHAIN:sourcery-arm SUB_RTT_BSP:[stm32/stm32l4r5-st-nucleo stm32/stm32l4r9-st-eval stm32/stm32l4r9-st-sensortile-box stm32/stm32l010-st-nucleo stm32/stm32l053-st-nucleo stm32/stm32l412-st-nu… (push) Waiting to run
BSP compilation with more drivers / BSP Compilation with More Drivers (push) Waiting to run
pkgs_test / change (push) Waiting to run
275 lines
7.4 KiB
C
275 lines
7.4 KiB
C
/*
|
|
* Copyright (c) 2006-2023, RT-Thread Development Team
|
|
*
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*
|
|
* Change Logs:
|
|
* Date Author Notes
|
|
* 2023-07-30 sp-cai first version
|
|
*/
|
|
|
|
#include <rtdevice.h>
|
|
|
|
#ifdef RT_USING_SOFT_I2C
|
|
#if !defined(RT_USING_SOFT_I2C0) &&\
|
|
!defined(RT_USING_SOFT_I2C1) && !defined(RT_USING_SOFT_I2C2) &&\
|
|
!defined(RT_USING_SOFT_I2C3) && !defined(RT_USING_SOFT_I2C4) &&\
|
|
!defined(RT_USING_SOFT_I2C5) && !defined(RT_USING_SOFT_I2C6) &&\
|
|
!defined(RT_USING_SOFT_I2C7) && !defined(RT_USING_SOFT_I2C8)
|
|
#error "Please define at least one RT_USING_SOFT_I2Cx"
|
|
/*
|
|
This driver can be disabled at:
|
|
menuconfig -> RT-Thread Components -> Device Drivers -> Using I2C device drivers
|
|
*/
|
|
#endif
|
|
|
|
#define DBG_ENABLE
|
|
#define DBG_TAG "I2C_S"
|
|
#ifdef RT_I2C_BITOPS_DEBUG
|
|
#define DBG_LEVEL DBG_LOG
|
|
#endif
|
|
#include <rtdbg.h>
|
|
|
|
/* i2c config class */
|
|
struct soft_i2c_config
|
|
{
|
|
rt_base_t scl_pin;
|
|
rt_base_t sda_pin;
|
|
const char *bus_name;
|
|
rt_uint16_t timing_delay; /* scl and sda line delay */
|
|
rt_uint16_t timing_timeout; /* in tick */
|
|
};
|
|
|
|
/* i2c dirver class */
|
|
struct rt_soft_i2c
|
|
{
|
|
struct rt_i2c_bus_device i2c_bus;
|
|
struct rt_i2c_bit_ops ops;
|
|
};
|
|
|
|
struct soft_i2c_config i2c_cfg[] =
|
|
{
|
|
#ifdef RT_USING_SOFT_I2C0
|
|
{
|
|
.scl_pin = RT_SOFT_I2C0_SCL_PIN,
|
|
.sda_pin = RT_SOFT_I2C0_SDA_PIN,
|
|
.bus_name = RT_SOFT_I2C0_BUS_NAME,
|
|
.timing_delay = RT_SOFT_I2C0_TIMING_DELAY,
|
|
.timing_timeout = RT_SOFT_I2C0_TIMING_TIMEOUT,
|
|
},
|
|
#endif //RT_USING_SOFT_I2C0
|
|
#ifdef RT_USING_SOFT_I2C1
|
|
{
|
|
.scl_pin = RT_SOFT_I2C1_SCL_PIN,
|
|
.sda_pin = RT_SOFT_I2C1_SDA_PIN,
|
|
.bus_name = RT_SOFT_I2C1_BUS_NAME,
|
|
.timing_delay = RT_SOFT_I2C1_TIMING_DELAY,
|
|
.timing_timeout = RT_SOFT_I2C1_TIMING_TIMEOUT,
|
|
},
|
|
#endif //RT_USING_SOFT_I2C1
|
|
#ifdef RT_USING_SOFT_I2C2
|
|
{
|
|
.scl_pin = RT_SOFT_I2C2_SCL_PIN,
|
|
.sda_pin = RT_SOFT_I2C2_SDA_PIN,
|
|
.bus_name = RT_SOFT_I2C2_BUS_NAME,
|
|
.timing_delay = RT_SOFT_I2C2_TIMING_DELAY,
|
|
.timing_timeout = RT_SOFT_I2C2_TIMING_TIMEOUT,
|
|
},
|
|
#endif //RT_USING_SOFT_I2C2
|
|
#ifdef RT_USING_SOFT_I2C3
|
|
{
|
|
.scl_pin = RT_SOFT_I2C3_SCL_PIN,
|
|
.sda_pin = RT_SOFT_I2C3_SDA_PIN,
|
|
.bus_name = RT_SOFT_I2C3_BUS_NAME,
|
|
.timing_delay = RT_SOFT_I2C3_TIMING_DELAY,
|
|
.timing_timeout = RT_SOFT_I2C3_TIMING_TIMEOUT,
|
|
},
|
|
#endif //RT_USING_SOFT_I2C3
|
|
#ifdef RT_USING_SOFT_I2C4
|
|
{
|
|
.scl_pin = RT_SOFT_I2C4_SCL_PIN,
|
|
.sda_pin = RT_SOFT_I2C4_SDA_PIN,
|
|
.bus_name = RT_SOFT_I2C4_BUS_NAME,
|
|
.timing_delay = RT_SOFT_I2C4_TIMING_DELAY,
|
|
.timing_timeout = RT_SOFT_I2C4_TIMING_TIMEOUT,
|
|
},
|
|
#endif //RT_USING_SOFT_I2C4
|
|
#ifdef RT_USING_SOFT_I2C5
|
|
{
|
|
.scl_pin = RT_SOFT_I2C5_SCL_PIN,
|
|
.sda_pin = RT_SOFT_I2C5_SDA_PIN,
|
|
.bus_name = RT_SOFT_I2C5_BUS_NAME,
|
|
.timing_delay = RT_SOFT_I2C5_TIMING_DELAY,
|
|
.timing_timeout = RT_SOFT_I2C5_TIMING_TIMEOUT,
|
|
},
|
|
#endif //RT_USING_SOFT_I2C5
|
|
#ifdef RT_USING_SOFT_I2C6
|
|
{
|
|
.scl_pin = RT_SOFT_I2C6_SCL_PIN,
|
|
.sda_pin = RT_SOFT_I2C6_SDA_PIN,
|
|
.bus_name = RT_SOFT_I2C6_BUS_NAME,
|
|
.timing_delay = RT_SOFT_I2C6_TIMING_DELAY,
|
|
.timing_timeout = RT_SOFT_I2C6_TIMING_TIMEOUT,
|
|
},
|
|
#endif //RT_USING_SOFT_I2C6
|
|
#ifdef RT_USING_SOFT_I2C7
|
|
{
|
|
.scl_pin = RT_SOFT_I2C7_SCL_PIN,
|
|
.sda_pin = RT_SOFT_I2C7_SDA_PIN,
|
|
.bus_name = RT_SOFT_I2C7_BUS_NAME,
|
|
.timing_delay = RT_SOFT_I2C7_TIMING_DELAY,
|
|
.timing_timeout = RT_SOFT_I2C7_TIMING_TIMEOUT,
|
|
},
|
|
#endif //RT_USING_SOFT_I2C7
|
|
#ifdef RT_USING_SOFT_I2C8
|
|
{
|
|
.scl_pin = RT_SOFT_I2C8_SCL_PIN,
|
|
.sda_pin = RT_SOFT_I2C8_SDA_PIN,
|
|
.bus_name = RT_SOFT_I2C8_BUS_NAME,
|
|
.timing_delay = RT_SOFT_I2C8_TIMING_DELAY,
|
|
.timing_timeout = RT_SOFT_I2C8_TIMING_TIMEOUT,
|
|
},
|
|
#endif //RT_USING_SOFT_I2C8
|
|
};
|
|
|
|
|
|
static struct rt_soft_i2c i2c_bus_obj[sizeof(i2c_cfg) / sizeof(i2c_cfg[0])] =
|
|
{ 0 };
|
|
|
|
/**
|
|
* This function initializes the i2c pin.
|
|
* @param i2c config class.
|
|
*/
|
|
static void pin_init(const struct soft_i2c_config *cfg)
|
|
{
|
|
rt_pin_mode(cfg->scl_pin, PIN_MODE_OUTPUT_OD);
|
|
rt_pin_mode(cfg->sda_pin, PIN_MODE_OUTPUT_OD);
|
|
rt_pin_write(cfg->scl_pin, PIN_HIGH);
|
|
rt_pin_write(cfg->sda_pin, PIN_HIGH);
|
|
}
|
|
|
|
|
|
/**
|
|
* This function sets the sda pin.
|
|
* @param i2c config class.
|
|
* @param The sda pin state.
|
|
*/
|
|
static void set_sda(void *cfg, rt_int32_t value)
|
|
{
|
|
rt_pin_write(((const struct soft_i2c_config*)cfg)->sda_pin, value);
|
|
}
|
|
|
|
/**
|
|
* This function sets the scl pin.
|
|
* @param i2c config class.
|
|
* @param The sda pin state.
|
|
*/
|
|
static void set_scl(void *cfg, rt_int32_t value)
|
|
{
|
|
rt_pin_write(((const struct soft_i2c_config*)cfg)->scl_pin, value);
|
|
}
|
|
|
|
/**
|
|
* This function gets the sda pin state.
|
|
* @param i2c config class.
|
|
*/
|
|
static rt_int32_t get_sda(void *cfg)
|
|
{
|
|
return rt_pin_read(((const struct soft_i2c_config*)cfg)->sda_pin);
|
|
}
|
|
|
|
/**
|
|
* This function gets the scl pin state.
|
|
* @param i2c config class.
|
|
*/
|
|
static rt_int32_t get_scl(void *cfg)
|
|
{
|
|
return rt_pin_read(((const struct soft_i2c_config*)cfg)->scl_pin);
|
|
}
|
|
|
|
|
|
static const struct rt_i2c_bit_ops soft_i2c_ops =
|
|
{
|
|
.set_sda = set_sda,
|
|
.set_scl = set_scl,
|
|
.get_sda = get_sda,
|
|
.get_scl = get_scl,
|
|
.udelay = rt_hw_us_delay,
|
|
};
|
|
|
|
/**
|
|
* if i2c is locked, this function will unlock it
|
|
*
|
|
* @param i2c config class.
|
|
*
|
|
* @return RT_EOK indicates successful unlock.
|
|
*/
|
|
static rt_err_t i2c_bus_unlock(const struct soft_i2c_config *cfg)
|
|
{
|
|
rt_ubase_t i = 0;
|
|
|
|
if(PIN_LOW == rt_pin_read(cfg->sda_pin))
|
|
{
|
|
while(i++ < 9)
|
|
{
|
|
rt_pin_write(cfg->scl_pin, PIN_HIGH);
|
|
rt_hw_us_delay(cfg->timing_delay);
|
|
rt_pin_write(cfg->scl_pin, PIN_LOW);
|
|
rt_hw_us_delay(cfg->timing_delay);
|
|
}
|
|
}
|
|
if(PIN_LOW == rt_pin_read(cfg->sda_pin))
|
|
{
|
|
return -RT_ERROR;
|
|
}
|
|
|
|
return RT_EOK;
|
|
}
|
|
|
|
/* I2C initialization function */
|
|
int rt_soft_i2c_init(void)
|
|
{
|
|
int err = RT_EOK;
|
|
struct rt_soft_i2c *obj;
|
|
int i;
|
|
|
|
for(i = 0; i < sizeof(i2c_bus_obj) / sizeof(i2c_bus_obj[0]); i++)
|
|
{
|
|
struct soft_i2c_config *cfg = &i2c_cfg[i];
|
|
|
|
pin_init(cfg);
|
|
|
|
obj = &i2c_bus_obj[i];
|
|
obj->ops = soft_i2c_ops;
|
|
obj->ops.data = cfg;
|
|
obj->i2c_bus.priv = &obj->ops;
|
|
obj->ops.delay_us = cfg->timing_delay;
|
|
obj->ops.timeout = cfg->timing_timeout;
|
|
if(rt_i2c_bit_add_bus(&obj->i2c_bus, cfg->bus_name) == RT_EOK)
|
|
{
|
|
i2c_bus_unlock(cfg);
|
|
LOG_D("Software simulation %s init done"
|
|
", SCL pin: 0x%02X, SDA pin: 0x%02X"
|
|
, cfg->bus_name
|
|
, cfg->scl_pin
|
|
, cfg->sda_pin
|
|
);
|
|
}
|
|
else
|
|
{
|
|
err++;
|
|
LOG_E("Software simulation %s init fail"
|
|
", SCL pin: 0x%02X, SDA pin: 0x%02X"
|
|
, cfg->bus_name
|
|
, cfg->scl_pin
|
|
, cfg->sda_pin
|
|
);
|
|
}
|
|
}
|
|
|
|
return err;
|
|
}
|
|
INIT_PREV_EXPORT(rt_soft_i2c_init);
|
|
|
|
#endif // RT_USING_SOFT_I2C
|