led.c 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. /*
  2. * (c) danielinux 2019
  3. * GPLv.2
  4. *
  5. * See LICENSE for details
  6. */
  7. #include <stdint.h>
  8. #include "unicore-mx/stm32/gpio.h"
  9. #include "unicore-mx/stm32/rcc.h"
  10. #include "system.h"
  11. #include "led.h"
  12. #include "pinout.h"
  13. /* LEDS mapping:
  14. *
  15. * E0 - Heartbeat
  16. * E10 - 1
  17. * B2 - 2
  18. * E8 - 3
  19. * E9 - 4
  20. * E1 - 5
  21. * E7 - 6
  22. * B8 - 7
  23. * B9 - 8
  24. */
  25. #define NUM_LEDS 9
  26. #define LD0 (1 << 0)
  27. #define LD1 (1 << 10)
  28. #define LD2 (1 << 2)
  29. #define LD3 (1 << 8)
  30. #define LD4 (1 << 9)
  31. #define LD5 (1 << 1)
  32. #define LD6 (1 << 7)
  33. #define LD7 (1 << 8)
  34. #define LD8 (1 << 9)
  35. #define BANK_B_LD (LD2 | LD7 | LD8)
  36. #define BANK_E_LD (LD0 | LD1 | LD3 | LD4 | LD5 | LD6)
  37. struct pin Leds[9] = {
  38. { GPIOE, LD0 },
  39. { GPIOE, LD1 },
  40. { GPIOB, LD2 },
  41. { GPIOE, LD3 },
  42. { GPIOE, LD4 },
  43. { GPIOE, LD5 },
  44. { GPIOE, LD6 },
  45. { GPIOB, LD7 },
  46. { GPIOB, LD8 },
  47. };
  48. void led_setup(void)
  49. {
  50. rcc_periph_clock_enable(RCC_GPIOB);
  51. rcc_periph_clock_enable(RCC_GPIOE);
  52. gpio_mode_setup(GPIOB, GPIO_MODE_OUTPUT, GPIO_PUPD_PULLDOWN, BANK_B_LD);
  53. gpio_set(GPIOB, BANK_B_LD);
  54. gpio_mode_setup(GPIOE, GPIO_MODE_OUTPUT, GPIO_PUPD_PULLDOWN, BANK_E_LD);
  55. gpio_set(GPIOE, BANK_E_LD);
  56. }
  57. void led_on(int led)
  58. {
  59. gpio_set(Leds[led].bank, Leds[led].pin);
  60. }
  61. void led_off(int led)
  62. {
  63. gpio_clear(Leds[led].bank, Leds[led].pin);
  64. }
  65. void led_toggle(int led)
  66. {
  67. if (gpio_get(Leds[led].bank, Leds[led].pin))
  68. gpio_clear(Leds[led].bank, Leds[led].pin);
  69. else
  70. gpio_set(Leds[led].bank, Leds[led].pin);
  71. }
  72. void led_beat(int b)
  73. {
  74. if (b < 0 || b > 8)
  75. return;
  76. gpio_clear(GPIOB, BANK_B_LD);
  77. gpio_clear(GPIOE, BANK_E_LD);
  78. if (b != 0)
  79. led_on(b);
  80. }