MCPcopy Create free account
hub / github.com/Moddable-OpenSource/moddable / serial_uart_isr

Function serial_uart_isr

modules/io/serial/zephyr/serial.c:120–176  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

118}
119
120static void serial_uart_isr(const struct device *dev, void *user_data)
121{
122 modSerial serial = (modSerial)user_data;
123 uint8_t flags = 0;
124
125 while (uart_irq_update(dev) && uart_irq_is_pending(dev)) {
126 if (serial->onError) {
127 int error = uart_err_check(dev);
128 if (error) {
129 serial->lastError = error;
130 flags |= kSerialError;
131 }
132 }
133
134 if (uart_irq_rx_ready(dev)) {
135 uint8_t rx_data[MODDEF_SERIAL_RX_CHUNKSIZE];
136 int bytes_read;
137
138 while ((bytes_read = uart_fifo_read(dev, rx_data, sizeof(rx_data))) > 0) {
139 uint32_t written = ring_buf_put(&serial->rxRingBuffer, rx_data, bytes_read);
140 if (serial->onReadable && (written > 0))
141 flags |= kSerialReadable;
142
143 if (serial->onError && (written < bytes_read)) {
144 serial->lastError = -ENOMEM; // buffer overflow
145 flags |= kSerialError;
146 }
147 }
148 }
149
150 uint32_t space = uart_irq_tx_ready(dev);
151 if (space > 0) {
152 uint8_t tx_data[MODDEF_SERIAL_TX_CHUNKSIZE];
153 uint32_t len = ring_buf_get(&serial->txRingBuffer, tx_data,
154 (space < MODDEF_SERIAL_TX_CHUNKSIZE) ? space : MODDEF_SERIAL_TX_CHUNKSIZE);
155 if (len > 0) {
156 uart_fifo_fill(dev, tx_data, len);
157
158 if (serial->onWritable && (ring_buf_space_get(&serial->txRingBuffer) > 0)) //@@ this could fire less often
159 flags |= kSerialWritable;
160 }
161 else {
162 uart_irq_tx_disable(dev);
163 serial->txEnabled = false;
164 if (serial->onWritable)
165 flags |= kSerialWritable;
166 }
167 }
168 }
169
170 uint8_t currentFlags = serial->flags;
171 serial->flags |= flags;
172 if (flags && !currentFlags) {
173 serial->useCount++;
174 modMessagePostToMachineFromISR(serial->the, serialDeliver, serial);
175 }
176}
177

Callers

nothing calls this directly

Calls 1

Tested by

no test coverage detected