Skip to content

Commit b437478

Browse files
authored
Merge pull request #4025 from xckhmf/master
[bsp/nrf5x]support for uarte1
2 parents 065488e + 7c783d4 commit b437478

File tree

9 files changed

+461
-57
lines changed

9 files changed

+461
-57
lines changed

bsp/nrf5x/libraries/drivers/SConscript

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,10 @@ src = Split("""
99
""")
1010

1111
if GetDepend(['BSP_USING_UART']):
12-
src += ['drv_uart.c']
13-
12+
if GetDepend(['NRFX_USING_UART']):
13+
src += ['drv_uart.c']
14+
else:
15+
src += ['drv_uarte.c']
1416
if GetDepend(['BSP_USING_ON_CHIP_FLASH']):
1517
src += ['drv_flash.c']
1618

Lines changed: 281 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,281 @@
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+
* 2020-04-28 xckhmf Modify for <nrfx>
9+
* 2020-10-31 xckhmf Support for UART1
10+
*
11+
*/
12+
#include <rtdevice.h>
13+
#include <nrfx_uarte.h>
14+
#include "drv_uart.h"
15+
16+
#ifdef BSP_USING_UART
17+
#if defined(BSP_USING_UART0) || defined(BSP_USING_UART1)
18+
typedef struct
19+
{
20+
struct rt_serial_device *serial;
21+
nrfx_uarte_t uarte_instance;
22+
uint8_t rx_length;
23+
uint8_t tx_buffer[1];
24+
uint8_t rx_buffer[1];
25+
bool isInit;
26+
uint32_t rx_pin;
27+
uint32_t tx_pin;
28+
} drv_uart_cb_t;
29+
30+
#ifdef BSP_USING_UART0
31+
static struct rt_serial_device m_serial_0;
32+
drv_uart_cb_t m_uarte0_cb = {
33+
.uarte_instance = NRFX_UARTE_INSTANCE(0),
34+
.rx_length = 0,
35+
.rx_pin = BSP_UART0_RX_PIN,
36+
.tx_pin = BSP_UART0_TX_PIN,
37+
.isInit = false
38+
};
39+
#endif /* BSP_USING_UART0 */
40+
41+
#ifdef BSP_USING_UART1
42+
static struct rt_serial_device m_serial_1;
43+
drv_uart_cb_t m_uarte1_cb = {
44+
.uarte_instance = NRFX_UARTE_INSTANCE(1),
45+
.rx_length = 0,
46+
.rx_pin = BSP_UART1_RX_PIN,
47+
.tx_pin = BSP_UART1_TX_PIN,
48+
.isInit = false
49+
};
50+
#endif /* BSP_USING_UART1 */
51+
52+
static void uarte_evt_handler(nrfx_uarte_event_t const * p_event,
53+
void * p_context)
54+
{
55+
drv_uart_cb_t *p_cb = RT_NULL;
56+
p_cb = (drv_uart_cb_t*)p_context;
57+
switch (p_event->type)
58+
{
59+
case NRFX_UARTE_EVT_RX_DONE:
60+
p_cb->rx_length = p_event->data.rxtx.bytes;
61+
if(p_cb->serial->parent.open_flag&RT_DEVICE_FLAG_INT_RX)
62+
{
63+
rt_hw_serial_isr(p_cb->serial, RT_SERIAL_EVENT_RX_IND);
64+
}
65+
(void)nrfx_uarte_rx(&(p_cb->uarte_instance), p_cb->rx_buffer, 1);
66+
break;
67+
68+
case NRFX_UARTE_EVT_ERROR:
69+
(void)nrfx_uarte_rx(&(p_cb->uarte_instance), p_cb->rx_buffer, 1);
70+
break;
71+
72+
case NRFX_UARTE_EVT_TX_DONE:
73+
if(p_cb->serial->parent.open_flag&RT_DEVICE_FLAG_INT_TX)
74+
{
75+
rt_hw_serial_isr(p_cb->serial, RT_SERIAL_EVENT_TX_DONE);
76+
}
77+
break;
78+
79+
default:
80+
break;
81+
}
82+
}
83+
84+
static rt_err_t _uart_cfg(struct rt_serial_device *serial, struct serial_configure *cfg)
85+
{
86+
nrfx_uarte_config_t config = NRFX_UARTE_DEFAULT_CONFIG(NRF_UARTE_PSEL_DISCONNECTED,\
87+
NRF_UARTE_PSEL_DISCONNECTED);
88+
89+
drv_uart_cb_t *p_cb = RT_NULL;
90+
91+
RT_ASSERT(serial != RT_NULL);
92+
RT_ASSERT(cfg != RT_NULL);
93+
94+
if (serial->parent.user_data == RT_NULL)
95+
{
96+
return -RT_ERROR;
97+
}
98+
p_cb = (drv_uart_cb_t*)serial->parent.user_data;
99+
if(p_cb->isInit)
100+
{
101+
nrfx_uarte_uninit(&(p_cb->uarte_instance));
102+
p_cb->isInit = false;
103+
}
104+
105+
switch (cfg->baud_rate)
106+
{
107+
case BAUD_RATE_2400:
108+
config.baudrate = NRF_UARTE_BAUDRATE_2400;
109+
break;
110+
case BAUD_RATE_4800:
111+
config.baudrate = NRF_UARTE_BAUDRATE_4800;
112+
break;
113+
case BAUD_RATE_9600:
114+
config.baudrate = NRF_UARTE_BAUDRATE_9600;
115+
break;
116+
case BAUD_RATE_19200:
117+
config.baudrate = NRF_UARTE_BAUDRATE_19200;
118+
break;
119+
case BAUD_RATE_38400:
120+
config.baudrate = NRF_UARTE_BAUDRATE_38400;
121+
break;
122+
case BAUD_RATE_57600:
123+
config.baudrate = NRF_UARTE_BAUDRATE_57600;
124+
break;
125+
case BAUD_RATE_115200:
126+
config.baudrate = NRF_UARTE_BAUDRATE_115200;
127+
break;
128+
case BAUD_RATE_230400:
129+
config.baudrate = NRF_UARTE_BAUDRATE_230400;
130+
break;
131+
case BAUD_RATE_460800:
132+
config.baudrate = NRF_UARTE_BAUDRATE_460800;
133+
break;
134+
case BAUD_RATE_921600:
135+
config.baudrate = NRF_UARTE_BAUDRATE_921600;
136+
break;
137+
case BAUD_RATE_2000000:
138+
case BAUD_RATE_3000000:
139+
return -RT_EINVAL;
140+
default:
141+
config.baudrate = NRF_UARTE_BAUDRATE_115200;
142+
break;
143+
}
144+
config.hal_cfg.parity = (cfg->parity == PARITY_NONE)?\
145+
NRF_UARTE_PARITY_EXCLUDED:NRF_UARTE_PARITY_INCLUDED;
146+
config.hal_cfg.hwfc = NRF_UARTE_HWFC_DISABLED;
147+
config.pselrxd = p_cb->rx_pin;
148+
config.pseltxd = p_cb->tx_pin;
149+
config.p_context = (void *)p_cb;
150+
151+
nrfx_uarte_init(&(p_cb->uarte_instance),(nrfx_uarte_config_t const *)&config,uarte_evt_handler);
152+
nrfx_uarte_rx(&(p_cb->uarte_instance),p_cb->rx_buffer,1);
153+
p_cb->isInit = true;
154+
return RT_EOK;
155+
}
156+
157+
static rt_err_t _uart_ctrl(struct rt_serial_device *serial, int cmd, void *arg)
158+
{
159+
drv_uart_cb_t *p_cb = RT_NULL;
160+
RT_ASSERT(serial != RT_NULL);
161+
162+
if (serial->parent.user_data == RT_NULL)
163+
{
164+
return -RT_ERROR;
165+
}
166+
p_cb = (drv_uart_cb_t*)serial->parent.user_data;
167+
168+
switch (cmd)
169+
{
170+
/* disable interrupt */
171+
case RT_DEVICE_CTRL_CLR_INT:
172+
break;
173+
174+
/* enable interrupt */
175+
case RT_DEVICE_CTRL_SET_INT:
176+
break;
177+
178+
case RT_DEVICE_CTRL_CUSTOM:
179+
if ((rt_uint32_t)(arg) == UART_CONFIG_BAUD_RATE_9600)
180+
{
181+
p_cb->serial->config.baud_rate = 9600;
182+
}
183+
else if ((rt_uint32_t)(arg) == UART_CONFIG_BAUD_RATE_115200)
184+
{
185+
p_cb->serial->config.baud_rate = 115200;
186+
}
187+
_uart_cfg(serial, &(serial->config));
188+
break;
189+
190+
case RT_DEVICE_CTRL_PIN:
191+
_uart_cfg(serial, &(serial->config));
192+
break;
193+
194+
case RT_DEVICE_POWERSAVE:
195+
if(p_cb->isInit)
196+
{
197+
nrfx_uarte_uninit(&(p_cb->uarte_instance));
198+
p_cb->isInit = false;
199+
}
200+
break;
201+
202+
case RT_DEVICE_WAKEUP:
203+
_uart_cfg(serial, &(serial->config));
204+
break;
205+
206+
default:
207+
return -RT_ERROR;
208+
}
209+
210+
return RT_EOK;
211+
}
212+
213+
static int _uart_putc(struct rt_serial_device *serial, char c)
214+
{
215+
drv_uart_cb_t *p_cb = RT_NULL;
216+
int rtn = -1;
217+
RT_ASSERT(serial != RT_NULL);
218+
219+
if (serial->parent.user_data != RT_NULL)
220+
{
221+
p_cb = (drv_uart_cb_t*)serial->parent.user_data;
222+
}
223+
p_cb->tx_buffer[0] = c;
224+
nrfx_uarte_tx(&(p_cb->uarte_instance),p_cb->tx_buffer,1);
225+
if(!(serial->parent.open_flag&RT_DEVICE_FLAG_INT_TX))
226+
{
227+
while(nrfx_uarte_tx_in_progress(&(p_cb->uarte_instance)))
228+
{
229+
}
230+
}
231+
return rtn;
232+
}
233+
234+
static int _uart_getc(struct rt_serial_device *serial)
235+
{
236+
int ch = -1;
237+
drv_uart_cb_t *p_cb = RT_NULL;
238+
RT_ASSERT(serial != RT_NULL);
239+
240+
if (serial->parent.user_data != RT_NULL)
241+
{
242+
p_cb = (drv_uart_cb_t*)serial->parent.user_data;
243+
}
244+
if(p_cb->rx_length)
245+
{
246+
ch = p_cb->rx_buffer[0];
247+
p_cb->rx_length--;
248+
}
249+
return ch;
250+
}
251+
252+
static struct rt_uart_ops _uart_ops = {
253+
_uart_cfg,
254+
_uart_ctrl,
255+
_uart_putc,
256+
_uart_getc
257+
};
258+
259+
void rt_hw_uart_init(void)
260+
{
261+
struct serial_configure config = RT_SERIAL_CONFIG_DEFAULT;
262+
263+
#ifdef BSP_USING_UART0
264+
m_serial_0.config = config;
265+
m_serial_0.ops = &_uart_ops;
266+
m_uarte0_cb.serial = &m_serial_0;
267+
rt_hw_serial_register(&m_serial_0, "uart0", \
268+
RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX , &m_uarte0_cb);
269+
#endif /* BSP_USING_UART0 */
270+
271+
#ifdef BSP_USING_UART1
272+
m_serial_1.config = config;
273+
m_serial_1.ops = &_uart_ops;
274+
m_uarte1_cb.serial = &m_serial_1;
275+
rt_hw_serial_register(&m_serial_1, "uart1", \
276+
RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX |RT_DEVICE_FLAG_INT_TX, &m_uarte1_cb);
277+
#endif /* BSP_USING_UART1 */
278+
279+
}
280+
#endif /* defined(BSP_USING_UART0) || defined(BSP_USING_UART1) */
281+
#endif /* BSP_USING_UART */
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
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+
* 2020-04-28 xckhmf Modify for <nrfx>
9+
* 2020-10-31 xckhmf Support for UART1
10+
*
11+
*/
12+
#ifndef __DRV_UART_H__
13+
#define __DRV_UART_H__
14+
15+
#ifdef __cplusplus
16+
extern "C" {
17+
#endif
18+
19+
#define RT_DEVICE_CTRL_CUSTOM 0x20
20+
#define RT_DEVICE_CTRL_PIN 0x21
21+
#define RT_DEVICE_POWERSAVE 0x22
22+
#define RT_DEVICE_WAKEUP 0x23
23+
24+
#define UART_CONFIG_BAUD_RATE_9600 1
25+
#define UART_CONFIG_BAUD_RATE_115200 2
26+
27+
void rt_hw_uart_init(void);
28+
29+
#ifdef __cplusplus
30+
}
31+
#endif
32+
33+
#endif /* __DRV_UART_H__ */

0 commit comments

Comments
 (0)