serial_stm32.c 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. /*
  2. * (C) Copyright 2015
  3. * Kamil Lulko, <rev13@wp.pl>
  4. *
  5. * SPDX-License-Identifier: GPL-2.0+
  6. */
  7. #include <common.h>
  8. #include <asm/io.h>
  9. #include <serial.h>
  10. #include <asm/arch/stm32.h>
  11. #define STM32_USART1_BASE (STM32_APB2PERIPH_BASE + 0x1000)
  12. #define RCC_APB2ENR_USART1EN (1 << 4)
  13. #define USART_BASE STM32_USART1_BASE
  14. #define RCC_USART_ENABLE RCC_APB2ENR_USART1EN
  15. struct stm32_serial {
  16. u32 sr;
  17. u32 dr;
  18. u32 brr;
  19. u32 cr1;
  20. u32 cr2;
  21. u32 cr3;
  22. u32 gtpr;
  23. };
  24. #define USART_CR1_RE (1 << 2)
  25. #define USART_CR1_TE (1 << 3)
  26. #define USART_CR1_UE (1 << 13)
  27. #define USART_SR_FLAG_RXNE (1 << 5)
  28. #define USART_SR_FLAG_TXE (1 << 7)
  29. #define USART_BRR_F_MASK 0xF
  30. #define USART_BRR_M_SHIFT 4
  31. #define USART_BRR_M_MASK 0xFFF0
  32. DECLARE_GLOBAL_DATA_PTR;
  33. static void stm32_serial_setbrg(void)
  34. {
  35. serial_init();
  36. }
  37. static int stm32_serial_init(void)
  38. {
  39. struct stm32_serial *usart = (struct stm32_serial *)USART_BASE;
  40. u32 clock, int_div, frac_div, tmp;
  41. if ((USART_BASE & STM32_BUS_MASK) == STM32_APB1PERIPH_BASE) {
  42. setbits_le32(&STM32_RCC->apb1enr, RCC_USART_ENABLE);
  43. clock = clock_get(CLOCK_APB1);
  44. } else if ((USART_BASE & STM32_BUS_MASK) == STM32_APB2PERIPH_BASE) {
  45. setbits_le32(&STM32_RCC->apb2enr, RCC_USART_ENABLE);
  46. clock = clock_get(CLOCK_APB2);
  47. } else {
  48. return -1;
  49. }
  50. int_div = (25 * clock) / (4 * gd->baudrate);
  51. tmp = ((int_div / 100) << USART_BRR_M_SHIFT) & USART_BRR_M_MASK;
  52. frac_div = int_div - (100 * (tmp >> USART_BRR_M_SHIFT));
  53. tmp |= (((frac_div * 16) + 50) / 100) & USART_BRR_F_MASK;
  54. writel(tmp, &usart->brr);
  55. setbits_le32(&usart->cr1, USART_CR1_RE | USART_CR1_TE | USART_CR1_UE);
  56. return 0;
  57. }
  58. static int stm32_serial_getc(void)
  59. {
  60. struct stm32_serial *usart = (struct stm32_serial *)USART_BASE;
  61. while ((readl(&usart->sr) & USART_SR_FLAG_RXNE) == 0)
  62. ;
  63. return readl(&usart->dr);
  64. }
  65. static void stm32_serial_putc(const char c)
  66. {
  67. struct stm32_serial *usart = (struct stm32_serial *)USART_BASE;
  68. while ((readl(&usart->sr) & USART_SR_FLAG_TXE) == 0)
  69. ;
  70. writel(c, &usart->dr);
  71. }
  72. static int stm32_serial_tstc(void)
  73. {
  74. struct stm32_serial *usart = (struct stm32_serial *)USART_BASE;
  75. u8 ret;
  76. ret = readl(&usart->sr) & USART_SR_FLAG_RXNE;
  77. return ret;
  78. }
  79. static struct serial_device stm32_serial_drv = {
  80. .name = "stm32_serial",
  81. .start = stm32_serial_init,
  82. .stop = NULL,
  83. .setbrg = stm32_serial_setbrg,
  84. .putc = stm32_serial_putc,
  85. .puts = default_serial_puts,
  86. .getc = stm32_serial_getc,
  87. .tstc = stm32_serial_tstc,
  88. };
  89. void stm32_serial_initialize(void)
  90. {
  91. serial_register(&stm32_serial_drv);
  92. }
  93. __weak struct serial_device *default_serial_console(void)
  94. {
  95. return &stm32_serial_drv;
  96. }