|
1 | 1 | /*
|
2 |
| - * Copyright © 2012 Keith Packard <[email protected]> |
| 2 | + * Copyright © 2018 Keith Packard <[email protected]> |
3 | 3 | *
|
4 | 4 | * This program is free software; you can redistribute it and/or modify
|
5 | 5 | * it under the terms of the GNU General Public License as published by
|
|
18 | 18 |
|
19 | 19 | #include "ao.h"
|
20 | 20 |
|
21 |
| -#if LED_PER_LED |
22 | 21 | static const struct {
|
23 | 22 | struct stm_gpio *port;
|
24 | 23 | uint16_t pin;
|
@@ -71,146 +70,105 @@ static const struct {
|
71 | 70 | #ifdef LED_15_PORT
|
72 | 71 | [15] { LED_15_PORT, LED_15_PIN },
|
73 | 72 | #endif
|
| 73 | +#ifdef LED_16_PORT |
| 74 | + [16] { LED_16_PORT, LED_16_PIN }, |
| 75 | +#endif |
| 76 | +#ifdef LED_17_PORT |
| 77 | + [17] { LED_17_PORT, LED_17_PIN }, |
| 78 | +#endif |
| 79 | +#ifdef LED_18_PORT |
| 80 | + [18] { LED_18_PORT, LED_18_PIN }, |
| 81 | +#endif |
| 82 | +#ifdef LED_19_PORT |
| 83 | + [19] { LED_19_PORT, LED_19_PIN }, |
| 84 | +#endif |
| 85 | +#ifdef LED_20_PORT |
| 86 | + [20] { LED_20_PORT, LED_20_PIN }, |
| 87 | +#endif |
| 88 | +#ifdef LED_21_PORT |
| 89 | + [21] { LED_21_PORT, LED_21_PIN }, |
| 90 | +#endif |
| 91 | +#ifdef LED_22_PORT |
| 92 | + [22] { LED_22_PORT, LED_22_PIN }, |
| 93 | +#endif |
| 94 | +#ifdef LED_23_PORT |
| 95 | + [23] { LED_23_PORT, LED_23_PIN }, |
| 96 | +#endif |
| 97 | +#ifdef LED_24_PORT |
| 98 | + [24] { LED_24_PORT, LED_24_PIN }, |
| 99 | +#endif |
| 100 | +#ifdef LED_25_PORT |
| 101 | + [25] { LED_25_PORT, LED_25_PIN }, |
| 102 | +#endif |
| 103 | +#ifdef LED_26_PORT |
| 104 | + [26] { LED_26_PORT, LED_26_PIN }, |
| 105 | +#endif |
| 106 | +#ifdef LED_27_PORT |
| 107 | + [27] { LED_27_PORT, LED_27_PIN }, |
| 108 | +#endif |
| 109 | +#ifdef LED_28_PORT |
| 110 | + [28] { LED_28_PORT, LED_28_PIN }, |
| 111 | +#endif |
| 112 | +#ifdef LED_29_PORT |
| 113 | + [29] { LED_29_PORT, LED_29_PIN }, |
| 114 | +#endif |
| 115 | +#ifdef LED_30_PORT |
| 116 | + [30] { LED_30_PORT, LED_30_PIN }, |
| 117 | +#endif |
| 118 | +#ifdef LED_31_PORT |
| 119 | + [31] { LED_31_PORT, LED_31_PIN }, |
| 120 | +#endif |
74 | 121 | };
|
75 | 122 | #define N_LED (sizeof (ao_leds)/sizeof(ao_leds[0]))
|
76 |
| -#endif |
77 |
| -static AO_LED_TYPE ao_led_enable; |
78 | 123 |
|
79 | 124 | void
|
80 | 125 | ao_led_on(AO_LED_TYPE colors)
|
81 | 126 | {
|
82 |
| -#ifdef LED_PER_LED |
83 | 127 | AO_LED_TYPE i;
|
84 | 128 | for (i = 0; i < N_LED; i++)
|
85 | 129 | if (colors & (1 << i))
|
86 | 130 | ao_gpio_set(ao_leds[i].port, ao_leds[i].pin, 1);
|
87 |
| -#else |
88 |
| -#ifdef LED_PORT |
89 |
| - LED_PORT->bsrr = (colors & ao_led_enable); |
90 |
| -#else |
91 |
| -#ifdef LED_PORT_0 |
92 |
| - LED_PORT_0->bsrr = ((colors & ao_led_enable) & LED_PORT_0_MASK) << LED_PORT_0_SHIFT; |
93 |
| -#endif |
94 |
| -#ifdef LED_PORT_1 |
95 |
| - LED_PORT_1->bsrr = ((colors & ao_led_enable) & LED_PORT_1_MASK) << LED_PORT_1_SHIFT; |
96 |
| -#endif |
97 |
| -#endif |
98 |
| -#endif |
99 | 131 | }
|
100 | 132 |
|
101 | 133 | void
|
102 | 134 | ao_led_off(AO_LED_TYPE colors)
|
103 | 135 | {
|
104 |
| -#ifdef LED_PER_LED |
105 | 136 | AO_LED_TYPE i;
|
106 | 137 | for (i = 0; i < N_LED; i++)
|
107 | 138 | if (colors & (1 << i))
|
108 | 139 | ao_gpio_set(ao_leds[i].port, ao_leds[i].pin, 0);
|
109 |
| -#else |
110 |
| -#ifdef LED_PORT |
111 |
| - LED_PORT->bsrr = (uint32_t) (colors & ao_led_enable) << 16; |
112 |
| -#else |
113 |
| -#ifdef LED_PORT_0 |
114 |
| - LED_PORT_0->bsrr = ((uint32_t) (colors & ao_led_enable) & LED_PORT_0_MASK) << (LED_PORT_0_SHIFT + 16); |
115 |
| -#endif |
116 |
| -#ifdef LED_PORT_1 |
117 |
| - LED_PORT_1->bsrr = ((uint32_t) (colors & ao_led_enable) & LED_PORT_1_MASK) << (LED_PORT_1_SHIFT + 16); |
118 |
| -#endif |
119 |
| -#endif |
120 |
| -#endif |
121 | 140 | }
|
122 | 141 |
|
123 | 142 | void
|
124 | 143 | ao_led_set(AO_LED_TYPE colors)
|
125 | 144 | {
|
126 |
| - AO_LED_TYPE on = colors & ao_led_enable; |
127 |
| - AO_LED_TYPE off = ~colors & ao_led_enable; |
128 |
| - |
129 |
| - ao_led_off(off); |
130 |
| - ao_led_on(on); |
| 145 | + AO_LED_TYPE i; |
| 146 | + for (i = 0; i < N_LED; i++) |
| 147 | + ao_gpio_set(ao_leds[i].port, ao_leds[i].pin, (colors >> i) & 1); |
131 | 148 | }
|
132 | 149 |
|
133 | 150 | void
|
134 | 151 | ao_led_toggle(AO_LED_TYPE colors)
|
135 | 152 | {
|
136 |
| -#ifdef LED_PER_LED |
137 | 153 | AO_LED_TYPE i;
|
138 | 154 | for (i = 0; i < N_LED; i++)
|
139 | 155 | if (colors & (1 << i))
|
140 | 156 | ao_gpio_set(ao_leds[i].port, ao_leds[i].pin, ~ao_gpio_get(ao_leds[i].port, ao_leds[i].pin));
|
141 |
| -#else |
142 |
| -#ifdef LED_PORT |
143 |
| - LED_PORT->odr ^= (colors & ao_led_enable); |
144 |
| -#else |
145 |
| -#ifdef LED_PORT_0 |
146 |
| - LED_PORT_0->odr ^= ((colors & ao_led_enable) & LED_PORT_0_MASK) << LED_PORT_0_SHIFT; |
147 |
| -#endif |
148 |
| -#ifdef LED_PORT_1 |
149 |
| - LED_PORT_1->odr ^= ((colors & ao_led_enable) & LED_PORT_1_MASK) << LED_PORT_1_SHIFT; |
150 |
| -#endif |
151 |
| -#endif |
152 |
| -#endif |
153 | 157 | }
|
154 | 158 |
|
155 | 159 | void
|
156 |
| -ao_led_for(AO_LED_TYPE colors, AO_LED_TYPE ticks) |
| 160 | +ao_led_for(AO_LED_TYPE colors, AO_TICK_TYPE ticks) |
157 | 161 | {
|
158 | 162 | ao_led_on(colors);
|
159 | 163 | ao_delay(ticks);
|
160 | 164 | ao_led_off(colors);
|
161 | 165 | }
|
162 | 166 |
|
163 |
| -#define init_led_pin(port, bit) do { \ |
164 |
| - stm_moder_set(port, bit, STM_MODER_OUTPUT); \ |
165 |
| - stm_otyper_set(port, bit, STM_OTYPER_PUSH_PULL); \ |
166 |
| - } while (0) |
167 |
| - |
168 | 167 | void
|
169 |
| -ao_led_init(AO_LED_TYPE enable) |
| 168 | +ao_led_init(void) |
170 | 169 | {
|
171 | 170 | AO_LED_TYPE bit;
|
172 | 171 |
|
173 |
| - ao_led_enable = enable; |
174 |
| -#if LED_PER_LED |
175 | 172 | for (bit = 0; bit < N_LED; bit++)
|
176 | 173 | ao_enable_output(ao_leds[bit].port, ao_leds[bit].pin, 0);
|
177 |
| -#else |
178 |
| -#ifdef LED_PORT |
179 |
| - stm_rcc.ahbenr |= (1 << LED_PORT_ENABLE); |
180 |
| - LED_PORT->odr &= ~enable; |
181 |
| -#else |
182 |
| -#ifdef LED_PORT_0 |
183 |
| - stm_rcc.ahbenr |= (1 << LED_PORT_0_ENABLE); |
184 |
| - LED_PORT_0->odr &= ~((enable & ao_led_enable) & LED_PORT_0_MASK) << LED_PORT_0_SHIFT; |
185 |
| -#endif |
186 |
| -#ifdef LED_PORT_1 |
187 |
| - stm_rcc.ahbenr |= (1 << LED_PORT_1_ENABLE); |
188 |
| - LED_PORT_1->odr &= ~((enable & ao_led_enable) & LED_PORT_1_MASK) << LED_PORT_1_SHIFT; |
189 |
| -#endif |
190 |
| -#ifdef LED_PORT_2 |
191 |
| - stm_rcc.ahbenr |= (1 << LED_PORT_1_ENABLE); |
192 |
| - LED_PORT_1->odr &= ~((enable & ao_led_enable) & LED_PORT_1_MASK) << LED_PORT_1_SHIFT; |
193 |
| -#endif |
194 |
| -#endif |
195 |
| - for (bit = 0; bit < 16; bit++) { |
196 |
| - if (enable & (1 << bit)) { |
197 |
| -#ifdef LED_PORT |
198 |
| - init_led_pin(LED_PORT, bit); |
199 |
| -#else |
200 |
| -#ifdef LED_PORT_0 |
201 |
| - if (LED_PORT_0_MASK & (1 << bit)) |
202 |
| - init_led_pin(LED_PORT_0, bit + LED_PORT_0_SHIFT); |
203 |
| -#endif |
204 |
| -#ifdef LED_PORT_1 |
205 |
| - if (LED_PORT_1_MASK & (1 << bit)) |
206 |
| - init_led_pin(LED_PORT_1, bit + LED_PORT_1_SHIFT); |
207 |
| -#endif |
208 |
| -#ifdef LED_PORT_2 |
209 |
| - if (LED_PORT_2_MASK & (1 << bit)) |
210 |
| - init_led_pin(LED_PORT_2, bit + LED_PORT_2_SHIFT); |
211 |
| -#endif |
212 |
| -#endif |
213 |
| - } |
214 |
| - } |
215 |
| -#endif |
216 | 174 | }
|
0 commit comments