Skip to content

Commit ae2cd5c

Browse files
committed
cores: arduino: Split zephyrCommon.cpp
Split zephyrCommon.cpp into small cpp files. wirinig_digital.cpp: - pinMode - digitalWrite - digitalRead wirinig_analog.cpp: - analogRead - analogWrite - analogReference - analogReadResolution - analogWriteResolution wirinig_pulse.cpp: - pulseIn WInterrupts.cpp: - attachInterrupt - detachInterrupt - interrupts - noInterrupts - digitalPinToInterrupt WMath.cpp: - randomSeed - random Tone.cpp: - tone - noTone Arduino.h (inline): - delay - delayMicroseconds - millis - micros - yield Signed-off-by: TOKITA Hiroshi <tokita.hiroshi@gmail.com>
1 parent be057fb commit ae2cd5c

File tree

9 files changed

+554
-476
lines changed

9 files changed

+554
-476
lines changed

cores/arduino/Arduino.h

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,17 @@ int digitalPinToInterrupt(pin_size_t pin);
137137
void analogReadResolution(int bits);
138138
void analogWriteResolution(int bits);
139139

140+
__attribute__((always_inline)) void delay(unsigned long ms) {
141+
k_sleep(K_MSEC(ms));
142+
}
143+
144+
__attribute__((always_inline)) void delayMicroseconds(unsigned int us) {
145+
if (us == 0) {
146+
return;
147+
}
148+
k_busy_wait(us - 1);
149+
}
150+
140151
#include <variant.h>
141152

142153
#if !defined(LED_BUILTIN) && defined(ZARD_LED_BUILTIN)

cores/arduino/CMakeLists.txt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,13 @@ zephyr_sources(zephyrCommon.cpp)
99
zephyr_sources(USB.cpp)
1010
zephyr_sources(itoa.cpp)
1111

12+
zephyr_sources(wiring_analog.cpp)
13+
zephyr_sources(wiring_digital.cpp)
14+
zephyr_sources(wiring_pulse.cpp)
15+
zephyr_sources(Tone.cpp)
16+
zephyr_sources(WMath.cpp)
17+
zephyr_sources(WInterrupts.cpp)
18+
1219
if(DEFINED CONFIG_ARDUINO_ENTRY)
1320
zephyr_sources(main.cpp)
1421
zephyr_sources(threads.cpp)

cores/arduino/Tone.cpp

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
/*
2+
* Copyright (c) 2024 Ayush Singh <ayush@beagleboard.org>
3+
* Copyright (c) 2026 TOKITA Hiroshi
4+
*
5+
* SPDX-License-Identifier: Apache-2.0
6+
*/
7+
8+
#include <Arduino.h>
9+
#include "wiring_private.h"
10+
11+
using namespace zephyr::arduino;
12+
13+
namespace {
14+
15+
struct k_timer arduino_pin_timers[ARRAY_SIZE(arduino_pins)];
16+
struct k_timer arduino_pin_timers_timeout[ARRAY_SIZE(arduino_pins)];
17+
18+
void tone_expiry_cb(struct k_timer *timer) {
19+
const struct gpio_dt_spec *spec = (gpio_dt_spec *)k_timer_user_data_get(timer);
20+
gpio_pin_toggle_dt(spec);
21+
}
22+
23+
void tone_timeout_cb(struct k_timer *timer) {
24+
pin_size_t pinNumber = (pin_size_t)(uintptr_t)k_timer_user_data_get(timer);
25+
noTone(pinNumber);
26+
}
27+
28+
} // anonymous namespace
29+
30+
void tone(pin_size_t pinNumber, unsigned int frequency, unsigned long duration) {
31+
struct k_timer *timer = &arduino_pin_timers[pinNumber];
32+
const struct gpio_dt_spec *spec = &arduino_pins[pinNumber];
33+
k_timeout_t timeout;
34+
35+
pinMode(pinNumber, OUTPUT);
36+
37+
if (frequency == 0) {
38+
gpio_pin_set_dt(spec, 0);
39+
return;
40+
}
41+
42+
timeout = K_NSEC(NSEC_PER_SEC / (2 * frequency));
43+
44+
k_timer_init(timer, tone_expiry_cb, NULL);
45+
k_timer_user_data_set(timer, (void *)spec);
46+
gpio_pin_set_dt(spec, 1);
47+
k_timer_start(timer, timeout, timeout);
48+
49+
if (duration > 0) {
50+
timer = &arduino_pin_timers_timeout[pinNumber];
51+
k_timer_init(timer, tone_timeout_cb, NULL);
52+
k_timer_user_data_set(timer, (void *)(uintptr_t)pinNumber);
53+
k_timer_start(timer, K_MSEC(duration), K_NO_WAIT);
54+
}
55+
}
56+
57+
void noTone(pin_size_t pinNumber) {
58+
k_timer_stop(&arduino_pin_timers[pinNumber]);
59+
gpio_pin_set_dt(&arduino_pins[pinNumber], 0);
60+
}

cores/arduino/WInterrupts.cpp

Lines changed: 142 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,142 @@
1+
/*
2+
* Copyright (c) 2022 TOKITA Hiroshi
3+
*
4+
* SPDX-License-Identifier: Apache-2.0
5+
*/
6+
7+
#include <Arduino.h>
8+
#include "wiring_private.h"
9+
10+
using namespace zephyr::arduino;
11+
12+
namespace {
13+
14+
/*
15+
* GPIO callback implementation
16+
*/
17+
18+
struct arduino_callback {
19+
voidFuncPtr handler;
20+
bool enabled;
21+
};
22+
23+
struct gpio_port_callback {
24+
struct gpio_callback callback;
25+
struct arduino_callback handlers[max_ngpios];
26+
gpio_port_pins_t pins;
27+
const struct device *dev;
28+
} port_callback[port_num] = {0};
29+
30+
unsigned int irq_key;
31+
bool interrupts_disabled = false;
32+
33+
struct gpio_port_callback *find_gpio_port_callback(const struct device *dev) {
34+
for (size_t i = 0; i < ARRAY_SIZE(port_callback); i++) {
35+
if (port_callback[i].dev == dev) {
36+
return &port_callback[i];
37+
}
38+
if (port_callback[i].dev == nullptr) {
39+
port_callback[i].dev = dev;
40+
return &port_callback[i];
41+
}
42+
}
43+
44+
return nullptr;
45+
}
46+
47+
void setInterruptHandler(pin_size_t pinNumber, voidFuncPtr func) {
48+
struct gpio_port_callback *pcb = find_gpio_port_callback(arduino_pins[pinNumber].port);
49+
50+
if (pcb) {
51+
pcb->handlers[arduino_pins[pinNumber].pin].handler = func;
52+
}
53+
}
54+
55+
void handleGpioCallback(const struct device *port, struct gpio_callback *cb, uint32_t pins) {
56+
(void)port; // unused
57+
struct gpio_port_callback *pcb = (struct gpio_port_callback *)cb;
58+
59+
for (uint32_t i = 0; i < max_ngpios; i++) {
60+
if (pins & BIT(i) && pcb->handlers[i].enabled) {
61+
pcb->handlers[i].handler();
62+
}
63+
}
64+
}
65+
66+
void enableInterrupt(pin_size_t pinNumber) {
67+
struct gpio_port_callback *pcb = find_gpio_port_callback(arduino_pins[pinNumber].port);
68+
69+
if (pcb) {
70+
pcb->handlers[arduino_pins[pinNumber].pin].enabled = true;
71+
}
72+
}
73+
74+
void disableInterrupt(pin_size_t pinNumber) {
75+
struct gpio_port_callback *pcb = find_gpio_port_callback(arduino_pins[pinNumber].port);
76+
77+
if (pcb) {
78+
pcb->handlers[arduino_pins[pinNumber].pin].enabled = false;
79+
}
80+
}
81+
82+
} // anonymous namespace
83+
84+
void attachInterrupt(pin_size_t pinNumber, voidFuncPtr callback, PinStatus pinStatus) {
85+
struct gpio_port_callback *pcb;
86+
gpio_flags_t intmode = 0;
87+
88+
if (!callback) {
89+
return;
90+
}
91+
92+
if (pinStatus == LOW) {
93+
intmode |= GPIO_INT_LEVEL_LOW;
94+
} else if (pinStatus == HIGH) {
95+
intmode |= GPIO_INT_LEVEL_HIGH;
96+
} else if (pinStatus == CHANGE) {
97+
intmode |= GPIO_INT_EDGE_BOTH;
98+
} else if (pinStatus == FALLING) {
99+
intmode |= GPIO_INT_EDGE_FALLING;
100+
} else if (pinStatus == RISING) {
101+
intmode |= GPIO_INT_EDGE_RISING;
102+
} else {
103+
return;
104+
}
105+
106+
pcb = find_gpio_port_callback(arduino_pins[pinNumber].port);
107+
__ASSERT(pcb != nullptr, "gpio_port_callback not found");
108+
109+
pcb->pins |= BIT(arduino_pins[pinNumber].pin);
110+
setInterruptHandler(pinNumber, callback);
111+
enableInterrupt(pinNumber);
112+
113+
gpio_pin_interrupt_configure(arduino_pins[pinNumber].port, arduino_pins[pinNumber].pin,
114+
intmode);
115+
gpio_init_callback(&pcb->callback, handleGpioCallback, pcb->pins);
116+
gpio_add_callback(arduino_pins[pinNumber].port, &pcb->callback);
117+
}
118+
119+
void detachInterrupt(pin_size_t pinNumber) {
120+
setInterruptHandler(pinNumber, nullptr);
121+
disableInterrupt(pinNumber);
122+
}
123+
124+
void interrupts(void) {
125+
if (interrupts_disabled) {
126+
irq_unlock(irq_key);
127+
interrupts_disabled = false;
128+
}
129+
}
130+
131+
void noInterrupts(void) {
132+
if (!interrupts_disabled) {
133+
irq_key = irq_lock();
134+
interrupts_disabled = true;
135+
}
136+
}
137+
138+
int digitalPinToInterrupt(pin_size_t pin) {
139+
struct gpio_port_callback *pcb = find_gpio_port_callback(arduino_pins[pin].port);
140+
141+
return (pcb) ? pin : -1;
142+
}

cores/arduino/WMath.cpp

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
/*
2+
* Copyright (c) 2024 Ayush Singh <ayush@beagleboard.org>
3+
* Copyright (c) 2026 TOKITA Hiroshi
4+
*
5+
* SPDX-License-Identifier: Apache-2.0
6+
*/
7+
8+
#include <Arduino.h>
9+
10+
#ifndef CONFIG_MINIMAL_LIBC_RAND
11+
12+
#include <stdlib.h>
13+
14+
void randomSeed(unsigned long seed) {
15+
srand(seed);
16+
}
17+
18+
long random(long min, long max) {
19+
return rand() % (max - min) + min;
20+
}
21+
22+
long random(long max) {
23+
return rand() % max;
24+
}
25+
26+
#endif

0 commit comments

Comments
 (0)