Skip to content

Commit cfe5606

Browse files
authored
Merge pull request #2 from KurtE/giga_Serial_fixex
Some Serial object fixes...
2 parents 0bf6118 + a565a0a commit cfe5606

File tree

3 files changed

+48
-12
lines changed

3 files changed

+48
-12
lines changed

cores/arduino/zephyrSerial.cpp

+29-4
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,10 @@ void arduino::ZephyrSerial::begin(unsigned long baud, uint16_t conf)
6666

6767
uart_configure(uart, &config);
6868
uart_irq_callback_user_data_set(uart, arduino::ZephyrSerial::IrqDispatch, this);
69+
k_sem_take(&rx.sem, K_FOREVER);
70+
ring_buf_reset(&rx.ringbuf);
71+
k_sem_give(&rx.sem);
72+
6973
uart_irq_rx_enable(uart);
7074
}
7175

@@ -126,26 +130,37 @@ int arduino::ZephyrSerial::available()
126130
return ret;
127131
}
128132

133+
int arduino::ZephyrSerial::availableForWrite()
134+
{
135+
int ret;
136+
137+
k_sem_take(&rx.sem, K_FOREVER);
138+
ret = ring_buf_space_get(&rx.ringbuf);
139+
k_sem_give(&rx.sem);
140+
141+
return ret;
142+
}
143+
129144
int arduino::ZephyrSerial::peek()
130145
{
131146
uint8_t data;
132147

133148
k_sem_take(&rx.sem, K_FOREVER);
134-
ring_buf_peek(&rx.ringbuf, &data, 1);
149+
uint32_t cb_ret = ring_buf_peek(&rx.ringbuf, &data, 1);
135150
k_sem_give(&rx.sem);
136151

137-
return data;
152+
return cb_ret? data : -1;
138153
}
139154

140155
int arduino::ZephyrSerial::read()
141156
{
142157
uint8_t data;
143158

144159
k_sem_take(&rx.sem, K_FOREVER);
145-
ring_buf_get(&rx.ringbuf, &data, 1);
160+
uint32_t cb_ret = ring_buf_get(&rx.ringbuf, &data, 1);
146161
k_sem_give(&rx.sem);
147162

148-
return data;
163+
return cb_ret? data : -1;
149164
}
150165

151166
size_t arduino::ZephyrSerial::write(const uint8_t *buffer, size_t size)
@@ -174,6 +189,16 @@ size_t arduino::ZephyrSerial::write(const uint8_t *buffer, size_t size)
174189
return size;
175190
}
176191

192+
void arduino::ZephyrSerial::flush() {
193+
while (ring_buf_size_get(&tx.ringbuf) > 0) {
194+
k_yield();
195+
}
196+
while (uart_irq_tx_complete(uart) == 0){
197+
k_yield();
198+
}
199+
}
200+
201+
177202
#if DT_NODE_HAS_PROP(DT_PATH(zephyr_user), serials)
178203
#if !DT_NODE_HAS_PROP(DT_PATH(zephyr_user), cdc_acm)
179204
// If CDC USB, use that object as Serial (and SerialUSB)

cores/arduino/zephyrSerial.h

+4-7
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,8 @@ namespace arduino {
1414
class ZephyrSerialStub : public HardwareSerial
1515
{
1616
public:
17-
void begin(unsigned long baudRate) { }
18-
void begin(unsigned long baudrate, uint16_t config) { }
17+
void begin(__attribute__((unused)) unsigned long baudRate) { }
18+
void begin(__attribute__((unused)) unsigned long baudrate, __attribute__((unused)) uint16_t config) { }
1919
void end() { }
2020
int available() { return 0; }
2121
int peek() { return 0; }
@@ -51,16 +51,13 @@ class ZephyrSerial : public HardwareSerial
5151
ZephyrSerial(const struct device *dev) : uart(dev) { }
5252
void begin(unsigned long baudrate, uint16_t config);
5353
void begin(unsigned long baudrate) { begin(baudrate, SERIAL_8N1); }
54-
void flush() {
55-
while (ring_buf_size_get(&tx.ringbuf) > 0) {
56-
k_yield();
57-
}
58-
}
54+
void flush();
5955
void end() { }
6056
size_t write(const uint8_t *buffer, size_t size);
6157
size_t write(const uint8_t data) { return write(&data, 1); }
6258
using Print::write; // pull in write(str) and write(buf, size) from Print
6359
int available();
60+
int availableForWrite();
6461
int peek();
6562
int read();
6663

loader/boards/arduino_giga_r1_m7.overlay

+15-1
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,20 @@
99
status = "okay";
1010
};
1111

12+
&usart2 {
13+
status = "okay";
14+
pinctrl-0 = <&usart2_tx_pd5 &usart2_rx_pd6>;
15+
pinctrl-names = "default";
16+
current-speed = <115200>;
17+
};
18+
19+
&uart4 {
20+
status = "okay";
21+
pinctrl-0 = <&uart4_tx_ph13 &uart4_rx_pi9>;
22+
pinctrl-names = "default";
23+
current-speed = <115200>;
24+
};
25+
1226
&usart6 {
1327
status = "okay";
1428
};
@@ -407,7 +421,7 @@
407421
<&gpioa 4 0>,
408422
<&gpioa 5 0>;
409423

410-
serials = <&cdc_acm_uart0>, <&usart1>, <&usart6>;
424+
serials = <&cdc_acm_uart0>, <&usart1>, <&usart2>, <&uart4>, <&usart6>;
411425
cdc-acm = <&cdc_acm_uart0>;
412426
i2cs = <&i2c4>;
413427
spis = <&spi1>, <&spi5>;

0 commit comments

Comments
 (0)