uart.c 13 KB

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