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