summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRbb666 <[email protected]>2022-07-11 11:17:03 +0800
committerguo <[email protected]>2022-07-28 18:54:50 +0800
commit7d68083bd7cbabe375062069af61764ea60dc344 (patch)
tree75cf0479a2a1cd7fc9213f25eed9b018ab8b0946
parenta0be4ee3e921056560172c417a2458e7915077e4 (diff)
Add Hardware I2C Bus
-rw-r--r--bsp/cypress/libraries/HAL_Drivers/SConscript2
-rw-r--r--bsp/cypress/libraries/HAL_Drivers/drv_i2c.c175
-rw-r--r--bsp/cypress/libraries/IFX_PSOC6_HAL/SConscript5
-rw-r--r--bsp/cypress/psoc6-cy8cproto-4343w/board/Kconfig50
4 files changed, 215 insertions, 17 deletions
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 <rtdevice.h>
+
+#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