|
ra8-firmware 0.1.0
Bare-metal firmware for the Renesas RA8 family (RA8D2 / RA8P1)
|
USB self-loop: HS host reads a 2-LUN FS device (multi-LUN MSC). 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 "usb_selftest_mlun_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 | mlun_dev_step_t : uint32_t { k_mlun_dev_step_stack = 1U , k_mlun_dev_step_class = 2U , k_mlun_dev_step_dcd = 3U , k_mlun_dev_step_attach = 4U , k_mlun_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 | mlun_msc_read (VOID *storage, ULONG lun, UCHAR *data_pointer, ULONG number_blocks, ULONG lba, ULONG *media_status) |
| Storage media-read callback: synthesize the per-LUN pattern. | |
| static UINT | mlun_msc_write (VOID *storage, ULONG lun, UCHAR *data_pointer, ULONG number_blocks, ULONG lba, ULONG *media_status) |
| Storage media-write callback: reject (all LUNs are read-only). | |
| static UINT | mlun_msc_status (VOID *storage, ULONG lun, ULONG media_id, ULONG *media_status) |
| Storage media-status callback. | |
| static UINT | mlun_usbx_stack_up (void) |
| Bring USBX system + device stack up with the MSC framework. | |
| static void | mlun_fill_lun (UX_SLAVE_CLASS_STORAGE_PARAMETER *p, uint32_t idx) |
| Populate one LUN parameter slot with geometry + callbacks. | |
| static UINT | mlun_class_register (void) |
| Register the Mass-Storage class with two logical units. | |
| static VOID | mlun_device_worker (ULONG arg) |
| Device-side worker: bring the 2-LUN FS device up, then park. | |
| VOID | tx_application_define (VOID *first_unused_memory) |
| ThreadX application-define hook. | |
| static void | mlun_panic_halt (void) |
| Halt forever in WFI – panic stop on init failure. | |
| static void | mlun_route_usb_or_halt (void) |
| Route both ports' pins: FS as device, HS as host. | |
| static void | mlun_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_mlun_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_mlun_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_mlun_pin_fs_dp = (ra8_port_pin_t)k_ra8_board_usbfs_pin_dp |
| USBFS D+ (P8_14). | |
| static const ra8_port_pin_t | k_mlun_pin_fs_dm = (ra8_port_pin_t)k_ra8_board_usbfs_pin_dm |
| USBFS D- (P8_15). | |
| static const ra8_port_pin_t | k_mlun_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_mlun_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_mlun_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_mlun_host_stack] |
| Stack backing storage for s_host_thread. | |
| static UCHAR | s_usbx_pool [k_mlun_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 [] = "MULTI-LUN x3 RO " |
| static UCHAR | s_msc_product_rev [] = "0001" |
| static volatile uint32_t | s_dbg_read_calls |
| Device-side media_read invocations (all LUNs). | |
| 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 reads a 2-LUN FS device (multi-LUN MSC).
The multi-LUN twin of the MSC self-loop apps. The two USB ports are cabled to EACH OTHER and one firmware image runs both USB stacks:
No filesystem is involved (raw SCSI READ(10) per LUN), so this is a pure read-path test that needs no host WRITE support.
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 mlun_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 818 of file main.c.
References mlun_panic_halt(), mlun_setup_or_halt(), and ra8_isr_globals_enable().
|
static |
Register the Mass-Storage class with two logical units.
Sets number_lun = 2 and fills both LUN slots via mlun_fill_lun, so the host's GET_MAX_LUN returns 1. Two is the ceiling set by UX_MAX_SLAVE_LUN in the USBX storage class.
| UX_SUCCESS | Class registered. |
Definition at line 576 of file main.c.
References k_mlun_count, memset(), mlun_fill_lun(), s_msc_product_id, s_msc_product_rev, and s_msc_vendor_id.
Referenced by mlun_device_worker().
|
static |
Device-side worker: bring the 2-LUN FS device up, then park.
USBX system + device stack + MSC class (2 LUNs) + 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 613 of file main.c.
References k_mlun_dev_step_attach, k_mlun_dev_step_class, k_mlun_dev_step_dcd, k_mlun_dev_step_parked, k_mlun_dev_step_stack, k_mlun_idle_ticks, k_ra8_ok, k_ra8_usb_speed_fs, mlun_class_register(), mlun_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 one LUN parameter slot with geometry + callbacks.
Each of the two LUNs is a read-only FAT-disk-typed, removable, 256-sector volume sharing the same media callbacks (which key on the LUN index).
| [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_mlun_count. idx carries the geometry + media callbacks. Definition at line 540 of file main.c.
References k_mlun_block_size, k_mlun_sectors, mlun_msc_read(), mlun_msc_status(), and mlun_msc_write().
Referenced by mlun_class_register().
|
static |
Storage media-read callback: synthesize the per-LUN pattern.
Bound-checks the request against the LUN geometry, then fills each block via mlun_pattern_fill keyed on lun. One callback serves both LUNs (USBX passes the LUN index). 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_mlun_count. Definition at line 388 of file main.c.
References k_mlun_block_size, k_mlun_sectors, k_ra8_board_led1, k_scsi_asc_lba_out_of_range, k_scsi_ascq_none, k_scsi_sense_illegal_request, mlun_pattern_fill(), ra8_board_led_toggle(), and s_dbg_read_calls.
Referenced by mlun_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 477 of file main.c.
Referenced by mlun_fill_lun().
|
static |
Storage media-write callback: reject (all LUNs are read-only).
The multi-LUN volumes are synthesized read-only; any WRITE(10) is refused with DATA PROTECT. Hosts honouring the MODE SENSE WP bit never call this.
| [in,out] | storage | USBX storage class instance (unused). |
| [in] | lun | Logical unit number (unused). |
| [in] | data_pointer | USBX-owned source buffer (unused). |
| [in] | number_blocks | Number of blocks the host tried (unused). |
| [in] | lba | Starting LBA (unused). |
| [out] | media_status | Filled with DATA PROTECT sense. |
| UX_ERROR | The medium is write-protected. |
Definition at line 438 of file main.c.
References k_scsi_asc_write_protected, k_scsi_ascq_none, and k_scsi_sense_data_protect.
Referenced by mlun_fill_lun().
|
static |
Halt forever in WFI – panic stop on init failure.
Last-resort stop; only a debugger or reset recovers.
Definition at line 712 of file main.c.
Referenced by main(), mlun_route_usb_or_halt(), and mlun_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 735 of file main.c.
References k_mlun_pin_fs_dm, k_mlun_pin_fs_dp, k_mlun_pin_fs_vbus, k_mlun_pin_fs_vbusen, k_mlun_pin_hs_pwr, k_mlun_pin_hs_vbus, k_ra8_level_high, k_ra8_level_low, k_ra8_ok, k_ra8_psel_usb_fs, k_ra8_psel_usb_hs, mlun_panic_halt(), ra8_board_io_expander_set_usbhs_host_mode(), ra8_gpio_output_init(), and ra8_pfs_route_peripheral().
Referenced by mlun_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 774 of file main.c.
References k_mlun_baud, k_ra8_board_led1, k_ra8_board_led2, k_ra8_clock_id_cpuclk0, k_ra8_ok, mlun_panic_halt(), mlun_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 506 of file main.c.
References k_mlun_usbx_pool_bytes, s_device_framework_fs, s_language_id_framework, s_string_framework, and s_usbx_pool.
Referenced by mlun_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 90 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 665 of file main.c.
References k_mlun_dev_priority, k_mlun_host_priority, k_mlun_host_stack, k_mlun_thread_stack, mlun_device_worker(), mlun_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 105 of file main.c.
Referenced by mlun_route_usb_or_halt().
|
static |
USBFS VBUSEN (P5_00) – GPIO LOW for the device role.
Definition at line 108 of file main.c.
Referenced by mlun_route_usb_or_halt().
|
static |
J7 host-power switch (PD07): HIGH = U18 supplies VBUS (UM 6.2).
Definition at line 120 of file main.c.
Referenced by mlun_route_usb_or_halt().
|
static |
USBHS_VBUS sense pin (P4_08, PSEL = 0x14).
Definition at line 117 of file main.c.
Referenced by mlun_route_usb_or_halt().
|
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 |