ra8-firmware 0.1.0
Bare-metal firmware for the Renesas RA8 family (RA8D2 / RA8P1)
Loading...
Searching...
No Matches
main.c
Go to the documentation of this file.
1
51
52#include <stdint.h>
53#include <string.h>
54
55#include "ra8_board_ek_ra8d2.h"
56#include "ra8_boot_entry.h"
57#include "ra8_cgc.h"
58#include "ra8_err.h"
59#include "ra8_gpio_constants.h"
60#include "ra8_isr.h"
61#include "ra8_port_constants.h"
62#include "ra8_port_utils.h"
63#include "ra8_time.h"
64#include "ra8_usb.h"
66
67#ifndef RA8_OFF_TARGET
68#include "tx_api.h"
69#include "ux_api.h"
70#include "ux_dcd_ra8_usb.h"
71#include "ux_device_class_hid.h"
72#include "ux_device_stack.h"
73
74/* Strong SysTick override: route the tick into BOTH the ra8_time millisecond
75 * counter (for ra8_delay_ms and the polled host stack's timeouts) AND
76 * ThreadX's timer; the 1 ms pulse also recovers the DCD's storm-guard mask. */
77
78extern void _tx_timer_interrupt(void);
79
89static volatile bool s_tx_kernel_up = false;
90
91void SysTick_Handler(void);
100#endif
101
102/* -------------------------------------------------------------------------- */
103/* Pinout (FSP-aligned, EK-RA8D2 v1 User's Manual) */
104/* -------------------------------------------------------------------------- */
105
108
111
114
117
120
123
124/* -------------------------------------------------------------------------- */
125/* Tunables */
126/* -------------------------------------------------------------------------- */
127
128/*
129 * The compile-time setting enums shared across the three translation units --
130 * ::hid_config_t, ::hid_hex_t, ::hid_geom_t -- live in
131 * `usb_selftest_hid_steps.h`. The host-only enums ::hid_phase_t,
132 * ::hid_usb_req_t, and ::hid_enum_tune_t are private to the host cluster in
133 * `src/usb_selftest_hid_host.c`; the console-only ::hid_mask_t is private to
134 * `src/usb_selftest_hid_console.c`. Only the device-progress enum below stays
135 * in this unit.
136 */
137
149
150#ifndef RA8_OFF_TARGET
151
152/* -------------------------------------------------------------------------- */
153/* ThreadX workers + USBX pool storage */
154/* -------------------------------------------------------------------------- */
155
163
170
178
185
192
199static UX_SLAVE_CLASS_HID* s_hid_class = UX_NULL;
200
209static TX_SEMAPHORE s_hid_active_sem;
210
211/* -------------------------------------------------------------------------- */
212/* J-Link probes (device side; host-side probes live in the host cluster) */
213/* -------------------------------------------------------------------------- */
214
216static volatile uint32_t s_dbg_dev_sent;
218static volatile uint32_t s_dbg_dev_step;
220static volatile uint32_t s_dbg_dev_err;
221
222/* -------------------------------------------------------------------------- */
223/* HID Report Descriptor (vendor-defined, one 8-byte input report) */
224/* -------------------------------------------------------------------------- */
225
226/* A minimal vendor-defined collection with a single 8-byte input report
227 * (Report Size 8 bits x Report Count 8). 21 bytes total. The host does not
228 * parse this -- it only needs the device to expose an interrupt-IN report
229 * of a known width -- but a real HID device must publish a report
230 * descriptor, so the enumeration is genuinely HID-class. */
231static UCHAR s_report_descriptor[] = {
232 0x06U, 0x00U, 0xFFU, /* Usage Page (Vendor Defined 0xFF00) */
233 0x09U, 0x01U, /* Usage (0x01) */
234 0xA1U, 0x01U, /* Collection (Application) */
235 0x09U, 0x01U, /* Usage (0x01) */
236 0x15U, 0x00U, /* Logical Minimum (0) */
237 0x26U, 0xFFU, 0x00U, /* Logical Maximum (255) */
238 0x75U, 0x08U, /* Report Size (8 bits) */
239 0x95U, 0x08U, /* Report Count (8) */
240 0x81U, 0x02U, /* Input (Data,Var,Abs) */
241 0xC0U, /* End Collection */
242};
243
244/* -------------------------------------------------------------------------- */
245/* USB descriptors (HID: one interface, one interrupt-IN endpoint) */
246/* -------------------------------------------------------------------------- */
247
248/* HID config: one HID interface (class 0x03, no boot subclass), one
249 * interrupt-IN endpoint EP1 IN (64-byte MPS), no OUT endpoint. Total config
250 * blob = 9 (config) + 9 (interface) + 9 (HID class) + 7 (EP IN) = 34 = 0x22.
251 * Layout per USB 2.0 sec 9.6 + HID 1.11 sec 6.2.1. PID 0x0018 marks the HID
252 * self-test identity. */
253static UCHAR s_device_framework_fs[] = {
254 /* Device descriptor (USB 2.0 sec 9.6.1) -- 18 bytes. */
255 0x12U,
256 0x01U,
257 0x00U,
258 0x02U,
259 0x00U,
260 0x00U,
261 0x00U,
262 0x40U,
263 0x09U,
264 0x12U,
265 0x18U, /* PID = 0x0018 (pid.codes test). */
266 0x00U,
267 0x00U,
268 0x01U,
269 0x01U,
270 0x02U,
271 0x03U,
272 0x01U,
273 /* Configuration descriptor (34 bytes total = 0x22). */
274 0x09U,
275 0x02U,
276 0x22U,
277 0x00U,
278 0x01U,
279 0x01U,
280 0x00U,
281 0x80U,
282 0x32U,
283 /* Interface descriptor -- HID, no boot subclass, no protocol. */
284 0x09U,
285 0x04U,
286 0x00U,
287 0x00U,
288 0x01U,
289 0x03U,
290 0x00U,
291 0x00U,
292 0x00U,
293 /* HID class descriptor (HID 1.11 sec 6.2.1) -- 9 bytes. bcdHID 0x0111,
294 one report descriptor of sizeof(s_report_descriptor) = 21 (0x15). */
295 0x09U,
296 0x21U,
297 0x11U,
298 0x01U,
299 0x00U,
300 0x01U,
301 0x22U,
302 0x15U,
303 0x00U,
304 /* Interrupt-IN endpoint (EP1 IN, 64-byte MPS, 1 ms poll). */
305 0x07U,
306 0x05U,
307 0x81U,
308 0x03U,
309 0x40U,
310 0x00U,
311 0x01U,
312};
313
321static UCHAR s_string_framework[] = {
322 /* idx 1: "Brighton Sikarskie". */
323 0x09U,
324 0x04U,
325 0x01U,
326 0x12U,
327 'B',
328 'r',
329 'i',
330 'g',
331 'h',
332 't',
333 'o',
334 'n',
335 ' ',
336 'S',
337 'i',
338 'k',
339 'a',
340 'r',
341 's',
342 'k',
343 'i',
344 'e',
345 /* idx 2: "RA8D2 HID TEST". */
346 0x09U,
347 0x04U,
348 0x02U,
349 0x0EU,
350 'R',
351 'A',
352 '8',
353 'D',
354 '2',
355 ' ',
356 'H',
357 'I',
358 'D',
359 ' ',
360 'T',
361 'E',
362 'S',
363 'T',
364 /* idx 3: serial. */
365 0x09U,
366 0x04U,
367 0x03U,
368 0x08U,
369 '0',
370 '0',
371 '0',
372 '0',
373 '0',
374 '0',
375 '1',
376 '3',
377};
378
379/* USBX LANGID descriptor 0x0409 (English-US), little-endian byte pair. */
380typedef enum : uint8_t {
384
391
392/* -------------------------------------------------------------------------- */
393/* Shared HID report pattern */
394/* -------------------------------------------------------------------------- */
395
397void hid_fill_report_body(uint8_t* out, uint32_t len)
398{
399 for (uint32_t i = (uint32_t)k_hid_body_idx; i < len; i++) {
400 const uint32_t v = (i * (uint32_t)k_hid_pat_idx_mul) + (uint32_t)k_hid_pat_bias;
401 out[i] = (uint8_t)(v & (uint32_t)k_hid_byte_mask);
402 }
403}
404
405/* -------------------------------------------------------------------------- */
406/* HID activate / deactivate callbacks */
407/* -------------------------------------------------------------------------- */
408
427static VOID hid_activate(VOID* hid_instance)
428{
429 s_hid_class = (UX_SLAVE_CLASS_HID*)hid_instance;
430 if (_ux_system_slave != UX_NULL) {
431 _ux_system_slave->ux_system_slave_device.ux_slave_device_state =
432 (unsigned long)UX_DEVICE_CONFIGURED;
433 }
434 (void)tx_semaphore_put(&s_hid_active_sem);
435}
436
450static VOID hid_deactivate(VOID* hid_instance)
451{
452 (void)hid_instance;
453 s_hid_class = UX_NULL;
454}
455
456/* -------------------------------------------------------------------------- */
457/* Device side: USBX HID interrupt-IN reports */
458/* -------------------------------------------------------------------------- */
459
477{
478 if (_ux_system_initialize(s_usbx_pool, k_hid_usbx_pool_bytes, UX_NULL, 0) != UX_SUCCESS) {
479 return UX_ERROR;
480 }
481 return _ux_device_stack_initialize((UCHAR*)UX_NULL,
482 0,
484 sizeof(s_device_framework_fs),
486 sizeof(s_string_framework),
489 UX_NULL);
490}
491
513static UINT hid_get_callback(UX_SLAVE_CLASS_HID* hid, UX_SLAVE_CLASS_HID_EVENT* hid_event)
514{
515 (void)hid;
516 hid_event->ux_device_class_hid_event_length = (ULONG)k_hid_report_len;
517 hid_event->ux_device_class_hid_event_report_id = 0UL;
518 hid_event->ux_device_class_hid_event_report_type = (ULONG)UX_DEVICE_CLASS_HID_REPORT_TYPE_INPUT;
519 hid_fill_report_body(hid_event->ux_device_class_hid_event_buffer, (uint32_t)k_hid_report_len);
520 hid_event->ux_device_class_hid_event_buffer[k_hid_seq_idx] = 0U;
521 return UX_SUCCESS;
522}
523
543{
544 UX_SLAVE_CLASS_HID_PARAMETER hid_params = {
545 .ux_slave_class_hid_instance_activate = hid_activate,
546 .ux_slave_class_hid_instance_deactivate = hid_deactivate,
547 .ux_device_class_hid_parameter_report_address = s_report_descriptor,
548 .ux_device_class_hid_parameter_report_id = 0UL,
549 .ux_device_class_hid_parameter_report_length = (ULONG)sizeof(s_report_descriptor),
550 .ux_device_class_hid_parameter_callback = UX_NULL,
551 .ux_device_class_hid_parameter_get_callback = hid_get_callback,
552 };
553 static UCHAR s_class_name[] = "ux_slave_class_hid";
554
555 return _ux_device_stack_class_register(s_class_name,
556 _ux_device_class_hid_entry,
557 1,
558 0,
559 &hid_params);
560}
561
581static void hid_send_iter(uint32_t* seq)
582{
583 if (_ux_system_slave != UX_NULL) {
584 _ux_system_slave->ux_system_slave_device.ux_slave_device_state =
585 (unsigned long)UX_DEVICE_CONFIGURED;
586 }
587 UX_SLAVE_CLASS_HID_EVENT ev;
588 (void)memset(&ev, 0, sizeof(ev));
589 ev.ux_device_class_hid_event_length = (ULONG)k_hid_report_len;
590 ev.ux_device_class_hid_event_report_id = 0UL;
591 ev.ux_device_class_hid_event_report_type = (ULONG)UX_DEVICE_CLASS_HID_REPORT_TYPE_INPUT;
592 hid_fill_report_body(ev.ux_device_class_hid_event_buffer, (uint32_t)k_hid_report_len);
593 ev.ux_device_class_hid_event_buffer[k_hid_seq_idx] = (UCHAR)(*seq & (uint32_t)k_hid_byte_mask);
594 if (_ux_device_class_hid_event_set(s_hid_class, &ev) == UX_SUCCESS) {
595 (*seq)++;
598 }
599 tx_thread_sleep(1U);
600}
601
620static VOID hid_device_worker(ULONG arg)
621{
622 (void)arg;
623
624 UINT ux = hid_usbx_stack_up();
625 if (ux != UX_SUCCESS) {
626 s_dbg_dev_err = (uint32_t)ux;
627 return;
628 }
630 ux = hid_class_register();
631 if (ux != UX_SUCCESS) {
632 s_dbg_dev_err = (uint32_t)ux;
633 return;
634 }
637 if (e != k_ra8_ok) {
638 s_dbg_dev_err = (uint32_t)e;
639 return;
640 }
643 if (e != k_ra8_ok) {
644 s_dbg_dev_err = (uint32_t)e;
645 return;
646 }
648
649 uint32_t seq = 0U;
650 while (1) {
651 if (s_hid_class == UX_NULL) {
652 (void)tx_semaphore_get(&s_hid_active_sem, TX_WAIT_FOREVER);
653 continue;
654 }
656 hid_send_iter(&seq);
657 }
658}
659
677VOID tx_application_define(VOID* first_unused_memory)
678{
679 static CHAR s_semaphore_name[] = "hid_active";
680 static CHAR s_device_thread_name[] = "hid_device";
681 static CHAR s_host_thread_name[] = "hid_host";
682
683 (void)first_unused_memory;
684 s_tx_kernel_up = true;
685 (void)tx_semaphore_create(&s_hid_active_sem, s_semaphore_name, 0U);
689 0UL,
699 0UL,
706}
707#endif /* !RA8_OFF_TARGET */
708
709/* -------------------------------------------------------------------------- */
710/* Startup */
711/* -------------------------------------------------------------------------- */
712
726static void hid_panic_halt(void)
727{
728 while (1) {
729 __asm__ volatile("wfi");
730 }
731}
732
773
788static void hid_setup_or_halt(void)
789{
790 uint32_t cpuclk0_hz = 0U;
791 if (ra8_cgc_init() != k_ra8_ok) {
793 }
796 }
799 }
802 }
803 if (ra8_time_init(cpuclk0_hz) != k_ra8_ok) {
805 }
808 }
811 }
814 }
816}
817
832void main(void)
833{
835
837
838#ifndef RA8_OFF_TARGET
839 tx_kernel_enter();
840#endif
841
843}
void main(void)
Secure fallback main entry point.
Definition main.c:37
void tx_application_define(void *first_unused_memory)
ThreadX system-define hook: build worker thread + byte pool.
Definition main.c:942
void _tx_timer_interrupt(void)
void SysTick_Handler(void)
SysTick exception handler – tail-calls the ThreadX timer.
Definition main.c:146
static volatile bool s_tx_kernel_up
Set in tx_application_define; gates ThreadX tick delivery.
Definition main.c:86
static UCHAR s_host_stack[k_wlun_host_stack]
Stack backing storage for s_host_thread.
Definition main.c:186
static TX_THREAD s_device_thread
ThreadX TCB for the USBX device-side worker thread.
Definition main.c:164
static UCHAR s_string_framework[]
USBX string descriptor table (vendor / product / serial).
Definition main.c:299
static UCHAR s_usbx_pool[k_wlun_usbx_pool_bytes]
USBX memory pool (USBX uses tx_byte_pool internally).
Definition main.c:193
usb_langid_byte_t
Definition main.c:358
@ k_usb_langid_en_us_lo
LANGID 0x0409 low byte.
Definition main.c:359
@ k_usb_langid_en_us_hi
LANGID 0x0409 high byte.
Definition main.c:360
static CHAR s_host_thread_name[]
Definition main.c:202
static TX_THREAD s_host_thread
ThreadX TCB for the host-side worker thread.
Definition main.c:179
static UCHAR s_device_framework_fs[]
Definition main.c:234
static UCHAR s_language_id_framework[]
USBX language-id table – US English.
Definition main.c:368
static UCHAR s_device_stack[k_wlun_thread_stack]
Stack backing storage for s_device_thread.
Definition main.c:171
static volatile uint32_t s_dbg_dev_step
Device worker progress: 1 stack, 2 class, 3 dcd, 4 attach, 5 parked.
Definition main.c:219
static volatile uint32_t s_dbg_dev_err
Device worker first failing return code (0 = none).
Definition main.c:221
static CHAR s_device_thread_name[]
Definition main.c:201
static void hid_route_usb_or_halt(void)
Route both ports' pins: FS as device, HS as host.
Definition main.c:766
static void hid_setup_or_halt(void)
Bring CGC + both USB clocks + SysTick + SCI8 + LEDs + pins up.
Definition main.c:805
static const ra8_port_pin_t k_hid_pin_hs_vbus
USBHS_VBUS sense pin (P4_08, PSEL = 0x14).
Definition main.c:108
static void hid_panic_halt(void)
Halt forever in WFI – panic stop on init failure.
Definition main.c:743
static const ra8_port_pin_t k_hid_pin_fs_dm
USBFS D- (P8_15).
Definition main.c:105
static const ra8_port_pin_t k_hid_pin_fs_vbusen
USBFS VBUSEN (P5_00) – GPIO LOW for the device role.
Definition main.c:99
static const ra8_port_pin_t k_hid_pin_fs_dp
USBFS D+ (P8_14).
Definition main.c:102
static VOID hid_host_worker(ULONG arg)
Host-side worker: retry the full pass until it succeeds.
Definition main.c:669
static const ra8_port_pin_t k_hid_pin_hs_pwr
J7 host-power switch (PD07): HIGH = U18 supplies VBUS (UM 6.2).
Definition main.c:111
static const ra8_port_pin_t k_hid_pin_fs_vbus
USBFS VBUS sense pin (P4_07, PSEL = 0x13).
Definition main.c:96
static VOID hid_activate(VOID *hid_instance)
HID activate callback.
Definition main.c:427
static UINT hid_class_register(void)
Register the HID class against configuration 1, interface 0.
Definition main.c:542
static VOID hid_deactivate(VOID *hid_instance)
HID deactivate callback.
Definition main.c:450
static UINT hid_usbx_stack_up(void)
Bring USBX system + device stack up with the HID framework.
Definition main.c:476
static TX_SEMAPHORE s_hid_active_sem
Posted by the activate callback so the send worker blocks on it instead of polling s_hid_class with t...
Definition main.c:209
static void hid_send_iter(uint32_t *seq)
One device send iteration: queue a fresh input report.
Definition main.c:581
static VOID hid_device_worker(ULONG arg)
Device-side worker: bring the HID device up, then send reports.
Definition main.c:620
static UINT hid_get_callback(UX_SLAVE_CLASS_HID *hid, UX_SLAVE_CLASS_HID_EVENT *hid_event)
HID GET_REPORT control-pipe callback: hand back a neutral report.
Definition main.c:513
Board-support layer for the Renesas EK-RA8D2 v1 evaluation kit.
ra8_err_t ra8_board_led_toggle(ra8_board_led_id_t led)
Toggle led's output state.
ra8_err_t ra8_board_led_init(ra8_board_led_id_t led)
Configure led as a digital output, initial level low (off).
@ k_ra8_board_led2
LED2, GREEN, P303 (jumper E26).
@ k_ra8_board_led1
LED1, BLUE, P600 (jumper E27).
ra8_err_t ra8_board_io_expander_set_usbhs_host_mode(void)
Drive the U15 I/O expander to select USB-HS HOST mode.
ra8_err_t ra8_board_uart_console_init(uint32_t baud)
Configure SCI8 + PD02/PD03 as the debug-console UART.
@ k_ra8_board_usbhs_pin_pwr
PD07 J7 host-power switch (HIGH = U18 drives 5 V VBUS).
@ k_ra8_board_usbhs_pin_vbus
P4_08 USBHS_VBUS sense.
@ k_ra8_board_usbfs_pin_dm
P8_15 D-.
@ k_ra8_board_usbfs_pin_vbusen
P5_00 VBUSEN GPIO.
@ k_ra8_board_usbfs_pin_vbus
P4_07 VBUS sense.
@ k_ra8_board_usbfs_pin_dp
P8_14 D+.
Boot entry points shared between a vector table and its startup code.
High-level Clock Generation Circuit driver.
ra8_err_t ra8_cgc_get_clock_hz(ra8_clock_id_t id, uint32_t *out_hz)
Query the current frequency of a clock-tree domain.
Definition ra8_cgc.c:132
@ k_ra8_clock_id_cpuclk0
Cortex-M85 CPUCLK0.
Definition ra8_cgc.h:70
ra8_err_t ra8_cgc_init(void)
Configure the clock tree to a safe default.
Definition ra8_cgc.c:727
ra8_err_t ra8_cgc_usbfs_clock_enable(void)
Bring up the USB-FS module clock (USBCKCR / USBCKDIVCR).
ra8_err_t ra8_cgc_usbhs_pll_enable(void)
Bring up the USBHS PHY reference clock + module clock.
Error Code Definitions for ra8-firmware.
@ k_ra8_ok
Success – operation completed with all postconditions satisfied.
Definition ra8_err.h:119
ra8_err_codes_t ra8_err_t
Canonical error-return type used by every ra8-firmware API.
Definition ra8_err.h:546
void * memset(void *dst, int value, size_t n)
Fill memory with a constant byte value.
PSEL codes for peripheral pin routing on the RA8D2.
@ k_ra8_psel_usb_fs
10011b: USB Full-Speed.
@ k_ra8_psel_usb_hs
10100b: USB High-Speed (e.g.
NVIC + ICU IELSR allocator.
void ra8_isr_globals_enable(void)
Globally enable maskable interrupts (PRIMASK = 0).
Definition ra8_isr.c:439
Typed Port / Pin Constants for the RA8D2 IOPORT Module.
ra8_port_pin_t
Packed (port << 8) | pin pin identifier.
@ k_ra8_level_high
Drive or read 1.
@ k_ra8_level_low
Drive or read 0.
High-level GPIO helpers on top of the PORT + PFS register layer.
ra8_err_t ra8_gpio_output_init(ra8_port_pin_t pin, ra8_level_t init_level)
Configure a pin as a digital output and drive it to an initial level.
Definition gpio.c:88
ra8_err_t ra8_pfs_route_peripheral(ra8_port_pin_t pin, ra8_psel_t psel, const char *owner)
Route a pin to a non-IRQ peripheral function via PFS.PSEL.
Definition gpio.c:238
void ux_dcd_ra8_usb_irq_reenable(void)
Storm-guard recovery: zero the run counter and re-enable the USB IRQ.
SysTick-based tick counter, delay and timestamp helpers.
ra8_err_t ra8_time_init(uint32_t cpu_hz)
Initialise SysTick for a 1 kHz tick interrupt.
Definition ra8_time.c:59
void ra8_time_on_tick(void)
SysTick IRQ handler – called from the vector table.
Definition ra8_time.c:170
Native USB controller driver public API (device + host modes).
ra8_err_t ra8_usb_device_attach(ra8_usb_speed_t speed, bool attached)
Raise / drop the D+ pull-up to advertise the device to the host.
@ k_ra8_usb_speed_fs
Full-Speed controller (USBFS @ 0x40250000).
unsigned int UINT
ThreadX-compatible unsigned int (host stub).
#define tx_thread_create
#define tx_thread_sleep
#define TX_NO_TIME_SLICE
char CHAR
ThreadX-compatible CHAR (host stub).
#define TX_AUTO_START
#define TX_WAIT_FOREVER
unsigned long ULONG
ThreadX-compatible unsigned long (host stub).
Opaque thread stand-in for the host build.
hid_dev_step_t
J-Link probe values marking device-worker bring-up progress.
@ k_hid_dev_step_stack
USBX system + device stack up.
@ k_hid_dev_step_dcd
DCD bridge initialized.
@ k_hid_dev_step_send
Report-send loop running.
@ k_hid_dev_step_attach
Device attached (DPRPU).
@ k_hid_dev_step_class
HID class registered.
static VOID hid_activate(VOID *hid_instance)
HID activate callback.
static VOID hid_deactivate(VOID *hid_instance)
HID deactivate callback.
static UCHAR s_report_descriptor[]
static volatile uint32_t s_dbg_dev_sent
Device-side report-queue successes (one hid_event_set each).
static UINT hid_get_callback(UX_SLAVE_CLASS_HID *hid, UX_SLAVE_CLASS_HID_EVENT *hid_event)
HID GET_REPORT control-pipe callback: hand back a neutral report.
static UX_SLAVE_CLASS_HID * s_hid_class
Active HID class instance, captured by the activate callback.
VOID hid_device_worker(ULONG arg)
Device-side worker: bring the HID device up, then send reports.
void hid_fill_report_body(uint8_t *out, uint32_t len)
Fill the fixed body of a HID report (bytes 1..len-1).
@ k_hid_report_len
Vendor input report width (bytes).
@ k_hid_pat_bias
Pattern constant bias.
@ k_hid_pat_idx_mul
Per-index pattern multiplier.
@ k_hid_body_idx
Report body starts at byte 1.
@ k_hid_byte_mask
Byte mask.
@ k_hid_seq_idx
Report byte 0: modifier / rolling seq.
@ k_hid_thread_stack
Device worker stack (bytes).
@ k_hid_usbx_pool_bytes
USBX memory pool (bytes).
@ k_hid_host_stack
Host worker stack (bytes).
@ k_hid_host_priority
Host worker priority (below USBX).
@ k_hid_baud
J-Link OB CDC log baud.
@ k_hid_dev_priority
Device bring-up worker priority.
Shared contract for the USB HID self-loop console + host clusters.
USBX device-controller-driver (DCD) bridge to ra8_usb.
ra8_err_t ux_dcd_ra8_usb_initialize(ra8_usb_speed_t speed)
Register the ra8_usb bridge as the active USBX DCD.