uart_hal.c 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. /*
  2. * SPDX-FileCopyrightText: 2015-2023 Espressif Systems (Shanghai) CO LTD
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. */
  6. // The HAL layer for UART (common part)
  7. #include "hal/uart_hal.h"
  8. #include "soc/soc_caps.h"
  9. void uart_hal_get_sclk(uart_hal_context_t *hal, soc_module_clk_t *sclk)
  10. {
  11. uart_ll_get_sclk(hal->dev, sclk);
  12. }
  13. void uart_hal_get_baudrate(uart_hal_context_t *hal, uint32_t *baud_rate, uint32_t sclk_freq)
  14. {
  15. *baud_rate = uart_ll_get_baudrate(hal->dev, sclk_freq);
  16. }
  17. void uart_hal_set_stop_bits(uart_hal_context_t *hal, uart_stop_bits_t stop_bit)
  18. {
  19. uart_ll_set_stop_bits(hal->dev, stop_bit);
  20. }
  21. void uart_hal_get_stop_bits(uart_hal_context_t *hal, uart_stop_bits_t *stop_bit)
  22. {
  23. uart_ll_get_stop_bits(hal->dev, stop_bit);
  24. }
  25. void uart_hal_set_data_bit_num(uart_hal_context_t *hal, uart_word_length_t data_bit)
  26. {
  27. uart_ll_set_data_bit_num(hal->dev, data_bit);
  28. }
  29. void uart_hal_get_data_bit_num(uart_hal_context_t *hal, uart_word_length_t *data_bit)
  30. {
  31. uart_ll_get_data_bit_num(hal->dev, data_bit);
  32. }
  33. void uart_hal_set_parity(uart_hal_context_t *hal, uart_parity_t parity_mode)
  34. {
  35. uart_ll_set_parity(hal->dev, parity_mode);
  36. }
  37. void uart_hal_get_parity(uart_hal_context_t *hal, uart_parity_t *parity_mode)
  38. {
  39. uart_ll_get_parity(hal->dev, parity_mode);
  40. }
  41. void uart_hal_set_hw_flow_ctrl(uart_hal_context_t *hal, uart_hw_flowcontrol_t flow_ctrl, uint8_t rx_thresh)
  42. {
  43. uart_ll_set_hw_flow_ctrl(hal->dev, flow_ctrl, rx_thresh);
  44. }
  45. void uart_hal_get_hw_flow_ctrl(uart_hal_context_t *hal, uart_hw_flowcontrol_t *flow_ctrl)
  46. {
  47. uart_ll_get_hw_flow_ctrl(hal->dev, flow_ctrl);
  48. }
  49. void uart_hal_set_sw_flow_ctrl(uart_hal_context_t *hal, uart_sw_flowctrl_t *flow_ctrl, bool sw_flow_ctrl_en)
  50. {
  51. uart_ll_set_sw_flow_ctrl(hal->dev, flow_ctrl, sw_flow_ctrl_en);
  52. }
  53. void uart_hal_set_at_cmd_char(uart_hal_context_t *hal, uart_at_cmd_t *at_cmd)
  54. {
  55. uart_ll_set_at_cmd_char(hal->dev, at_cmd);
  56. }
  57. void uart_hal_set_tx_idle_num(uart_hal_context_t *hal, uint16_t idle_num)
  58. {
  59. uart_ll_set_tx_idle_num(hal->dev, idle_num);
  60. }
  61. void uart_hal_set_dtr(uart_hal_context_t *hal, int active_level)
  62. {
  63. uart_ll_set_dtr_active_level(hal->dev, active_level);
  64. }
  65. void uart_hal_set_rxfifo_full_thr(uart_hal_context_t *hal, uint32_t full_thrhd)
  66. {
  67. uart_ll_set_rxfifo_full_thr(hal->dev, full_thrhd);
  68. }
  69. void uart_hal_set_txfifo_empty_thr(uart_hal_context_t *hal, uint32_t empty_thrhd)
  70. {
  71. uart_ll_set_txfifo_empty_thr(hal->dev, empty_thrhd);
  72. }
  73. void uart_hal_set_wakeup_thrd(uart_hal_context_t *hal, uint32_t wakeup_thrd)
  74. {
  75. uart_ll_set_wakeup_thrd(hal->dev, wakeup_thrd);
  76. }
  77. void uart_hal_get_wakeup_thrd(uart_hal_context_t *hal, uint32_t *wakeup_thrd)
  78. {
  79. *wakeup_thrd = uart_ll_get_wakeup_thrd(hal->dev);
  80. }
  81. void uart_hal_set_mode(uart_hal_context_t *hal, uart_mode_t mode)
  82. {
  83. uart_ll_set_mode(hal->dev, mode);
  84. }
  85. bool uart_hal_is_hw_rts_en(uart_hal_context_t *hal)
  86. {
  87. return uart_ll_is_hw_rts_en(hal->dev);
  88. }
  89. void uart_hal_inverse_signal(uart_hal_context_t *hal, uint32_t inv_mask)
  90. {
  91. uart_ll_inverse_signal(hal->dev, inv_mask);
  92. }
  93. void uart_hal_set_loop_back(uart_hal_context_t *hal, bool loop_back_en)
  94. {
  95. uart_ll_set_loop_back(hal->dev, loop_back_en);
  96. }
  97. void uart_hal_init(uart_hal_context_t *hal, uart_port_t uart_num)
  98. {
  99. // Set UART mode.
  100. uart_ll_set_mode(hal->dev, UART_MODE_UART);
  101. // Disable UART parity
  102. uart_ll_set_parity(hal->dev, UART_PARITY_DISABLE);
  103. // 8-bit world
  104. uart_ll_set_data_bit_num(hal->dev, UART_DATA_8_BITS);
  105. // 1-bit stop bit
  106. uart_ll_set_stop_bits(hal->dev, UART_STOP_BITS_1);
  107. // Set tx idle
  108. uart_ll_set_tx_idle_num(hal->dev, 0);
  109. // Disable hw-flow control
  110. uart_ll_set_hw_flow_ctrl(hal->dev, UART_HW_FLOWCTRL_DISABLE, 100);
  111. }
  112. uint8_t uart_hal_get_symb_len(uart_hal_context_t *hal)
  113. {
  114. uint8_t symbol_len = 1; // number of bits per symbol including start
  115. uart_parity_t parity_mode;
  116. uart_stop_bits_t stop_bit;
  117. uart_word_length_t data_bit;
  118. uart_ll_get_data_bit_num(hal->dev, &data_bit);
  119. uart_ll_get_stop_bits(hal->dev, &stop_bit);
  120. uart_ll_get_parity(hal->dev, &parity_mode);
  121. symbol_len += (data_bit < UART_DATA_BITS_MAX) ? (uint8_t)data_bit + 5 : 8;
  122. symbol_len += (stop_bit > UART_STOP_BITS_1) ? 2 : 1;
  123. symbol_len += (parity_mode > UART_PARITY_DISABLE) ? 1 : 0;
  124. return symbol_len;
  125. }
  126. void uart_hal_set_rx_timeout(uart_hal_context_t *hal, const uint8_t tout)
  127. {
  128. uint8_t symb_len = uart_hal_get_symb_len(hal);
  129. uart_ll_set_rx_tout(hal->dev, symb_len * tout);
  130. }
  131. uint16_t uart_hal_get_max_rx_timeout_thrd(uart_hal_context_t *hal)
  132. {
  133. uint8_t symb_len = uart_hal_get_symb_len(hal);
  134. uint16_t max_tout_thresh = uart_ll_max_tout_thrd(hal->dev);
  135. return (max_tout_thresh / symb_len);
  136. }