Files
Yukihiro "Matz" Matsumoto 2b5a389de3 hw-uart: add UART peripheral gems for embedded platforms
Add three new gems for UART serial communication:
- hw-uart: common Ruby API, C bindings, ring buffer, and HAL header
- hw-esp32-uart: ESP32 HAL using ESP-IDF UART driver with FreeRTOS
  RX task
- hw-rp2040-uart: RP2040 HAL using Pico SDK with IRQ-driven RX

Co-authored-by: Claude <noreply@anthropic.com>
2026-04-23 19:25:36 +09:00

61 lines
1.8 KiB
C

#ifndef MRUBY_UART_H
#define MRUBY_UART_H
#include <stdint.h>
#include <stddef.h>
#include <stdbool.h>
#ifdef __cplusplus
extern "C" {
#endif
#define MRB_UART_PARITY_NONE 0
#define MRB_UART_PARITY_EVEN 1
#define MRB_UART_PARITY_ODD 2
#define MRB_UART_FLOW_NONE 0
#define MRB_UART_FLOW_RTS_CTS 1
typedef enum {
MRB_UART_OK = 0,
MRB_UART_ERROR_UNIT = -1,
} mrb_uart_status;
/* Ring buffer for interrupt-driven RX.
Allocated by common gem, populated by platform interrupt handler.
size must be a power of two. */
typedef struct {
volatile int head;
volatile int tail;
int mask;
uint8_t data[];
} mrb_uart_ringbuf;
/* Ring buffer helpers (implemented in hw-uart/src/ringbuf.c) */
bool mrb_uart_ringbuf_init(mrb_uart_ringbuf *rb, int size);
bool mrb_uart_ringbuf_push(mrb_uart_ringbuf *rb, uint8_t ch);
int mrb_uart_ringbuf_pop(mrb_uart_ringbuf *rb, uint8_t *dst, int len);
int mrb_uart_ringbuf_available(const mrb_uart_ringbuf *rb);
void mrb_uart_ringbuf_clear(mrb_uart_ringbuf *rb);
int mrb_uart_ringbuf_search(const mrb_uart_ringbuf *rb, uint8_t ch);
/* HAL functions - implemented by hw-<platform>-uart gems */
int mrb_uart_unit_name_to_num(const char *name);
mrb_uart_status mrb_uart_init(int unit, uint32_t tx_pin, uint32_t rx_pin,
mrb_uart_ringbuf *rxbuf);
uint32_t mrb_uart_set_baudrate(int unit, uint32_t baudrate);
void mrb_uart_set_format(int unit, uint32_t data_bits, uint32_t stop_bits,
uint8_t parity);
void mrb_uart_set_flow_control(int unit, bool cts, bool rts);
void mrb_uart_write(int unit, const uint8_t *src, size_t len);
void mrb_uart_flush(int unit);
void mrb_uart_send_break(int unit, uint32_t duration_ms);
void mrb_uart_clear_rx(int unit);
void mrb_uart_clear_tx(int unit);
#ifdef __cplusplus
}
#endif
#endif /* MRUBY_UART_H */