41#include "ux_device_stack.h"
43#include "ux_utility.h"
56typedef enum : uint8_t {
65static const char*
const s_tag =
"ux_dcd_ra8_usb";
152typedef enum : uintptr_t {
162typedef enum : uint32_t {
210 *(
volatile uint32_t*)(base + ((uintptr_t)word * (uintptr_t)
k_nvic_reg_stride)) = bit;
269 bool stashed =
false;
271 if (
g_dcd.pipes[i].xfer != UX_NULL) {
278 const uintptr_t addr =
280 *(
volatile uint32_t*)addr = bit;
297typedef enum : uint8_t {
305#ifndef RA8_USB_POLLED_ONLY
358 if (_ux_system_slave == UX_NULL) {
361 UX_SLAVE_DCD*
owner = &_ux_system_slave->ux_system_slave_dcd;
362 owner->ux_slave_dcd_status = UX_DCD_STATUS_OPERATIONAL;
365 owner->ux_slave_dcd_controller_hardware = (
void*)&
g_dcd;
372 g_dcd.pipes[i].xfer =
nullptr;
375#ifndef RA8_USB_POLLED_ONLY
422 if (_ux_system_slave->ux_system_slave_speed == UX_HIGH_SPEED_DEVICE) {
423 _ux_system_slave->ux_system_slave_device_framework =
424 _ux_system_slave->ux_system_slave_device_framework_high_speed;
425 _ux_system_slave->ux_system_slave_device_framework_length =
426 _ux_system_slave->ux_system_slave_device_framework_length_high_speed;
428 _ux_system_slave->ux_system_slave_device_framework =
429 _ux_system_slave->ux_system_slave_device_framework_full_speed;
430 _ux_system_slave->ux_system_slave_device_framework_length =
431 _ux_system_slave->ux_system_slave_device_framework_length_full_speed;
434 if (_ux_system_slave->ux_system_slave_device_framework != UX_NULL) {
435 _ux_utility_descriptor_parse(_ux_system_slave->ux_system_slave_device_framework,
436 _ux_system_device_descriptor_structure,
437 UX_DEVICE_DESCRIPTOR_ENTRIES,
438 (UCHAR*)&device->ux_slave_device_descriptor);
466 UX_SLAVE_TRANSFER* tr =
467 &device->ux_slave_device_control_endpoint.ux_slave_endpoint_transfer_request;
468 tr->ux_slave_transfer_request_timeout = UX_MS_TO_TICK(UX_CONTROL_TRANSFER_TIMEOUT);
469 tr->ux_slave_transfer_request_current_data_pointer = tr->ux_slave_transfer_request_data_pointer;
470 tr->ux_slave_transfer_request_endpoint = &device->ux_slave_device_control_endpoint;
471 device->ux_slave_device_control_endpoint.ux_slave_endpoint_descriptor.wMaxPacketSize =
472 device->ux_slave_device_descriptor.bMaxPacketSize0;
473 tr->ux_slave_transfer_request_requested_length =
474 device->ux_slave_device_descriptor.bMaxPacketSize0;
475 tr->ux_slave_transfer_request_transfer_length =
476 device->ux_slave_device_descriptor.bMaxPacketSize0;
481 UX_DCD_CREATE_ENDPOINT,
482 (
void*)&device->ux_slave_device_control_endpoint);
484 device->ux_slave_device_control_endpoint.ux_slave_endpoint_state = UX_ENDPOINT_RESET;
485 tr->ux_slave_transfer_request_phase = UX_TRANSFER_PHASE_DATA_IN;
489 device->ux_slave_device_state = (
unsigned long)UX_DEVICE_ATTACHED;
533 _ux_system_slave->ux_system_slave_speed =
536 UX_SLAVE_DEVICE* device = &_ux_system_slave->ux_system_slave_device;
577 if (
g_dcd.owner !=
nullptr) {
578 g_dcd.owner->ux_slave_dcd_status = UX_DCD_STATUS_HALTED;
579 g_dcd.owner->ux_slave_dcd_function =
nullptr;
582 g_dcd.owner =
nullptr;
static const char * s_tag
Logging / check tag.
#define RA8_INTERNAL
Marker that a function is intended to be static (file-local).
Validation and Error-Checking Macros for ra8-firmware.
#define RA8_RETURN_ON_ERROR(err, tag, message)
Early return on error, propagating the code upward.
Event Link Controller (ELC) register layout for the Renesas RA8D2.
@ k_ra8_err_invalid_arg
Invalid function argument.
@ k_ra8_err_invalid_state
Module in wrong state for requested operation.
@ k_ra8_ok
Success – operation completed with all postconditions satisfied.
ra8_err_codes_t ra8_err_t
Canonical error-return type used by every ra8-firmware API.
NVIC + ICU IELSR allocator.
ra8_err_t ra8_isr_init(void)
Initialise the ra8_isr table.
ra8_err_t ra8_isr_lookup_slot(ra8_elc_event_t event, uint16_t *out_slot)
Look up the slot allocated to a registered event.
ra8_err_t ra8_isr_register(ra8_elc_event_t event, ra8_isr_handler_t handler, void *ctx, uint8_t priority, uint16_t *out_slot)
Allocate an IELSR slot for an ELC event + handler.
Lightweight Logging Interface for ra8-firmware.
#define ra8_log_info(tag, message)
RA8 log info.
ra8_err_t ra8_usb_device_init(ra8_usb_speed_t speed)
Bring up a USB controller in device mode.
ra8_err_t ra8_usb_device_deinit(ra8_usb_speed_t speed)
Tear down a USB controller and drop its MSTP reference.
void ra8_usb_attach_handler(ra8_usb_speed_t speed, ra8_usb_event_fn_t fn, void *ctx)
Install (or detach) the per-controller USB event handler.
ra8_usb_speed_t
Selects which controller instance the call targets.
@ k_ra8_usb_speed_hs
High-Speed controller (USBHS @ 0x40351000).
@ k_ra8_usb_speed_fs
Full-Speed controller (USBFS @ 0x40250000).
USB Full-Speed + High-Speed controller layout for the Renesas RA8D2.
static volatile uint16_t * ra8_usbhs_lpsts(void)
Get pointer to USBHS LPSTS register.
static volatile r_usb_regs_t * ra8_usb_hs(void)
Get pointer to the USB HS controller register block.
unsigned int UINT
ThreadX-compatible unsigned int (host stub).
volatile uint16_t SYSCFG
+0x000 System Configuration.
Externally-readable diagnostic counters for OUT-pipe stall debug.
static void internal_init_parse_framework(UX_SLAVE_DEVICE *device)
Select the active device-framework pair and parse the descriptor.
void ux_dcd_ra8_usb_irq_reenable(void)
Storm-guard recovery: zero the run counter and re-enable the USB IRQ.
ra8_usb_dcd_state_t ux_dcd_ra8_usb_state(void)
Ux dcd ra usb state.
ra8_usb_dcd_isr_prio_t
NVIC priority chosen for the USB controller IRQs.
@ k_ra8_usb_dcd_isr_prio
RA8 USB dcd ISR prio.
static uint16_t s_usb_irq_slot
NVIC slot the USB controller's ELC event is routed to.
static void internal_init_setup_ep0(UX_SLAVE_DEVICE *device, UX_SLAVE_DCD *owner)
Bind the EP0 transfer-request endpoint and run CREATE_ENDPOINT.
volatile uint16_t g_syscfg_after_dcd_init
SYSCFG snapshot at end of ux_dcd_ra8_usb_initialize.
static void internal_usbfs_storm_guard_init(ra8_usb_speed_t speed)
Resolve the USB controller's NVIC slot for the storm guard.
ra8_nvic_reg_t
Cortex-M NVIC set/clear-enable register array base addresses.
@ k_nvic_ispr_base
NVIC Interrupt Set-Pending Register array.
@ k_nvic_icer_base
NVIC Interrupt Clear-Enable Register array.
@ k_nvic_iser_base
NVIC Interrupt Set-Enable Register array.
volatile uint16_t g_lpsts_after_dcd_init
LPSTS snapshot at end of ux_dcd_ra8_usb_initialize.
void priv_usbfs_irq_mask(void)
Mask the USB IRQ at the NVIC to break an interrupt storm.
ra8_usb_dcd_ctrl_id_t
Private USBX controller-type id reported by this DCD bridge.
@ k_ra8_usb_dcd_controller_id
RA-USB private controller id.
void ux_dcd_ra8_usb_auto_echo_enable(uint8_t out_pipe, uint8_t in_pipe)
Enable bridge-side auto-echo on the configured pipe pair.
static ra8_err_t internal_init_bind_owner(ra8_usb_speed_t speed)
Bind _ux_system_slave->ux_system_slave_dcd to this bridge.
ra8_err_t ux_dcd_ra8_usb_initialize(ra8_usb_speed_t speed)
Bring up the USBX DCD bridge for the selected RA8 USB controller.
static void internal_usbfs_irq_set_enabled(bool enabled)
Set or clear the USB controller's NVIC enable bit.
ra8_nvic_layout_t
Bit layout of the NVIC ISER/ICER register array.
@ k_nvic_irqs_per_reg
IRQ lines covered by one ISER/ICER word.
@ k_nvic_reg_stride
Byte stride between consecutive ISER/ICER words.
ra8_err_t ux_dcd_ra8_usb_uninitialize(void)
Ux dcd ra usb uninitialize.
USBX device-controller-driver (DCD) bridge to ra8_usb.
@ k_ux_dcd_ra8_usb_max_pipes
DCP + 9 PIPE entries (HUM 36.1).
unsigned int _ux_dcd_ra8_usb_function(struct UX_SLAVE_DCD_STRUCT *dcd, unsigned int function, void *parameter)
ux dcd ra usb function.
ra8_usb_dcd_state_t
Run-state of the DCD bridge.
@ k_ux_dcd_ra8_usb_state_ready
Bridge installed; bus idle.
@ k_ux_dcd_ra8_usb_state_uninit
Bridge not yet initialized.
USBX device-controller-driver bridge to ra8_usb – per-module cross-translation-unit contract.
volatile uint32_t g_dcd_auto_echo_enable
Non-zero once ISR-side auto-echo is armed.
uint8_t g_dcd_auto_echo_out_pipe
Pipe drained by the in-ISR auto-echo path.
uint8_t g_dcd_auto_echo_in_pipe
Pipe the auto-echo path re-queues onto.
ra8_usb_dcd_t g_dcd
The single bridge instance, defined in ux_dcd_ra8_usb.c.
ra8_elc_event_t priv_pick_event(ra8_usb_speed_t speed)
Pick the ELC event number for a controller.
ra8_usb_dcd_diag_t g_diag
Bridge diagnostic counter block, defined in ux_dcd_ra8_usb.c.
ra8_isr_handler_t priv_pick_isr(ra8_usb_speed_t speed)
Pick the ISR trampoline for a controller.
void priv_event_cb(void *ctx, ra8_usb_speed_t speed, uint16_t status_mask)
ra8_usb_attach_handler trampoline into ux_dcd_ra8_usb_irq.
volatile uint32_t g_isr_spurious_run
Consecutive event-less ISR entries since the last SysTick re-enable.