77#include < Arduino.h>
88#include " zephyrInternal.h"
99
10-
1110namespace {
1211
1312struct device gpio0;
@@ -17,41 +16,55 @@ static constexpr struct device *gpios[] = {&gpio0, &gpio1};
1716static constexpr uint32_t pins[] = {16u , 32u }; // exclusive-upper
1817static constexpr size_t NUM_PORTS = sizeof (gpios) / sizeof (gpios[0 ]);
1918
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 );
2726}
2827
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 );
3136}
3237
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);
4141}
4242
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+ {
4445 return gpin - pins[port_index_recursive (local_gpio_port (gpin), gpios, 0 , NUM_PORTS)];
4546}
4647
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+ {
4850 return pins[port_index_recursive (lport, gpios, 0 , NUM_PORTS)] + lpin;
4951}
5052
51- constexpr uint32_t local_gpio_dt_flags (int ) {
53+ static constexpr inline uint32_t local_gpio_dt_flags (int )
54+ {
5255 return 0 ;
5356}
5457
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+
5568template <class N , class Head > constexpr const N max_in_list (const N max, const Head &head)
5669{
5770 return (max >= head) ? max : head;
@@ -185,14 +198,16 @@ struct pin_timer {
185198struct pin_timer arduino_pin_timers[GPIO_PORT_NUMS];
186199struct pin_timer arduino_pin_timers_timeout[GPIO_PORT_NUMS];
187200
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 );
191205}
192206
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 ));
196211}
197212
198213} // namespace
@@ -208,17 +223,13 @@ void yield(void) {
208223 */
209224void pinMode (pin_size_t pinNumber, PinMode pinMode) {
210225 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);
213227 } 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);
216229 } 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);
219231 } 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);
222233 }
223234}
224235
@@ -236,7 +247,7 @@ void tone(pin_size_t pinNumber, unsigned int frequency, unsigned long duration)
236247 k_timeout_t timeout;
237248
238249 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);
240251 arduino_pin_timers[pinNumber].spec .dt_flags = local_gpio_dt_flags (pinNumber);
241252
242253 pinMode (pinNumber, OUTPUT);
@@ -253,10 +264,10 @@ void tone(pin_size_t pinNumber, unsigned int frequency, unsigned long duration)
253264 gpio_pin_set_dt (&arduino_pin_timers[pinNumber].spec , 1 );
254265 k_timer_start (timer, timeout, timeout);
255266
256- if (duration > 0 ) {
267+ if (duration > 0 ) {
257268 timer = &arduino_pin_timers_timeout[pinNumber].timer ;
258269 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);
260271 arduino_pin_timers_timeout[pinNumber].spec .dt_flags = local_gpio_dt_flags (pinNumber);
261272 k_timer_init (timer, tone_timeout_cb, NULL );
262273 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
436447 goto cleanup;
437448 }
438449
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 );
440451 if (k_timer_status_get (&timer) > 0 ) {
441452 goto cleanup;
442453 }
443454
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 );
445456 if (k_timer_status_get (&timer) > 0 ) {
446457 goto cleanup;
447458 }
448459
449460 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 );
451462 if (k_timer_status_get (&timer) > 0 ) {
452463 goto cleanup;
453464 }
0 commit comments