Prechádzať zdrojové kódy

Standardized board system clock frequencies

Standardize system clock frequencies for RP2MCU based board
- Wide 150MHz
- Blaster 155MHz
- Pico 2/2W 155MHz
- RP2040 and Pico 1/1W 203MHz
J. Morio Sakaguchi 3 mesiacov pred
rodič
commit
b2420c7104

+ 34 - 47
lib/BlueSCSI_platform_RP2MCU/BlueSCSI_platform.cpp

@@ -514,19 +514,13 @@ void platform_init()
     if (!rp2040.isPicoW())
         gpio_conf(LED_PIN,    GPIO_FUNC_SIO, false,false, true,  false, false);
 
-#ifndef ENABLE_AUDIO_OUTPUT_SPDIF
+
 #ifdef GPIO_I2C_SDA
     // I2C pins
     //        pin             function       pup   pdown  out    state fast
     // gpio_conf(GPIO_I2C_SCL,   GPIO_FUNC_I2C, true,false, false,  true, true);
     // gpio_conf(GPIO_I2C_SDA,   GPIO_FUNC_I2C, true,false, false,  true, true);
 #endif  // GPIO_I2C_SDA
-#else
-    //        pin             function       pup   pdown  out    state fast
-    gpio_conf(GPIO_EXP_AUDIO, GPIO_FUNC_SPI, true,false, false,  true, true);
-    gpio_conf(GPIO_EXP_SPARE, GPIO_FUNC_SIO, true,false, false,  true, false);
-    // configuration of corresponding SPI unit occurs in audio_setup()
-#endif  // ENABLE_AUDIO_OUTPUT_SPDIF
 
 #ifdef GPIO_USB_POWER
     gpio_conf(GPIO_USB_POWER, GPIO_FUNC_SIO, false, false, false,  false, false);
@@ -615,7 +609,25 @@ void platform_late_init()
         gpio_conf(SCSI_IN_ATN,    GPIO_FUNC_SIO, true, false, false, true, false);
         gpio_conf(SCSI_IN_RST,    GPIO_FUNC_SIO, true, false, false, true, false);
 
-#ifdef BLUESCSI_RM2
+#if defined(BLUESCSI_WIDE)
+    logmsg("Wide board runs at base speed of ",(int) platform_sys_clock_in_hz(), "Hz");
+#elif defined(BLUESCSI_BLASTER)
+    logmsg("Reclock Blaster based boards to standardized speed");
+    platform_reclock(SPEED_GRADE_BASE_155MHZ);
+#elif defined(BLUESCSI_PICO_2)
+    logmsg("Reclock Pico 2/2W based boards to standardized speed");
+    platform_reclock(SPEED_GRADE_BASE_155MHZ);
+#elif defined(BLUESCSI_MCU_RP20XX)
+    logmsg("Reclock RP2040 & Pico 1/1W based boards to standardized speed");
+    platform_reclock(SPEED_GRADE_BASE_203MHZ);
+#endif
+
+#ifdef ENABLE_AUDIO_OUTPUT_I2S
+    logmsg("BlueSCSI CD Audio enabled - requires DAC");
+    audio_setup();
+#endif
+
+#ifdef BlSCSI_RM2
     uint rm2_pins[CYW43_PIN_INDEX_WL_COUNT] = {0};
     rm2_pins[CYW43_PIN_INDEX_WL_REG_ON] = GPIO_RM2_ON;
     rm2_pins[CYW43_PIN_INDEX_WL_DATA_OUT] = GPIO_RM2_DATA;
@@ -624,45 +636,18 @@ void platform_late_init()
     rm2_pins[CYW43_PIN_INDEX_WL_CLOCK] = GPIO_RM2_CLK;
     rm2_pins[CYW43_PIN_INDEX_WL_CS] = GPIO_RM2_CS;
     assert(PICO_OK == cyw43_set_pins_wl(rm2_pins));
-    if (platform_reclock(SPEED_GRADE_WIFI_RM2))
-    {
+
         // The iface check turns on the LED on the RM2 early in the init process
-        // Should tell the user that the RM2 is working
-        if(platform_network_iface_check())
-        {
-            logmsg("RM2 found");
-        }
-        else
-        {
-# ifdef BLUESCSI_BLASTER
-            logmsg("RM2 not found, upclocking");
-            platform_reclock(SPEED_GRADE_AUDIO_I2S);
-# else
-            logmsg("RM2 not found");
-# endif
-        }
-    }
-    else
+    // Should tell the user that the RM2 is working
+    if(platform_network_iface_check())
     {
-        logmsg("WiFi RM2 timings not found");
-    }
-#elif defined(ENABLE_AUDIO_OUTPUT_I2S)
-    logmsg("I2S audio to expansion header enabled");
-    if (!platform_reclock(SPEED_GRADE_AUDIO_I2S))
-    {
-        logmsg("Audio output timings not found");
-    }
-#elif defined(ENABLE_AUDIO_OUTPUT_SPDIF)
-    logmsg("S/PDIF audio to expansion header enabled");
-    if (platform_reclock(SPEED_GRADE_AUDIO_SPDIF))
-    {
-        logmsg("Reclocked for Audio Ouput at ", (int) platform_sys_clock_in_hz(), "Hz");
+        logmsg("RM2 found");
     }
     else
     {
-        logmsg("Audio Output timings not found");
+        logmsg("RM2 not found");
     }
-#endif // ENABLE_AUDIO_OUTPUT_SPDIF
+#endif
 
 // This should turn on the LED for Pico 1/2 W devices early in the init process
 // It should help indicate to the user that interface is working and the board is ready for DaynaPORT
@@ -671,11 +656,6 @@ void platform_late_init()
         platform_network_iface_check();
 #endif
 
-
-#ifdef ENABLE_AUDIO_OUTPUT
-        // one-time control setup for DMA channels and second core
-        audio_setup();
-#endif // ENABLE_AUDIO_OUTPUT_SPDIF
     }
     else
     {
@@ -709,7 +689,14 @@ void platform_initiator_gpio_setup() {
 bool platform_supports_initiator_mode() {
     return g_supports_initiator;
 }
-void platform_post_sd_card_init() {}
+
+void platform_post_sd_card_init()
+{
+#if defined(ENABLE_AUDIO_OUTPUT) && !defined(BLUESCSI_BLASTER)
+        // one-time control setup for DMA channels and second core
+        audio_setup();
+#endif // ENABLE_AUDIO_OUTPUT
+}
 
 bool platform_is_initiator_mode_enabled()
 {

+ 3 - 1
lib/BlueSCSI_platform_RP2MCU/BlueSCSI_platform_config.h

@@ -35,15 +35,17 @@
 #elif defined(BLUESCSI_PICO_2)
 # ifdef BLUESCSI_PICO_2_DAYNAPORT
 #   define PLATFORM_NAME "BlueSCSI Pico 2 DaynaPORT"
+#   define PLATFORM_DEFAULT_SCSI_SPEED_SETTING 10
 # else
 #   define PLATFORM_NAME "BlueSCSI Pico 2"
+#   define PLATFORM_DEFAULT_SCSI_SPEED_SETTING 20
 # endif
 # define PLATFORM_PID "Pico 2"
 # define PLATFORM_REVISION "2.3A"
 # define PLATFORM_HAS_INITIATOR_MODE 1
 # define DISABLE_SWO
 # define PLATFORM_MAX_SCSI_SPEED S2S_CFG_SPEED_SYNC_20
-# define PLATFORM_DEFAULT_SCSI_SPEED_SETTING 20
+
 
 #elif defined(BLUESCSI_BLASTER)
 # define PLATFORM_NAME "BlueSCSI Blaster"

+ 16 - 2
lib/BlueSCSI_platform_RP2MCU/audio_spdif.cpp

@@ -347,7 +347,7 @@ void audio_dma_irq() {
 }
 
 bool audio_is_active() {
-    return audio_owner != 0xFF;
+    return audio_owner != 0xFF && g_scsi_settings.getSystem()->enableCDAudio;
 }
 
 bool audio_is_playing(uint8_t id) {
@@ -355,6 +355,20 @@ bool audio_is_playing(uint8_t id) {
 }
 
 void audio_setup() {
+    if (!g_scsi_settings.getSystem()->enableCDAudio)
+        return;
+    logmsg("BlueSCSI CD Audio Enabled - Connect DAC to BlueSCSI or use SPDIF on I2C SCL pin");
+    gpio_put(GPIO_EXP_AUDIO, true);
+    gpio_set_dir(GPIO_EXP_AUDIO, false);
+    gpio_set_pulls(GPIO_EXP_AUDIO, true, false);
+    gpio_set_function(GPIO_EXP_AUDIO, GPIO_FUNC_SPI);
+    gpio_set_slew_rate(GPIO_EXP_AUDIO, GPIO_SLEW_RATE_FAST);
+
+    gpio_put(GPIO_EXP_SPARE, true);
+    gpio_set_dir(GPIO_EXP_SPARE, false);
+    gpio_set_pulls(GPIO_EXP_SPARE, true, false);
+    gpio_set_function(GPIO_EXP_SPARE, GPIO_FUNC_SIO);
+
     // setup SPI to blast S/PDIF data over the TX pin
     spi_set_baudrate(AUDIO_SPI, 5644800); // will be slightly wrong, ~0.03% slow
     hw_write_masked(&spi_get_hw(AUDIO_SPI)->cr0,
@@ -371,7 +385,7 @@ void audio_setup() {
 }
 
 void audio_poll() {
-    if (!audio_is_active()) return;
+    if (!audio_is_active() || !g_scsi_settings.getSystem()->enableCDAudio) return;
     if (audio_paused) return;
     if (fleft == 0 && sbufst_a == STALE && sbufst_b == STALE) {
         // out of data and ready to stop

+ 94 - 16
lib/BlueSCSI_platform_RP2MCU/timings_RP2MCU.c

@@ -343,7 +343,7 @@ static bluescsi_timings_t  predefined_timings[]  = {
             .audio_clocked = false,
         }
     },
-    // predefined_timings[5] - 155250000 - Default clocks for Blaster I2S Audio
+    // predefined_timings[5] - 155250000 - Default clock for RP235X with external RM2
     {
         .clk_hz = 155250000,
 
@@ -607,14 +607,78 @@ static bluescsi_timings_t  predefined_timings[]  = {
             .audio_clocked = true,
         }
     },
-    
+    // predefined_timings[9] - 203200000 - Base clock for RP2040, compatible with I2S and SPDIF over SPI
+    {
+        .clk_hz = 203200000,
+
+        .pll =
+        {
+            .refdiv = 3,
+            .vco_freq = 1016000000,
+            .post_div1 = 5,
+            .post_div2 = 1
+        },
+
+        .scsi =
+        {
+            .req_delay = 12,
+            .clk_period_ps = 4921
+        },
+
+        .scsi_20 =
+        {
+            .delay0 = 2 - 1,
+            .delay1 = 5 - 1,
+            .total_period_adjust = 0,
+            .rdelay1 = 7 - 1,
+            .rtotal_period_adjust = 1,
+            .max_sync = 12,
+
+        },
+
+        .scsi_10 =
+        {
+            .delay0 = 5 - 1,
+            .delay1 = 9 - 1,
+            .total_period_adjust = 0,
+            .rdelay1 = 9 - 1,
+            .rtotal_period_adjust = 0,
+            .max_sync = 25,
+
+        },
+
+        .scsi_5 =
+        {
+            .delay0 = 5 - 1,
+            .delay1 = 10 - 1,
+            .total_period_adjust = 0,
+            .rdelay1 = 10 - 1,
+            .rtotal_period_adjust = 0,
+            .max_sync = 50,
+            .clkdiv = 2,
+        },
+
+        .sdio =
+        {
+            .clk_div_1mhz = 30,
+            .clk_div_pio = 5,
+            .delay0 = 4 - 1, // subtract one for the instruction delay
+            .delay1 = 1 - 1  // clk_div_pio - delay0 and subtract one for the instruction delay
+        },
+
+        .audio =
+        {
+            // Divider for 44.1KHz to the nearest integer with a sys clk divided by 2 x 16-bit samples with the pio clock running 2x I2S clock
+            // 200.4Mhz / 16 / 2 / 2 / 44.1KHz = 71.003 ~= 71
+            .clk_div_pio = 72,
+            .audio_clocked = true,
+        }
+    },
+
+
 };
 
-#ifdef ENABLE_AUDIO_OUTPUT_SPDIF
-bluescsi_timings_t *g_bluescsi_timings = &predefined_timings[2];
-#elif defined(ENABLE_AUDIO_OUTPUT_I2S)
-bluescsi_timings_t *g_bluescsi_timings = &predefined_timings[7];
-#elif defined(BLUESCSI_MCU_RP23XX)
+#ifdef BLUESCSI_MCU_RP23XX
 bluescsi_timings_t *g_bluescsi_timings = &predefined_timings[3];
 #elif defined(BLUESCSI_PICO)
 bluescsi_timings_t *g_bluescsi_timings = &predefined_timings[1];
@@ -641,20 +705,24 @@ bool set_timings(bluescsi_speed_grade_t speed_grade)
         timings_index = 5;
         break;
     case SPEED_GRADE_AUDIO_SPDIF:
-        timings_index = 2;
+        timings_index = 9;
         break;
-    case SPEED_GRADE_200MHZ:
     case SPEED_GRADE_AUDIO_I2S:
-        timings_index = 7;
+        timings_index = 5;
         break;
     case SPEED_GRADE_WIFI_RM2:
+        timings_index = 3;
+        break;
+    case SPEED_GRADE_BASE_203MHZ:
+        timings_index = 9;
+        break;
+    case SPEED_GRADE_BASE_155MHZ:
         timings_index = 5;
 #elif defined(BLUESCSI_MCU_RP23XX)
     case SPEED_GRADE_MAX:
     case SPEED_GRADE_A:
         timings_index = 4;
         break;
-    case SPEED_GRADE_200MHZ:
     case SPEED_GRADE_B:
         timings_index = 7;
         break;
@@ -662,13 +730,19 @@ bool set_timings(bluescsi_speed_grade_t speed_grade)
         timings_index  = 6;
         break;
     case SPEED_GRADE_AUDIO_SPDIF:
-        timings_index = 2;
+        timings_index = 9;
         break;
     case SPEED_GRADE_AUDIO_I2S:
+        timings_index  =9;
+        break;
+    case SPEED_GRADE_BASE_203MHZ:
+        timings_index = 9;
+        break;
+    case SPEED_GRADE_BASE_155MHZ:
         timings_index = 5;
         break;
 #else
-case SPEED_GRADE_MAX:
+    case SPEED_GRADE_MAX:
     case SPEED_GRADE_A:
         timings_index = 4;
         break;
@@ -679,13 +753,17 @@ case SPEED_GRADE_MAX:
         timings_index  = 1;
         break;
     case SPEED_GRADE_AUDIO_SPDIF:
-        timings_index = 2;
+        timings_index = 9;
         break;
     case SPEED_GRADE_AUDIO_I2S:
+        timings_index = 9;
+        break;
+    case SPEED_GRADE_BASE_203MHZ:
+        timings_index = 9;
+        break;
+    case SPEED_GRADE_BASE_155MHZ:
         timings_index = 5;
         break;
-    case SPEED_GRADE_200MHZ:
-        timings_index = 7;
 #endif
         default:
             break;

+ 24 - 10
src/BlueSCSI_cdrom.cpp

@@ -1382,7 +1382,30 @@ void cdromGetAudioPlaybackStatus(uint8_t *status, uint32_t *current_lba, bool cu
 
 static void doPlayAudio(uint32_t lba, uint32_t length)
 {
-#if defined(ENABLE_AUDIO_OUTPUT) && !defined(BLUESCSI_BLASTER)
+#ifdef ENABLE_AUDIO_OUTPUT
+    if (!g_scsi_settings.getSystem()->enableCDAudio)
+    {
+        dbgmsg("---- Audio disabled in ", CONFIGFILE);
+#else
+    {
+        dbgmsg("---- Target does not support audio playback");
+#endif
+        // per SCSI-2, targets not supporting audio respond to zero-length
+        // PLAY AUDIO commands with ILLEGAL REQUEST; this seems to be a check
+        // performed by at least some audio playback software
+        scsiDev.status = CHECK_CONDITION;
+        scsiDev.target->sense.code = ILLEGAL_REQUEST;
+        scsiDev.target->sense.asc = 0x0000; // NO ADDITIONAL SENSE INFORMATION
+        scsiDev.phase = STATUS;
+        return;
+// Just balancing curly braces for IDE like vscode
+#ifdef ENABLE_AUDIO_OUTPUT
+    }
+#else
+    }
+#endif
+
+#if defined(ENABLE_AUDIO_OUTPUT) && !defined(ZULUSCSI_BLASTER)
     dbgmsg("------ CD-ROM Play Audio request at ", lba, " for ", length, " sectors");
     image_config_t &img = *(image_config_t*)scsiDev.target->cfg;
     uint8_t target_id = img.scsiId & 7;
@@ -1490,15 +1513,6 @@ static void doPlayAudio(uint32_t lba, uint32_t length)
         scsiDev.target->sense.asc = 0x6400; // ILLEGAL MODE FOR THIS TRACK
         scsiDev.phase = STATUS;
     }
-#else
-    dbgmsg("---- Target does not support audio playback");
-    // per SCSI-2, targets not supporting audio respond to zero-length
-    // PLAY AUDIO commands with ILLEGAL REQUEST; this seems to be a check
-    // performed by at least some audio playback software
-    scsiDev.status = CHECK_CONDITION;
-    scsiDev.target->sense.code = ILLEGAL_REQUEST;
-    scsiDev.target->sense.asc = 0x0000; // NO ADDITIONAL SENSE INFORMATION
-    scsiDev.phase = STATUS;
 #endif
 }
 

+ 4 - 4
src/BlueSCSI_settings.cpp

@@ -315,18 +315,18 @@ scsi_system_settings_t *BlueSCSISettings::initSystem(const char *presetName)
     cfgSys.mapLunsToIDs = false;
     cfgSys.enableParity = true;
     cfgSys.useFATAllocSize = false;
+#ifdef BLUESCSI_MCU_RP20XX
     cfgSys.enableCDAudio = false;
+#else
+    cfgSys.enableCDAudio = true;
+#endif
     cfgSys.maxVolume = 100;
     cfgSys.enableUSBMassStorage = true;
     cfgSys.usbMassStorageWaitPeriod = 1000;
     cfgSys.usbMassStoragePresentImages = false;
     cfgSys.invertStatusLed = false;
 
-#if defined(BLUESCSI_MCU_RP23XX) || defined(BLUESCSI_MCU_RP20XX)
-    cfgSys.speedGrade = bluescsi_speed_grade_t::SPEED_GRADE_200MHZ;
-#else
     cfgSys.speedGrade = bluescsi_speed_grade_t::SPEED_GRADE_DEFAULT;
-#endif
 
     // setting set for all or specific devices
     cfgDev.deviceType = S2S_CFG_NOT_SET;

+ 2 - 1
src/BlueSCSI_settings.h

@@ -35,7 +35,8 @@ typedef enum
     SPEED_GRADE_B,
     SPEED_GRADE_C,
     SPEED_GRADE_WIFI_RM2,
-    SPEED_GRADE_200MHZ,
+    SPEED_GRADE_BASE_203MHZ,
+    SPEED_GRADE_BASE_155MHZ,
 } bluescsi_speed_grade_t;
 
 #ifdef __cplusplus