|
ra8-firmware 0.1.0
Bare-metal firmware for the Renesas RA8 family (RA8D2 / RA8P1)
|
USB self-loop config A: HS host reads the FS device's MSC MRAM disk. More...
#include <stdint.h>#include <string.h>#include "ra8_board_ek_ra8d2.h"#include "ra8_boot_entry.h"#include "ra8_cgc.h"#include "ra8_err.h"#include "ra8_fs.h"#include "ra8_gpio_constants.h"#include "ra8_isr.h"#include "ra8_port_constants.h"#include "ra8_port_utils.h"#include "ra8_time.h"#include "ra8_usb.h"#include "ra8_usb_hmsc.h"#include "usb_selftest_hs_host_steps.h"#include "tx_api.h"#include "ux_api.h"#include "ux_dcd_ra8_usb.h"#include "ux_device_class_storage.h"#include "ux_device_stack.h"Go to the source code of this file.
Enumerations | |
| enum | usb_langid_byte_t : uint8_t { k_usb_langid_en_us_lo = 0x09U , k_usb_langid_en_us_hi = 0x04U } |
Functions | |
| void | _tx_timer_interrupt (void) |
| void | SysTick_Handler (void) |
| Service the SysTick exception selected by the linked application. | |
| static UINT | selftest_usbx_stack_up (void) |
| Brings USBX system + FS device stack up. | |
| static UINT | selftest_msc_class_register (void) |
| Registers the Mass-Storage class with the read-only MRAM LUN. | |
| static VOID | selftest_device_worker (ULONG arg) |
| Device-side worker: bring the FS device stack up, then park. | |
| static VOID | selftest_host_worker (ULONG arg) |
| Host-side worker: retry the full pass until it succeeds. | |
| VOID | tx_application_define (VOID *first_unused_memory) |
| ThreadX application-define hook. | |
| static void | selftest_panic_halt (void) |
| Halt forever in WFI – panic stop on init failure. | |
| static void | selftest_route_usb_or_halt (void) |
| Route both ports' pins: FS as device, HS as host. | |
| static void | selftest_setup_or_halt (void) |
| Bring CGC + both USB clocks + SysTick + SCI8 + LEDs + pins up. | |
| void | main (void) |
| Application entry: bring the board up, then hand off to ThreadX. | |
Variables | |
| static volatile bool | s_tx_kernel_up = false |
| Set in tx_application_define; gates ThreadX tick delivery. | |
| static const ra8_port_pin_t | k_selftest_pin_fs_vbus = (ra8_port_pin_t)k_ra8_board_usbfs_pin_vbus |
| USBFS VBUS sense pin (P4_07, PSEL = 0x13). | |
| static const ra8_port_pin_t | k_selftest_pin_fs_vbusen = (ra8_port_pin_t)k_ra8_board_usbfs_pin_vbusen |
| USBFS VBUSEN (P5_00) – GPIO LOW for the device role. | |
| static const ra8_port_pin_t | k_selftest_pin_fs_dp = (ra8_port_pin_t)k_ra8_board_usbfs_pin_dp |
| USBFS D+ (P8_14). | |
| static const ra8_port_pin_t | k_selftest_pin_fs_dm = (ra8_port_pin_t)k_ra8_board_usbfs_pin_dm |
| USBFS D- (P8_15). | |
| static const ra8_port_pin_t | k_selftest_pin_hs_vbus = (ra8_port_pin_t)k_ra8_board_usbhs_pin_vbus |
| USBHS_VBUS sense pin (P4_08, PSEL = 0x14). | |
| static const ra8_port_pin_t | k_selftest_pin_hs_pwr = (ra8_port_pin_t)k_ra8_board_usbhs_pin_pwr |
| J7 host-power switch (PD07): HIGH = U18 supplies VBUS (UM 6.2). | |
| static TX_THREAD | s_device_thread |
| ThreadX TCB for the USBX device-side worker thread. | |
| static UCHAR | s_device_stack [k_selftest_thread_stack] |
| Stack backing storage for s_device_thread. | |
| static TX_THREAD | s_host_thread |
| ThreadX TCB for the polled host-side worker thread. | |
| static UCHAR | s_host_stack [k_selftest_host_stack] |
| Stack backing storage for s_host_thread (ra8_fs walks live here). | |
| static UCHAR | s_usbx_pool [k_selftest_usbx_pool_bytes] |
| USBX memory pool (USBX uses tx_byte_pool internally). | |
| static UCHAR | s_msc_vendor_id [] = "RA8D2 " |
| static UCHAR | s_msc_product_id [] = "SELFTEST MRAM RO" |
| static UCHAR | s_msc_product_rev [] = "0001" |
| static UCHAR | s_device_framework_fs [] |
| static UCHAR | s_string_framework [] |
| USBX string descriptor table (vendor / product / serial). | |
| static UCHAR | s_language_id_framework [] = {k_usb_langid_en_us_lo, k_usb_langid_en_us_hi} |
| USBX language-id table – US English. | |
USB self-loop config A: HS host reads the FS device's MSC MRAM disk.
The board's two USB ports are cabled to EACH OTHER and one firmware image runs BOTH sides of the link:
The link itself runs at 12 Mbps: the FS device is the ceiling, and the HS host's root port serves a full-speed downstream device (RHST = FS) – coverage the Mac-attached ladders never exercised.
Verdicts stream over SCI8 (J-Link OB CDC console, 115200) and are mirrored in J-Link-readable probes (s_dbg_*).
FS device: P4_07 VBUS sense, P5_00 VBUSEN as GPIO LOW (device role), P8_14 D+, P8_15 D- (PSEL usb_fs). HS host: SW4-8 to Host via the U15 expander, PD07 HIGH (U18 supplies J7 VBUS), P4_08 USBHS_VBUS (PSEL usb_hs). Console: PD_02/PD_03 SCI8 (PSEL sci_async).
Definition in file main.c.
| enum usb_langid_byte_t : uint8_t |
|
extern |
| void main | ( | void | ) |
Application entry: bring the board up, then hand off to ThreadX.
The application entry point Reset_Handler hands control to.
Both USB controllers' clocks and pins come up before the kernel so the two workers only deal with stack bring-up.
Definition at line 653 of file main.c.
References ra8_isr_globals_enable(), selftest_panic_halt(), and selftest_setup_or_halt().
|
static |
Device-side worker: bring the FS device stack up, then park.
USBX system + device stack + MSC class + DCD bridge on the USBFS controller, then DPRPU attach. USBX runs the SCSI/BBB state machine on its own class threads after this.
| [in] | arg | ThreadX entry argument (unused). |
Definition at line 420 of file main.c.
References k_ra8_ok, k_ra8_usb_speed_fs, k_selftest_idle_ticks, ra8_usb_device_attach(), selftest_msc_class_register(), selftest_usbx_stack_up(), tx_thread_sleep, and ux_dcd_ra8_usb_initialize().
|
static |
Host-side worker: retry the full pass until it succeeds.
Waits for the device side to attach, then loops selftest_host_pass with a retry pause until the whole config A ladder passes; afterwards parks so the verdict stays on the wire.
| [in] | arg | ThreadX entry argument (unused). |
Definition at line 461 of file main.c.
References k_ra8_ok, k_selftest_boot_wait_ticks, k_selftest_idle_ticks, k_selftest_retry_ticks, selftest_host_pass(), and tx_thread_sleep.
|
static |
Registers the Mass-Storage class with the read-only MRAM LUN.
Single LUN, write-protected, FAT16 geometry from selftest_fat_geom_t, media callbacks above.
| UX_SUCCESS | Class registered. |
Definition at line 368 of file main.c.
References k_fat_total_sectors, k_selftest_block_size, memset(), s_msc_product_id, s_msc_product_rev, s_msc_vendor_id, selftest_msc_read(), selftest_msc_status(), and selftest_msc_write().
|
static |
Halt forever in WFI – panic stop on init failure.
Last-resort stop; only a debugger or reset recovers.
|
static |
Route both ports' pins: FS as device, HS as host.
FS device: P4_07 VBUS sense (PSEL), P5_00 VBUSEN held LOW as GPIO (peripheral routing would force host-style VBUSEN HIGH and block device enumeration), P8_14/P8_15 data. HS host: SW4-8 to Host via the U15 expander, PD07 HIGH (U18 supplies J7), P4_08 VBUS sense.
Definition at line 563 of file main.c.
References k_ra8_level_high, k_ra8_level_low, k_ra8_ok, k_ra8_psel_usb_fs, k_ra8_psel_usb_hs, k_selftest_pin_fs_dm, k_selftest_pin_fs_dp, k_selftest_pin_fs_vbus, k_selftest_pin_fs_vbusen, k_selftest_pin_hs_pwr, k_selftest_pin_hs_vbus, ra8_board_io_expander_set_usbhs_host_mode(), ra8_gpio_output_init(), ra8_pfs_route_peripheral(), and selftest_panic_halt().
|
static |
Bring CGC + both USB clocks + SysTick + SCI8 + LEDs + pins up.
USBFS needs the 48 MHz PLL2 reference before MSTPB11 is released; USBHS needs its 60 MHz UTMI PLL. SCI8 is the J-Link OB CDC console at 115200.
Definition at line 609 of file main.c.
References k_ra8_board_led1, k_ra8_board_led2, k_ra8_clock_id_cpuclk0, k_ra8_ok, k_selftest_baud, ra8_board_led_init(), ra8_board_uart_console_init(), ra8_cgc_get_clock_hz(), ra8_cgc_init(), ra8_cgc_usbfs_clock_enable(), ra8_cgc_usbhs_pll_enable(), ra8_time_init(), selftest_panic_halt(), and selftest_route_usb_or_halt().
|
static |
Brings USBX system + FS device stack up.
One-shot USBX pool + device-stack initialization for the FS-only framework.
| UX_SUCCESS | Stack ready. |
Definition at line 335 of file main.c.
References k_selftest_usbx_pool_bytes, s_device_framework_fs, s_language_id_framework, s_string_framework, and s_usbx_pool.
| void SysTick_Handler | ( | void | ) |
Service the SysTick exception selected by the linked application.
Service one SysTick event for the core timebase.
Service one SysTick event for the core timebase.
Resolves to the weak core timebase handler unless a strong RTOS or application handler overrides it. The vector table references the selected implementation without owning its subsystem policy.
The weak firmware implementation advances the millisecond counter, then services linked ThreadX and USB hooks when their weak symbols and readiness state permit. The host-test implementation advances only the counter. An application may replace either weak definition with a strong handler.
Service the SysTick exception selected by the linked application.
The weak firmware implementation advances the millisecond counter, then services linked ThreadX and USB hooks when their weak symbols and readiness state permit. The host-test implementation advances only the counter. An application may replace either weak definition with a strong handler.
Service the SysTick exception selected by the linked application.
Definition at line 91 of file main.c.
References _tx_timer_interrupt(), ra8_time_on_tick(), s_tx_kernel_up, and ux_dcd_ra8_usb_irq_reenable().
| VOID tx_application_define | ( | VOID * | first_unused_memory | ) |
ThreadX application-define hook.
Spawns both workers.
Device worker at priority 8 (above USBX class threads' default), host worker at 16 so the polled host loop can never starve the IRQ-driven device side.
| [in] | first_unused_memory | Sentinel (unused; static stacks). |
Definition at line 493 of file main.c.
References k_selftest_dev_priority, k_selftest_host_priority, k_selftest_host_stack, k_selftest_thread_stack, s_device_stack, s_device_thread, s_device_thread_name, s_host_stack, s_host_thread, s_host_thread_name, s_tx_kernel_up, selftest_device_worker(), selftest_host_worker(), TX_AUTO_START, TX_NO_TIME_SLICE, and tx_thread_create.
|
static |
|
static |
|
static |
|
static |
|
static |
|
static |
|
static |
|
static |
|
static |
Stack backing storage for s_host_thread (ra8_fs walks live here).
|
static |
|
static |
|
static |
|
static |
Set in tx_application_define; gates ThreadX tick delivery.
main() starts SysTick (ra8_time_init) BEFORE tx_kernel_enter, and this app's setup window is long (the U15 expander I2C transaction blocks for milliseconds), so the tick WILL fire pre-kernel. Feeding _tx_timer_interrupt into ThreadX's still-zeroed timer state walks a bogus expiration list and bus-faults (observed: IMPRECISERR HardFault from SysTick).
|
static |