summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBernard Xiong <[email protected]>2021-02-28 20:19:29 +0800
committerGitHub <[email protected]>2021-02-28 20:19:29 +0800
commit307671e2c46694d547d9529e8ffc7b48c19e36cf (patch)
treed4fdb82026f195d00f9d2290984761c09ebaf67d
parent2bf53d315d62bd199c01fd2d6a7f05d1a6712153 (diff)
parent8c7dd0353a24aacd35646ff94ff8b2ebe8a26851 (diff)
Merge pull request #4392 from Jackistang/master
[bsp/max32660] add the driver of i2c
-rw-r--r--bsp/maxim/MAX32660_EVSYS/.config33
-rw-r--r--bsp/maxim/MAX32660_EVSYS/README.md2
-rw-r--r--bsp/maxim/MAX32660_EVSYS/board/Kconfig16
-rw-r--r--bsp/maxim/MAX32660_EVSYS/rtconfig.h2
-rw-r--r--bsp/maxim/libraries/HAL_Drivers/SConscript3
-rw-r--r--bsp/maxim/libraries/HAL_Drivers/drv_i2c.c179
-rw-r--r--bsp/maxim/libraries/HAL_Drivers/drv_i2c.h16
7 files changed, 247 insertions, 4 deletions
diff --git a/bsp/maxim/MAX32660_EVSYS/.config b/bsp/maxim/MAX32660_EVSYS/.config
index 82e0a0d279..c2b026f742 100644
--- a/bsp/maxim/MAX32660_EVSYS/.config
+++ b/bsp/maxim/MAX32660_EVSYS/.config
@@ -14,7 +14,7 @@ CONFIG_RT_ALIGN_SIZE=4
CONFIG_RT_THREAD_PRIORITY_32=y
# CONFIG_RT_THREAD_PRIORITY_256 is not set
CONFIG_RT_THREAD_PRIORITY_MAX=32
-CONFIG_RT_TICK_PER_SECOND=100
+CONFIG_RT_TICK_PER_SECOND=1000
CONFIG_RT_USING_OVERFLOW_CHECK=y
CONFIG_RT_USING_HOOK=y
CONFIG_RT_USING_IDLE_HOOK=y
@@ -272,6 +272,7 @@ CONFIG_RT_USING_PIN=y
# CONFIG_PKG_USING_PDULIB is not set
# CONFIG_PKG_USING_BTSTACK is not set
# CONFIG_PKG_USING_LORAWAN_ED_STACK is not set
+# CONFIG_PKG_USING_WAYZ_IOTKIT is not set
#
# security packages
@@ -300,6 +301,7 @@ CONFIG_RT_USING_PIN=y
# CONFIG_PKG_USING_HELIX is not set
# CONFIG_PKG_USING_AZUREGUIX is not set
# CONFIG_PKG_USING_TOUCHGFX2RTT is not set
+# CONFIG_PKG_USING_LVGL is not set
#
# tools packages
@@ -311,6 +313,8 @@ CONFIG_RT_USING_PIN=y
# CONFIG_PKG_USING_RDB is not set
# CONFIG_PKG_USING_QRCODE is not set
# CONFIG_PKG_USING_ULOG_EASYFLASH is not set
+# CONFIG_PKG_USING_ULOG_FILE is not set
+# CONFIG_PKG_USING_LOGMGR is not set
# CONFIG_PKG_USING_ADBD is not set
# CONFIG_PKG_USING_COREMARK is not set
# CONFIG_PKG_USING_DHRYSTONE is not set
@@ -324,6 +328,16 @@ CONFIG_RT_USING_PIN=y
# CONFIG_PKG_USING_UMCN is not set
# CONFIG_PKG_USING_LWRB2RTT is not set
# CONFIG_PKG_USING_CPU_USAGE is not set
+# CONFIG_PKG_USING_GBK2UTF8 is not set
+# CONFIG_PKG_USING_VCONSOLE is not set
+# CONFIG_PKG_USING_KDB is not set
+# CONFIG_PKG_USING_WAMR is not set
+# CONFIG_PKG_USING_MICRO_XRCE_DDS_CLIENT is not set
+# CONFIG_PKG_USING_LWLOG is not set
+# CONFIG_PKG_USING_ANV_TRACE is not set
+# CONFIG_PKG_USING_ANV_MEMLEAK is not set
+# CONFIG_PKG_USING_ANV_TESTSUIT is not set
+# CONFIG_PKG_USING_ANV_BENCH is not set
#
# system packages
@@ -361,6 +375,13 @@ CONFIG_RT_USING_PIN=y
# CONFIG_PKG_USING_UC_COMMON is not set
# CONFIG_PKG_USING_UC_MODBUS is not set
# CONFIG_PKG_USING_PPOOL is not set
+# CONFIG_PKG_USING_OPENAMP is not set
+# CONFIG_PKG_USING_RT_KPRINTF_THREADSAFE is not set
+# CONFIG_PKG_USING_RT_MEMCPY_CM is not set
+# CONFIG_PKG_USING_QFPLIB_M0_FULL is not set
+# CONFIG_PKG_USING_QFPLIB_M0_TINY is not set
+# CONFIG_PKG_USING_QFPLIB_M3 is not set
+# CONFIG_PKG_USING_LPM is not set
#
# peripheral libraries and drivers
@@ -369,6 +390,7 @@ CONFIG_RT_USING_PIN=y
# CONFIG_PKG_USING_REALTEK_AMEBA is not set
# CONFIG_PKG_USING_SHT2X is not set
# CONFIG_PKG_USING_SHT3X is not set
+# CONFIG_PKG_USING_AS7341 is not set
# CONFIG_PKG_USING_STM32_SDIO is not set
# CONFIG_PKG_USING_ICM20608 is not set
# CONFIG_PKG_USING_U8G2 is not set
@@ -418,7 +440,10 @@ CONFIG_RT_USING_PIN=y
# CONFIG_PKG_USING_SSD1306 is not set
# CONFIG_PKG_USING_QKEY is not set
# CONFIG_PKG_USING_RS485 is not set
-# CONFIG_PKG_USING_BSAL is not set
+# CONFIG_PKG_USING_NES is not set
+# CONFIG_PKG_USING_VIRTUAL_SENSOR is not set
+# CONFIG_PKG_USING_VDEVICE is not set
+# CONFIG_PKG_USING_SGM706 is not set
#
# miscellaneous packages
@@ -468,6 +493,9 @@ CONFIG_RT_USING_PIN=y
# CONFIG_PKG_USING_TETRIS is not set
# CONFIG_PKG_USING_LWGPS is not set
# CONFIG_PKG_USING_TENSORFLOWLITEMICRO is not set
+# CONFIG_PKG_USING_STATE_MACHINE is not set
+# CONFIG_PKG_USING_MCURSES is not set
+# CONFIG_PKG_USING_COWSAY is not set
#
# Hardware Drivers Config
@@ -485,3 +513,4 @@ CONFIG_BSP_USING_UART1=y
# CONFIG_BSP_UART1_RX_USING_DMA is not set
# CONFIG_BSP_USING_SPI is not set
# CONFIG_BSP_USING_ON_CHIP_FLASH is not set
+# CONFIG_BSP_USING_I2C is not set
diff --git a/bsp/maxim/MAX32660_EVSYS/README.md b/bsp/maxim/MAX32660_EVSYS/README.md
index 90fea40042..5caa5d9836 100644
--- a/bsp/maxim/MAX32660_EVSYS/README.md
+++ b/bsp/maxim/MAX32660_EVSYS/README.md
@@ -78,7 +78,7 @@ MAX32660-EVSYS开发板常用 **板载资源** 如下:
| SPI | 支持 | SPI0, SPI1 |
| RTC | | |
| I2S | | |
-| I2C | | |
+| I2C | 支持 | I2C0, I2C1 |
| TIMER | | |
| Watchdog | | |
diff --git a/bsp/maxim/MAX32660_EVSYS/board/Kconfig b/bsp/maxim/MAX32660_EVSYS/board/Kconfig
index fa4ec1d0cd..01d04ec0f6 100644
--- a/bsp/maxim/MAX32660_EVSYS/board/Kconfig
+++ b/bsp/maxim/MAX32660_EVSYS/board/Kconfig
@@ -66,6 +66,22 @@ menu "On-chip Peripheral Drivers"
select PKG_USING_FAL
bool "Enable on-chip FLASH"
default n
+ config BSP_USING_I2C
+ bool "Enable I2C"
+ select RT_USING_I2C
+ default n
+
+ if BSP_USING_I2C
+ config BSP_USING_I2C0
+ bool "Enable I2C0 bus [SCL P0.8; SDA P0.9]"
+ default y
+
+ config BSP_USING_I2C1
+ bool "Enable I2C1 bus [SCL P0.2; SDA P0.3]"
+ default n
+ endif
+
+
endmenu
diff --git a/bsp/maxim/MAX32660_EVSYS/rtconfig.h b/bsp/maxim/MAX32660_EVSYS/rtconfig.h
index a15112c1b2..a2f3204096 100644
--- a/bsp/maxim/MAX32660_EVSYS/rtconfig.h
+++ b/bsp/maxim/MAX32660_EVSYS/rtconfig.h
@@ -10,7 +10,7 @@
#define RT_ALIGN_SIZE 4
#define RT_THREAD_PRIORITY_32
#define RT_THREAD_PRIORITY_MAX 32
-#define RT_TICK_PER_SECOND 100
+#define RT_TICK_PER_SECOND 1000
#define RT_USING_OVERFLOW_CHECK
#define RT_USING_HOOK
#define RT_USING_IDLE_HOOK
diff --git a/bsp/maxim/libraries/HAL_Drivers/SConscript b/bsp/maxim/libraries/HAL_Drivers/SConscript
index f6262f54da..ae053a38d5 100644
--- a/bsp/maxim/libraries/HAL_Drivers/SConscript
+++ b/bsp/maxim/libraries/HAL_Drivers/SConscript
@@ -20,6 +20,9 @@ if GetDepend(['RT_USING_PWM']):
if GetDepend(['RT_USING_SPI']):
src += ['drv_spi.c']
+if GetDepend(['RT_USING_I2C']):
+ src += ['drv_i2c.c']
+
if GetDepend(['RT_USING_I2C', 'RT_USING_I2C_BITOPS']):
src += ['drv_soft_i2c.c']
diff --git a/bsp/maxim/libraries/HAL_Drivers/drv_i2c.c b/bsp/maxim/libraries/HAL_Drivers/drv_i2c.c
new file mode 100644
index 0000000000..ddacdf0a12
--- /dev/null
+++ b/bsp/maxim/libraries/HAL_Drivers/drv_i2c.c
@@ -0,0 +1,179 @@
+/*
+ * Copyright (c) 2006-2020, RT-Thread Development Team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2021-02-26 Jackistang first version
+ *
+ */
+
+#include "drv_i2c.h"
+#include "i2c.h"
+#include <rtdevice.h>
+#include <rtthread.h>
+#include "board.h"
+
+#ifdef RT_USING_I2C
+
+#if !defined(BSP_USING_I2C0) && !defined(BSP_USING_I2C1)
+ #error "Please define at least one BSP_USING_I2Cx"
+ /* this driver can be disabled at menuconfig -> Hardware Drivers Config -> On-chip Peripheral Drivers -> Enable I2C */
+#endif
+
+#define DBG_LEVEL DBG_LOG
+#include <rtdbg.h>
+#define LOG_TAG "drv.i2c"
+
+/* mxc config class */
+struct mxc_i2c_config
+{
+ const char *name;
+ mxc_i2c_regs_t *i2c_periph;
+ i2c_speed_t speed;
+ IRQn_Type irq_type;
+};
+
+struct mxc_i2c
+{
+ struct rt_i2c_bus_device bus;
+ struct mxc_i2c_config *config;
+};
+
+static struct mxc_i2c_config i2c_config[] =
+{
+#ifdef BSP_USING_I2C0
+ {
+ .name = "i2c0",
+ .i2c_periph = MXC_I2C_GET_I2C(0),
+ .irq_type = MXC_I2C_GET_IRQ(0),
+ .speed = I2C_STD_MODE,
+ /*I2C_STD_MODE: 100KHz, I2C_FAST_MODE: 400KHz, I2C_FASTPLUS_MODE: 1MHz, I2C_HS_MODE: 3.4MHz */
+ },
+#endif
+#ifdef BSP_USING_I2C1
+ {
+ .name = "i2c1",
+ .i2c_periph = MXC_I2C_GET_I2C(1),
+ .irq_type = MXC_I2C_GET_IRQ(1),
+ .speed = I2C_STD_MODE,
+ /*I2C_STD_MODE: 100KHz, I2C_FAST_MODE: 400KHz, I2C_FASTPLUS_MODE: 1MHz, I2C_HS_MODE: 3.4MHz */
+ },
+#endif
+};
+
+static struct mxc_i2c i2c_obj[sizeof(i2c_config) / sizeof(i2c_config[0])] = {0};
+
+
+static rt_size_t mxc_i2c_mst_xfer(struct rt_i2c_bus_device *bus,
+ struct rt_i2c_msg msgs[],
+ rt_uint32_t num)
+{
+ rt_uint32_t i, ret;
+ rt_uint16_t addr;
+ int error;
+ int restart = 0;
+ struct rt_i2c_msg *msg;
+ struct mxc_i2c *obj = (struct mxc_i2c *)bus;
+
+ for (i = 0; i < num; i++)
+ {
+ msg = &msgs[i];
+
+ if (msg->flags & RT_I2C_ADDR_10BIT || msg->flags & RT_I2C_NO_START || msg->flags & RT_I2C_IGNORE_NACK || msg->flags & RT_I2C_NO_READ_ACK)
+ {
+ LOG_E("Not support RT_I2C_ADDR_10BIT or RT_I2C_NO_START or RT_I2C_IGNORE_NACK or RT_I2C_NO_READ_ACK");
+ return 0;
+ }
+
+ if (msg->flags & RT_I2C_NO_STOP)
+ {
+ restart = 1;
+ }
+
+ if (msg->flags & RT_I2C_RD)
+ {
+ addr = msg->addr << 1;
+ if ((error = I2C_MasterRead(obj->config->i2c_periph, (uint8_t)addr, msg->buf, msg->len, restart)) != msg->len)
+ {
+ LOG_E("Error writing %d", error);
+ return 0;
+ }
+ }
+ else /* RT_I2C_WR */
+ {
+ addr = msg->addr << 1;
+ if ((error = I2C_MasterWrite(obj->config->i2c_periph, (uint8_t)addr, msg->buf, msg->len, restart)) != msg->len)
+ {
+ LOG_E("Error writing %d", error);
+ return 0;
+ }
+ }
+ }
+ ret = i;
+
+ return ret;
+}
+
+static const struct rt_i2c_bus_device_ops mxc_i2c_ops =
+{
+ mxc_i2c_mst_xfer,
+ RT_NULL,
+ RT_NULL,
+};
+
+int rt_hw_i2c_init(void)
+{
+ rt_size_t obj_num;
+ int index;
+ rt_err_t result = 0;
+
+#ifdef BSP_USING_I2C0
+ NVIC_EnableIRQ(I2C0_IRQn);
+#endif
+#ifdef BSP_USING_I2C1
+ NVIC_EnableIRQ(I2C1_IRQn);
+#endif
+
+ obj_num = sizeof(i2c_obj) / sizeof(struct mxc_i2c);
+ for (index = 0; index < obj_num; index++)
+ {
+ /* init i2c object */
+ i2c_obj[index].config = &i2c_config[index];
+ i2c_obj[index].bus.ops = &mxc_i2c_ops;
+
+ /* init i2c device */
+ I2C_Shutdown(i2c_config[index].i2c_periph);
+ I2C_Init(i2c_config[index].i2c_periph, i2c_config[index].speed, RT_NULL);
+
+ /* register i2c device */
+ result = rt_i2c_bus_device_register(&i2c_obj[index].bus,
+ i2c_obj[index].config->name
+ );
+ RT_ASSERT(result == RT_EOK);
+ }
+
+ return 0;
+}
+INIT_DEVICE_EXPORT(rt_hw_i2c_init);
+
+#ifdef BSP_USING_I2C0
+void I2C0_IRQHandler(void)
+{
+ rt_interrupt_enter();
+ I2C_Handler(MXC_I2C0);
+ rt_interrupt_leave();
+}
+#endif
+
+#ifdef BSP_USING_I2C1
+void I2C1_IRQHandler(void)
+{
+ rt_interrupt_enter();
+ I2C_Handler(MXC_I2C1);
+ rt_interrupt_leave();
+}
+#endif
+
+#endif /* RT_USING_I2C */
diff --git a/bsp/maxim/libraries/HAL_Drivers/drv_i2c.h b/bsp/maxim/libraries/HAL_Drivers/drv_i2c.h
new file mode 100644
index 0000000000..f1be28755c
--- /dev/null
+++ b/bsp/maxim/libraries/HAL_Drivers/drv_i2c.h
@@ -0,0 +1,16 @@
+/*
+ * Copyright (c) 2006-2020, RT-Thread Development Team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2021-02-26 Jackistang first version
+ *
+ */
+
+#ifndef __DRV_I2C_H__
+#define __DRV_I2C_H__
+
+
+#endif /* __DRV_I2C_H__ */