Timings
BlueSCSI SpeedGrade Timings Reference
This document describes the SpeedGrade timing system used to configure SCSI bus timing, PLL clocks, and audio support.
Updated as of release v2025.10.27
Platform Boot Clocks
Initial clock at MCU reset (before any reclocking):
| Platform | Initial Index | Initial Clock |
|---|---|---|
| BLUESCSI_MCU_RP23XX | 3 | 150 MHz |
| BLUESCSI_PICO | 1 | 133 MHz |
| Other RP2040 | 0 | 125 MHz |
Automatic Startup Reclocking
Pico-based boards are automatically reclocked at startup to a standardized speed before bluescsi.ini is processed. This ensures consistent SCSI timing across different board variants.
| Board Define | Speed Grade Used | Reclocked To |
|---|---|---|
| BLUESCSI_PICO_2 | SPEED_GRADE_BASE_203MHZ |
203.2 MHz |
| BLUESCSI_MCU_RP20XX | SPEED_GRADE_BASE_203MHZ |
203.2 MHz |
After startup reclocking, if SpeedGrade= is set in bluescsi.ini to something other than Default, a second reclock occurs to the user-specified speed grade.
Speed Grades
Speed grades are configured via SpeedGrade= in bluescsi.ini.
| Index | Enum Name | INI String | Description |
|---|---|---|---|
| 0 | SPEED_GRADE_DEFAULT |
Default |
Platform default (no reclocking) |
| 1 | SPEED_GRADE_MAX |
TurboMax |
Maximum performance |
| 2 | SPEED_GRADE_CUSTOM |
Custom |
Load from bluescsi_timings.ini |
| 3 | SPEED_GRADE_AUDIO_SPDIF |
AudioSPDIF |
Optimized for SPDIF audio output |
| 4 | SPEED_GRADE_AUDIO_I2S |
AudioI2S |
Optimized for I2S audio output |
| 5 | SPEED_GRADE_A |
A |
High performance tier |
| 6 | SPEED_GRADE_B |
B |
Medium performance tier |
| 7 | SPEED_GRADE_C |
C |
Lower performance tier |
| 8 | SPEED_GRADE_WIFI_RM2 |
WifiRM2 |
For external RM2 WiFi module |
| 9 | SPEED_GRADE_BASE_203MHZ |
(internal) | 203.2 MHz base clock |
| 10 | SPEED_GRADE_BASE_155MHZ |
(internal) | 155.25 MHz base clock |
Predefined Timing Profiles
| Index | Clock (MHz) | Audio Support | Use Case |
|---|---|---|---|
| 0 | 125.0 | No | RP2040 default |
| 1 | 133.0 | No | Pico default |
| 2 | 135.43 | Yes (SPDIF) | RP2040 Audio DAC Attack S/PDIF |
| 3 | 150.0 | No | RP2350 default |
| 4 | 250.0 | No | Maximum performance (TurboMax) |
| 5 | 155.25 | Yes | RP2350 with external RM2 WiFi |
| 6 | 175.0 | Yes (I2S) | Alternate I2S audio |
| 7 | 200.4 | Yes (I2S) | Alternate I2S audio |
| 8 | 251.2 | Yes (I2S) | High-speed with I2S audio |
| 9 | 203.2 | Yes | Base clock for I2S and SPDIF over SPI |
Speed Grade to Timing Index Mapping
ENABLE_AUDIO_OUTPUT_I2S builds
| Speed Grade | INI String | Index | Clock |
|---|---|---|---|
| MAX / A | TurboMax/A | 8 | 251.2 |
| B | B | 6 | 175.0 |
| C | C | 5 | 155.25 |
| AudioSPDIF | AudioSPDIF | 9 | 203.2 |
| AudioI2S | AudioI2S | 5 | 155.25 |
| WifiRM2 | WifiRM2 | 3 | 150.0 |
RP2350 (BLUESCSI_MCU_RP23XX) builds
| Speed Grade | INI String | Index | Clock |
|---|---|---|---|
| MAX / A | TurboMax/A | 4 | 250.0 |
| B | B | 7 | 200.4 |
| C | C | 6 | 175.0 |
| AudioSPDIF | AudioSPDIF | 9 | 203.2 |
| AudioI2S | AudioI2S | 9 | 203.2 |
RP2040 builds (default)
| Speed Grade | INI String | Index | Clock |
|---|---|---|---|
| MAX / A | TurboMax/A | 4 | 250.0 |
| B | B | 3 | 150.0 |
| C | C | 1 | 133.0 |
| AudioSPDIF | AudioSPDIF | 9 | 203.2 |
| AudioI2S | AudioI2S | 9 | 203.2 |
Timing Structure
bluescsi_timings_t Fields
typedef struct {
uint32_t clk_hz; // System clock frequency in Hz
struct pll { ... }; // PLL configuration for pico-sdk
struct scsi { ... }; // General SCSI timing
struct scsi_20 { ... }; // Ultra SCSI (20 MB/s) timing
struct scsi_10 { ... }; // Fast SCSI (10 MB/s) timing
struct scsi_5 { ... }; // SCSI-1 (5 MB/s) timing
struct sdio { ... }; // SD card interface timing
struct audio { ... }; // Audio output timing
} bluescsi_timings_t;
SCSI Speed Timing Specs
| Parameter | Ultra (20 MB/s) | Fast (10 MB/s) | SCSI-1 (5 MB/s) |
|---|---|---|---|
| delay0 | 11.5 ns | 25 ns | 25 ns |
| delay1 | 15 ns | 30 ns | 80 ns |
| delay2 | 15 ns | 30 ns | 80 ns |
| rdelay1 | 15 ns | 30 ns | 80 ns |
Delay Definitions
- delay0: Receive hold time - Delay from data write to REQ assertion
- delay1: Transmit assertion time from REQ assert to REQ deassert (REQ pulse width)
- delay2: Negation period (total_period - delay0 - delay1)
- rdelay1: Read transmit assertion time
- rtotal_period_adjust: Adjustment to total delay for rdelay0 calculation
- total_period_adjust: Manual adjustment for scope-verified timing
- max_sync: Minimum sync period supported (value is 1/4 actual ns)
All delay values are in clock cycles minus 1 (for PIO instruction delay).
Custom Timings File
Create bluescsi_timings.ini on the SD card for custom timing configuration.
Sections and Keys
[settings]
disable = 0 ; Set to 1 to disable custom timings
extends_speed_grade = Default ; Base speed grade to extend
clk_hz = 125000000 ; Target clock frequency
boot_with_sync_value = 0 ; Force sync period (>0 to enable)
boot_with_offset_value = 15 ; Force offset (0-15)
[pll]
vco_freq_hz = 1500000000 ; VCO frequency (max resulting clock: 252 MHz)
pd1 = 6 ; Post divider 1
pd2 = 2 ; Post divider 2
refdiv = 1 ; Reference divider
[scsi]
clk_period_ps = 8000 ; Clock period in picoseconds
req_delay_cc = 7 ; REQ delay in clock cycles
[scsi_20] ; Ultra SCSI timing
delay0_cc = 2 ; Data setup delay (clock cycles)
delay1_cc = 3 ; REQ pulse width (clock cycles)
total_period_adjust_cc = -1 ; Period adjustment
max_sync = 12 ; Max sync value (1/4 ns)
read_delay1_cc = 4 ; Read REQ pulse width
read_total_period_adjust_cc = 0
[scsi_10] ; Fast SCSI timing
delay0_cc = 4
delay1_cc = 6
total_period_adjust_cc = -1
max_sync = 25
read_delay1_cc = 6
read_total_period_adjust_cc = 0
[scsi_5] ; SCSI-1 timing
delay0_cc = 9
delay1_cc = 14
total_period_adjust_cc = -1
max_sync = 50
read_delay1_cc = 14
read_total_period_adjust_cc = 0
[sdio]
clk_div_pio = 4 ; PIO clock divider
clk_div_1mhz = 25 ; 1MHz reference divider
delay0 = 2
delay1 = 0
[audio]
clk_div_pio = 48 ; Audio PIO divider for 44.1kHz
clk_for_audio = false ; True if clock supports accurate 44.1kHz
Audio Clock Calculation
For 44.1 kHz audio with 16-bit stereo samples:
clk_div_pio = sys_clk_hz / 16 / 2 / 2 / 44100
Audio is considered “clocked” if the resulting sample rate is within 0.02% of 44.1 kHz.
Global Sync Variables
Set by timing configuration:
extern uint8_t g_max_sync_20_period; // Ultra SCSI max sync
extern uint8_t g_max_sync_10_period; // Fast SCSI max sync
extern uint8_t g_max_sync_5_period; // SCSI-1 max sync
extern uint8_t g_force_sync; // Forced sync value (0 = auto)
extern uint8_t g_force_offset; // Forced offset (0-15)
This wiki has been updated 927 times by 95 people like you! Click here to edit this page. Generated 2026-03-10