uart.c 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. /*
  2. * Copyright (c) 2006-2021, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2015-04-14 ArdaFu first version
  9. */
  10. #include "asm9260t.h"
  11. #include "rtthread.h"
  12. #include "uart.h"
  13. void Hw_UartDisable(HW_USART_TypeDef* uartBase)
  14. {
  15. uartBase->INTR[R_CLR] = ASM_UART_INTR_RXIEN | ASM_UART_INTR_TXIEN | ASM_UART_INTR_RTIS;
  16. uartBase->CTRL2[R_CLR] = ASM_UART_CTRL2_TXE | ASM_UART_CTRL2_RXE;
  17. }
  18. void Hw_UartEnable(HW_USART_TypeDef* uartBase)
  19. {
  20. uartBase->CTRL2[R_CLR] = 0x0000C000UL; //clear CTSEN and RTSEN
  21. uartBase->CTRL2[R_SET] = ASM_UART_CTRL2_TXE | ASM_UART_CTRL2_RXE | ASM_UART_CTRL2_USARTEN;
  22. uartBase->INTR[R_SET] = ASM_UART_INTR_RXIEN | ASM_UART_INTR_RTIEN;
  23. }
  24. void Hw_UartReset(HW_USART_TypeDef* uartBase)
  25. {
  26. uartBase->CTRL0[R_CLR] = ASM_UART_CTRL0_SFTRST | ASM_UART_CTRL0_CLKGATE | ASM_UART_CTRL0_RXTO_ENABLE;
  27. uartBase->CTRL0[R_SET] = ASM_UART_CTRL0_SFTRST | ASM_UART_CTRL0_CLKGATE | ASM_UART_CTRL0_RXTO_ENABLE;
  28. }
  29. void Hw_UartConfig(HW_USART_TypeDef* uartBase,int baudRate, int dataBits, int stopBits,int parity)
  30. {
  31. rt_uint32_t mode = ASM_UART_LINECTRL_FEN;
  32. switch (dataBits)
  33. {
  34. case 8:
  35. mode |= ASM_UART_LINECTRL_WLEN8;
  36. break;
  37. case 7:
  38. mode |= ASM_UART_LINECTRL_WLEN7;
  39. break;
  40. case 6:
  41. mode |= ASM_UART_LINECTRL_WLEN6;
  42. break;
  43. case 5:
  44. mode |= ASM_UART_LINECTRL_WLEN5;
  45. break;
  46. default:
  47. mode |= ASM_UART_LINECTRL_WLEN8;
  48. break;
  49. }
  50. switch (stopBits)
  51. {
  52. case 2:
  53. mode |= ASM_UART_LINECTRL_STP2;
  54. break;
  55. case 1:
  56. default:
  57. break;
  58. }
  59. switch (parity)
  60. {
  61. case 1:
  62. mode |= ASM_UART_LINECTRL_PEN;
  63. break;
  64. case 2:
  65. mode |= ASM_UART_LINECTRL_PEN | ASM_UART_LINECTRL_EPS;
  66. break;
  67. case 0:
  68. default:
  69. break;
  70. }
  71. //16bit nBaudDivint
  72. mode |= (((12000000 <<2 ) / baudRate) & UART_BAUD_DIVINT_MASK) << 10;
  73. //6bit nNaudDivfrac
  74. mode |= (((12000000 <<2 ) / baudRate) & UART_BAUD_DIVFRAC_MASK) << 8;
  75. uartBase->LINECTRL[R_VAL] = mode;
  76. }
  77. void Hw_UartInit(int index)
  78. {
  79. // uart0 = bit11, uart9 = bit20
  80. int ctrl_bit = index + 11;
  81. outl(1UL<<ctrl_bit,REG_SET(HW_AHBCLKCTRL0)); //UART4 ENABLE bit15
  82. outl(0x1, HW_UART0CLKDIV + index*4); //UART4 div 2
  83. outl(1UL<<ctrl_bit,REG_CLR(HW_AHBCLKCTRL0)); //UART4 clk gate
  84. outl(1UL<<ctrl_bit,REG_SET(HW_AHBCLKCTRL0)); //UART4 clk gate
  85. outl(1UL<<ctrl_bit,REG_CLR(HW_PRESETCTRL0)); //UART4 reset
  86. outl(1UL<<ctrl_bit,REG_SET(HW_PRESETCTRL0)); //UART4 reset
  87. }