|
ra8-firmware 0.1.0
Bare-metal firmware for the Renesas RA8 family (RA8D2 / RA8P1)
|
USB self-loop: HS host WRITE(10)s + reads back the onboard OSPI flash. 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_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 "ra8_xspi.h"#include "usb_selftest_ospi_rw_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 | ospirw_dev_step_t : uint32_t { k_ospirw_dev_step_stack = 1U , k_ospirw_dev_step_class = 2U , k_ospirw_dev_step_dcd = 3U , k_ospirw_dev_step_attach = 4U , k_ospirw_dev_step_parked = 5U } |
| J-Link probe values marking device-worker bring-up progress. More... | |
| enum | scsi_sense_code_t : uint8_t { k_scsi_sense_illegal_request = 0x05U , k_scsi_asc_lba_out_of_range = 0x21U , k_scsi_ascq_none = 0x00U , k_scsi_sense_data_protect = 0x07U , k_scsi_asc_write_protected = 0x27U } |
| SCSI sense triple for an unsupported / out-of-range request. More... | |
| 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 | ospirw_msc_read (VOID *storage, ULONG lun, UCHAR *data_pointer, ULONG number_blocks, ULONG lba, ULONG *media_status) |
| Storage media-read callback: read the OSPI flash window back. | |
| static UINT | ospirw_msc_write (VOID *storage, ULONG lun, UCHAR *data_pointer, ULONG number_blocks, ULONG lba, ULONG *media_status) |
| Storage media-write callback: program host data into OSPI flash. | |
| static UINT | ospirw_msc_status (VOID *storage, ULONG lun, ULONG media_id, ULONG *media_status) |
| Storage media-status callback. | |
| static UINT | ospirw_usbx_stack_up (void) |
| Bring USBX system + device stack up with the MSC framework. | |
| static void | ospirw_fill_lun (UX_SLAVE_CLASS_STORAGE_PARAMETER *p, uint32_t idx) |
| Populate the writable LUN parameter slot with geometry + callbacks. | |
| static UINT | ospirw_class_register (void) |
| Register the Mass-Storage class with one writable LUN. | |
| static VOID | ospirw_device_worker (ULONG arg) |
| Device-side worker: bring OSPI + the writable device up, then park. | |
| VOID | tx_application_define (VOID *first_unused_memory) |
| ThreadX application-define hook. | |
| static void | ospirw_panic_halt (void) |
| Halt forever in WFI – panic stop on init failure. | |
| static void | ospirw_route_usb_or_halt (void) |
| Route both ports' pins: FS as device, HS as host. | |
| static void | ospirw_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_ospirw_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_ospirw_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_ospirw_pin_fs_dp = (ra8_port_pin_t)k_ra8_board_usbfs_pin_dp |
| USBFS D+ (P8_14). | |
| static const ra8_port_pin_t | k_ospirw_pin_fs_dm = (ra8_port_pin_t)k_ra8_board_usbfs_pin_dm |
| USBFS D- (P8_15). | |
| static const ra8_port_pin_t | k_ospirw_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_ospirw_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_ospirw_thread_stack] |
| Stack backing storage for s_device_thread. | |
| static TX_THREAD | s_host_thread |
| ThreadX TCB for the host-side worker thread. | |
| static UCHAR | s_host_stack [k_ospirw_host_stack] |
| Stack backing storage for s_host_thread. | |
| static UCHAR | s_usbx_pool [k_ospirw_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 [] = "WRITABLE OSPI RW" |
| static UCHAR | s_msc_product_rev [] = "0001" |
| static volatile uint32_t | s_dbg_read_calls |
| Device-side media_read invocations. | |
| static volatile uint32_t | s_dbg_write_calls |
| Device-side media_write invocations (WRITE(10) data received). | |
| static volatile uint32_t | s_dbg_write_blocks |
| Total 512-B blocks the device media_write callback stored. | |
| static volatile uint32_t | s_dbg_dev_step |
| Device worker progress: 1 stack, 2 class, 3 dcd, 4 attach, 5 parked. | |
| static volatile uint32_t | s_dbg_dev_err |
| Device worker first failing return code (0 = none). | |
| 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: HS host WRITE(10)s + reads back the onboard OSPI flash.
The WRITABLE OSPI MSC self-loop – it exercises the host->device bulk-OUT data path (SCSI WRITE(10)) landing on real non-volatile storage. The two USB ports are cabled to EACH OTHER and one firmware image runs both USB stacks:
No filesystem is involved (raw SCSI WRITE(10)/READ(10)); this is the non-volatile write-path counterpart to the read-only MSC self-loops, and the on-bench validation for the device bulk-OUT WRITE(10) driver fix against persistent storage. The window (0x00200000) is a scratch region clear of flash_journal (offset 0) and the read-only OSPI image (offset 0x00100000); it is erased then rewritten every run.
The link runs at 12 Mbps (FS device ceiling; HS host serves an FS downstream device).
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 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 ospirw_dev_step_t : uint32_t |
J-Link probe values marking device-worker bring-up progress.
| enum scsi_sense_code_t : uint8_t |
SCSI sense triple for an unsupported / out-of-range request.
| 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 workers only deal with stack bring-up.
Definition at line 871 of file main.c.
References ospirw_panic_halt(), ospirw_setup_or_halt(), and ra8_isr_globals_enable().
|
static |
Register the Mass-Storage class with one writable LUN.
Sets number_lun = 1 and fills the LUN slot via ospirw_fill_lun, so the host's GET_MAX_LUN returns 0. One is the single writable unit this self-loop exercises.
| UX_SUCCESS | Class registered. |
Definition at line 619 of file main.c.
References k_ospirw_count, memset(), ospirw_fill_lun(), s_msc_product_id, s_msc_product_rev, and s_msc_vendor_id.
Referenced by ospirw_device_worker().
|
static |
Device-side worker: bring OSPI + the writable device up, then park.
Provisions the OSPI write window (ospirw_ospi_provision), then USBX system + device stack + writable 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 661 of file main.c.
References k_ospirw_dev_step_attach, k_ospirw_dev_step_class, k_ospirw_dev_step_dcd, k_ospirw_dev_step_parked, k_ospirw_dev_step_stack, k_ospirw_idle_ticks, k_ra8_ok, k_ra8_usb_speed_fs, ospirw_class_register(), ospirw_ospi_provision(), ospirw_usbx_stack_up(), ra8_usb_device_attach(), s_dbg_dev_err, s_dbg_dev_step, tx_thread_sleep, and ux_dcd_ra8_usb_initialize().
Referenced by tx_application_define().
|
static |
Populate the writable LUN parameter slot with geometry + callbacks.
The LUN is a writable FAT-disk-typed, removable, 64-sector OSPI-backed volume whose media callbacks program and read the OSPI flash window.
| [in,out] | p | The class parameter block. |
| [in] | idx | LUN slot index (0..1). |
p is zeroed and being filled before class register. idx is below k_ospirw_count. idx carries the geometry + media callbacks. Definition at line 582 of file main.c.
References k_ospirw_block_size, k_ospirw_sectors, ospirw_msc_read(), ospirw_msc_status(), and ospirw_msc_write().
Referenced by ospirw_class_register().
|
static |
Storage media-read callback: read the OSPI flash window back.
Bound-checks the request against the LUN geometry, then reads number_blocks sectors from the OSPI window at k_ospirw_offset with ra8_xspi_flash_read into the USBX buffer. One callback serves the single LUN. LED1 toggles per call so loop traffic is visible.
| [in,out] | storage | USBX storage class instance (unused). |
| [in] | lun | Logical unit number (0..1). |
| [out] | data_pointer | USBX-owned destination buffer. |
| [in] | number_blocks | Number of 512-byte blocks to produce. |
| [in] | lba | Starting LBA. |
| [out] | media_status | Filled with sense status word. |
| UX_SUCCESS | Read completed. |
| UX_ERROR | Out-of-range LBA / count. |
lun is below k_ospirw_count. Definition at line 402 of file main.c.
References k_ospirw_block_size, k_ospirw_instance, k_ospirw_offset, k_ospirw_sectors, k_ra8_board_led1, k_ra8_ok, k_scsi_asc_lba_out_of_range, k_scsi_ascq_none, k_scsi_sense_illegal_request, ra8_board_led_toggle(), ra8_xspi_flash_read(), and s_dbg_read_calls.
Referenced by ospirw_fill_lun().
Storage media-status callback.
Always reports media-present.
Synthesized LUNs never go absent; status is constant 0.
| [in,out] | storage | USBX storage class instance (unused). |
| [in] | lun | Logical unit number (unused). |
| [in] | media_id | Media id (unused). |
| [out] | media_status | Filled with 0 (no fault). |
| UX_SUCCESS | Media is present and ready. |
Definition at line 519 of file main.c.
Referenced by ospirw_fill_lun().
|
static |
Storage media-write callback: program host data into OSPI flash.
The LUN is writable; the host's WRITE(10) data-OUT phase lands here. Programs number_blocks sectors from the USBX buffer into the OSPI window at k_ospirw_offset with ra8_xspi_flash_program. The window is ERASED once at boot, so this is a fast program-only path (no per-write 4 KiB erase, which would exceed the host's BOT timeout). Bumps s_dbg_write_calls / s_dbg_write_blocks.
| [in,out] | storage | USBX storage class instance (unused). |
| [in] | lun | Logical unit number (unused; single LUN). |
| [in] | data_pointer | USBX-owned source buffer (received OUT data). |
| [in] | number_blocks | Number of 512-byte blocks the host wrote. |
| [in] | lba | Starting LBA. |
| [out] | media_status | Filled with the sense status word. |
| UX_SUCCESS | Blocks programmed into the OSPI window. |
| UX_ERROR | Out-of-range LBA / count. |
Definition at line 464 of file main.c.
References k_ospirw_block_size, k_ospirw_instance, k_ospirw_offset, k_ospirw_sectors, k_ra8_board_led2, k_ra8_ok, k_scsi_asc_lba_out_of_range, k_scsi_ascq_none, k_scsi_sense_illegal_request, ra8_board_led_toggle(), ra8_xspi_flash_program(), s_dbg_write_blocks, and s_dbg_write_calls.
Referenced by ospirw_fill_lun().
|
static |
Halt forever in WFI – panic stop on init failure.
Last-resort stop; only a debugger or reset recovers.
Definition at line 763 of file main.c.
Referenced by main(), ospirw_route_usb_or_halt(), and ospirw_setup_or_halt().
|
static |
Route both ports' pins: FS as device, HS as host.
FS device: P4_07 VBUS sense, P5_00 VBUSEN GPIO LOW (else peripheral routing forces host VBUSEN and blocks device enum), 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 786 of file main.c.
References k_ospirw_pin_fs_dm, k_ospirw_pin_fs_dp, k_ospirw_pin_fs_vbus, k_ospirw_pin_fs_vbusen, k_ospirw_pin_hs_pwr, k_ospirw_pin_hs_vbus, k_ra8_level_high, k_ra8_level_low, k_ra8_ok, k_ra8_psel_usb_fs, k_ra8_psel_usb_hs, ospirw_panic_halt(), ra8_board_io_expander_set_usbhs_host_mode(), ra8_gpio_output_init(), and ra8_pfs_route_peripheral().
Referenced by ospirw_setup_or_halt().
|
static |
Bring CGC + both USB clocks + SysTick + SCI8 + LEDs + pins up.
USBFS needs the 48 MHz PLL2 reference; USBHS needs its UTMI PLL. SCI8 is the J-Link OB CDC console at 115200.
Definition at line 827 of file main.c.
References k_ospirw_baud, k_ra8_board_led1, k_ra8_board_led2, k_ra8_clock_id_cpuclk0, k_ra8_ok, ospirw_panic_halt(), ospirw_route_usb_or_halt(), 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(), and ra8_time_init().
Referenced by main().
|
static |
Bring USBX system + device stack up with the MSC framework.
One-shot USBX pool + device-stack init (FS-only framework).
| UX_SUCCESS | Stack ready. |
Definition at line 548 of file main.c.
References k_ospirw_usbx_pool_bytes, s_device_framework_fs, s_language_id_framework, s_string_framework, and s_usbx_pool.
Referenced by ospirw_device_worker().
| 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 95 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, host worker at 24 (below the USBX class threads). Sets s_tx_kernel_up so SysTick may feed ThreadX from here on.
| [in] | first_unused_memory | Sentinel (unused; static stacks). |
Definition at line 716 of file main.c.
References k_ospirw_dev_priority, k_ospirw_host_priority, k_ospirw_host_stack, k_ospirw_thread_stack, ospirw_device_worker(), ospirw_host_worker(), s_device_stack, s_device_thread, s_device_thread_name, s_host_stack, s_host_thread, s_host_thread_name, s_tx_kernel_up, TX_AUTO_START, TX_NO_TIME_SLICE, and tx_thread_create.
|
static |
|
static |
|
static |
USBFS VBUS sense pin (P4_07, PSEL = 0x13).
Definition at line 110 of file main.c.
Referenced by ospirw_route_usb_or_halt().
|
static |
USBFS VBUSEN (P5_00) – GPIO LOW for the device role.
Definition at line 113 of file main.c.
Referenced by ospirw_route_usb_or_halt().
|
static |
J7 host-power switch (PD07): HIGH = U18 supplies VBUS (UM 6.2).
Definition at line 125 of file main.c.
Referenced by ospirw_route_usb_or_halt().
|
static |
USBHS_VBUS sense pin (P4_08, PSEL = 0x14).
Definition at line 122 of file main.c.
Referenced by ospirw_route_usb_or_halt().
|
static |
|
static |
|
static |
|
static |
|
static |
|
static |
|
static |
|
static |
|
static |
|
static |
|
static |
|
static |
Set in tx_application_define; gates ThreadX tick delivery.
main() starts SysTick before tx_kernel_enter and the setup window is long (U15 expander I2C blocks for ms), so the tick fires pre-kernel; feeding _tx_timer_interrupt into ThreadX's zeroed timer state bus-faults. Gate it until the kernel runs.
|
static |