34static const char*
s_tag =
"USB";
48typedef enum : uint32_t {
79 volatile const uint16_t* sts,
82 const uint16_t bit = (uint16_t)(1U << pipe_num);
83 const uint8_t idx = (uint8_t)(pipe_num - 1U);
85 if ((*sts & bit) != 0U) {
115 if (reg ==
nullptr) {
153 if (pipe_num == 0U) {
168 if (max_packet == 0U) {
208 if (reg ==
nullptr) {
225 const uint16_t pipe_bit = (uint16_t)(1U << pipe_num);
226 reg->
BRDYSTS = (uint16_t)~pipe_bit;
227 reg->
NRDYSTS = (uint16_t)~pipe_bit;
228 reg->
BEMPSTS = (uint16_t)~pipe_bit;
257 if (reg ==
nullptr) {
260 if (pipe_num == 0U) {
266 const uint16_t pipe_bit = (uint16_t)(1U << pipe_num);
267 reg->
BEMPSTS = (uint16_t)~pipe_bit;
275 reg->
BEMPSTS = (uint16_t)~pipe_bit;
310 uint16_t* out_copied)
321 reg->
BRDYSTS = (uint16_t)~(uint16_t)(1U << pipe_num);
328 uint16_t copy = dtln;
380 uint16_t copied = 0U;
384 (uint16_t)(max_len - rx),
390 rx = (uint16_t)(rx + copied);
428 uint16_t* out_received)
433 if (reg ==
nullptr) {
436 if (pipe_num == 0U) {
448 const uint16_t pipe_bit = (uint16_t)(1U << pipe_num);
479 if (reg ==
nullptr) {
static const char * s_tag
Logging / check tag.
Annotation-attribute framework macros for ra8-firmware.
#define RA8_INTERNAL
Marker that a function is intended to be static (file-local).
Validation and Error-Checking Macros for ra8-firmware.
#define RA8_CHECK_NULL_PTR(ptr, tag, message)
Reject nullptr pointer, returning k_ra8_err_null_ptr.
Error Code Definitions for ra8-firmware.
@ k_ra8_err_invalid_arg
Invalid function argument.
@ k_ra8_err_invalid_state
Module in wrong state for requested operation.
@ k_ra8_err_hw_timeout
Hardware timed out waiting for a flag or handshake.
@ k_ra8_ok
Success – operation completed with all postconditions satisfied.
@ k_ra8_err_hw_error
Generic hardware fault detected (error flag set, fault interrupt).
ra8_err_codes_t ra8_err_t
Canonical error-return type used by every ra8-firmware API.
void priv_rmw16(volatile uint16_t *reg, uint16_t set_mask, uint16_t clr_mask)
Apply a generic read-modify-write to a 16-bit register.
void priv_select_cfifo(volatile r_usb_regs_t *reg, uint16_t pipe_num, bool is_in_dir)
Set CFIFOSEL.MBW + CURPIPE + ISEL for the given pipe / direction.
ra8_err_t priv_wait_frdy(volatile r_usb_regs_t *reg)
Spin until CFIFOCTR.FRDY asserts or a deadline elapses.
volatile r_usb_regs_t * priv_pick(ra8_usb_speed_t speed)
Resolve the per-speed register pointer.
uint16_t priv_pipebuf_word(uint8_t pipe_num, uint16_t max_packet)
Compute the PIPEBUF word for a bulk pipe (2*MPS region).
void priv_pipe_pid(volatile r_usb_regs_t *reg, uint8_t pipe_num, ra8_usb_pid_t pid)
Set PIPECTR[idx] PID field.
void priv_pipe_quiesce(volatile r_usb_regs_t *reg, uint8_t pipe_num)
Quiesce the pipe so PIPECFG/PIPEMAXP/PIPEPERI become writable.
void priv_fifo_read(volatile r_usb_regs_t *reg, uint8_t *data, uint16_t len)
Drain the CFIFO data port into a buffer.
uint16_t priv_pipecfg_word(uint8_t ep_addr, ra8_usb_ep_dir_t dir, ra8_usb_ep_type_t type, bool dblb_in)
Pack PIPECFG fields for a configured non-control pipe.
Native USB controller driver public API (device + host modes).
@ k_ra8_usb_ep_type_bulk
Bulk transfer.
ra8_usb_ep_dir_t
Endpoint direction.
@ k_ra8_usb_ep_dir_in
Device -> host.
@ k_ra8_usb_ep_dir_out
Host -> device.
ra8_usb_speed_t
Selects which controller instance the call targets.
ra8_err_t ra8_usb_queue_in(ra8_usb_speed_t speed, uint8_t pipe_num, const uint8_t *data, uint16_t len)
Queue an IN transfer (device -> host) on pipe_num.
ra8_err_t ra8_usb_host_bulk_out(ra8_usb_speed_t speed, uint8_t pipe_num, const uint8_t *data, uint16_t len)
Implementation of ra8_usb_host_bulk_out().
static ra8_err_t internal_host_bulk_rx_loop(volatile r_usb_regs_t *reg, uint8_t pipe_num, uint8_t *buf, uint16_t max_len, uint16_t mps, uint16_t *out_rx)
Consume bulk-IN packets until short packet, fill, or error.
uint16_t ra8_usb_host_line_state(ra8_usb_speed_t speed)
Implementation of ra8_usb_host_line_state().
ra8_err_t ra8_usb_host_pipe_setup(ra8_usb_speed_t speed, uint8_t pipe_num, uint8_t dev_addr, uint8_t ep_num, bool device_to_host, uint16_t max_packet)
Implementation of ra8_usb_host_pipe_setup().
ra8_usb_host_bulk_lim_t
Spin bound for bulk-pipe waits (covers media access latency).
@ k_ra8_usb_bulk_poll_limit
Spins per bulk stage wait.
ra8_err_t ra8_usb_host_bulk_in(ra8_usb_speed_t speed, uint8_t pipe_num, uint8_t *buf, uint16_t max_len, uint16_t *out_received)
Implementation of ra8_usb_host_bulk_in().
static ra8_err_t internal_host_bulk_rx_packet(volatile r_usb_regs_t *reg, uint8_t pipe_num, uint8_t *dst, uint16_t room, uint16_t *out_dtln, uint16_t *out_copied)
Receive one bulk packet from an armed IN pipe into dst.
static ra8_err_t internal_host_wait_pipe(volatile const r_usb_regs_t *reg, volatile const uint16_t *sts, uint8_t pipe_num)
Spin until a pipe's W0C status bit asserts, with STALL detection.
static ra8_err_t internal_host_pipe_args_ok(uint8_t pipe_num, uint8_t dev_addr, uint8_t ep_num, uint16_t max_packet)
Validate the argument set for ra8_usb_host_pipe_setup.
ra8_err_t ra8_usb_host_set_target(ra8_usb_speed_t speed, uint8_t dev_addr)
Implementation of ra8_usb_host_set_target().
void priv_host_program_devadd(volatile r_usb_regs_t *reg, uint8_t dev_addr)
Program DEVADDn.USBSPD with the connected device's link speed.
Cross-TU surface for the ra8_usb driver split.
@ k_ra8_usb_dev_addr_max
Highest DEVADDn slot (DEVADDA).
@ k_ra8_usb_devsel_shift
DCPMAXP/PIPEMAXP DEVSEL pos.
@ k_ra8_usb_pid_stall_bit
PID[1]: set for either STALL.
@ k_ra8_usb_pipemaxp_mxps
PIPEMAXP MXPS field (the USBHS instance carries 11 bits, HUM Ch 37.2.36; FS uses the low 9).
@ k_ra8_usb_max_pipe_num
PIPE1..PIPE9 + DCP at 0.
@ k_ra8_usb_dcpmaxp_mxps
DCPMAXP MXPS (max packet) field.
@ k_ra8_usb_lnst_mask
SYSSTS0.LNST line-state field.
USB Full-Speed + High-Speed controller layout for the Renesas RA8D2.
@ k_ra8_pid_buf
BUF response (transmit/receive).
@ k_ra8_pid_nak
NAK response.
@ k_ra8_fifoctr_bclr
Buffer clear.
@ k_ra8_fifoctr_dtln
Data length (write-bytes-rem).
@ k_ra8_dcpctr_bit_sqclr
Sequence toggle clear.
@ k_ra8_pipecfg_epnum_mask
Endpoint number [3:0].
USB FS / HS register window (device-mode subset).
volatile uint16_t CFIFOCTR
+0x022 Control FIFO control.
volatile uint16_t DCPMAXP
+0x05E DCP Max Packet.
volatile uint16_t PIPECTR[k_ra8_usb_pipectr_count]
+0x070 PIPE1..9 ctrl.
volatile uint16_t PIPEPERI
+0x06E Selected pipe period.
volatile uint16_t SYSSTS0
+0x004 System Status 0.
volatile uint16_t BRDYENB
+0x036 BRDY Interrupt Enable.
volatile uint16_t PIPEMAXP
+0x06C Selected pipe max packet.
volatile uint16_t BEMPSTS
+0x04A BEMP Interrupt Status.
volatile uint16_t PIPEBUF
+0x06A Selected pipe buffer.
volatile uint16_t PIPECFG
+0x068 Selected pipe config.
volatile uint16_t NRDYSTS
+0x048 NRDY Interrupt Status.
volatile uint16_t BEMPENB
+0x03A BEMP Interrupt Enable.
volatile uint16_t PIPESEL
+0x064 Pipe window select.
volatile uint16_t BRDYSTS
+0x046 BRDY Interrupt Status.