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