1 /*
2  * Copyright (c) 2006-2024 RT-Thread Development Team
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  *
6  * Change Logs:
7  * Date           Author           Notes
8  * 2021-06-01     KyleChan     first version
9  */
10 
11 #ifndef __DEV_SERIAL_V2_H__
12 #define __DEV_SERIAL_V2_H__
13 
14 #include <rtthread.h>
15 #include <rtdevice.h>
16 /**
17  * @defgroup    group_drivers_serial_v2 Serial v2
18  * @brief       Serial v2 driver api
19  * @ingroup     group_device_driver
20  *
21  * <b>Example</b>
22  * @code {.c}
23  *
24  * #include <rtthread.h>
25  * #include <rtdevice.h>
26  *
27  * #define SAMPLE_UART_NAME       "uart1"
28  *
29  * struct rx_msg
30  * {
31  *     rt_device_t dev;
32  *     rt_size_t size;
33  * };
34  * static rt_device_t serial;
35  * static struct rt_messagequeue rx_mq;
36  *
37  * static rt_err_t uart_input(rt_device_t dev, rt_size_t size)
38  * {
39  *     struct rx_msg msg;
40  *     rt_err_t result;
41  *     msg.dev = dev;
42  *     msg.size = size;
43  *
44  *     result = rt_mq_send(&rx_mq, &msg, sizeof(msg));
45  *     if (result == -RT_EFULL)
46  *     {
47  *         rt_kprintf("message queue full!\n");
48  *     }
49  *     return result;
50  * }
51  *
52  * static void serial_thread_entry(void *parameter)
53  * {
54  *     struct rx_msg msg;
55  *     rt_err_t result;
56  *     rt_uint32_t rx_length;
57  *     static char rx_buffer[BSP_UART1_RX_BUFSIZE + 1];
58  *
59  *     while (1)
60  *     {
61  *         rt_memset(&msg, 0, sizeof(msg));
62  *         result = rt_mq_recv(&rx_mq, &msg, sizeof(msg), RT_WAITING_FOREVER);
63  *         if (result > 0)
64  *         {
65  *             rx_length = rt_device_read(msg.dev, 0, rx_buffer, msg.size);
66  *             rx_buffer[rx_length] = '\0';
67  *             rt_device_write(serial, 0, rx_buffer, rx_length);
68  *             rt_kprintf("%s\n",rx_buffer);
69  *         }
70  *     }
71  * }
72  *
73  * static int uart_dma_sample(int argc, char *argv[])
74  * {
75  *     rt_err_t ret = RT_EOK;
76  *     char uart_name[RT_NAME_MAX];
77  *     static char msg_pool[256];
78  *     char str[] = "hello RT-Thread!\r\n";
79  *
80  *     if (argc == 2)
81  *     {
82  *         rt_strncpy(uart_name, argv[1], RT_NAME_MAX);
83  *     }
84  *     else
85  *     {
86  *         rt_strncpy(uart_name, SAMPLE_UART_NAME, RT_NAME_MAX);
87  *     }
88  *
89  *     serial = rt_device_find(uart_name);
90  *     if (!serial)
91  *     {
92  *         rt_kprintf("find %s failed!\n", uart_name);
93  *         return -RT_ERROR;
94  *     }
95  *
96  *     rt_mq_init(&rx_mq, "rx_mq",
97  *                msg_pool,
98  *                sizeof(struct rx_msg),
99  *                sizeof(msg_pool),
100  *                RT_IPC_FLAG_FIFO);
101  *
102  *     rt_device_open(serial, RT_DEVICE_FLAG_RX_NON_BLOCKING | RT_DEVICE_FLAG_TX_BLOCKING);
103  *     rt_device_set_rx_indicate(serial, uart_input);
104  *     rt_device_write(serial, 0, str, (sizeof(str) - 1));
105  *
106  *     rt_thread_t thread = rt_thread_create("serial", serial_thread_entry, RT_NULL, 1024, 25, 10);
107  *     if (thread != RT_NULL)
108  *     {
109  *         rt_thread_startup(thread);
110  *     }
111  *     else
112  *     {
113  *         ret = RT_ERROR;
114  *     }
115  *
116  *     return ret;
117  * }
118  * MSH_CMD_EXPORT(uart_dma_sample, uart device dma sample);
119  * @endcode
120  */
121 
122 
123 /*!
124  * @addtogroup group_drivers_serial_v2
125  * @{
126  */
127 
128 #define BAUD_RATE_2400                  2400
129 #define BAUD_RATE_4800                  4800
130 #define BAUD_RATE_9600                  9600
131 #define BAUD_RATE_19200                 19200
132 #define BAUD_RATE_38400                 38400
133 #define BAUD_RATE_57600                 57600
134 #define BAUD_RATE_115200                115200
135 #define BAUD_RATE_230400                230400
136 #define BAUD_RATE_460800                460800
137 #define BAUD_RATE_500000                500000
138 #define BAUD_RATE_921600                921600
139 #define BAUD_RATE_2000000               2000000
140 #define BAUD_RATE_2500000               2500000
141 #define BAUD_RATE_3000000               3000000
142 
143 #define DATA_BITS_5                     5
144 #define DATA_BITS_6                     6
145 #define DATA_BITS_7                     7
146 #define DATA_BITS_8                     8
147 #define DATA_BITS_9                     9
148 
149 #define STOP_BITS_1                     0
150 #define STOP_BITS_2                     1
151 #define STOP_BITS_3                     2
152 #define STOP_BITS_4                     3
153 
154 #ifdef _WIN32
155 #include <windows.h>
156 #else
157 #define PARITY_NONE                     0
158 #define PARITY_ODD                      1
159 #define PARITY_EVEN                     2
160 #endif
161 
162 #define BIT_ORDER_LSB                   0
163 #define BIT_ORDER_MSB                   1
164 
165 #define NRZ_NORMAL                      0       /* Non Return to Zero : normal mode */
166 #define NRZ_INVERTED                    1       /* Non Return to Zero : inverted mode */
167 
168 /**
169  * device flag
170  */
171 #define RT_DEVICE_FLAG_RX_BLOCKING      0x1000
172 #define RT_DEVICE_FLAG_RX_NON_BLOCKING  0x2000
173 
174 #define RT_DEVICE_FLAG_TX_BLOCKING      0x4000
175 #define RT_DEVICE_FLAG_TX_NON_BLOCKING  0x8000
176 
177 #define RT_SERIAL_RX_BLOCKING           RT_DEVICE_FLAG_RX_BLOCKING
178 #define RT_SERIAL_RX_NON_BLOCKING       RT_DEVICE_FLAG_RX_NON_BLOCKING
179 #define RT_SERIAL_TX_BLOCKING           RT_DEVICE_FLAG_TX_BLOCKING
180 #define RT_SERIAL_TX_NON_BLOCKING       RT_DEVICE_FLAG_TX_NON_BLOCKING
181 
182 /**
183  * hw device control commands
184  */
185 #define RT_DEVICE_CHECK_OPTMODE         0x20
186 
187 /**
188  * hw serial control commands
189  */
190 #define RT_HW_SERIAL_CTRL_GETC                    0x01    /* Tx irq get char */
191 #define RT_HW_SERIAL_CTRL_PUTC                    0x02    /* Rx irq put char */
192 #define RT_HW_SERIAL_CTRL_GET_DMA_PING_BUF        0x03    /* Get DMA ping-pong buffer */
193 
194 /**
195  * hw isr event
196  */
197 #define RT_SERIAL_EVENT_RX_IND          0x01    /* Rx indication */
198 #define RT_SERIAL_EVENT_TX_DONE         0x02    /* Tx complete   */
199 #define RT_SERIAL_EVENT_RX_DMADONE      0x03    /* Rx DMA transfer done */
200 #define RT_SERIAL_EVENT_TX_DMADONE      0x04    /* Tx DMA transfer done */
201 
202 /**
203  * device commands
204  * 0x40 -      special device control commands
205  */
206 #define RT_SERIAL_CTRL_SET_RX_TIMEOUT           0x41    /* set Rx timeout. Call before rt_device_read. not supported in poll mode */
207 #define RT_SERIAL_CTRL_SET_TX_TIMEOUT           0x42    /* set Tx timeout. Call before rt_device_write. not supported in poll mode */
208 #define RT_SERIAL_CTRL_GET_RX_TIMEOUT           0x43    /* get Rx timeout. not supported in poll mode */
209 #define RT_SERIAL_CTRL_GET_TX_TIMEOUT           0x44    /* get Tx timeout. not supported in poll mode */
210 #define RT_SERIAL_CTRL_RX_FLUSH                 0x45    /* clear rx buffer. Discard all data */
211 #define RT_SERIAL_CTRL_TX_FLUSH                 0x46    /* clear tx buffer. Blocking and wait for the send buffer data to be sent. not supported in poll mode */
212 #define RT_SERIAL_CTRL_GET_UNREAD_BYTES_COUNT   0x47    /* get unread bytes count. not supported in poll mode */
213 #define RT_SERIAL_CTRL_GET_CONFIG               0x48    /* get serial config */
214 
215 #define RT_SERIAL_ERR_OVERRUN           0x01
216 #define RT_SERIAL_ERR_FRAMING           0x02
217 #define RT_SERIAL_ERR_PARITY            0x03
218 
219 #define RT_SERIAL_RX_MINBUFSZ 64
220 #define RT_SERIAL_TX_MINBUFSZ 64
221 
222 #define RT_SERIAL_TX_BLOCKING_BUFFER    1
223 #define RT_SERIAL_TX_BLOCKING_NO_BUFFER 0
224 
225 #define RT_SERIAL_FLOWCONTROL_CTSRTS    1
226 #define RT_SERIAL_FLOWCONTROL_NONE      0
227 
228 /* Default config for serial_configure structure */
229 #ifdef RT_SERIAL_USING_DMA
230 #define RT_SERIAL_CONFIG_DEFAULT                      \
231 {                                                     \
232     BAUD_RATE_115200,           /* 115200 bits/s */   \
233     DATA_BITS_8,                /* 8 databits */      \
234     STOP_BITS_1,                /* 1 stopbit */       \
235     PARITY_NONE,                /* No parity  */      \
236     BIT_ORDER_LSB,              /* LSB first sent */  \
237     NRZ_NORMAL,                 /* Normal mode */     \
238     RT_SERIAL_RX_MINBUFSZ,      /* rxBuf size */      \
239     RT_SERIAL_TX_MINBUFSZ,      /* txBuf size */      \
240     RT_SERIAL_FLOWCONTROL_NONE, /* Off flowcontrol */ \
241     0,                          /* reserved */        \
242     RT_SERIAL_RX_MINBUFSZ / 2,  /* dma_ping_bufsz */  \
243 }
244 #else
245 #define RT_SERIAL_CONFIG_DEFAULT                      \
246 {                                                     \
247     BAUD_RATE_115200,           /* 115200 bits/s */   \
248     DATA_BITS_8,                /* 8 databits */      \
249     STOP_BITS_1,                /* 1 stopbit */       \
250     PARITY_NONE,                /* No parity  */      \
251     BIT_ORDER_LSB,              /* LSB first sent */  \
252     NRZ_NORMAL,                 /* Normal mode */     \
253     RT_SERIAL_RX_MINBUFSZ,      /* rxBuf size */      \
254     RT_SERIAL_TX_MINBUFSZ,      /* txBuf size */      \
255     RT_SERIAL_FLOWCONTROL_NONE, /* Off flowcontrol */ \
256     0,                          /* reserved */        \
257 }
258 #endif
259 
260 /**
261  * @brief Serial receive indicate hook function type
262  *
263  */
264 typedef void (*rt_hw_serial_rxind_hookproto_t)(rt_device_t dev, rt_size_t size);
265 RT_OBJECT_HOOKLIST_DECLARE(rt_hw_serial_rxind_hookproto_t, rt_hw_serial_rxind);
266 
267 struct serial_configure
268 {
269     rt_uint32_t baud_rate;
270 
271     rt_uint32_t data_bits               :4;
272     rt_uint32_t stop_bits               :2;
273     rt_uint32_t parity                  :2;
274     rt_uint32_t bit_order               :1;
275     rt_uint32_t invert                  :1;
276     rt_uint32_t rx_bufsz                :16;
277     rt_uint32_t tx_bufsz                :16;
278     rt_uint32_t flowcontrol             :1;
279     rt_uint32_t reserved                :5;
280 
281 #ifdef RT_SERIAL_USING_DMA
282     rt_uint32_t dma_ping_bufsz          :16;
283 #endif
284 };
285 
286 /**
287  * @brief Serial Receive FIFO mode
288  */
289 struct rt_serial_rx_fifo
290 {
291     struct rt_ringbuffer rb;
292 
293 #ifdef RT_SERIAL_USING_DMA
294     struct rt_ringbuffer dma_ping_rb;
295 #endif
296 
297     struct rt_completion rx_cpt;
298 
299     rt_size_t rx_cpt_index;
300 
301     rt_atomic_t rx_timeout;
302 };
303 
304 /**
305  * @brief Serial Transmit FIFO mode
306  *
307  */
308 struct rt_serial_tx_fifo
309 {
310     struct rt_ringbuffer rb;
311 
312     struct rt_completion tx_cpt;
313 
314     rt_size_t put_size;
315 
316     rt_atomic_t tx_timeout;
317 
318     rt_atomic_t activated;
319 };
320 
321 /**
322  * @brief     serial device structure
323  *
324  */
325 struct rt_serial_device
326 {
327     struct rt_device          parent;
328 
329     const struct rt_uart_ops *ops;
330     struct serial_configure   config;
331 
332     void *serial_rx;
333     void *serial_tx;
334 
335     struct rt_spinlock spinlock;
336 
337 #ifdef RT_USING_SERIAL_BYPASS
338     struct rt_serial_bypass* bypass;
339 #endif
340 
341     struct rt_device_notify rx_notify;
342 
343 #ifdef RT_USING_POSIX_STDIO
344     rt_bool_t is_posix_mode;
345 #endif
346 };
347 
348 /**
349  * @brief uart device operations
350  *
351  */
352 struct rt_uart_ops
353 {
354     rt_err_t (*configure)(struct rt_serial_device       *serial,
355                           struct serial_configure       *cfg);
356 
357     rt_err_t (*control)(struct rt_serial_device         *serial,
358                                             int          cmd,
359                                             void        *arg);
360 
361     int (*putc)(struct rt_serial_device *serial, char c);
362     int (*getc)(struct rt_serial_device *serial);
363 
364     rt_ssize_t (*transmit)(struct rt_serial_device       *serial,
365                                  rt_uint8_t             *buf,
366                                  rt_size_t               size,
367                                  rt_uint32_t             tx_flag);
368 };
369 
370 /**
371  * @brief Serial interrupt service routine
372  * @param serial    serial device
373  * @param event     event mask
374  * @ingroup group_drivers_serial_v2
375  */
376 void rt_hw_serial_isr(struct rt_serial_device *serial, int event);
377 
378 rt_err_t rt_hw_serial_control_isr(struct rt_serial_device *serial, int cmd, void *args);
379 
380 /**
381  * @brief Register a serial device to device list
382  *
383  * @param serial    serial device
384  * @param name      device name
385  * @param flag      device flag
386  * @param data      device private data
387  * @return rt_err_t        error code
388  * @note This function will register a serial device to system device list,
389  *       and add a device object to system object list.
390  * @ingroup group_drivers_serial_v2
391  */
392 rt_err_t rt_hw_serial_register(struct rt_serial_device      *serial,
393                                const  char                  *name,
394                                       rt_uint32_t            flag,
395                                       void                  *data);
396 
397 /**
398  * @brief     register a serial device to system device list and add a device object to system object list
399  *
400  * @param serial    serial device
401  * @return rt_err_t error code
402  *
403  * @ingroup group_drivers_serial_v2
404  */
405 rt_err_t rt_hw_serial_register_tty(struct rt_serial_device *serial);
406 
407 
408 /*! @}*/
409 
410 #endif
411