Skip to content

Commit 307671e

Browse files
authored
Merge pull request #4392 from Jackistang/master
[bsp/max32660] add the driver of i2c
2 parents 2bf53d3 + 8c7dd03 commit 307671e

File tree

7 files changed

+247
-4
lines changed

7 files changed

+247
-4
lines changed

bsp/maxim/MAX32660_EVSYS/.config

Lines changed: 31 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ CONFIG_RT_ALIGN_SIZE=4
1414
CONFIG_RT_THREAD_PRIORITY_32=y
1515
# CONFIG_RT_THREAD_PRIORITY_256 is not set
1616
CONFIG_RT_THREAD_PRIORITY_MAX=32
17-
CONFIG_RT_TICK_PER_SECOND=100
17+
CONFIG_RT_TICK_PER_SECOND=1000
1818
CONFIG_RT_USING_OVERFLOW_CHECK=y
1919
CONFIG_RT_USING_HOOK=y
2020
CONFIG_RT_USING_IDLE_HOOK=y
@@ -272,6 +272,7 @@ CONFIG_RT_USING_PIN=y
272272
# CONFIG_PKG_USING_PDULIB is not set
273273
# CONFIG_PKG_USING_BTSTACK is not set
274274
# CONFIG_PKG_USING_LORAWAN_ED_STACK is not set
275+
# CONFIG_PKG_USING_WAYZ_IOTKIT is not set
275276

276277
#
277278
# security packages
@@ -300,6 +301,7 @@ CONFIG_RT_USING_PIN=y
300301
# CONFIG_PKG_USING_HELIX is not set
301302
# CONFIG_PKG_USING_AZUREGUIX is not set
302303
# CONFIG_PKG_USING_TOUCHGFX2RTT is not set
304+
# CONFIG_PKG_USING_LVGL is not set
303305

304306
#
305307
# tools packages
@@ -311,6 +313,8 @@ CONFIG_RT_USING_PIN=y
311313
# CONFIG_PKG_USING_RDB is not set
312314
# CONFIG_PKG_USING_QRCODE is not set
313315
# CONFIG_PKG_USING_ULOG_EASYFLASH is not set
316+
# CONFIG_PKG_USING_ULOG_FILE is not set
317+
# CONFIG_PKG_USING_LOGMGR is not set
314318
# CONFIG_PKG_USING_ADBD is not set
315319
# CONFIG_PKG_USING_COREMARK is not set
316320
# CONFIG_PKG_USING_DHRYSTONE is not set
@@ -324,6 +328,16 @@ CONFIG_RT_USING_PIN=y
324328
# CONFIG_PKG_USING_UMCN is not set
325329
# CONFIG_PKG_USING_LWRB2RTT is not set
326330
# CONFIG_PKG_USING_CPU_USAGE is not set
331+
# CONFIG_PKG_USING_GBK2UTF8 is not set
332+
# CONFIG_PKG_USING_VCONSOLE is not set
333+
# CONFIG_PKG_USING_KDB is not set
334+
# CONFIG_PKG_USING_WAMR is not set
335+
# CONFIG_PKG_USING_MICRO_XRCE_DDS_CLIENT is not set
336+
# CONFIG_PKG_USING_LWLOG is not set
337+
# CONFIG_PKG_USING_ANV_TRACE is not set
338+
# CONFIG_PKG_USING_ANV_MEMLEAK is not set
339+
# CONFIG_PKG_USING_ANV_TESTSUIT is not set
340+
# CONFIG_PKG_USING_ANV_BENCH is not set
327341

328342
#
329343
# system packages
@@ -361,6 +375,13 @@ CONFIG_RT_USING_PIN=y
361375
# CONFIG_PKG_USING_UC_COMMON is not set
362376
# CONFIG_PKG_USING_UC_MODBUS is not set
363377
# CONFIG_PKG_USING_PPOOL is not set
378+
# CONFIG_PKG_USING_OPENAMP is not set
379+
# CONFIG_PKG_USING_RT_KPRINTF_THREADSAFE is not set
380+
# CONFIG_PKG_USING_RT_MEMCPY_CM is not set
381+
# CONFIG_PKG_USING_QFPLIB_M0_FULL is not set
382+
# CONFIG_PKG_USING_QFPLIB_M0_TINY is not set
383+
# CONFIG_PKG_USING_QFPLIB_M3 is not set
384+
# CONFIG_PKG_USING_LPM is not set
364385

365386
#
366387
# peripheral libraries and drivers
@@ -369,6 +390,7 @@ CONFIG_RT_USING_PIN=y
369390
# CONFIG_PKG_USING_REALTEK_AMEBA is not set
370391
# CONFIG_PKG_USING_SHT2X is not set
371392
# CONFIG_PKG_USING_SHT3X is not set
393+
# CONFIG_PKG_USING_AS7341 is not set
372394
# CONFIG_PKG_USING_STM32_SDIO is not set
373395
# CONFIG_PKG_USING_ICM20608 is not set
374396
# CONFIG_PKG_USING_U8G2 is not set
@@ -418,7 +440,10 @@ CONFIG_RT_USING_PIN=y
418440
# CONFIG_PKG_USING_SSD1306 is not set
419441
# CONFIG_PKG_USING_QKEY is not set
420442
# CONFIG_PKG_USING_RS485 is not set
421-
# CONFIG_PKG_USING_BSAL is not set
443+
# CONFIG_PKG_USING_NES is not set
444+
# CONFIG_PKG_USING_VIRTUAL_SENSOR is not set
445+
# CONFIG_PKG_USING_VDEVICE is not set
446+
# CONFIG_PKG_USING_SGM706 is not set
422447

423448
#
424449
# miscellaneous packages
@@ -468,6 +493,9 @@ CONFIG_RT_USING_PIN=y
468493
# CONFIG_PKG_USING_TETRIS is not set
469494
# CONFIG_PKG_USING_LWGPS is not set
470495
# CONFIG_PKG_USING_TENSORFLOWLITEMICRO is not set
496+
# CONFIG_PKG_USING_STATE_MACHINE is not set
497+
# CONFIG_PKG_USING_MCURSES is not set
498+
# CONFIG_PKG_USING_COWSAY is not set
471499

472500
#
473501
# Hardware Drivers Config
@@ -485,3 +513,4 @@ CONFIG_BSP_USING_UART1=y
485513
# CONFIG_BSP_UART1_RX_USING_DMA is not set
486514
# CONFIG_BSP_USING_SPI is not set
487515
# CONFIG_BSP_USING_ON_CHIP_FLASH is not set
516+
# CONFIG_BSP_USING_I2C is not set

bsp/maxim/MAX32660_EVSYS/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ MAX32660-EVSYS开发板常用 **板载资源** 如下:
7878
| SPI | 支持 | SPI0, SPI1 |
7979
| RTC | | |
8080
| I2S | | |
81-
| I2C | | |
81+
| I2C | 支持 | I2C0, I2C1 |
8282
| TIMER | | |
8383
| Watchdog | | |
8484

bsp/maxim/MAX32660_EVSYS/board/Kconfig

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,22 @@ menu "On-chip Peripheral Drivers"
6666
select PKG_USING_FAL
6767
bool "Enable on-chip FLASH"
6868
default n
69+
config BSP_USING_I2C
70+
bool "Enable I2C"
71+
select RT_USING_I2C
72+
default n
73+
74+
if BSP_USING_I2C
75+
config BSP_USING_I2C0
76+
bool "Enable I2C0 bus [SCL P0.8; SDA P0.9]"
77+
default y
78+
79+
config BSP_USING_I2C1
80+
bool "Enable I2C1 bus [SCL P0.2; SDA P0.3]"
81+
default n
82+
endif
83+
84+
6985

7086
endmenu
7187

bsp/maxim/MAX32660_EVSYS/rtconfig.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
#define RT_ALIGN_SIZE 4
1111
#define RT_THREAD_PRIORITY_32
1212
#define RT_THREAD_PRIORITY_MAX 32
13-
#define RT_TICK_PER_SECOND 100
13+
#define RT_TICK_PER_SECOND 1000
1414
#define RT_USING_OVERFLOW_CHECK
1515
#define RT_USING_HOOK
1616
#define RT_USING_IDLE_HOOK

bsp/maxim/libraries/HAL_Drivers/SConscript

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,9 @@ if GetDepend(['RT_USING_PWM']):
2020
if GetDepend(['RT_USING_SPI']):
2121
src += ['drv_spi.c']
2222

23+
if GetDepend(['RT_USING_I2C']):
24+
src += ['drv_i2c.c']
25+
2326
if GetDepend(['RT_USING_I2C', 'RT_USING_I2C_BITOPS']):
2427
src += ['drv_soft_i2c.c']
2528

Lines changed: 179 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,179 @@
1+
/*
2+
* Copyright (c) 2006-2020, RT-Thread Development Team
3+
*
4+
* SPDX-License-Identifier: Apache-2.0
5+
*
6+
* Change Logs:
7+
* Date Author Notes
8+
* 2021-02-26 Jackistang first version
9+
*
10+
*/
11+
12+
#include "drv_i2c.h"
13+
#include "i2c.h"
14+
#include <rtdevice.h>
15+
#include <rtthread.h>
16+
#include "board.h"
17+
18+
#ifdef RT_USING_I2C
19+
20+
#if !defined(BSP_USING_I2C0) && !defined(BSP_USING_I2C1)
21+
#error "Please define at least one BSP_USING_I2Cx"
22+
/* this driver can be disabled at menuconfig -> Hardware Drivers Config -> On-chip Peripheral Drivers -> Enable I2C */
23+
#endif
24+
25+
#define DBG_LEVEL DBG_LOG
26+
#include <rtdbg.h>
27+
#define LOG_TAG "drv.i2c"
28+
29+
/* mxc config class */
30+
struct mxc_i2c_config
31+
{
32+
const char *name;
33+
mxc_i2c_regs_t *i2c_periph;
34+
i2c_speed_t speed;
35+
IRQn_Type irq_type;
36+
};
37+
38+
struct mxc_i2c
39+
{
40+
struct rt_i2c_bus_device bus;
41+
struct mxc_i2c_config *config;
42+
};
43+
44+
static struct mxc_i2c_config i2c_config[] =
45+
{
46+
#ifdef BSP_USING_I2C0
47+
{
48+
.name = "i2c0",
49+
.i2c_periph = MXC_I2C_GET_I2C(0),
50+
.irq_type = MXC_I2C_GET_IRQ(0),
51+
.speed = I2C_STD_MODE,
52+
/*I2C_STD_MODE: 100KHz, I2C_FAST_MODE: 400KHz, I2C_FASTPLUS_MODE: 1MHz, I2C_HS_MODE: 3.4MHz */
53+
},
54+
#endif
55+
#ifdef BSP_USING_I2C1
56+
{
57+
.name = "i2c1",
58+
.i2c_periph = MXC_I2C_GET_I2C(1),
59+
.irq_type = MXC_I2C_GET_IRQ(1),
60+
.speed = I2C_STD_MODE,
61+
/*I2C_STD_MODE: 100KHz, I2C_FAST_MODE: 400KHz, I2C_FASTPLUS_MODE: 1MHz, I2C_HS_MODE: 3.4MHz */
62+
},
63+
#endif
64+
};
65+
66+
static struct mxc_i2c i2c_obj[sizeof(i2c_config) / sizeof(i2c_config[0])] = {0};
67+
68+
69+
static rt_size_t mxc_i2c_mst_xfer(struct rt_i2c_bus_device *bus,
70+
struct rt_i2c_msg msgs[],
71+
rt_uint32_t num)
72+
{
73+
rt_uint32_t i, ret;
74+
rt_uint16_t addr;
75+
int error;
76+
int restart = 0;
77+
struct rt_i2c_msg *msg;
78+
struct mxc_i2c *obj = (struct mxc_i2c *)bus;
79+
80+
for (i = 0; i < num; i++)
81+
{
82+
msg = &msgs[i];
83+
84+
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)
85+
{
86+
LOG_E("Not support RT_I2C_ADDR_10BIT or RT_I2C_NO_START or RT_I2C_IGNORE_NACK or RT_I2C_NO_READ_ACK");
87+
return 0;
88+
}
89+
90+
if (msg->flags & RT_I2C_NO_STOP)
91+
{
92+
restart = 1;
93+
}
94+
95+
if (msg->flags & RT_I2C_RD)
96+
{
97+
addr = msg->addr << 1;
98+
if ((error = I2C_MasterRead(obj->config->i2c_periph, (uint8_t)addr, msg->buf, msg->len, restart)) != msg->len)
99+
{
100+
LOG_E("Error writing %d", error);
101+
return 0;
102+
}
103+
}
104+
else /* RT_I2C_WR */
105+
{
106+
addr = msg->addr << 1;
107+
if ((error = I2C_MasterWrite(obj->config->i2c_periph, (uint8_t)addr, msg->buf, msg->len, restart)) != msg->len)
108+
{
109+
LOG_E("Error writing %d", error);
110+
return 0;
111+
}
112+
}
113+
}
114+
ret = i;
115+
116+
return ret;
117+
}
118+
119+
static const struct rt_i2c_bus_device_ops mxc_i2c_ops =
120+
{
121+
mxc_i2c_mst_xfer,
122+
RT_NULL,
123+
RT_NULL,
124+
};
125+
126+
int rt_hw_i2c_init(void)
127+
{
128+
rt_size_t obj_num;
129+
int index;
130+
rt_err_t result = 0;
131+
132+
#ifdef BSP_USING_I2C0
133+
NVIC_EnableIRQ(I2C0_IRQn);
134+
#endif
135+
#ifdef BSP_USING_I2C1
136+
NVIC_EnableIRQ(I2C1_IRQn);
137+
#endif
138+
139+
obj_num = sizeof(i2c_obj) / sizeof(struct mxc_i2c);
140+
for (index = 0; index < obj_num; index++)
141+
{
142+
/* init i2c object */
143+
i2c_obj[index].config = &i2c_config[index];
144+
i2c_obj[index].bus.ops = &mxc_i2c_ops;
145+
146+
/* init i2c device */
147+
I2C_Shutdown(i2c_config[index].i2c_periph);
148+
I2C_Init(i2c_config[index].i2c_periph, i2c_config[index].speed, RT_NULL);
149+
150+
/* register i2c device */
151+
result = rt_i2c_bus_device_register(&i2c_obj[index].bus,
152+
i2c_obj[index].config->name
153+
);
154+
RT_ASSERT(result == RT_EOK);
155+
}
156+
157+
return 0;
158+
}
159+
INIT_DEVICE_EXPORT(rt_hw_i2c_init);
160+
161+
#ifdef BSP_USING_I2C0
162+
void I2C0_IRQHandler(void)
163+
{
164+
rt_interrupt_enter();
165+
I2C_Handler(MXC_I2C0);
166+
rt_interrupt_leave();
167+
}
168+
#endif
169+
170+
#ifdef BSP_USING_I2C1
171+
void I2C1_IRQHandler(void)
172+
{
173+
rt_interrupt_enter();
174+
I2C_Handler(MXC_I2C1);
175+
rt_interrupt_leave();
176+
}
177+
#endif
178+
179+
#endif /* RT_USING_I2C */
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
/*
2+
* Copyright (c) 2006-2020, RT-Thread Development Team
3+
*
4+
* SPDX-License-Identifier: Apache-2.0
5+
*
6+
* Change Logs:
7+
* Date Author Notes
8+
* 2021-02-26 Jackistang first version
9+
*
10+
*/
11+
12+
#ifndef __DRV_I2C_H__
13+
#define __DRV_I2C_H__
14+
15+
16+
#endif /* __DRV_I2C_H__ */

0 commit comments

Comments
 (0)