board.c 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. /*
  2. * board.c
  3. *
  4. * Board-specific setup and management.
  5. *
  6. * Written & released by Keir Fraser <keir.xen@gmail.com>
  7. *
  8. * This is free and unencumbered software released into the public domain.
  9. * See the file COPYING for more details, or visit <http://unlicense.org>.
  10. */
  11. #if STM32F == 1
  12. #define gpio_led gpioc
  13. #define pin_led 13
  14. #elif STM32F == 7
  15. #define gpio_led gpiob
  16. #define pin_led 13
  17. #endif
  18. /* Pull up currently unused and possibly-floating pins. */
  19. static void gpio_pull_up_pins(GPIO gpio, uint16_t mask)
  20. {
  21. unsigned int i;
  22. for (i = 0; i < 16; i++) {
  23. if (mask & 1)
  24. gpio_configure_pin(gpio, i, GPI_pull_up);
  25. mask >>= 1;
  26. }
  27. }
  28. #if STM32F == 1
  29. static void mcu_board_init(void)
  30. {
  31. gpio_pull_up_pins(gpioa, 0xe1fe); /* PA1-8,13-15 */
  32. gpio_pull_up_pins(gpiob, 0x0027); /* PB0-2,5 */
  33. gpio_pull_up_pins(gpioc, 0xffff); /* PC0-15 */
  34. }
  35. #elif STM32F == 7
  36. static void mcu_board_init(void)
  37. {
  38. uint16_t a = 0x9930; /* PA4-5,8,11-12,15 */
  39. uint16_t b = 0x23f8; /* PB3-9,13 */
  40. uint16_t c = 0xffe7; /* PC0-2,5-15 */
  41. uint16_t d = 0xffff; /* PD0-15 */
  42. uint16_t e = 0xffff; /* PE0-15 */
  43. uint16_t f = 0xffff; /* PF0-15 */
  44. uint16_t g = 0xffff; /* PG0-15 */
  45. uint16_t h = 0xffff; /* PH0-15 */
  46. uint16_t i = 0xffff; /* PI0-15 */
  47. uint32_t ahb1enr = rcc->ahb1enr;
  48. switch (gw_info.hw_submodel) {
  49. case F7SM_basic:
  50. break;
  51. case F7SM_ambertronic_f7_plus:
  52. break;
  53. case F7SM_lightning:
  54. /* Uses PE12 and PE13 for extra drive outputs. */
  55. ahb1enr |= RCC_AHB1ENR_GPIOEEN;
  56. break;
  57. }
  58. /* Enable all GPIO bank register clocks to configure unused pins. */
  59. rcc->ahb1enr |= (RCC_AHB1ENR_GPIOAEN |
  60. RCC_AHB1ENR_GPIOBEN |
  61. RCC_AHB1ENR_GPIOCEN |
  62. RCC_AHB1ENR_GPIODEN |
  63. RCC_AHB1ENR_GPIOEEN |
  64. RCC_AHB1ENR_GPIOFEN |
  65. RCC_AHB1ENR_GPIOGEN |
  66. RCC_AHB1ENR_GPIOHEN |
  67. RCC_AHB1ENR_GPIOIEN);
  68. peripheral_clock_delay();
  69. gpio_pull_up_pins(gpioa, a);
  70. gpio_pull_up_pins(gpiob, b);
  71. gpio_pull_up_pins(gpioc, c);
  72. gpio_pull_up_pins(gpiod, d);
  73. gpio_pull_up_pins(gpioe, e);
  74. gpio_pull_up_pins(gpiof, f);
  75. gpio_pull_up_pins(gpiog, g);
  76. gpio_pull_up_pins(gpioh, h);
  77. gpio_pull_up_pins(gpioi, i);
  78. /* Unused GPIO banks can have their clocks disabled again. They will
  79. * statically hold their configuration state. */
  80. peripheral_clock_delay();
  81. rcc->ahb1enr = ahb1enr;
  82. }
  83. #endif
  84. void board_init(void)
  85. {
  86. mcu_board_init();
  87. #ifdef NDEBUG
  88. /* Pull up unused debug pins (A9,A10 = serial console). */
  89. gpio_pull_up_pins(gpioa, (1u<<9) | (1u<<10));
  90. #endif
  91. /* Activity LED is active low. */
  92. gpio_configure_pin(gpio_led, pin_led, GPO_pushpull(IOSPD_LOW, HIGH));
  93. }
  94. /* Set the activity LED status. */
  95. void act_led(bool_t on)
  96. {
  97. gpio_write_pin(gpio_led, pin_led, on ? LOW : HIGH);
  98. }
  99. /*
  100. * Local variables:
  101. * mode: C
  102. * c-file-style: "Linux"
  103. * c-basic-offset: 4
  104. * tab-width: 4
  105. * indent-tabs-mode: nil
  106. * End:
  107. */