7
7
#include < Arduino.h>
8
8
#include " zephyrInternal.h"
9
9
10
-
11
10
namespace {
12
11
13
12
struct device gpio0;
@@ -17,41 +16,55 @@ static constexpr struct device *gpios[] = {&gpio0, &gpio1};
17
16
static constexpr uint32_t pins[] = {16u , 32u }; // exclusive-upper
18
17
static constexpr size_t NUM_PORTS = sizeof (gpios) / sizeof (gpios[0 ]);
19
18
20
-
21
- /* グローバル → gpio* を探す */
22
- constexpr const struct device * local_gpio_port_recursive ( pin_size_t pin, const struct device * const *ctrl,
23
- const uint32_t *end, size_t n) {
24
- return (n == 0 ) ? nullptr
25
- : (pin < end[0 ]) ? ctrl[0 ]
26
- : local_gpio_port_recursive (pin, ctrl + 1 , end + 1 , n - 1 );
19
+ static constexpr inline const struct device * local_gpio_port_recursive ( pin_size_t pin,
20
+ const struct device * const *ctrl,
21
+ const uint32_t *end, size_t n)
22
+ {
23
+ return (n == 0 ) ? nullptr
24
+ : (pin < end[0 ]) ? ctrl[0 ]
25
+ : local_gpio_port_recursive (pin, ctrl + 1 , end + 1 , n - 1 );
27
26
}
28
27
29
- constexpr const struct device *local_gpio_port (pin_size_t gpin) {
30
- return local_gpio_port_recursive (gpin, gpios, pins, NUM_PORTS);
28
+
29
+ static constexpr inline pin_size_t port_index_recursive (const struct device *target,
30
+ const struct device *const *table, pin_size_t idx,
31
+ size_t n)
32
+ {
33
+ return (n == 0 ) ? size_t (-1 )
34
+ : (target == table[0 ]) ? idx
35
+ : port_index_recursive (target, table + 1 , idx + 1 , n - 1 );
31
36
}
32
37
33
- /* ポートインデックスを取得(見つからなければ size_t(-1)) */
34
- constexpr pin_size_t port_index_recursive (const struct device *target,
35
- const struct device *const *table,
36
- pin_size_t idx, size_t n) {
37
- return (n == 0 ) ? size_t (-1 )
38
- : (target == table[0 ])
39
- ? idx
40
- : port_index_recursive (target, table + 1 , idx + 1 , n - 1 );
38
+ static constexpr inline const struct device *local_gpio_port (pin_size_t gpin)
39
+ {
40
+ return local_gpio_port_recursive (gpin, gpios, pins, NUM_PORTS);
41
41
}
42
42
43
- constexpr pin_size_t local_gpio_pin (pin_size_t gpin) {
43
+ static constexpr inline pin_size_t local_gpio_pin (pin_size_t gpin)
44
+ {
44
45
return gpin - pins[port_index_recursive (local_gpio_port (gpin), gpios, 0 , NUM_PORTS)];
45
46
}
46
47
47
- constexpr pin_size_t global_gpio_pin (const struct device *lport, pin_size_t lpin) noexcept {
48
+ static constexpr inline pin_size_t global_gpio_pin (const struct device *lport, pin_size_t lpin) noexcept
49
+ {
48
50
return pins[port_index_recursive (lport, gpios, 0 , NUM_PORTS)] + lpin;
49
51
}
50
52
51
- constexpr uint32_t local_gpio_dt_flags (int ) {
53
+ static constexpr inline uint32_t local_gpio_dt_flags (int )
54
+ {
52
55
return 0 ;
53
56
}
54
57
58
+ static inline int global_gpio_pin_get (pin_size_t pinNumber)
59
+ {
60
+ return gpio_pin_get (local_gpio_port (pinNumber), local_gpio_pin (pinNumber));
61
+ }
62
+
63
+ static inline int global_gpio_pin_configure (pin_size_t pinNumber, int flags)
64
+ {
65
+ return gpio_pin_configure (local_gpio_port (pinNumber), local_gpio_pin (pinNumber), flags);
66
+ }
67
+
55
68
template <class N , class Head > constexpr const N max_in_list (const N max, const Head &head)
56
69
{
57
70
return (max >= head) ? max : head;
@@ -185,14 +198,16 @@ struct pin_timer {
185
198
struct pin_timer arduino_pin_timers[GPIO_PORT_NUMS];
186
199
struct pin_timer arduino_pin_timers_timeout[GPIO_PORT_NUMS];
187
200
188
- void tone_expiry_cb (struct k_timer *timer) {
189
- struct pin_timer * pt = (struct pin_timer *)k_timer_user_data_get (timer);
190
- gpio_pin_toggle_dt (&pt->spec );
201
+ void tone_expiry_cb (struct k_timer *timer)
202
+ {
203
+ struct pin_timer *pt = (struct pin_timer *)k_timer_user_data_get (timer);
204
+ gpio_pin_toggle_dt (&pt->spec );
191
205
}
192
206
193
- void tone_timeout_cb (struct k_timer *timer) {
194
- struct pin_timer * pt = (struct pin_timer *)k_timer_user_data_get (timer);
195
- noTone (global_gpio_pin (pt->spec .port , pt->spec .pin ));
207
+ void tone_timeout_cb (struct k_timer *timer)
208
+ {
209
+ struct pin_timer *pt = (struct pin_timer *)k_timer_user_data_get (timer);
210
+ noTone (global_gpio_pin (pt->spec .port , pt->spec .pin ));
196
211
}
197
212
198
213
} // namespace
@@ -208,17 +223,13 @@ void yield(void) {
208
223
*/
209
224
void pinMode (pin_size_t pinNumber, PinMode pinMode) {
210
225
if (pinMode == INPUT) { // input mode
211
- gpio_pin_configure (local_gpio_port (pinNumber), local_gpio_pin (pinNumber),
212
- GPIO_INPUT | GPIO_ACTIVE_HIGH);
226
+ global_gpio_pin_configure (pinNumber, GPIO_INPUT | GPIO_ACTIVE_HIGH);
213
227
} else if (pinMode == INPUT_PULLUP) { // input with internal pull-up
214
- gpio_pin_configure (local_gpio_port (pinNumber), local_gpio_pin (pinNumber),
215
- GPIO_INPUT | GPIO_PULL_UP | GPIO_ACTIVE_HIGH);
228
+ global_gpio_pin_configure (pinNumber, GPIO_INPUT | GPIO_PULL_UP | GPIO_ACTIVE_HIGH);
216
229
} else if (pinMode == INPUT_PULLDOWN) { // input with internal pull-down
217
- gpio_pin_configure (local_gpio_port (pinNumber), local_gpio_pin (pinNumber),
218
- GPIO_INPUT | GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH);
230
+ global_gpio_pin_configure (pinNumber, GPIO_INPUT | GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH);
219
231
} else if (pinMode == OUTPUT) { // output mode
220
- gpio_pin_configure (local_gpio_port (pinNumber), local_gpio_pin (pinNumber),
221
- GPIO_OUTPUT_LOW | GPIO_ACTIVE_HIGH);
232
+ global_gpio_pin_configure (pinNumber, GPIO_OUTPUT_LOW | GPIO_ACTIVE_HIGH);
222
233
}
223
234
}
224
235
@@ -236,7 +247,7 @@ void tone(pin_size_t pinNumber, unsigned int frequency, unsigned long duration)
236
247
k_timeout_t timeout;
237
248
238
249
arduino_pin_timers[pinNumber].spec .port = local_gpio_port (pinNumber);
239
- arduino_pin_timers[pinNumber].spec .pin = local_gpio_pin (pinNumber);
250
+ arduino_pin_timers[pinNumber].spec .pin = local_gpio_pin (pinNumber);
240
251
arduino_pin_timers[pinNumber].spec .dt_flags = local_gpio_dt_flags (pinNumber);
241
252
242
253
pinMode (pinNumber, OUTPUT);
@@ -253,10 +264,10 @@ void tone(pin_size_t pinNumber, unsigned int frequency, unsigned long duration)
253
264
gpio_pin_set_dt (&arduino_pin_timers[pinNumber].spec , 1 );
254
265
k_timer_start (timer, timeout, timeout);
255
266
256
- if (duration > 0 ) {
267
+ if (duration > 0 ) {
257
268
timer = &arduino_pin_timers_timeout[pinNumber].timer ;
258
269
arduino_pin_timers_timeout[pinNumber].spec .port = local_gpio_port (pinNumber);
259
- arduino_pin_timers_timeout[pinNumber].spec .pin = local_gpio_pin (pinNumber);
270
+ arduino_pin_timers_timeout[pinNumber].spec .pin = local_gpio_pin (pinNumber);
260
271
arduino_pin_timers_timeout[pinNumber].spec .dt_flags = local_gpio_dt_flags (pinNumber);
261
272
k_timer_init (timer, tone_timeout_cb, NULL );
262
273
k_timer_user_data_set (timer, &arduino_pin_timers_timeout[pinNumber]);
@@ -436,18 +447,18 @@ unsigned long pulseIn(pin_size_t pinNumber, uint8_t state, unsigned long timeout
436
447
goto cleanup;
437
448
}
438
449
439
- while ( gpio_pin_get ( local_gpio_port ( pinNumber), local_gpio_pin (pinNumber) ) == state && k_timer_status_get (&timer) == 0 );
450
+ while ( global_gpio_pin_get ( pinNumber) == state && k_timer_status_get (&timer) == 0 );
440
451
if (k_timer_status_get (&timer) > 0 ) {
441
452
goto cleanup;
442
453
}
443
454
444
- while ( gpio_pin_get ( local_gpio_port ( pinNumber), local_gpio_pin (pinNumber) ) != state && k_timer_status_get (&timer) == 0 );
455
+ while ( global_gpio_pin_get ( pinNumber) != state && k_timer_status_get (&timer) == 0 );
445
456
if (k_timer_status_get (&timer) > 0 ) {
446
457
goto cleanup;
447
458
}
448
459
449
460
start = k_uptime_ticks ();
450
- while ( gpio_pin_get ( local_gpio_port ( pinNumber), local_gpio_pin (pinNumber) ) == state && k_timer_status_get (&timer) == 0 );
461
+ while ( global_gpio_pin_get ( pinNumber) == state && k_timer_status_get (&timer) == 0 );
451
462
if (k_timer_status_get (&timer) > 0 ) {
452
463
goto cleanup;
453
464
}
0 commit comments