uart.c 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478
  1. #include "uart.h"
  2. #include "os/os_task.h"
  3. #include "libs/crc16.h"
  4. #include "libs/logger.h"
  5. #include "libs/utils.h"
  6. #define SHARK_UART_BAUDRATE 230400
  7. #ifdef DEBUG_PORT_UART1
  8. #define SHARK_UART0_com USART1
  9. #define SHARK_UART0_tx_port GPIOA
  10. #define SHARK_UART0_tx_pin GPIO_PIN_2
  11. #define SHARK_UART0_rx_port GPIOA
  12. #define SHARK_UART0_rx_pin GPIO_PIN_3
  13. #define SHARK_UART0_irq USART1_IRQn
  14. #define SHARK_UART0_clk RCU_USART1
  15. #define SHARK_UART0_tx_gpio_clk RCU_GPIOA
  16. #define SHARK_UART0_rx_gpio_clk RCU_GPIOA
  17. #define SHARK_UART0_tx_dma DMA0
  18. #define SHARK_UART0_tx_dma_ch DMA_CH6
  19. #define SHARK_UART0_tx_dma_clk RCU_DMA0
  20. #define SHARK_UART0_rx_dma DMA0
  21. #define SHARK_UART0_rx_dma_ch DMA_CH5
  22. #define SHARK_UART0_rx_dma_clk RCU_DMA0
  23. #define SHARK_UART0_DMA_TX_IRQ DMA0_Channel6_IRQn
  24. #define UART_DMA_IRQHandler DMA0_Channel6_IRQHandler
  25. #else
  26. #define SHARK_UART0_com USART3
  27. #define SHARK_UART0_tx_port GPIOB
  28. #define SHARK_UART0_tx_pin GPIO_PINS_10
  29. #define SHARK_UART0_rx_port GPIOB
  30. #define SHARK_UART0_rx_pin GPIO_PINS_11
  31. #define SHARK_UART0_irq USART3_IRQn
  32. #define SHARK_UART0_clk CRM_USART3_PERIPH_CLOCK
  33. #define SHARK_UART0_tx_gpio_clk CRM_GPIOB_PERIPH_CLOCK
  34. #define SHARK_UART0_rx_gpio_clk CRM_GPIOB_PERIPH_CLOCK
  35. #define SHARK_UART0_tx_dma DMA1
  36. #define SHARK_UART0_tx_dma_ch DMA1_CHANNEL2
  37. #define SHARK_UART0_tx_dma_clk CRM_DMA1_PERIPH_CLOCK
  38. #define SHARK_UART0_rx_dma DMA1
  39. #define SHARK_UART0_rx_dma_ch DMA1_CHANNEL3
  40. #define SHARK_UART0_rx_dma_clk CRM_DMA1_PERIPH_CLOCK
  41. #define SHARK_UART0_DMA_TX_IRQ DMA0_Channel3_IRQn
  42. #define UART_DMA_IRQHandler DMA1_Channel3_IRQHandler
  43. #endif
  44. // ================================================================================
  45. #define ENABLE_RX_DMA 1
  46. static u8 shark_uart0_tx_cache[SHARK_UART_TX_MEM_SIZE];
  47. static u8 shark_uart0_rx_cache[SHARK_UART_RX_MEM_SIZE];
  48. static shark_uart_t _shark_uart[1];
  49. ///static bool uart_no_data = false;
  50. #if ENABLE_RX_DMA==1
  51. #define update_dma_w_pos(uart) circle_update_write_position(&uart->rx_queue, SHARK_UART_RX_MEM_SIZE - SHARK_UART0_rx_dma_ch->dtcnt)
  52. #else
  53. #define update_dma_w_pos(uart){}
  54. #endif
  55. // ================================================================================
  56. static usart_type *_uart_index(usart_type* com){
  57. return SHARK_UART0;
  58. }
  59. static bool shark_uart_on_rx_frame(shark_uart_t *uart)
  60. {
  61. u16 crc0 = decode_u16(uart->rx_frame + uart->rx_length);
  62. u16 crc1 = crc16_get(uart->rx_frame, uart->rx_length);
  63. if (crc0 != crc1) {
  64. return false;
  65. }
  66. //protocol_recv_frame(_uart_index(uart->uart_com), (char *)uart->rx_frame, uart->rx_length);
  67. return true;
  68. }
  69. static void shark_uart_rx(shark_uart_t *uart){
  70. while(1) {
  71. u8 data = 0;
  72. update_dma_w_pos(uart);
  73. if (circle_get_one_data(&uart->rx_queue, &data) != 1) {
  74. return;
  75. }
  76. switch(data){
  77. case CH_START:
  78. uart->rx_length = 0;
  79. uart->escape = false;
  80. uart->start = true;
  81. break;
  82. case CH_END:
  83. if (uart->rx_length > 2 && uart->rx_length != 0xFFFF){
  84. uart->rx_length -= 2; //skip crc
  85. shark_uart_on_rx_frame(uart);
  86. }
  87. uart->rx_length = 0xFFFF;
  88. uart->start = false;
  89. break;
  90. case CH_ESC:
  91. uart->escape = true;
  92. break;
  93. default:
  94. if (uart->escape) {
  95. uart->escape = false;
  96. switch (data) {
  97. case CH_ESC_START:
  98. data = CH_START;
  99. break;
  100. case CH_ESC_END:
  101. data = CH_END;
  102. break;
  103. case CH_ESC_ESC:
  104. data = CH_ESC;
  105. break;
  106. default:
  107. data = 0xFF;
  108. }
  109. }
  110. if (uart->rx_length < sizeof(uart->rx_frame)) {
  111. uart->rx_frame[uart->rx_length] = data;
  112. uart->rx_length++;
  113. } else {
  114. uart->rx_length = 0xFFFF;
  115. }
  116. }
  117. }
  118. }
  119. #define DMA_CHCTL(dma, dma_ch) ((dma_channel_type *)dma_ch)->ctrl
  120. #define DMA_CHMADDR(dma, dma_ch) ((dma_channel_type *)dma_ch)->maddr
  121. #define DMA_CHXCTL_CHEN BIT(0) /*!< channel enable */
  122. static void shark_uart_dma_tx(shark_uart_t *uart)
  123. {
  124. u32 value = DMA_CHCTL(SHARK_UART0_tx_dma, uart->tx_dma_ch);
  125. if (value & DMA_CHXCTL_CHEN) {
  126. if (SET != dma_flag_get(DMA1_FDT1_FLAG)) {
  127. return;
  128. }
  129. dma_flag_clear(DMA1_FDT1_FLAG);
  130. byte_queue_skip(&uart->tx_queue, uart->tx_length);
  131. DMA_CHCTL(SHARK_UART0_tx_dma, uart->tx_dma_ch) = value & (~DMA_CHXCTL_CHEN);
  132. }
  133. uart->tx_length = byte_queue_peek(&uart->tx_queue);
  134. if (uart->tx_length > 0) {
  135. dma_data_number_set(uart->tx_dma_ch, uart->tx_length);
  136. DMA_CHMADDR(SHARK_UART0_tx_dma, uart->tx_dma_ch) = (u32) byte_queue_head(&uart->tx_queue);
  137. DMA_CHCTL(SHARK_UART0_tx_dma, uart->tx_dma_ch) = value | DMA_CHXCTL_CHEN;
  138. }
  139. }
  140. static void shark_uart_write(shark_uart_t *uart, const u8 *buff, u16 size)
  141. {
  142. while (size > 0) {
  143. u16 length = byte_queue_write(&uart->tx_queue, buff, size);
  144. if (length == size) {
  145. shark_uart_dma_tx(uart);
  146. break;
  147. }
  148. shark_uart_dma_tx(uart);
  149. buff += length;
  150. size -= length;
  151. }
  152. }
  153. static void shark_uart_write_byte(shark_uart_t *uart, u8 value)
  154. {
  155. byte_queue_write(&uart->tx_queue, &value, 1);
  156. }
  157. void shark_uart_write_log(char *buffer){
  158. int len = strlen(buffer);
  159. shark_uart_t *uart = (_shark_uart+SHARK_UART0);
  160. if (len > byte_queue_get_free(&uart->tx_queue)){
  161. return;
  162. }
  163. byte_queue_write(&uart->tx_queue, (const u8 *)buffer, len);
  164. shark_uart_dma_tx(uart);
  165. }
  166. static void shark_uart_tx_dma_init(shark_uart_t *uart){
  167. dma_init_type dma_init_struct;
  168. crm_periph_clock_enable(SHARK_UART0_tx_dma_clk, TRUE);
  169. dma_reset(uart->tx_dma_ch);
  170. dma_init_struct.direction = DMA_DIR_MEMORY_TO_PERIPHERAL;
  171. dma_init_struct.memory_inc_enable = TRUE;
  172. dma_init_struct.memory_data_width = DMA_MEMORY_DATA_WIDTH_BYTE;
  173. dma_init_struct.peripheral_base_addr = (u32) &(((usart_type *)uart->uart_com)->dt);
  174. dma_init_struct.peripheral_inc_enable = FALSE;
  175. dma_init_struct.peripheral_data_width = DMA_PERIPHERAL_DATA_WIDTH_BYTE;
  176. dma_init_struct.priority = DMA_PRIORITY_MEDIUM;
  177. dma_init_struct.loop_mode_enable = FALSE;
  178. dma_init(uart->tx_dma_ch, &dma_init_struct);
  179. /* config flexible dma for usart2 tx */
  180. //dma_flexible_config(DMA1, FLEX_CHANNEL1, DMA_FLEXIBLE_UART2_TX);
  181. usart_dma_transmitter_enable(uart->uart_com, TRUE);
  182. }
  183. #if ENABLE_RX_DMA==1
  184. static void shark_uart_rx_dma_init(shark_uart_t *uart){
  185. dma_init_type dma_init_struct;
  186. crm_periph_clock_enable(SHARK_UART0_rx_dma_clk, TRUE);
  187. /* dma1 channel2 for usart2 rx configuration */
  188. dma_reset(uart->rx_dma_ch);
  189. dma_default_para_init(&dma_init_struct);
  190. dma_init_struct.buffer_size = SHARK_UART_RX_MEM_SIZE;
  191. dma_init_struct.direction = DMA_DIR_PERIPHERAL_TO_MEMORY;
  192. dma_init_struct.memory_base_addr = (uint32_t)shark_uart0_rx_cache;
  193. dma_init_struct.memory_data_width = DMA_MEMORY_DATA_WIDTH_BYTE;
  194. dma_init_struct.memory_inc_enable = TRUE;
  195. dma_init_struct.peripheral_base_addr = (u32) &(((usart_type *)uart->uart_com)->dt);
  196. dma_init_struct.peripheral_data_width = DMA_PERIPHERAL_DATA_WIDTH_BYTE;
  197. dma_init_struct.peripheral_inc_enable = FALSE;
  198. dma_init_struct.priority = DMA_PRIORITY_MEDIUM;
  199. dma_init_struct.loop_mode_enable = FALSE;
  200. dma_init(uart->rx_dma_ch, &dma_init_struct);
  201. /* config flexible dma for usart2 rx */
  202. //dma_flexible_config(DMA1, FLEX_CHANNEL2, DMA_FLEXIBLE_UART2_RX);
  203. usart_dma_receiver_enable(uart->uart_com, TRUE);
  204. }
  205. #endif
  206. static void shark_uart_pin_init(shark_uart_t *uart){
  207. crm_periph_clock_enable(SHARK_UART0_rx_gpio_clk, TRUE);
  208. crm_periph_clock_enable(SHARK_UART0_tx_gpio_clk, TRUE);
  209. gpio_init_type gpio_init_struct;
  210. gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
  211. gpio_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;
  212. gpio_init_struct.gpio_mode = GPIO_MODE_MUX;
  213. gpio_init_struct.gpio_pins = SHARK_UART0_tx_pin;
  214. gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
  215. gpio_init(SHARK_UART0_tx_port, &gpio_init_struct);
  216. /* configure the usart2 rx pin */
  217. gpio_init_struct.gpio_mode = GPIO_MODE_INPUT;
  218. gpio_init_struct.gpio_pins = SHARK_UART0_rx_pin;
  219. gpio_init_struct.gpio_pull = GPIO_PULL_UP;
  220. gpio_init(SHARK_UART0_rx_port, &gpio_init_struct);
  221. }
  222. static void shark_uart_pin_deinit(shark_uart_t *uart){
  223. if (_uart_index(uart->uart_com) == SHARK_UART0) {
  224. gpio_init_type gpio_init_struct;
  225. gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
  226. gpio_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;
  227. gpio_init_struct.gpio_mode = GPIO_MODE_INPUT;
  228. gpio_init_struct.gpio_pins = SHARK_UART0_tx_pin;
  229. gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
  230. gpio_init(SHARK_UART0_tx_port, &gpio_init_struct);
  231. gpio_init_struct.gpio_pins = SHARK_UART0_rx_pin;
  232. gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
  233. gpio_init(SHARK_UART0_rx_port, &gpio_init_struct);
  234. }
  235. }
  236. static void shark_uart_device_init(shark_uart_t *uart){
  237. crm_periph_clock_enable(SHARK_UART0_clk, TRUE);
  238. usart_reset(uart->uart_com);
  239. /* configure usart2 param */
  240. usart_init(uart->uart_com, SHARK_UART_BAUDRATE, USART_DATA_8BITS, USART_STOP_1_BIT);
  241. usart_transmitter_enable(uart->uart_com, TRUE);
  242. usart_receiver_enable(uart->uart_com, TRUE);
  243. usart_enable(uart->uart_com, TRUE);
  244. }
  245. static u32 shark_uart_task(void *args)
  246. {
  247. shark_uart_t *uart = (shark_uart_t *)args;
  248. if(uart->uart_com != 0) {
  249. shark_uart_rx(uart);
  250. shark_uart_dma_tx(uart);
  251. }
  252. return 0;
  253. }
  254. void shark_uart_flush(void){
  255. shark_uart_t *uart = _shark_uart + SHARK_UART0;
  256. if (uart->uart_com != 0) {
  257. while(!byte_queue_empty(&uart->tx_queue)) {
  258. shark_uart_dma_tx(uart);
  259. }
  260. }
  261. }
  262. #if 0
  263. void DMA_Channel1_2_IRQHandler(void){
  264. shark_uart_t *uart = _shark_uart + SHARK_UART0;
  265. if (dma_interrupt_flag_get(uart->tx_dma_ch, DMA_INT_FLAG_FTF) != RESET){
  266. shark_uart_dma_tx(uart);
  267. dma_interrupt_flag_clear(uart->tx_dma_ch, DMA_INT_FLAG_FTF);
  268. }
  269. }
  270. void DMA_Channel3_4_IRQHandler(void){
  271. shark_uart_t *uart = _shark_uart + SHARK_UART1;
  272. if (dma_interrupt_flag_get(uart->tx_dma_ch, DMA_INT_FLAG_FTF) != RESET){
  273. shark_uart_dma_tx(uart);
  274. dma_interrupt_flag_clear(uart->tx_dma_ch, DMA_INT_FLAG_FTF);
  275. }
  276. }
  277. #endif
  278. static u8 *tx_cache_addr(uart_enum_t uart_no){
  279. return shark_uart0_tx_cache;
  280. }
  281. static u8 *rx_cache_addr(uart_enum_t uart_no){
  282. return shark_uart0_rx_cache;
  283. }
  284. void shark_uart_deinit(uart_enum_t uart_no){
  285. shark_uart_t *uart = _shark_uart + uart_no;
  286. if (uart->uart_com != 0) {
  287. usart_enable(uart->uart_com, FALSE);
  288. usart_reset(uart->uart_com);
  289. crm_periph_clock_enable(SHARK_UART0_clk, FALSE);
  290. dma_channel_enable(uart->rx_dma_ch, FALSE);
  291. dma_channel_enable(uart->tx_dma_ch, FALSE);
  292. crm_periph_clock_enable(SHARK_UART0_tx_dma_clk, FALSE);
  293. crm_periph_clock_enable(SHARK_UART0_rx_dma_clk, FALSE);
  294. shark_uart_pin_deinit(uart);
  295. }
  296. #if ENABLE_RX_DMA==0
  297. nvic_irq_disable(SHARK_UART0_irq);
  298. #endif
  299. }
  300. bool shark_uart_timeout(void){
  301. #if UART_NUM==2
  302. return (_shark_uart[0].uart_no_data && _shark_uart[1].uart_no_data)?TRUE:FALSE;
  303. #else
  304. return (_shark_uart[0].uart_no_data)?TRUE:FALSE;
  305. #endif
  306. }
  307. void shark_uart_init(uart_enum_t uart_no)
  308. {
  309. shark_uart_t *uart = _shark_uart + uart_no;
  310. uart->escape = false;
  311. uart->rx_length = 0;
  312. uart->tx_length = 0;
  313. uart->uart_com = SHARK_UART0_com;
  314. circle_buffer_init(&uart->rx_queue, rx_cache_addr(uart_no), SHARK_UART_RX_MEM_SIZE);
  315. byte_queue_init(&uart->tx_queue,tx_cache_addr(uart_no), SHARK_UART_TX_MEM_SIZE);
  316. uart->rx_dma_ch = SHARK_UART0_rx_dma_ch;
  317. uart->tx_dma_ch = SHARK_UART0_tx_dma_ch;
  318. shark_uart_pin_init(uart);
  319. shark_uart_device_init(uart);
  320. #if ENABLE_RX_DMA==1
  321. shark_uart_rx_dma_init(uart);
  322. #endif
  323. shark_uart_tx_dma_init(uart);
  324. usart_enable(uart->uart_com, TRUE);
  325. shark_task_create(shark_uart_task, uart);
  326. #if ENABLE_RX_DMA==0
  327. nvic_irq_enable(SHARK_UART0_irq, UART_IRQ_PRIORITY, 0);
  328. #endif
  329. uart->uart_no_data = false;
  330. }
  331. #if ENABLE_RX_DMA==0
  332. void USART3_IRQHandler(void){
  333. if(usart_flag_get(USART0, USART_FLAG_RBNE) == SET){
  334. shark_uart_t *uart = _shark_uart + SHARK_UART0;
  335. u8 c = usart_data_receive(USART0);
  336. circle_put_one_data(&uart->rx_queue, c);
  337. }
  338. }
  339. #endif
  340. void UART_DMA_IRQHandler(void) {
  341. }
  342. static void shark_uart_write_byte_esc(shark_uart_t *uart, u8 value)
  343. {
  344. switch (value) {
  345. case CH_START:
  346. shark_uart_write_byte(uart, CH_ESC);
  347. value = CH_ESC_START;
  348. break;
  349. case CH_END:
  350. shark_uart_write_byte(uart, CH_ESC);
  351. value = CH_ESC_END;
  352. break;
  353. case CH_ESC:
  354. shark_uart_write_byte(uart, CH_ESC);
  355. value = CH_ESC_ESC;
  356. break;
  357. }
  358. shark_uart_write_byte(uart, value);
  359. }
  360. static void shark_uart_write_esc(shark_uart_t *uart, const u8 *buff, u16 length)
  361. {
  362. const u8 *buff_end;
  363. for (buff_end = buff + length; buff < buff_end; buff++) {
  364. shark_uart_write_byte_esc(uart, *buff);
  365. }
  366. }
  367. static void shark_uart_tx_start(shark_uart_t *uart)
  368. {
  369. shark_uart_write_byte(uart, CH_START);
  370. uart->tx_crc16 = 0;
  371. }
  372. static void shark_uart_tx_continue(shark_uart_t *uart, const void *buff, u16 length)
  373. {
  374. shark_uart_write_esc(uart, (const u8 *) buff, length);
  375. uart->tx_crc16 = crc16_update(uart->tx_crc16, (const u8 *) buff, length);
  376. }
  377. static void shark_uart_tx_end(shark_uart_t *uart)
  378. {
  379. shark_uart_write_esc(uart, (u8 *)&uart->tx_crc16, sizeof(uart->tx_crc16));
  380. shark_uart_write_byte(uart, CH_END);
  381. }
  382. void shark_uart_write_frame(uart_enum_t uart_no, uint8_t *bytes, int len){
  383. shark_uart_t *uart = _shark_uart + uart_no;
  384. shark_uart_tx_start(uart);
  385. shark_uart_tx_continue(uart, bytes, len);
  386. shark_uart_tx_end(uart);
  387. shark_uart_dma_tx(uart);
  388. }
  389. void shark_uart_frame_start(uart_enum_t uart_no, uint8_t *bytes, int len){
  390. shark_uart_t *uart = _shark_uart + uart_no;
  391. shark_uart_tx_start(uart);
  392. shark_uart_tx_continue(uart, bytes, len);
  393. }
  394. void shark_uart_frame_continue(uart_enum_t uart_no, uint8_t *bytes, int len){
  395. shark_uart_t *uart = _shark_uart + uart_no;
  396. shark_uart_tx_continue(uart, bytes, len);
  397. }
  398. void shark_uart_frame_end(uart_enum_t uart_no){
  399. shark_uart_tx_end(_shark_uart + uart_no);
  400. }
  401. void shark_uart_write_bytes(uart_enum_t uart_no, u8 *buff, u16 size){
  402. shark_uart_write(_shark_uart + uart_no, buff, size);
  403. }
  404. int fputc(int c, FILE *fp){
  405. shark_uart_write_byte(_shark_uart+SHARK_UART0, (u8)c);
  406. return 1;
  407. }