uart.c 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355
  1. #include "uart.h"
  2. #include "bsp/shark_bsp.h"
  3. #include "libs/shark_libs.h"
  4. #define SHARK_UART_BAUDRATE 38400
  5. #define SHARK_UART0_com USART0
  6. #define SHARK_UART0_tx_port GPIOA
  7. #define SHARK_UART0_tx_pin GPIO_PIN_9
  8. #define SHARK_UART0_rx_port GPIOA
  9. #define SHARK_UART0_rx_pin GPIO_PIN_10
  10. #define SHARK_UART0_irq USART0_IRQn
  11. #define SHARK_UART0_clk RCU_USART0
  12. #define SHARK_UART0_tx_gpio_clk RCU_GPIOA
  13. #define SHARK_UART0_rx_gpio_clk RCU_GPIOA
  14. #define SHARK_UART0_tx_dma DMA
  15. #define SHARK_UART0_tx_dma_ch DMA_CH1
  16. #define SHARK_UART0_tx_dma_clk RCU_DMA
  17. #define SHARK_UART0_rx_dma DMA
  18. #define SHARK_UART0_rx_dma_ch DMA_CH2
  19. #define SHARK_UART0_rx_dma_clk RCU_DMA
  20. #define SHARK_UART1_com USART1
  21. #define SHARK_UART1_tx_port GPIOA
  22. #define SHARK_UART1_tx_pin GPIO_PIN_2
  23. #define SHARK_UART1_rx_port GPIOA
  24. #define SHARK_UART1_rx_pin GPIO_PIN_3
  25. #define SHARK_UART1_irq USART1_IRQn
  26. #define SHARK_UART1_clk RCU_USART1
  27. #define SHARK_UART1_tx_gpio_clk RCU_GPIOA
  28. #define SHARK_UART1_rx_gpio_clk RCU_GPIOA
  29. #define SHARK_UART1_tx_dma DMA
  30. #define SHARK_UART1_tx_dma_ch DMA_CH3
  31. #define SHARK_UART1_tx_dma_clk RCU_DMA
  32. #define SHARK_UART1_rx_dma DMA
  33. #define SHARK_UART1_rx_dma_ch DMA_CH4
  34. #define SHARK_UART1_rx_dma_clk RCU_DMA
  35. #define SHARK_UART_com SHARK_UART0_com
  36. #define SHARK_UART_tx_port SHARK_UART0_tx_port
  37. #define SHARK_UART_tx_pin SHARK_UART0_tx_pin
  38. #define SHARK_UART_rx_port SHARK_UART0_rx_port
  39. #define SHARK_UART_rx_pin SHARK_UART0_rx_pin
  40. #define SHARK_UART_irq SHARK_UART0_irq
  41. #define SHARK_UART_clk SHARK_UART0_clk
  42. #define SHARK_UART_tx_gpio_clk SHARK_UART0_tx_gpio_clk
  43. #define SHARK_UART_rx_gpio_clk SHARK_UART0_rx_gpio_clk
  44. // #define SHARK_UART_tx_dma SHARK_UART0_tx_dma
  45. #define SHARK_UART_tx_dma_ch SHARK_UART0_tx_dma_ch
  46. #define SHARK_UART_tx_dma_clk SHARK_UART0_tx_dma_clk
  47. // #define SHARK_UART_rx_dma SHARK_UART0_rx_dma
  48. #define SHARK_UART_rx_dma_ch SHARK_UART0_rx_dma_ch
  49. #define SHARK_UART_rx_dma_clk SHARK_UART0_rx_dma_clk
  50. // ================================================================================
  51. #define SHARK_UART_CACHE_SIZE \
  52. (SHARK_UART_TX_MEM_SIZE + SHARK_UART_RX_MEM_SIZE)
  53. #define SHARK_UART_DMA_ADDR(index) \
  54. (SHARK_UART_com + 0x04)
  55. #define SHARK_UART_DMA_CHCTL_TX() \
  56. DMA_CHCTL(SHARK_UART_tx_dma_ch)
  57. #define SHARK_UART_DMA_CHCNT_TX() \
  58. DMA_CHCNT(SHARK_UART_tx_dma_ch)
  59. #define SHARK_UART_DMA_CHMADDR_TX() \
  60. DMA_CHMADDR(SHARK_UART_tx_dma_ch)
  61. #define SHARK_UART_DMA_CHCTL_RX() \
  62. DMA_CHCTL(SHARK_UART_rx_dma_ch)
  63. #define SHARK_UART_DMA_CHCNT_RX() \
  64. DMA_CHCNT(SHARK_UART_rx_dma_ch)
  65. #define SHARK_UART_DMA_CHMADDR_RX() \
  66. DMA_CHMADDR(SHARK_UART_rx_dma_ch)
  67. // ================================================================================
  68. static u8 shark_uart_tx_cache[SHARK_UART_TX_MEM_SIZE];
  69. static u8 shark_uart_rx_cache[SHARK_UART_RX_MEM_SIZE];
  70. static u16 shark_uart_tx_length;
  71. static u16 shark_uart_tx_crc16;
  72. static u16 shark_uart_rx_index;
  73. static byte_queue_t shark_uart_tx_queue;
  74. // ================================================================================
  75. static bool shark_uart_on_frame_received(u8 *buff, u16 length)
  76. {
  77. u16 crc0 = shark_decode_u16(buff + length);
  78. u16 crc1 = shark_crc16_check(buff, length);
  79. if (crc0 != crc1) {
  80. return false;
  81. }
  82. return true;
  83. }
  84. static void shark_uart_on_data_received(u8 *buff, u16 size)
  85. {
  86. static bool escape = false;
  87. static u8 length = 0xFF;
  88. static u8 frame[16];
  89. u8 *buff_end;
  90. for (buff_end = buff + size; buff < buff_end; buff++) {
  91. u8 value = *buff;
  92. switch (value) {
  93. case CH_START:
  94. length = 0;
  95. escape = false;
  96. break;
  97. case CH_END:
  98. if (length > 2 && length != 0xFF) {
  99. shark_uart_on_frame_received(frame, length - 2);
  100. }
  101. length = 0xFF;
  102. break;
  103. case CH_ESC:
  104. escape = true;
  105. break;
  106. default:
  107. if (escape) {
  108. escape = false;
  109. switch (value) {
  110. case CH_ESC_START:
  111. value = CH_START;
  112. break;
  113. case CH_ESC_END:
  114. value = CH_END;
  115. break;
  116. case CH_ESC_ESC:
  117. value = CH_ESC;
  118. break;
  119. default:
  120. length = 0xFF;
  121. }
  122. }
  123. if (length < sizeof(frame)) {
  124. frame[length] = value;
  125. length++;
  126. } else {
  127. length = 0xFF;
  128. }
  129. }
  130. }
  131. }
  132. static void shark_uart_dma_tx(void)
  133. {
  134. u32 value = SHARK_UART_DMA_CHCTL_TX();
  135. if (value & DMA_CHXCTL_CHEN) {
  136. if (SET != dma_flag_get(SHARK_UART_tx_dma_ch, DMA_FLAG_FTF)) {
  137. return;
  138. }
  139. byte_queue_skip(&shark_uart_tx_queue, shark_uart_tx_length);
  140. SHARK_UART_DMA_CHCTL_TX() = value & (~DMA_CHXCTL_CHEN);
  141. }
  142. shark_uart_tx_length = byte_queue_peek(&shark_uart_tx_queue);
  143. if (shark_uart_tx_length > 0) {
  144. SHARK_UART_DMA_CHCNT_TX() = shark_uart_tx_length;
  145. SHARK_UART_DMA_CHMADDR_TX() = (u32) byte_queue_head(&shark_uart_tx_queue);
  146. dma_flag_clear(SHARK_UART_tx_dma_ch, DMA_FLAG_FTF);
  147. SHARK_UART_DMA_CHCTL_TX() = value | DMA_CHXCTL_CHEN;
  148. }
  149. }
  150. static void shark_uart_dma_rx(void)
  151. {
  152. u16 index = shark_uart_rx_index;
  153. shark_uart_rx_index = sizeof(shark_uart_rx_cache) - SHARK_UART_DMA_CHCNT_RX();
  154. if (shark_uart_rx_index < index) {
  155. shark_uart_on_data_received(shark_uart_rx_cache + index, sizeof(shark_uart_rx_cache) - index);
  156. shark_uart_on_data_received(shark_uart_rx_cache, shark_uart_rx_index);
  157. } else {
  158. shark_uart_on_data_received(shark_uart_rx_cache + index, shark_uart_rx_index - index);
  159. }
  160. }
  161. void shark_uart_write(const u8 *buff, u16 size)
  162. {
  163. while (size > 0) {
  164. u16 length = byte_queue_write(&shark_uart_tx_queue, buff, size);
  165. if (length == size) {
  166. break;
  167. }
  168. shark_uart_dma_tx();
  169. buff += length;
  170. size -= length;
  171. }
  172. }
  173. void shark_uart_write_byte(u8 value)
  174. {
  175. shark_uart_write(&value, 1);
  176. }
  177. void shark_uart_dma_init(dma_channel_enum channelx, u8 direction, u32 periph_addr, void *memory_addr, u16 length)
  178. {
  179. u32 ctl;
  180. DMA_CHCTL(channelx) &= ~DMA_CHXCTL_CHEN;
  181. /* configure peripheral base address */
  182. DMA_CHPADDR(channelx) = periph_addr;
  183. /* configure memory base address */
  184. DMA_CHMADDR(channelx) = (u32) memory_addr;
  185. /* configure the number of remaining data to be transferred */
  186. DMA_CHCNT(channelx) = length;
  187. /* configure peripheral transfer width,memory transfer width and priority */
  188. ctl = DMA_CHCTL(channelx);
  189. ctl &= ~(DMA_CHXCTL_PWIDTH | DMA_CHXCTL_MWIDTH | DMA_CHXCTL_PRIO);
  190. ctl |= (DMA_PERIPHERAL_WIDTH_8BIT | DMA_MEMORY_WIDTH_8BIT | DMA_PRIORITY_ULTRA_HIGH);
  191. DMA_CHCTL(channelx) = ctl;
  192. /* configure peripheral increasing mode */
  193. DMA_CHCTL(channelx) &= ~DMA_CHXCTL_PNAGA;
  194. /* configure memory increasing mode */
  195. DMA_CHCTL(channelx) |= DMA_CHXCTL_MNAGA;
  196. /* configure the direction of data transfer */
  197. if (DMA_PERIPHERAL_TO_MEMORY == direction) {
  198. DMA_CHCTL(channelx) &= ~DMA_CHXCTL_DIR;
  199. } else {
  200. DMA_CHCTL(channelx) |= DMA_CHXCTL_DIR;
  201. }
  202. }
  203. static u32 shark_uart_handler(void)
  204. {
  205. shark_uart_dma_rx();
  206. shark_uart_dma_tx();
  207. return 0;
  208. }
  209. static shark_task_t shark_uart_task = {
  210. .handler = shark_uart_handler
  211. };
  212. void shark_uart_init(void)
  213. {
  214. byte_queue_init(&shark_uart_tx_queue, shark_uart_tx_cache, sizeof(shark_uart_tx_cache));
  215. rcu_periph_clock_enable(SHARK_UART_clk);
  216. rcu_periph_clock_enable(SHARK_UART_rx_gpio_clk);
  217. rcu_periph_clock_enable(SHARK_UART_tx_gpio_clk);
  218. gpio_mode_set(SHARK_UART_tx_port, GPIO_MODE_AF, GPIO_PUPD_NONE, SHARK_UART_tx_pin);
  219. gpio_mode_set(SHARK_UART_rx_port, GPIO_MODE_INPUT, GPIO_PUPD_PULLUP, SHARK_UART_rx_pin);
  220. usart_deinit(SHARK_UART_com);
  221. usart_baudrate_set(SHARK_UART_com, SHARK_UART_BAUDRATE);
  222. usart_word_length_set(SHARK_UART_com, USART_WL_8BIT);
  223. usart_stop_bit_set(SHARK_UART_com, USART_STB_1BIT);
  224. usart_parity_config(SHARK_UART_com, USART_PM_NONE);
  225. usart_hardware_flow_rts_config(SHARK_UART_com, USART_RTS_DISABLE);
  226. usart_hardware_flow_cts_config(SHARK_UART_com, USART_CTS_DISABLE);
  227. usart_receive_config(SHARK_UART_com, USART_RECEIVE_ENABLE);
  228. usart_transmit_config(SHARK_UART_com, USART_TRANSMIT_ENABLE);
  229. rcu_periph_clock_enable(SHARK_UART_tx_dma_clk);
  230. shark_uart_dma_init(SHARK_UART_tx_dma_ch, DMA_MEMORY_TO_PERIPHERAL, SHARK_UART_DMA_ADDR(), shark_uart_tx_cache, 0);
  231. dma_circulation_disable(SHARK_UART_tx_dma_ch);
  232. usart_dma_transmit_config(SHARK_UART_com, USART_DENT_ENABLE);
  233. rcu_periph_clock_enable(SHARK_UART_rx_dma_clk);
  234. shark_uart_dma_init(SHARK_UART_rx_dma_ch, DMA_PERIPHERAL_TO_MEMORY, SHARK_UART_DMA_ADDR(), shark_uart_rx_cache, sizeof(shark_uart_rx_cache));
  235. dma_circulation_enable(SHARK_UART_rx_dma_ch);
  236. dma_channel_enable(SHARK_UART_rx_dma_ch);
  237. usart_dma_receive_config(SHARK_UART_com, USART_DENR_ENABLE);
  238. usart_enable(SHARK_UART_com);
  239. shark_task_add(&shark_uart_task);
  240. }
  241. void shark_uart_write_byte_esc(u8 value)
  242. {
  243. switch (value) {
  244. case CH_START:
  245. shark_uart_write_byte(CH_ESC);
  246. value = CH_ESC_START;
  247. break;
  248. case CH_END:
  249. shark_uart_write_byte(CH_ESC);
  250. value = CH_ESC_END;
  251. break;
  252. case CH_ESC:
  253. shark_uart_write_byte(CH_ESC);
  254. value = CH_ESC_ESC;
  255. break;
  256. }
  257. shark_uart_write_byte(value);
  258. }
  259. void shark_uart_write_esc(const u8 *buff, u16 length)
  260. {
  261. const u8 *buff_end;
  262. for (buff_end = buff + length; buff < buff_end; buff++) {
  263. shark_uart_write_byte_esc(*buff);
  264. }
  265. }
  266. void shark_uart_tx_start(void)
  267. {
  268. shark_uart_write_byte(CH_START);
  269. shark_uart_tx_crc16 = 0;
  270. }
  271. void shark_uart_tx_continue(const void *buff, u16 length)
  272. {
  273. shark_uart_write_esc((const u8 *) buff, length);
  274. shark_uart_tx_crc16 = shark_crc16_update(shark_uart_tx_crc16, (const u8 *) buff, length);
  275. }
  276. void shark_uart_tx_end(void)
  277. {
  278. shark_uart_write_esc((u8 *) &shark_uart_tx_crc16, sizeof(shark_uart_tx_crc16));
  279. shark_uart_write_byte(CH_END);
  280. }