uart.c 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586
  1. #include "uart.h"
  2. #include "bsp/shark_bsp.h"
  3. #include "bsp/gpio.h"
  4. #include "bsp/clock.h"
  5. #include "libs/shark_libs.h"
  6. #include "libs/shark_task.h"
  7. #include "libs/logger.h"
  8. #define SHARK_UART_BAUDRATE 38400
  9. #define SHARK_UART0_com USART0
  10. #define SHARK_UART0_tx_port GPIOB
  11. #define SHARK_UART0_tx_pin GPIO_PIN_6
  12. #define SHARK_UART0_rx_port GPIOB
  13. #define SHARK_UART0_rx_pin GPIO_PIN_7
  14. #define SHARK_UART0_irq USART0_IRQn
  15. #define SHARK_UART0_clk RCU_USART0
  16. #define SHARK_UART0_tx_gpio_clk RCU_GPIOB
  17. #define SHARK_UART0_rx_gpio_clk RCU_GPIOB
  18. #define SHARK_UART0_tx_dma DMA
  19. #define SHARK_UART0_tx_dma_ch DMA_CH1
  20. #define SHARK_UART0_tx_dma_clk RCU_DMA
  21. #define SHARK_UART0_rx_dma DMA
  22. #define SHARK_UART0_rx_dma_ch DMA_CH2
  23. #define SHARK_UART0_rx_dma_clk RCU_DMA
  24. #define SHARK_UART1_com USART1
  25. #define SHARK_UART1_tx_port GPIOA
  26. #define SHARK_UART1_tx_pin GPIO_PIN_2
  27. #define SHARK_UART1_rx_port GPIOA
  28. #define SHARK_UART1_rx_pin GPIO_PIN_3
  29. #define SHARK_UART1_irq USART1_IRQn
  30. #define SHARK_UART1_clk RCU_USART1
  31. #define SHARK_UART1_tx_gpio_clk RCU_GPIOA
  32. #define SHARK_UART1_rx_gpio_clk RCU_GPIOA
  33. #define SHARK_UART1_tx_dma DMA
  34. #define SHARK_UART1_tx_dma_ch DMA_CH3
  35. #define SHARK_UART1_tx_dma_clk RCU_DMA
  36. #define SHARK_UART1_rx_dma DMA
  37. #define SHARK_UART1_rx_dma_ch DMA_CH4
  38. #define SHARK_UART1_rx_dma_clk RCU_DMA
  39. // ================================================================================
  40. #define ENABLE_RX_DMA 1
  41. static u8 shark_uart0_tx_cache[SHARK_UART_TX_MEM_SIZE];
  42. #if UART_NUM==2
  43. static u8 shark_uart1_tx_cache[SHARK_UART_TX_MEM_SIZE];
  44. #endif
  45. static u8 shark_uart0_rx_cache[SHARK_UART_RX_MEM_SIZE];
  46. #if UART_NUM==2
  47. static u8 shark_uart1_rx_cache[SHARK_UART_RX_MEM_SIZE];
  48. #endif
  49. static shark_uart_t _shark_uart[UART_NUM];
  50. static shark_task_t _uart_task;
  51. static u64 _rx_time;
  52. u32 uart_rx_bytes = 0;
  53. u32 uart_old_prot = 0;
  54. u32 uart_new_prot = 0;
  55. u32 uart_tx_bytes = 0;
  56. static u32 uart_run_times[2];
  57. static u32 uart_irq_times[2];
  58. ///static bool uart_no_data = false;
  59. #if ENABLE_RX_DMA==1
  60. #define update_dma_w_pos(uart) circle_update_write_position(&uart->rx_queue, SHARK_UART_RX_MEM_SIZE - DMA_CHCNT(uart->rx_dma_ch))
  61. #else
  62. #define update_dma_w_pos(uart){}
  63. #endif
  64. extern void protocol_recv_frame(uart_enum_t uart_no, char *data, int len);
  65. extern void protocol_old_recv_frame(uart_enum_t uart_no, uint8_t *data, int len);
  66. extern void health_add_uart_error(uint32_t c, uint32_t l, uint32_t d);
  67. // ================================================================================
  68. static uart_enum_t _uart_index(uint32_t com){
  69. return com == SHARK_UART0_com?SHARK_UART0:SHARK_UART1;
  70. }
  71. static bool shark_uart_on_rx_frame(shark_uart_t *uart)
  72. {
  73. u16 crc0 = shark_decode_u16(uart->rx_frame + uart->rx_length);
  74. u16 crc1 = shark_crc16_check(uart->rx_frame, uart->rx_length);
  75. if (crc0 != crc1) {
  76. health_add_uart_error(1, 0, 0);
  77. return false;
  78. }
  79. #if (CONFIG_BOARD_TYPE==SHARK_BOARD_SP600)
  80. //wait 250us to give the time for PS200 485 switch to rx mode
  81. task_udelay(250);
  82. #endif
  83. protocol_recv_frame(_uart_index(uart->uart_com), (char *)uart->rx_frame, uart->rx_length);
  84. return true;
  85. }
  86. static void shark_uart_rx(shark_uart_t *uart){
  87. while(1) {
  88. u8 data;
  89. uart_run_times[_uart_index(uart->uart_com)] ++;
  90. update_dma_w_pos(uart);
  91. if (circle_get_one_data(&uart->rx_queue, &data) != 1) {
  92. if (shark_get_mseconds() >= (5 + _rx_time)) {
  93. //_rx_time = 0xFFFFFFFFFFFFL;
  94. if (uart->rx_length_old_prot > 0){
  95. protocol_old_recv_frame(_uart_index(uart->uart_com), uart->rx_frame_old_prot, uart->rx_length_old_prot);
  96. uart->rx_length_old_prot = 0;
  97. }
  98. }
  99. if (shark_get_mseconds() >= (UART_TIMEOUT + _rx_time)){
  100. uart->uart_no_data = true;
  101. }else {
  102. uart->uart_no_data = false;
  103. }
  104. break;
  105. }
  106. uart_rx_bytes ++;
  107. _rx_time = shark_get_mseconds();
  108. uart->rx_frame_old_prot[uart->rx_length_old_prot ++] = data;
  109. if (uart->rx_length_old_prot == sizeof(uart->rx_frame_old_prot)){
  110. uart->rx_length_old_prot = 0;
  111. }
  112. switch(data){
  113. case CH_START:
  114. uart->rx_length = 0;
  115. uart->escape = false;
  116. uart->start = true;
  117. break;
  118. case CH_END:
  119. if (uart->rx_length > 2 && uart->rx_length != 0xFFFF){
  120. uart->rx_length -= 2; //skip crc
  121. shark_uart_on_rx_frame(uart);
  122. }else if (uart->start == true){
  123. health_add_uart_error(0, 1, 0);
  124. }
  125. uart->rx_length = 0xFFFF;
  126. uart->start = false;
  127. return;
  128. case CH_ESC:
  129. uart->escape = true;
  130. break;
  131. default:
  132. if (uart->escape) {
  133. uart->escape = false;
  134. switch (data) {
  135. case CH_ESC_START:
  136. data = CH_START;
  137. break;
  138. case CH_ESC_END:
  139. data = CH_END;
  140. break;
  141. case CH_ESC_ESC:
  142. data = CH_ESC;
  143. break;
  144. default:
  145. data = 0xFF;
  146. }
  147. }
  148. if (uart->rx_length < sizeof(uart->rx_frame)) {
  149. uart->rx_frame[uart->rx_length] = data;
  150. uart->rx_length++;
  151. } else {
  152. uart->rx_length = 0xFFFF;
  153. if (uart->start == true) {
  154. health_add_uart_error(0, 1, 0);
  155. }
  156. }
  157. }
  158. }
  159. }
  160. static void shark_uart_dma_tx(shark_uart_t *uart)
  161. {
  162. u32 value = DMA_CHCTL(uart->tx_dma_ch);
  163. if (value & DMA_CHXCTL_CHEN) {
  164. if (SET != dma_flag_get(uart->tx_dma_ch, DMA_FLAG_FTF)) {
  165. return;
  166. }
  167. byte_queue_skip(&uart->tx_queue, uart->tx_length);
  168. dma_flag_clear(uart->tx_dma_ch, DMA_FLAG_FTF);
  169. DMA_CHCTL(uart->tx_dma_ch) = value & (~DMA_CHXCTL_CHEN);
  170. }
  171. uart->tx_length = byte_queue_peek(&uart->tx_queue);
  172. if (uart->tx_length > 0) {
  173. DMA_CHCNT(uart->tx_dma_ch) = uart->tx_length;
  174. DMA_CHMADDR(uart->tx_dma_ch) = (u32) byte_queue_head(&uart->tx_queue);
  175. DMA_CHCTL(uart->tx_dma_ch) = value | DMA_CHXCTL_CHEN;
  176. }
  177. }
  178. static void shark_uart_write(shark_uart_t *uart, const u8 *buff, u16 size)
  179. {
  180. uart_tx_bytes += size;
  181. while (size > 0) {
  182. u16 length = byte_queue_write(&uart->tx_queue, buff, size);
  183. if (length == size) {
  184. shark_uart_dma_tx(uart);
  185. break;
  186. }
  187. shark_uart_dma_tx(uart);
  188. buff += length;
  189. size -= length;
  190. }
  191. }
  192. static void shark_uart_write_byte(shark_uart_t *uart, u8 value)
  193. {
  194. //shark_uart_write(uart, &value, 1);
  195. byte_queue_write(&uart->tx_queue, &value, 1);
  196. if (byte_queue_get_used(&uart->tx_queue) > 64) {
  197. shark_uart_dma_tx(uart);
  198. }
  199. }
  200. static void shark_uart_tx_dma_init(shark_uart_t *uart){
  201. dma_parameter_struct dma_init_struct;
  202. rcu_periph_clock_enable(_uart_index(uart->uart_com)== SHARK_UART0?SHARK_UART0_tx_dma_clk:SHARK_UART1_tx_dma_clk);
  203. dma_deinit(uart->tx_dma_ch);
  204. dma_init_struct.direction = DMA_MEMORY_TO_PERIPHERAL;
  205. dma_init_struct.memory_inc = DMA_MEMORY_INCREASE_ENABLE;
  206. dma_init_struct.memory_width = DMA_MEMORY_WIDTH_8BIT;
  207. dma_init_struct.periph_addr = (u32) &USART_TDATA(uart->uart_com);
  208. dma_init_struct.periph_inc = DMA_PERIPH_INCREASE_DISABLE;
  209. dma_init_struct.periph_width = DMA_PERIPHERAL_WIDTH_8BIT;
  210. dma_init_struct.priority = DMA_PRIORITY_ULTRA_HIGH;
  211. dma_init(uart->tx_dma_ch, &dma_init_struct);
  212. dma_circulation_disable(uart->tx_dma_ch);
  213. dma_memory_to_memory_disable(uart->tx_dma_ch);
  214. usart_dma_transmit_config(uart->uart_com, USART_DENT_ENABLE);
  215. #if 0
  216. if (uart->tx_dma_ch == DMA_CH1) {
  217. nvic_irq_enable(DMA_Channel1_2_IRQn ,4, 0);
  218. }else {
  219. nvic_irq_enable(DMA_Channel3_4_IRQn ,4, 0);
  220. }
  221. dma_interrupt_enable(uart->tx_dma_ch, DMA_INT_FTF);
  222. #endif
  223. }
  224. #if ENABLE_RX_DMA==1
  225. static void shark_uart_rx_dma_init(shark_uart_t *uart){
  226. dma_parameter_struct dma_init_struct;
  227. rcu_periph_clock_enable(_uart_index(uart->uart_com)== SHARK_UART0?SHARK_UART0_rx_dma_clk:SHARK_UART1_rx_dma_clk);
  228. dma_deinit(uart->rx_dma_ch);
  229. dma_init_struct.direction = DMA_PERIPHERAL_TO_MEMORY;
  230. dma_init_struct.memory_inc = DMA_MEMORY_INCREASE_ENABLE;
  231. dma_init_struct.memory_width = DMA_MEMORY_WIDTH_8BIT;
  232. dma_init_struct.memory_addr = (u32)uart->rx_queue.buffer;
  233. dma_init_struct.number = uart->rx_queue.buffer_len;
  234. dma_init_struct.periph_addr = (u32) &USART_RDATA(uart->uart_com);
  235. dma_init_struct.periph_inc = DMA_PERIPH_INCREASE_DISABLE;
  236. dma_init_struct.periph_width = DMA_PERIPHERAL_WIDTH_8BIT;
  237. dma_init_struct.priority = DMA_PRIORITY_ULTRA_HIGH;
  238. dma_init(uart->rx_dma_ch, &dma_init_struct);
  239. dma_circulation_enable(uart->rx_dma_ch);
  240. dma_memory_to_memory_disable(uart->rx_dma_ch);
  241. dma_channel_enable(uart->rx_dma_ch);
  242. usart_dma_receive_config(uart->uart_com, USART_DENR_ENABLE);
  243. }
  244. #endif
  245. static void shark_uart_pin_init(shark_uart_t *uart){
  246. if (_uart_index(uart->uart_com) == SHARK_UART0) {
  247. rcu_periph_clock_enable(SHARK_UART0_clk);
  248. rcu_periph_clock_enable(SHARK_UART0_rx_gpio_clk);
  249. rcu_periph_clock_enable(SHARK_UART0_tx_gpio_clk);
  250. gpio_af_set(SHARK_UART0_tx_port, GPIO_AF_0,SHARK_UART0_tx_pin);
  251. gpio_mode_set(SHARK_UART0_tx_port, GPIO_MODE_AF, GPIO_PUPD_PULLUP, SHARK_UART0_tx_pin);
  252. gpio_output_options_set(SHARK_UART0_tx_port, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, SHARK_UART0_tx_pin);
  253. gpio_af_set(SHARK_UART0_rx_port, GPIO_AF_0,SHARK_UART0_rx_pin);
  254. gpio_mode_set(SHARK_UART0_rx_port, GPIO_MODE_AF, GPIO_PUPD_PULLUP, SHARK_UART0_rx_pin);
  255. gpio_output_options_set(SHARK_UART0_rx_port, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ,SHARK_UART0_rx_pin);
  256. }else {
  257. rcu_periph_clock_enable(SHARK_UART1_clk);
  258. rcu_periph_clock_enable(SHARK_UART1_rx_gpio_clk);
  259. rcu_periph_clock_enable(SHARK_UART1_tx_gpio_clk);
  260. gpio_af_set(SHARK_UART1_tx_port, GPIO_AF_1,SHARK_UART1_tx_pin);
  261. gpio_mode_set(SHARK_UART1_tx_port, GPIO_MODE_AF, GPIO_PUPD_PULLUP, SHARK_UART1_tx_pin);
  262. gpio_output_options_set(SHARK_UART1_tx_port, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, SHARK_UART1_tx_pin);
  263. gpio_af_set(SHARK_UART1_rx_port, GPIO_AF_1,SHARK_UART1_rx_pin);
  264. gpio_mode_set(SHARK_UART1_rx_port, GPIO_MODE_AF, GPIO_PUPD_PULLUP, SHARK_UART1_rx_pin);
  265. gpio_output_options_set(SHARK_UART1_rx_port, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ,SHARK_UART1_rx_pin);
  266. }
  267. }
  268. static void shark_uart_pin_deinit(shark_uart_t *uart){
  269. if (_uart_index(uart->uart_com) == SHARK_UART0) {
  270. gpio_mode_set(SHARK_UART0_tx_port, GPIO_MODE_INPUT, GPIO_PUPD_NONE, SHARK_UART0_tx_pin);
  271. gpio_mode_set(SHARK_UART0_rx_port, GPIO_MODE_INPUT, GPIO_PUPD_NONE, SHARK_UART0_rx_pin);
  272. }else {
  273. gpio_mode_set(SHARK_UART1_tx_port, GPIO_MODE_INPUT, GPIO_PUPD_NONE, SHARK_UART1_tx_pin);
  274. gpio_mode_set(SHARK_UART1_rx_port, GPIO_MODE_INPUT, GPIO_PUPD_NONE, SHARK_UART1_rx_pin);
  275. }
  276. }
  277. static void shark_uart_device_init(shark_uart_t *uart){
  278. usart_deinit(uart->uart_com);
  279. usart_baudrate_set(uart->uart_com, SHARK_UART_BAUDRATE);
  280. usart_word_length_set(uart->uart_com, USART_WL_8BIT);
  281. usart_stop_bit_set(uart->uart_com, USART_STB_1BIT);
  282. usart_parity_config(uart->uart_com, USART_PM_NONE);
  283. usart_hardware_flow_rts_config(uart->uart_com, USART_RTS_DISABLE);
  284. usart_hardware_flow_cts_config(uart->uart_com, USART_CTS_DISABLE);
  285. usart_receive_config(uart->uart_com, USART_RECEIVE_ENABLE);
  286. usart_transmit_config(uart->uart_com, USART_TRANSMIT_ENABLE);
  287. #if ENABLE_RX_DMA==0
  288. usart_overrun_disable(uart->uart_com);//must add
  289. usart_lin_mode_disable(uart->uart_com);
  290. usart_receiver_timeout_disable(uart->uart_com);
  291. usart_reception_error_dma_disable(uart->uart_com);
  292. usart_interrupt_enable(uart->uart_com,USART_INT_RBNE);
  293. #endif
  294. }
  295. static u32 shark_uart_handler(void)
  296. {
  297. shark_uart_t *uart = _shark_uart + SHARK_UART0;
  298. if (uart->uart_com != 0) {
  299. shark_uart_rx(uart);
  300. shark_uart_dma_tx(uart);
  301. }
  302. #if UART_NUM==2
  303. uart = _shark_uart + SHARK_UART1;
  304. if (uart->uart_com != 0) {
  305. shark_uart_rx(uart);
  306. shark_uart_dma_tx(uart);
  307. }
  308. #endif
  309. return 0;
  310. }
  311. void shark_uart_log(void){
  312. shark_uart_t *uart = _shark_uart + SHARK_UART0;
  313. sys_debug("Debug: %d, %d, %d, %d\n", uart_tx_bytes, uart_rx_bytes, uart_new_prot, uart_old_prot);
  314. sys_debug("uart0: %d, %d, %d, %d, %d\n", uart_run_times[0], uart->rx_queue.r_pos, uart->rx_queue.w_pos, uart->rx_queue.buffer_len, uart_irq_times[0]);
  315. #if ENABLE_RX_DMA==1
  316. sys_debug("dma0: %d\n", DMA_CHCNT(uart->rx_dma_ch));
  317. #endif
  318. #if UART_NUM==2
  319. uart = _shark_uart + SHARK_UART1;
  320. sys_debug("uart1: %d, %d, %d, %d, %d\n", uart_run_times[1], uart->rx_queue.r_pos, uart->rx_queue.w_pos, uart->rx_queue.buffer_len, uart_irq_times[1]);
  321. #if ENABLE_RX_DMA==1
  322. sys_debug("dma1: %d\n", DMA_CHCNT(uart->rx_dma_ch));
  323. #endif
  324. #endif
  325. }
  326. void shark_uart_flush(void){
  327. shark_uart_t *uart = _shark_uart + SHARK_UART0;
  328. if (uart->uart_com != 0) {
  329. while(!byte_queue_empty(&uart->tx_queue)) {
  330. shark_uart_dma_tx(uart);
  331. }
  332. }
  333. #if UART_NUM==2
  334. uart = _shark_uart + SHARK_UART1;
  335. if (uart->uart_com != 0) {
  336. while(!byte_queue_empty(&uart->tx_queue)) {
  337. shark_uart_dma_tx(uart);
  338. }
  339. }
  340. #endif
  341. }
  342. #if 0
  343. void DMA_Channel1_2_IRQHandler(void){
  344. shark_uart_t *uart = _shark_uart + SHARK_UART0;
  345. if (dma_interrupt_flag_get(uart->tx_dma_ch, DMA_INT_FLAG_FTF) != RESET){
  346. shark_uart_dma_tx(uart);
  347. dma_interrupt_flag_clear(uart->tx_dma_ch, DMA_INT_FLAG_FTF);
  348. }
  349. }
  350. void DMA_Channel3_4_IRQHandler(void){
  351. shark_uart_t *uart = _shark_uart + SHARK_UART1;
  352. if (dma_interrupt_flag_get(uart->tx_dma_ch, DMA_INT_FLAG_FTF) != RESET){
  353. shark_uart_dma_tx(uart);
  354. dma_interrupt_flag_clear(uart->tx_dma_ch, DMA_INT_FLAG_FTF);
  355. }
  356. }
  357. #endif
  358. static u8 *tx_cache_addr(uart_enum_t uart_no){
  359. #if UART_NUM==2
  360. return (uart_no == SHARK_UART0)?shark_uart0_tx_cache:shark_uart1_tx_cache;
  361. #else
  362. return shark_uart0_tx_cache;
  363. #endif
  364. }
  365. static u8 *rx_cache_addr(uart_enum_t uart_no){
  366. #if UART_NUM==2
  367. return (uart_no == SHARK_UART0)?shark_uart0_rx_cache:shark_uart1_rx_cache;
  368. #else
  369. return shark_uart0_rx_cache;
  370. #endif
  371. }
  372. void shark_uart_deinit(uart_enum_t uart_no){
  373. shark_uart_t *uart = _shark_uart + uart_no;
  374. if (uart->uart_com != 0) {
  375. usart_disable(uart->uart_com);
  376. usart_deinit(uart->uart_com);
  377. rcu_periph_clock_disable(uart_no == SHARK_UART0?SHARK_UART0_clk:SHARK_UART1_clk);
  378. dma_channel_disable(uart->rx_dma_ch);
  379. dma_channel_disable(uart->tx_dma_ch);
  380. rcu_periph_clock_disable(uart_no == SHARK_UART0?SHARK_UART0_tx_dma_clk:SHARK_UART1_tx_dma_clk);
  381. rcu_periph_clock_disable(uart_no == SHARK_UART0?SHARK_UART0_rx_dma_clk:SHARK_UART1_rx_dma_clk);
  382. shark_uart_pin_deinit(uart);
  383. }
  384. if (uart_no == SHARK_UART0) {
  385. UART0_IR_EN(0);
  386. #if ENABLE_RX_DMA==0
  387. nvic_irq_disable(USART0_IRQn);
  388. #endif
  389. }else {
  390. UART1_IR_EN(0);
  391. #if ENABLE_RX_DMA==0
  392. nvic_irq_disable(USART1_IRQn);
  393. #endif
  394. }
  395. }
  396. bool shark_uart_timeout(void){
  397. #if UART_NUM==2
  398. return (_shark_uart[0].uart_no_data && _shark_uart[1].uart_no_data)?TRUE:FALSE;
  399. #else
  400. return (_shark_uart[0].uart_no_data)?TRUE:FALSE;
  401. #endif
  402. }
  403. void shark_uart_init(uart_enum_t uart_no)
  404. {
  405. shark_uart_t *uart = _shark_uart + uart_no;
  406. uart->escape = false;
  407. uart->rx_length = 0;
  408. uart->tx_length = 0;
  409. uart->uart_com = (uart_no == SHARK_UART0)?SHARK_UART0_com:SHARK_UART1_com;
  410. circle_buffer_init(&uart->rx_queue, rx_cache_addr(uart_no), SHARK_UART_RX_MEM_SIZE);
  411. byte_queue_init(&uart->tx_queue,tx_cache_addr(uart_no), SHARK_UART_TX_MEM_SIZE);
  412. uart->rx_dma_ch = (uart_no == SHARK_UART0)?SHARK_UART0_rx_dma_ch:SHARK_UART1_rx_dma_ch;
  413. uart->tx_dma_ch = (uart_no == SHARK_UART0)?SHARK_UART0_tx_dma_ch:SHARK_UART1_tx_dma_ch;
  414. shark_uart_pin_init(uart);
  415. shark_uart_device_init(uart);
  416. #if ENABLE_RX_DMA==1
  417. shark_uart_rx_dma_init(uart);
  418. #endif
  419. shark_uart_tx_dma_init(uart);
  420. usart_enable(uart->uart_com);
  421. if (_uart_task.handler == NULL) {
  422. _uart_task.handler = shark_uart_handler;
  423. shark_task_add(&_uart_task);
  424. }
  425. if (uart_no == SHARK_UART0) {
  426. UART0_IR_EN(1);
  427. #if ENABLE_RX_DMA==0
  428. nvic_irq_enable(USART0_IRQn, 3, 0);
  429. #endif
  430. }else {
  431. UART1_IR_EN(1);
  432. #if ENABLE_RX_DMA==0
  433. nvic_irq_enable(USART1_IRQn, 3, 0);
  434. #endif
  435. }
  436. _rx_time = shark_get_mseconds();
  437. uart->uart_no_data = false;
  438. }
  439. #if ENABLE_RX_DMA==0
  440. void USART0_IRQHandler(void){
  441. if(usart_flag_get(USART0, USART_FLAG_RBNE) == SET){
  442. shark_uart_t *uart = _shark_uart + SHARK_UART0;
  443. uart_irq_times[0] ++;
  444. u8 c = usart_data_receive(USART0);
  445. circle_put_one_data(&uart->rx_queue, c);
  446. }
  447. }
  448. void USART1_IRQHandler(void){
  449. if(usart_flag_get(USART1, USART_FLAG_RBNE) == SET){
  450. shark_uart_t *uart = _shark_uart + SHARK_UART1;
  451. uart_irq_times[1] ++;
  452. u8 c = usart_data_receive(USART1);
  453. circle_put_one_data(&uart->rx_queue, c);
  454. }
  455. }
  456. #endif
  457. static void shark_uart_write_byte_esc(shark_uart_t *uart, u8 value)
  458. {
  459. switch (value) {
  460. case CH_START:
  461. shark_uart_write_byte(uart, CH_ESC);
  462. value = CH_ESC_START;
  463. break;
  464. case CH_END:
  465. shark_uart_write_byte(uart, CH_ESC);
  466. value = CH_ESC_END;
  467. break;
  468. case CH_ESC:
  469. shark_uart_write_byte(uart, CH_ESC);
  470. value = CH_ESC_ESC;
  471. break;
  472. }
  473. shark_uart_write_byte(uart, value);
  474. }
  475. static void shark_uart_write_esc(shark_uart_t *uart, const u8 *buff, u16 length)
  476. {
  477. const u8 *buff_end;
  478. for (buff_end = buff + length; buff < buff_end; buff++) {
  479. shark_uart_write_byte_esc(uart, *buff);
  480. }
  481. }
  482. static void shark_uart_tx_start(shark_uart_t *uart)
  483. {
  484. shark_uart_write_byte(uart, CH_START);
  485. uart->tx_crc16 = 0;
  486. }
  487. static void shark_uart_tx_continue(shark_uart_t *uart, const void *buff, u16 length)
  488. {
  489. shark_uart_write_esc(uart, (const u8 *) buff, length);
  490. uart->tx_crc16 = shark_crc16_update(uart->tx_crc16, (const u8 *) buff, length);
  491. }
  492. static void shark_uart_tx_end(shark_uart_t *uart)
  493. {
  494. shark_uart_write_esc(uart, (u8 *)&uart->tx_crc16, sizeof(uart->tx_crc16));
  495. shark_uart_write_byte(uart, CH_END);
  496. shark_uart_dma_tx(uart);
  497. }
  498. void shark_uart_write_frame(uart_enum_t uart_no, uint8_t *bytes, int len){
  499. shark_uart_t *uart = _shark_uart + uart_no;
  500. shark_uart_tx_start(uart);
  501. shark_uart_tx_continue(uart, bytes, len);
  502. shark_uart_tx_end(uart);
  503. }
  504. void shark_uart_frame_start(uart_enum_t uart_no, uint8_t *bytes, int len){
  505. shark_uart_t *uart = _shark_uart + uart_no;
  506. shark_uart_tx_start(uart);
  507. shark_uart_tx_continue(uart, bytes, len);
  508. }
  509. void shark_uart_frame_continue(uart_enum_t uart_no, uint8_t *bytes, int len){
  510. shark_uart_t *uart = _shark_uart + uart_no;
  511. shark_uart_tx_continue(uart, bytes, len);
  512. }
  513. void shark_uart_frame_end(uart_enum_t uart_no){
  514. shark_uart_tx_end(_shark_uart + uart_no);
  515. }
  516. void shark_uart_write_bytes(uart_enum_t uart_no, u8 *buff, u16 size){
  517. shark_uart_write(_shark_uart + uart_no, buff, size);
  518. }