board.c 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  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. const struct board_config *board_config;
  12. GPIO gpio_from_id(uint8_t id)
  13. {
  14. switch (id) {
  15. case _A: return gpioa;
  16. case _B: return gpiob;
  17. case _C: return gpioc;
  18. case _D: return gpiod;
  19. case _E: return gpioe;
  20. case _F: return gpiof;
  21. case _G: return gpiog;
  22. #if MCU == STM32F7
  23. case _H: return gpioh;
  24. case _I: return gpioi;
  25. #endif
  26. }
  27. ASSERT(0);
  28. return NULL;
  29. }
  30. uint8_t write_mapped_pin(
  31. const struct pin_mapping *map, int pin_id, bool_t level)
  32. {
  33. const struct pin_mapping *pin;
  34. for (pin = map; pin->pin_id != 0; pin++)
  35. if (pin->pin_id == pin_id)
  36. goto found;
  37. return ACK_BAD_PIN;
  38. found:
  39. gpio_write_pin(gpio_from_id(pin->gpio_bank), pin->gpio_pin, level);
  40. return ACK_OKAY;
  41. }
  42. uint8_t read_mapped_pin(
  43. const struct pin_mapping *map, int pin_id, bool_t *p_level)
  44. {
  45. const struct pin_mapping *pin;
  46. for (pin = map; pin->pin_id != 0; pin++)
  47. if (pin->pin_id == pin_id)
  48. goto found;
  49. return ACK_BAD_PIN;
  50. found:
  51. *p_level = gpio_read_pin(gpio_from_id(pin->gpio_bank), pin->gpio_pin);
  52. return ACK_OKAY;
  53. }
  54. /* Pull up currently unused and possibly-floating pins. */
  55. static void gpio_pull_up_pins(GPIO gpio, uint16_t mask)
  56. {
  57. unsigned int i;
  58. for (i = 0; i < 16; i++) {
  59. if (mask & 1)
  60. gpio_configure_pin(gpio, i, GPI_pull_up);
  61. mask >>= 1;
  62. }
  63. }
  64. #if MCU == STM32F1
  65. #include "mcu/stm32f1/board.c"
  66. #elif MCU == STM32F7
  67. #include "mcu/stm32f7/board.c"
  68. #elif MCU == AT32F4
  69. #include "mcu/at32f4/board.c"
  70. #endif
  71. void board_init(void)
  72. {
  73. mcu_board_init();
  74. #ifdef NDEBUG
  75. /* Pull up unused debug pins (A9,A10 = serial console). */
  76. gpio_pull_up_pins(gpioa, (1u<<9) | (1u<<10));
  77. #endif
  78. /* Activity LED is active low. */
  79. gpio_configure_pin(gpio_led, pin_led, GPO_pushpull(IOSPD_LOW, HIGH));
  80. #if defined(NDEBUG) && MCU == AT32F4
  81. if (at32f4_series != AT32F415)
  82. gpio_configure_pin(gpioa, 9, GPO_pushpull(IOSPD_LOW, HIGH));
  83. #endif
  84. }
  85. /* Set the activity LED status. */
  86. void act_led(bool_t on)
  87. {
  88. gpio_write_pin(gpio_led, pin_led, on ? LOW : HIGH);
  89. #if defined(NDEBUG) && MCU == AT32F4
  90. if (at32f4_series != AT32F415)
  91. gpio_write_pin(gpioa, 9, on ? LOW : HIGH);
  92. #endif
  93. }
  94. /*
  95. * Local variables:
  96. * mode: C
  97. * c-file-style: "Linux"
  98. * c-basic-offset: 4
  99. * tab-width: 4
  100. * indent-tabs-mode: nil
  101. * End:
  102. */