uart_hal.c 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. // Copyright 2015-2019 Espressif Systems (Shanghai) PTE LTD
  2. //
  3. // Licensed under the Apache License, Version 2.0 (the "License");
  4. // you may not use this file except in compliance with the License.
  5. // You may obtain a copy of the License at
  6. //
  7. // http://www.apache.org/licenses/LICENSE-2.0
  8. //
  9. // Unless required by applicable law or agreed to in writing, software
  10. // distributed under the License is distributed on an "AS IS" BASIS,
  11. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. // See the License for the specific language governing permissions and
  13. // limitations under the License.
  14. // The HAL layer for UART (common part)
  15. #include "hal/uart_hal.h"
  16. void uart_hal_set_sclk(uart_hal_context_t *hal, uart_sclk_t sclk)
  17. {
  18. uart_ll_set_sclk(hal->dev, sclk);
  19. }
  20. void uart_hal_get_sclk(uart_hal_context_t *hal, uart_sclk_t *sclk)
  21. {
  22. uart_ll_get_sclk(hal->dev, sclk);
  23. }
  24. void uart_hal_set_baudrate(uart_hal_context_t *hal, uint32_t baud_rate)
  25. {
  26. uart_ll_set_baudrate(hal->dev, baud_rate);
  27. }
  28. void uart_hal_get_baudrate(uart_hal_context_t *hal, uint32_t *baud_rate)
  29. {
  30. *baud_rate = uart_ll_get_baudrate(hal->dev);
  31. }
  32. void uart_hal_set_stop_bits(uart_hal_context_t *hal, uart_stop_bits_t stop_bit)
  33. {
  34. uart_ll_set_stop_bits(hal->dev, stop_bit);
  35. }
  36. void uart_hal_get_stop_bits(uart_hal_context_t *hal, uart_stop_bits_t *stop_bit)
  37. {
  38. uart_ll_get_stop_bits(hal->dev, stop_bit);
  39. }
  40. void uart_hal_set_data_bit_num(uart_hal_context_t *hal, uart_word_length_t data_bit)
  41. {
  42. uart_ll_set_data_bit_num(hal->dev, data_bit);
  43. }
  44. void uart_hal_get_data_bit_num(uart_hal_context_t *hal, uart_word_length_t *data_bit)
  45. {
  46. uart_ll_get_data_bit_num(hal->dev, data_bit);
  47. }
  48. void uart_hal_set_parity(uart_hal_context_t *hal, uart_parity_t parity_mode)
  49. {
  50. uart_ll_set_parity(hal->dev, parity_mode);
  51. }
  52. void uart_hal_get_parity(uart_hal_context_t *hal, uart_parity_t *parity_mode)
  53. {
  54. uart_ll_get_parity(hal->dev, parity_mode);
  55. }
  56. void uart_hal_set_hw_flow_ctrl(uart_hal_context_t *hal, uart_hw_flowcontrol_t flow_ctrl, uint8_t rx_thresh)
  57. {
  58. uart_ll_set_hw_flow_ctrl(hal->dev, flow_ctrl, rx_thresh);
  59. }
  60. void uart_hal_get_hw_flow_ctrl(uart_hal_context_t *hal, uart_hw_flowcontrol_t *flow_ctrl)
  61. {
  62. uart_ll_get_hw_flow_ctrl(hal->dev, flow_ctrl);
  63. }
  64. void uart_hal_set_sw_flow_ctrl(uart_hal_context_t *hal, uart_sw_flowctrl_t *flow_ctrl, bool sw_flow_ctrl_en)
  65. {
  66. uart_ll_set_sw_flow_ctrl(hal->dev, flow_ctrl, sw_flow_ctrl_en);
  67. }
  68. void uart_hal_set_at_cmd_char(uart_hal_context_t *hal, uart_at_cmd_t *at_cmd)
  69. {
  70. uart_ll_set_at_cmd_char(hal->dev, at_cmd);
  71. }
  72. void uart_hal_set_tx_idle_num(uart_hal_context_t *hal, uint16_t idle_num)
  73. {
  74. uart_ll_set_tx_idle_num(hal->dev, idle_num);
  75. }
  76. void uart_hal_set_dtr(uart_hal_context_t *hal, int active_level)
  77. {
  78. uart_ll_set_dtr_active_level(hal->dev, active_level);
  79. }
  80. void uart_hal_set_rxfifo_full_thr(uart_hal_context_t *hal, uint32_t full_thrhd)
  81. {
  82. uart_ll_set_rxfifo_full_thr(hal->dev, full_thrhd);
  83. }
  84. void uart_hal_set_txfifo_empty_thr(uart_hal_context_t *hal, uint32_t empty_thrhd)
  85. {
  86. uart_ll_set_txfifo_empty_thr(hal->dev, empty_thrhd);
  87. }
  88. void uart_hal_set_wakeup_thrd(uart_hal_context_t *hal, uint32_t wakeup_thrd)
  89. {
  90. uart_ll_set_wakeup_thrd(hal->dev, wakeup_thrd);
  91. }
  92. void uart_hal_get_wakeup_thrd(uart_hal_context_t *hal, uint32_t *wakeup_thrd)
  93. {
  94. *wakeup_thrd = uart_ll_get_wakeup_thrd(hal->dev);
  95. }
  96. void uart_hal_set_mode(uart_hal_context_t *hal, uart_mode_t mode)
  97. {
  98. uart_ll_set_mode(hal->dev, mode);
  99. }
  100. bool uart_hal_is_hw_rts_en(uart_hal_context_t *hal)
  101. {
  102. return uart_ll_is_hw_rts_en(hal->dev);
  103. }
  104. void uart_hal_inverse_signal(uart_hal_context_t *hal, uint32_t inv_mask)
  105. {
  106. uart_ll_inverse_signal(hal->dev, inv_mask);
  107. }
  108. void uart_hal_set_loop_back(uart_hal_context_t *hal, bool loop_back_en)
  109. {
  110. uart_ll_set_loop_back(hal->dev, loop_back_en);
  111. }
  112. void uart_hal_init(uart_hal_context_t *hal, int uart_num)
  113. {
  114. // Set default clock source
  115. uart_ll_set_sclk(hal->dev, UART_SCLK_APB);
  116. // Set default baud: 115200, use APB clock.
  117. const uint32_t baud_def = 115200;
  118. uart_ll_set_baudrate(hal->dev, baud_def);
  119. // Set UART mode.
  120. uart_ll_set_mode(hal->dev, UART_MODE_UART);
  121. // Disable UART parity
  122. uart_ll_set_parity(hal->dev, UART_PARITY_DISABLE);
  123. // 8-bit world
  124. uart_ll_set_data_bit_num(hal->dev, UART_DATA_8_BITS);
  125. // 1-bit stop bit
  126. uart_ll_set_stop_bits(hal->dev, UART_STOP_BITS_1);
  127. // Set tx idle
  128. uart_ll_set_tx_idle_num(hal->dev, 0);
  129. // Disable hw-flow control
  130. uart_ll_set_hw_flow_ctrl(hal->dev, UART_HW_FLOWCTRL_DISABLE, 100);
  131. }
  132. uint8_t uart_hal_get_symb_len(uart_hal_context_t *hal)
  133. {
  134. uint8_t symbol_len = 1; // number of bits per symbol including start
  135. uart_parity_t parity_mode;
  136. uart_stop_bits_t stop_bit;
  137. uart_word_length_t data_bit;
  138. uart_ll_get_data_bit_num(hal->dev, &data_bit);
  139. uart_ll_get_stop_bits(hal->dev, &stop_bit);
  140. uart_ll_get_parity(hal->dev, &parity_mode);
  141. symbol_len += (data_bit < UART_DATA_BITS_MAX) ? (uint8_t)data_bit + 5 : 8;
  142. symbol_len += (stop_bit > UART_STOP_BITS_1) ? 2 : 1;
  143. symbol_len += (parity_mode > UART_PARITY_DISABLE) ? 1 : 0;
  144. return symbol_len;
  145. }
  146. void uart_hal_set_rx_timeout(uart_hal_context_t *hal, const uint8_t tout)
  147. {
  148. uint8_t symb_len = uart_hal_get_symb_len(hal);
  149. uart_ll_set_rx_tout(hal->dev, symb_len * tout);
  150. }
  151. uint16_t uart_hal_get_max_rx_timeout_thrd(uart_hal_context_t *hal)
  152. {
  153. uint8_t symb_len = uart_hal_get_symb_len(hal);
  154. uint16_t max_tout_thresh = uart_ll_max_tout_thrd(hal->dev);
  155. return (max_tout_thresh / symb_len);
  156. }