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