dev_led.c 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214
  1. /*
  2. * Copyright (c) 2006-2022, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2009-01-05 Bernard the first version
  9. * 2010-12-27 onelife Modify for EFM32
  10. * 2011-05-06 onelife Add EFM32 development kit support
  11. * 2011-12-08 onelife Add giant gecko development kit support
  12. */
  13. /***************************************************************************//**
  14. * @addtogroup efm32
  15. * @{
  16. ******************************************************************************/
  17. /* Includes ------------------------------------------------------------------*/
  18. #include "board.h"
  19. #include "dev_led.h"
  20. /* Private typedef -----------------------------------------------------------*/
  21. /* Private define ------------------------------------------------------------*/
  22. /* Private macro -------------------------------------------------------------*/
  23. /* Private constants ---------------------------------------------------------*/
  24. #if defined(EFM32_G8XX_STK)
  25. static const rt_uint8_t leds_list[LEDS_MAX_NUMBER][2] = \
  26. {
  27. {LEDS_PIN_PORT_0, LEDS_PIN_NUMBER_0},
  28. {LEDS_PIN_PORT_1, LEDS_PIN_NUMBER_1},
  29. {LEDS_PIN_PORT_2, LEDS_PIN_NUMBER_2},
  30. {LEDS_PIN_PORT_3, LEDS_PIN_NUMBER_3}
  31. };
  32. #endif
  33. /* Private variables ---------------------------------------------------------*/
  34. /* Private function prototypes -----------------------------------------------*/
  35. /* Private functions ---------------------------------------------------------*/
  36. /***************************************************************************//**
  37. * @brief
  38. * Turn on a LED
  39. *
  40. * @details
  41. *
  42. * @note
  43. *
  44. * @param[in] num
  45. * LED number
  46. *
  47. ******************************************************************************/
  48. void rt_hw_led_on(rt_uint8_t num)
  49. {
  50. RT_ASSERT(num < LEDS_MAX_NUMBER);
  51. #if defined(EFM32_G8XX_STK)
  52. GPIO_PinOutSet(leds_list[num][0], leds_list[num][1]);
  53. #elif (defined(EFM32_GXXX_DK) || defined(EFM32GG_DK3750))
  54. {
  55. rt_uint16_t leds;
  56. leds = DVK_getLEDs() | (rt_uint16_t)(1 << num);
  57. DVK_setLEDs(leds);
  58. }
  59. #endif
  60. }
  61. /***************************************************************************//**
  62. * @brief
  63. * Turn off a LED
  64. *
  65. * @details
  66. *
  67. * @note
  68. *
  69. * @param[in] num
  70. * LED number
  71. *
  72. ******************************************************************************/
  73. void rt_hw_led_off(rt_uint8_t num)
  74. {
  75. RT_ASSERT(num < LEDS_MAX_NUMBER);
  76. #if defined(EFM32_G8XX_STK)
  77. GPIO_PinOutClear(leds_list[num][0], leds_list[num][1]);
  78. #elif (defined(EFM32_GXXX_DK) || defined(EFM32GG_DK3750))
  79. {
  80. rt_uint16_t leds;
  81. leds = DVK_getLEDs() & ~(rt_uint16_t)(1 << num);
  82. DVK_setLEDs(leds);
  83. }
  84. #endif
  85. }
  86. /***************************************************************************//**
  87. * @brief
  88. * Toggle the state of a LED
  89. *
  90. * @details
  91. *
  92. * @note
  93. *
  94. * @param[in] num
  95. * LED number
  96. *
  97. ******************************************************************************/
  98. void rt_hw_led_toggle(rt_uint8_t num)
  99. {
  100. RT_ASSERT(num < LEDS_MAX_NUMBER);
  101. #if defined(EFM32_G8XX_STK)
  102. GPIO_PinOutToggle(leds_list[num][0], leds_list[num][1]);
  103. #elif (defined(EFM32_GXXX_DK) || defined(EFM32GG_DK3750))
  104. {
  105. rt_uint16_t leds;
  106. leds = DVK_getLEDs() ^ (rt_uint16_t)(1 << num);
  107. DVK_setLEDs(leds);
  108. }
  109. #endif
  110. }
  111. rt_uint8_t rt_hw_led_state(rt_uint8_t num)
  112. {
  113. RT_ASSERT(num < LEDS_MAX_NUMBER);
  114. #if defined(EFM32_G8XX_STK)
  115. return (rt_uint8_t)GPIO_PinInGet(leds_list[num][0], leds_list[num][1]);
  116. #elif (defined(EFM32_GXXX_DK) || defined(EFM32GG_DK3750))
  117. return ((DVK_getLEDs() & (rt_uint16_t)(1 << num)) >> num);
  118. #endif
  119. }
  120. /***************************************************************************//**
  121. * @brief
  122. * Initialize the LEDs related GPIO
  123. *
  124. * @details
  125. *
  126. * @note
  127. *
  128. * @return
  129. * Error code
  130. ******************************************************************************/
  131. rt_err_t rt_hw_led_init(void)
  132. {
  133. #if defined(EFM32_G8XX_STK)
  134. rt_uint8_t i;
  135. /* Configure GPIO */
  136. for (i = 0; i < LEDS_MAX_NUMBER; i++)
  137. {
  138. GPIO_PinModeSet(
  139. leds_list[i][0],
  140. leds_list[i][1],
  141. gpioModePushPull,
  142. 0);
  143. }
  144. #endif
  145. return RT_EOK;
  146. }
  147. /***************************************************************************//**
  148. * Export to FINSH
  149. ******************************************************************************/
  150. #ifdef RT_USING_FINSH
  151. #include <finsh.h>
  152. void list_leds(void)
  153. {
  154. rt_uint8_t i;
  155. rt_kprintf(" led \t port \t pin \t state\n");
  156. rt_kprintf(" -----\t -----\t -----\t -----\n");
  157. for (i = 0; i < LEDS_MAX_NUMBER; i++)
  158. {
  159. #if defined(EFM32_G8XX_STK)
  160. rt_kprintf(" %d \t %x \t %x \t %x \n",
  161. i, leds_list[i][0], leds_list[i][1], rt_hw_led_state(i));
  162. #elif (defined(EFM32_GXXX_DK) || defined(EFM32GG_DK3750))
  163. rt_uint16_t leds;
  164. leds = DVK_getLEDs();
  165. rt_kprintf(" %d \t FPGA \t FPGA \t %x \n",
  166. i, (leds & (1 << i))? 1 : 0);
  167. #endif
  168. }
  169. }
  170. FINSH_FUNCTION_EXPORT(list_leds, list all the LEDs.)
  171. void set_led(rt_uint32_t led, rt_uint32_t state)
  172. {
  173. /* set led status */
  174. switch (state)
  175. {
  176. case 0:
  177. rt_hw_led_off(led);
  178. break;
  179. case 1:
  180. rt_hw_led_on(led);
  181. break;
  182. default:
  183. break;
  184. }
  185. }
  186. FINSH_FUNCTION_EXPORT(set_led, turn led (0 - 3) on (1) or off (0).)
  187. #endif
  188. /***************************************************************************//**
  189. * @}
  190. ******************************************************************************/