xref: /nrf52832-nimble/drivers/drv_uart.c (revision 150812a83cab50279bd772ef6db1bfaf255f2c5b)
1*150812a8SEvalZero /*
2*150812a8SEvalZero  * Copyright (c) 2006-2018, RT-Thread Development Team
3*150812a8SEvalZero  *
4*150812a8SEvalZero  * SPDX-License-Identifier: Apache-2.0
5*150812a8SEvalZero  *
6*150812a8SEvalZero  */
7*150812a8SEvalZero 
8*150812a8SEvalZero #include <rtthread.h>
9*150812a8SEvalZero #include <rtdevice.h>
10*150812a8SEvalZero 
11*150812a8SEvalZero #include "board.h"
12*150812a8SEvalZero #include "drv_uart.h"
13*150812a8SEvalZero 
14*150812a8SEvalZero #include "nrf.h"
15*150812a8SEvalZero #include "nrf_gpio.h"
16*150812a8SEvalZero #include "nrfx_uart.h"
17*150812a8SEvalZero 
18*150812a8SEvalZero static struct rt_serial_device _serial0_0;
19*150812a8SEvalZero #if USE_UART0_1
20*150812a8SEvalZero static struct rt_serial_device _serial0_1;
21*150812a8SEvalZero #endif
22*150812a8SEvalZero 
23*150812a8SEvalZero typedef struct
24*150812a8SEvalZero {
25*150812a8SEvalZero     struct rt_serial_device *serial;
26*150812a8SEvalZero     nrfx_uart_t uart;
27*150812a8SEvalZero     uint32_t rx_pin;
28*150812a8SEvalZero     uint32_t tx_pin;
29*150812a8SEvalZero } UART_CFG_T;
30*150812a8SEvalZero 
31*150812a8SEvalZero UART_CFG_T uart0 =
32*150812a8SEvalZero {
33*150812a8SEvalZero     .uart = {.p_reg = NRF_UART0, .drv_inst_idx = 0},
34*150812a8SEvalZero #ifdef RT_USING_CONSOLE
35*150812a8SEvalZero     .rx_pin = 8,
36*150812a8SEvalZero     .tx_pin = 6
37*150812a8SEvalZero #else
38*150812a8SEvalZero     .rx_pin = 3,
39*150812a8SEvalZero     .tx_pin = 4
40*150812a8SEvalZero #endif
41*150812a8SEvalZero };
42*150812a8SEvalZero 
43*150812a8SEvalZero #if USE_UART0_1
44*150812a8SEvalZero UART_CFG_T uart1 =
45*150812a8SEvalZero {
46*150812a8SEvalZero     .uart = NRF_DRV_UART_INSTANCE(0),
47*150812a8SEvalZero     .rx_pin = 3,
48*150812a8SEvalZero     .tx_pin = 4
49*150812a8SEvalZero };
50*150812a8SEvalZero #endif
51*150812a8SEvalZero 
52*150812a8SEvalZero UART_CFG_T *working_cfg = RT_NULL;
53*150812a8SEvalZero 
UART0_IRQHandler(void)54*150812a8SEvalZero void UART0_IRQHandler(void)
55*150812a8SEvalZero {
56*150812a8SEvalZero     if (nrf_uart_int_enable_check(NRF_UART0, NRF_UART_INT_MASK_ERROR)
57*150812a8SEvalZero             && nrf_uart_event_check(NRF_UART0, NRF_UART_EVENT_ERROR))
58*150812a8SEvalZero     {
59*150812a8SEvalZero         nrf_uart_event_clear(NRF_UART0, NRF_UART_EVENT_ERROR);
60*150812a8SEvalZero     }
61*150812a8SEvalZero 
62*150812a8SEvalZero     if (nrf_uart_int_enable_check(NRF_UART0, NRF_UART_INT_MASK_RXDRDY)
63*150812a8SEvalZero             && nrf_uart_event_check(NRF_UART0, NRF_UART_EVENT_RXDRDY))
64*150812a8SEvalZero     {
65*150812a8SEvalZero         rt_hw_serial_isr(working_cfg->serial, RT_SERIAL_EVENT_RX_IND);
66*150812a8SEvalZero     }
67*150812a8SEvalZero 
68*150812a8SEvalZero     if (nrf_uart_int_enable_check(NRF_UART0, NRF_UART_INT_MASK_TXDRDY)
69*150812a8SEvalZero             && nrf_uart_event_check(NRF_UART0, NRF_UART_EVENT_TXDRDY))
70*150812a8SEvalZero     {
71*150812a8SEvalZero         rt_hw_serial_isr(working_cfg->serial, RT_SERIAL_EVENT_TX_DONE);
72*150812a8SEvalZero     }
73*150812a8SEvalZero 
74*150812a8SEvalZero     if (nrf_uart_event_check(NRF_UART0, NRF_UART_EVENT_RXTO))
75*150812a8SEvalZero     {
76*150812a8SEvalZero         rt_hw_serial_isr(working_cfg->serial, RT_SERIAL_EVENT_RX_TIMEOUT);
77*150812a8SEvalZero     }
78*150812a8SEvalZero }
79*150812a8SEvalZero 
_uart_cfg(struct rt_serial_device * serial,struct serial_configure * cfg)80*150812a8SEvalZero static rt_err_t _uart_cfg(struct rt_serial_device *serial, struct serial_configure *cfg)
81*150812a8SEvalZero {
82*150812a8SEvalZero     nrfx_uart_config_t config = NRFX_UART_DEFAULT_CONFIG;
83*150812a8SEvalZero     UART_CFG_T *instance = &uart0;
84*150812a8SEvalZero 
85*150812a8SEvalZero     RT_ASSERT(serial != RT_NULL);
86*150812a8SEvalZero     RT_ASSERT(cfg != RT_NULL);
87*150812a8SEvalZero 
88*150812a8SEvalZero     if (serial->parent.user_data != RT_NULL)
89*150812a8SEvalZero     {
90*150812a8SEvalZero         instance = (UART_CFG_T *)serial->parent.user_data;
91*150812a8SEvalZero     }
92*150812a8SEvalZero 
93*150812a8SEvalZero     nrf_uart_disable(instance->uart.p_reg);
94*150812a8SEvalZero 
95*150812a8SEvalZero     switch (cfg->baud_rate)
96*150812a8SEvalZero     {
97*150812a8SEvalZero     case 115200:
98*150812a8SEvalZero         config.baudrate = NRF_UART_BAUDRATE_115200;
99*150812a8SEvalZero         break;
100*150812a8SEvalZero 
101*150812a8SEvalZero     case 9600:
102*150812a8SEvalZero         config.baudrate = NRF_UART_BAUDRATE_9600;
103*150812a8SEvalZero         break;
104*150812a8SEvalZero 
105*150812a8SEvalZero     default:
106*150812a8SEvalZero         config.baudrate = NRF_UART_BAUDRATE_115200;
107*150812a8SEvalZero         break;
108*150812a8SEvalZero     }
109*150812a8SEvalZero 
110*150812a8SEvalZero     if (cfg->parity == PARITY_NONE)
111*150812a8SEvalZero     {
112*150812a8SEvalZero         config.parity = NRF_UART_PARITY_EXCLUDED;
113*150812a8SEvalZero     }
114*150812a8SEvalZero     else
115*150812a8SEvalZero     {
116*150812a8SEvalZero         config.parity = NRF_UART_PARITY_INCLUDED;
117*150812a8SEvalZero     }
118*150812a8SEvalZero 
119*150812a8SEvalZero     config.hwfc = NRF_UART_HWFC_DISABLED;
120*150812a8SEvalZero     config.interrupt_priority = 6;
121*150812a8SEvalZero     config.pselcts = 0;
122*150812a8SEvalZero     config.pselrts = 0;
123*150812a8SEvalZero     config.pselrxd = instance->rx_pin;
124*150812a8SEvalZero     config.pseltxd = instance->tx_pin;
125*150812a8SEvalZero 
126*150812a8SEvalZero     nrf_gpio_pin_set(config.pseltxd);
127*150812a8SEvalZero     nrf_gpio_cfg_output(config.pseltxd);
128*150812a8SEvalZero     nrf_gpio_pin_clear(config.pseltxd);
129*150812a8SEvalZero     nrf_gpio_cfg_input(config.pselrxd, NRF_GPIO_PIN_NOPULL);
130*150812a8SEvalZero     nrf_uart_baudrate_set(instance->uart.p_reg, config.baudrate);
131*150812a8SEvalZero     nrf_uart_configure(instance->uart.p_reg, config.parity, config.hwfc);
132*150812a8SEvalZero     nrf_uart_txrx_pins_set(instance->uart.p_reg, config.pseltxd, config.pselrxd);
133*150812a8SEvalZero 
134*150812a8SEvalZero     if (config.hwfc == NRF_UART_HWFC_ENABLED)
135*150812a8SEvalZero     {
136*150812a8SEvalZero         nrf_uart_hwfc_pins_set(instance->uart.p_reg, config.pselrts, config.pselcts);
137*150812a8SEvalZero     }
138*150812a8SEvalZero 
139*150812a8SEvalZero     nrf_uart_event_clear(instance->uart.p_reg, NRF_UART_EVENT_TXDRDY);
140*150812a8SEvalZero     nrf_uart_event_clear(instance->uart.p_reg, NRF_UART_EVENT_RXDRDY);
141*150812a8SEvalZero     nrf_uart_event_clear(instance->uart.p_reg, NRF_UART_EVENT_RXTO);
142*150812a8SEvalZero     nrf_uart_event_clear(instance->uart.p_reg, NRF_UART_EVENT_ERROR);
143*150812a8SEvalZero 
144*150812a8SEvalZero     nrf_uart_int_enable(instance->uart.p_reg, NRF_UART_INT_MASK_RXDRDY | NRF_UART_INT_MASK_RXTO | NRF_UART_INT_MASK_ERROR);
145*150812a8SEvalZero     NVIC_SetPriority(nrfx_get_irq_number((void *)instance->uart.p_reg), config.interrupt_priority);
146*150812a8SEvalZero     NVIC_EnableIRQ(nrfx_get_irq_number((void *)instance->uart.p_reg));
147*150812a8SEvalZero     nrf_uart_enable(instance->uart.p_reg);
148*150812a8SEvalZero     working_cfg = instance;
149*150812a8SEvalZero     return RT_EOK;
150*150812a8SEvalZero }
151*150812a8SEvalZero 
_uart_ctrl(struct rt_serial_device * serial,int cmd,void * arg)152*150812a8SEvalZero static rt_err_t _uart_ctrl(struct rt_serial_device *serial, int cmd, void *arg)
153*150812a8SEvalZero {
154*150812a8SEvalZero     UART_CFG_T *instance = working_cfg;
155*150812a8SEvalZero 
156*150812a8SEvalZero     RT_ASSERT(serial != RT_NULL);
157*150812a8SEvalZero 
158*150812a8SEvalZero     if (serial->parent.user_data != RT_NULL)
159*150812a8SEvalZero     {
160*150812a8SEvalZero         instance = (UART_CFG_T *)serial->parent.user_data;
161*150812a8SEvalZero     }
162*150812a8SEvalZero 
163*150812a8SEvalZero     switch (cmd)
164*150812a8SEvalZero     {
165*150812a8SEvalZero     /* disable interrupt */
166*150812a8SEvalZero     case RT_DEVICE_CTRL_CLR_INT:
167*150812a8SEvalZero         nrf_uart_task_trigger(instance->uart.p_reg, NRF_UART_TASK_STOPRX);
168*150812a8SEvalZero         nrf_uart_int_disable(instance->uart.p_reg, NRF_UART_INT_MASK_RXDRDY
169*150812a8SEvalZero                              | NRF_UART_INT_MASK_RXTO
170*150812a8SEvalZero                              | NRF_UART_INT_MASK_ERROR);
171*150812a8SEvalZero         NVIC_DisableIRQ(nrfx_get_irq_number((void *)instance->uart.p_reg));
172*150812a8SEvalZero         break;
173*150812a8SEvalZero 
174*150812a8SEvalZero     /* enable interrupt */
175*150812a8SEvalZero     case RT_DEVICE_CTRL_SET_INT:
176*150812a8SEvalZero         nrf_uart_event_clear(instance->uart.p_reg, NRF_UART_EVENT_RXDRDY);
177*150812a8SEvalZero         nrf_uart_event_clear(instance->uart.p_reg, NRF_UART_EVENT_RXTO);
178*150812a8SEvalZero         nrf_uart_event_clear(instance->uart.p_reg, NRF_UART_EVENT_ERROR);
179*150812a8SEvalZero         /* Enable RX interrupt. */
180*150812a8SEvalZero         nrf_uart_int_enable(instance->uart.p_reg, NRF_UART_INT_MASK_RXDRDY
181*150812a8SEvalZero                             | NRF_UART_INT_MASK_RXTO
182*150812a8SEvalZero                             | NRF_UART_INT_MASK_ERROR);
183*150812a8SEvalZero         NVIC_SetPriority(nrfx_get_irq_number((void *)instance->uart.p_reg), 6);
184*150812a8SEvalZero         NVIC_EnableIRQ(nrfx_get_irq_number((void *)instance->uart.p_reg));
185*150812a8SEvalZero         nrf_uart_task_trigger(instance->uart.p_reg, NRF_UART_TASK_STARTRX);
186*150812a8SEvalZero         break;
187*150812a8SEvalZero 
188*150812a8SEvalZero     case RT_DEVICE_CTRL_CUSTOM:
189*150812a8SEvalZero         if ((rt_uint32_t)(arg) == UART_CONFIG_BAUD_RATE_9600)
190*150812a8SEvalZero         {
191*150812a8SEvalZero             instance->serial->config.baud_rate = 9600;
192*150812a8SEvalZero             nrf_uart_baudrate_set(instance->uart.p_reg, NRF_UART_BAUDRATE_9600);
193*150812a8SEvalZero         }
194*150812a8SEvalZero         else if ((rt_uint32_t)(arg) == UART_CONFIG_BAUD_RATE_115200)
195*150812a8SEvalZero         {
196*150812a8SEvalZero             instance->serial->config.baud_rate = 115200;
197*150812a8SEvalZero             nrf_uart_baudrate_set(instance->uart.p_reg, NRF_UART_BAUDRATE_115200);
198*150812a8SEvalZero         }
199*150812a8SEvalZero 
200*150812a8SEvalZero         // _uart_cfg(instance->serial, &(instance->serial->config));
201*150812a8SEvalZero         // nrf_uart_task_trigger(instance->uart.reg.p_uart, NRF_UART_TASK_STARTRX);
202*150812a8SEvalZero         break;
203*150812a8SEvalZero 
204*150812a8SEvalZero     case RT_DEVICE_CTRL_PIN:
205*150812a8SEvalZero         if (working_cfg != instance)
206*150812a8SEvalZero         {
207*150812a8SEvalZero             _uart_cfg(instance->serial, &(instance->serial->config));
208*150812a8SEvalZero         }
209*150812a8SEvalZero         break;
210*150812a8SEvalZero 
211*150812a8SEvalZero     case RT_DEVICE_POWERSAVE:
212*150812a8SEvalZero         nrf_uart_disable(instance->uart.p_reg);
213*150812a8SEvalZero         nrf_uart_txrx_pins_disconnect(instance->uart.p_reg);
214*150812a8SEvalZero         nrf_gpio_pin_clear(instance->rx_pin);
215*150812a8SEvalZero         nrf_gpio_cfg_output(instance->rx_pin);
216*150812a8SEvalZero         nrf_gpio_pin_clear(instance->tx_pin);
217*150812a8SEvalZero         nrf_gpio_cfg_output(instance->tx_pin);
218*150812a8SEvalZero         break;
219*150812a8SEvalZero 
220*150812a8SEvalZero     case RT_DEVICE_WAKEUP:
221*150812a8SEvalZero         _uart_cfg(instance->serial, &(instance->serial->config));
222*150812a8SEvalZero         break;
223*150812a8SEvalZero 
224*150812a8SEvalZero     default:
225*150812a8SEvalZero         return RT_ERROR;
226*150812a8SEvalZero     }
227*150812a8SEvalZero 
228*150812a8SEvalZero     return RT_EOK;
229*150812a8SEvalZero }
230*150812a8SEvalZero 
_uart_putc(struct rt_serial_device * serial,char c)231*150812a8SEvalZero static int _uart_putc(struct rt_serial_device *serial, char c)
232*150812a8SEvalZero {
233*150812a8SEvalZero     UART_CFG_T *instance = working_cfg;
234*150812a8SEvalZero 
235*150812a8SEvalZero     RT_ASSERT(serial != RT_NULL);
236*150812a8SEvalZero 
237*150812a8SEvalZero     if (serial->parent.user_data != RT_NULL)
238*150812a8SEvalZero     {
239*150812a8SEvalZero         instance = (UART_CFG_T *)serial->parent.user_data;
240*150812a8SEvalZero     }
241*150812a8SEvalZero 
242*150812a8SEvalZero     nrf_uart_event_clear(instance->uart.p_reg, NRF_UART_EVENT_TXDRDY);
243*150812a8SEvalZero     nrf_uart_task_trigger(instance->uart.p_reg, NRF_UART_TASK_STARTTX);
244*150812a8SEvalZero     nrf_uart_txd_set(instance->uart.p_reg, (uint8_t)c);
245*150812a8SEvalZero     while (!nrf_uart_event_check(instance->uart.p_reg, NRF_UART_EVENT_TXDRDY))
246*150812a8SEvalZero     {
247*150812a8SEvalZero     }
248*150812a8SEvalZero 
249*150812a8SEvalZero     return 1;
250*150812a8SEvalZero }
251*150812a8SEvalZero 
_uart_getc(struct rt_serial_device * serial)252*150812a8SEvalZero static int _uart_getc(struct rt_serial_device *serial)
253*150812a8SEvalZero {
254*150812a8SEvalZero     int ch = -1;
255*150812a8SEvalZero     UART_CFG_T *instance = working_cfg;
256*150812a8SEvalZero 
257*150812a8SEvalZero     RT_ASSERT(serial != RT_NULL);
258*150812a8SEvalZero 
259*150812a8SEvalZero     if (serial->parent.user_data != RT_NULL)
260*150812a8SEvalZero     {
261*150812a8SEvalZero         instance = (UART_CFG_T *)serial->parent.user_data;
262*150812a8SEvalZero     }
263*150812a8SEvalZero 
264*150812a8SEvalZero     if (nrf_uart_event_check(instance->uart.p_reg, NRF_UART_EVENT_RXDRDY))
265*150812a8SEvalZero     {
266*150812a8SEvalZero         nrf_uart_event_clear(instance->uart.p_reg, NRF_UART_EVENT_RXDRDY);
267*150812a8SEvalZero         ch = (int)(nrf_uart_rxd_get(instance->uart.p_reg));
268*150812a8SEvalZero     }
269*150812a8SEvalZero 
270*150812a8SEvalZero     return ch;
271*150812a8SEvalZero }
272*150812a8SEvalZero 
273*150812a8SEvalZero static struct rt_uart_ops _uart_ops =
274*150812a8SEvalZero {
275*150812a8SEvalZero     _uart_cfg,
276*150812a8SEvalZero     _uart_ctrl,
277*150812a8SEvalZero     _uart_putc,
278*150812a8SEvalZero     _uart_getc
279*150812a8SEvalZero };
280*150812a8SEvalZero 
rt_hw_uart_init(void)281*150812a8SEvalZero int rt_hw_uart_init(void)
282*150812a8SEvalZero {
283*150812a8SEvalZero     struct serial_configure config = RT_SERIAL_CONFIG_DEFAULT;
284*150812a8SEvalZero 
285*150812a8SEvalZero     nrf_gpio_pin_write(uart0.tx_pin, 1);
286*150812a8SEvalZero     nrf_gpio_cfg_output(uart0.tx_pin);
287*150812a8SEvalZero 
288*150812a8SEvalZero     config.bufsz = RT_SERIAL_RB_BUFSZ;
289*150812a8SEvalZero     _serial0_0.config = config;
290*150812a8SEvalZero     _serial0_0.ops = &_uart_ops;
291*150812a8SEvalZero     uart0.serial = &_serial0_0;
292*150812a8SEvalZero 
293*150812a8SEvalZero     rt_hw_serial_register(&_serial0_0, "uart0", RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX, &uart0);
294*150812a8SEvalZero 
295*150812a8SEvalZero #if USE_UART0_1
296*150812a8SEvalZero     config.bufsz = UART0_RB_SIZE;
297*150812a8SEvalZero     _serial0_1.config = config;
298*150812a8SEvalZero     _serial0_1.ops = &_uart_ops;
299*150812a8SEvalZero     uart1.serial = &_serial0_1;
300*150812a8SEvalZero     rt_hw_serial_register(&_serial0_1, "uart1", RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX, &uart1);
301*150812a8SEvalZero #endif
302*150812a8SEvalZero 
303*150812a8SEvalZero     return 0;
304*150812a8SEvalZero }
305*150812a8SEvalZero 
306*150812a8SEvalZero INIT_BOARD_EXPORT(rt_hw_uart_init);
307