From 7d68083bd7cbabe375062069af61764ea60dc344 Mon Sep 17 00:00:00 2001 From: Rbb666 Date: Mon, 11 Jul 2022 11:17:03 +0800 Subject: [PATCH] Add Hardware I2C Bus --- bsp/cypress/libraries/HAL_Drivers/SConscript | 2 +- bsp/cypress/libraries/HAL_Drivers/drv_i2c.c | 175 ++++++++++++++++++ .../libraries/IFX_PSOC6_HAL/SConscript | 5 +- .../psoc6-cy8cproto-4343w/board/Kconfig | 50 +++-- 4 files changed, 215 insertions(+), 17 deletions(-) create mode 100644 bsp/cypress/libraries/HAL_Drivers/drv_i2c.c diff --git a/bsp/cypress/libraries/HAL_Drivers/SConscript b/bsp/cypress/libraries/HAL_Drivers/SConscript index 5fef6acb7d..e61bdf7c2e 100644 --- a/bsp/cypress/libraries/HAL_Drivers/SConscript +++ b/bsp/cypress/libraries/HAL_Drivers/SConscript @@ -23,7 +23,7 @@ if GetDepend(['RT_USING_I2C', 'RT_USING_I2C_BITOPS']): src += ['drv_soft_i2c.c'] if GetDepend(['RT_USING_I2C']): - if GetDepend('BSP_USING_HW_I2C1'): + if GetDepend('BSP_USING_HW_I2C3') or GetDepend('BSP_USING_HW_I2C6'): src += ['drv_i2c.c'] if GetDepend(['RT_USING_ADC']): diff --git a/bsp/cypress/libraries/HAL_Drivers/drv_i2c.c b/bsp/cypress/libraries/HAL_Drivers/drv_i2c.c new file mode 100644 index 0000000000..058e957524 --- /dev/null +++ b/bsp/cypress/libraries/HAL_Drivers/drv_i2c.c @@ -0,0 +1,175 @@ +/* + * Copyright (c) 2006-2022, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2021-09-03 AisinoChip first implementation. + */ + +#include "board.h" + +#if defined(RT_USING_I2C) +#if defined(BSP_USING_HW_I2C3) || defined(BSP_USING_HW_I2C6) +#include + +#ifndef I2C3_CONFIG +#define I2C3_CONFIG \ + { \ + .name = "i2c3", \ + .scl_pin = P6_0, \ + .sda_pin = P6_1, \ + } +#endif /* I2C3_CONFIG */ +#endif +#ifndef I2C6_CONFIG +#define I2C6_CONFIG \ + { \ + .name = "i2c6", \ + .scl_pin = P13_0, \ + .sda_pin = P13_1, \ + } +#endif /* I2C6_CONFIG */ + +enum +{ +#ifdef BSP_USING_HW_I2C3 + I2C3_INDEX, +#endif +#ifdef BSP_USING_HW_I2C6 + I2C6_INDEX, +#endif +}; + +struct ifx_i2c_config +{ + char *name; + rt_uint32_t scl_pin; + rt_uint32_t sda_pin; +}; + +struct ifx_i2c +{ + cyhal_i2c_t mI2C; + cyhal_i2c_cfg_t mI2C_cfg; + struct ifx_i2c_config *config; + struct rt_i2c_bus_device i2c_bus; +}; + +static struct ifx_i2c_config i2c_config[] = +{ +#ifdef BSP_USING_HW_I2C3 + I2C3_CONFIG, +#endif + +#ifdef BSP_USING_HW_I2C6 + I2C6_CONFIG, +#endif +}; + +static struct ifx_i2c i2c_objs[sizeof(i2c_config) / sizeof(i2c_config[0])] = {0}; + +static int ifx_i2c_read(struct ifx_i2c *hi2c, rt_uint16_t slave_address, rt_uint8_t *p_buffer, rt_uint16_t data_byte) +{ + if (cyhal_i2c_master_read(&hi2c->mI2C, slave_address, p_buffer, data_byte, 10, true) != RT_EOK) + { + return -RT_ERROR; + } + + return 0; +} + +static int ifx_i2c_write(struct ifx_i2c *hi2c, uint16_t slave_address, uint8_t *p_buffer, uint16_t data_byte) +{ + if (cyhal_i2c_master_write(&hi2c->mI2C, slave_address, p_buffer, data_byte, 10, true) != RT_EOK) + { + return -RT_ERROR; + } + + return 0; +} + +static rt_size_t _i2c_xfer(struct rt_i2c_bus_device *bus, struct rt_i2c_msg msgs[], rt_uint32_t num) +{ + struct rt_i2c_msg *msg; + rt_uint32_t i; + struct ifx_i2c *i2c_obj; + + RT_ASSERT(bus != RT_NULL); + RT_ASSERT(msgs != RT_NULL); + + i2c_obj = rt_container_of(bus, struct ifx_i2c, i2c_bus); + + for (i = 0; i < num; i++) + { + msg = &msgs[i]; + + if (msg->flags & RT_I2C_RD) + { + if (ifx_i2c_read(i2c_obj, msg->addr, msg->buf, msg->len) != 0) + { + goto out; + } + } + else + { + if (ifx_i2c_write(i2c_obj, msg->addr, msg->buf, msg->len) != 0) + { + goto out; + } + } + } + +out: + + return i; +} + +static const struct rt_i2c_bus_device_ops i2c_ops = +{ + _i2c_xfer, + RT_NULL, + RT_NULL +}; + +void HAL_I2C_Init(struct ifx_i2c *obj) +{ + rt_uint8_t result = RT_EOK; + + result = cyhal_i2c_init(&obj->mI2C, obj->config->sda_pin, obj->config->scl_pin, NULL); + RT_ASSERT(result == RT_EOK); + + result = cyhal_i2c_configure(&obj->mI2C, &obj->mI2C_cfg); + RT_ASSERT(result == RT_EOK); +} + +int rt_hw_i2c_init(void) +{ + rt_err_t result; + cyhal_i2c_t mI2C; + + for (int i = 0; i < sizeof(i2c_config) / sizeof(i2c_config[0]); i++) + { + i2c_objs[i].config = &i2c_config[i]; + i2c_objs[i].i2c_bus.parent.user_data = &i2c_config[i]; + + i2c_objs[i].mI2C_cfg.is_slave = false; + i2c_objs[i].mI2C_cfg.address = 0; + i2c_objs[i].mI2C_cfg.frequencyhal_hz = (400000UL); + + i2c_objs[i].mI2C = mI2C; + + i2c_objs[i].i2c_bus.ops = &i2c_ops; + + HAL_I2C_Init(&i2c_objs[i]); + + result = rt_i2c_bus_device_register(&i2c_objs[i].i2c_bus, i2c_config[i].name); + RT_ASSERT(result == RT_EOK); + } + + return 0; +} +INIT_DEVICE_EXPORT(rt_hw_i2c_init); + +#endif /* defined(BSP_USING_I2C1) || defined(BSP_USING_I2C2) */ diff --git a/bsp/cypress/libraries/IFX_PSOC6_HAL/SConscript b/bsp/cypress/libraries/IFX_PSOC6_HAL/SConscript index c016301831..dc3db9811c 100644 --- a/bsp/cypress/libraries/IFX_PSOC6_HAL/SConscript +++ b/bsp/cypress/libraries/IFX_PSOC6_HAL/SConscript @@ -94,9 +94,6 @@ path = [cwd + '/capsense', cwd + '/TARGET_CY8CKIT-062S2-43012', cwd + '/TARGET_CY8CKIT-062S2-43012/COMPONENT_BSP_DESIGN_MODUS/GeneratedSource'] -if rtconfig.PLATFORM == 'gcc': - group = DefineGroup('Libraries', src, depend=[''], CPPPATH=path) -else: - group = DefineGroup('Libraries', src, depend=[''], CPPPATH=path) +group = DefineGroup('Libraries', src, depend=[''], CPPPATH=path) Return('group') diff --git a/bsp/cypress/psoc6-cy8cproto-4343w/board/Kconfig b/bsp/cypress/psoc6-cy8cproto-4343w/board/Kconfig index f204a244ca..9e74096d34 100644 --- a/bsp/cypress/psoc6-cy8cproto-4343w/board/Kconfig +++ b/bsp/cypress/psoc6-cy8cproto-4343w/board/Kconfig @@ -29,12 +29,24 @@ menu "On-chip Peripheral Drivers" default y select RT_USING_SERIAL if BSP_USING_UART - config BSP_USING_UART5 - bool "Enable UART5" - default y + config BSP_USING_UART0 + bool "Enable UART0" + default n + config BSP_USING_UART1 + bool "Enable UART1" + default n config BSP_USING_UART2 bool "Enable UART2" - default n + default n + config BSP_USING_UART3 + bool "Enable UART3" + default n + config BSP_USING_UART4 + bool "Enable UART4" + default n + config BSP_USING_UART5 + bool "Enable UART5" + default y endif menuconfig BSP_USING_ADC @@ -60,24 +72,38 @@ menu "On-chip Peripheral Drivers" select RT_USING_I2C select RT_USING_PIN if BSP_USING_HW_I2C - config BSP_USING_HW_I2C1 - bool "Enable I2C1 Bus (User I2C)" + config BSP_USING_HW_I2C3 + bool "Enable I2C3 Bus (User I2C)" default n - if BSP_USING_HW_I2C1 + if BSP_USING_HW_I2C3 comment "Notice: P6_0 --> 48; P6_1 --> 49" - config BSP_I2C1_SCL_PIN - int "i2c1 SCL pin number" + config BSP_I2C3_SCL_PIN + int "i2c3 SCL pin number" range 1 113 default 48 - config BSP_I2C1_SDA_PIN - int "i2c1 SDA pin number" + config BSP_I2C3_SDA_PIN + int "i2c3 SDA pin number" range 1 113 default 49 endif + config BSP_USING_HW_I2C6 + bool "Enable I2C6 Bus (User I2C)" + default n + if BSP_USING_HW_I2C6 + comment "Notice: P13_0 --> 48; P13_1 --> 49" + config BSP_I2C6_SCL_PIN + int "i2c6 SCL pin number" + range 1 113 + default 104 + config BSP_I2C6_SDA_PIN + int "i2c6 SDA pin number" + range 1 113 + default 105 + endif endif menuconfig BSP_USING_I2C - bool "Enable I2C Bus" + bool "Enable Software I2C Bus" default n select RT_USING_I2C select RT_USING_I2C_BITOPS -- GitLab