Forráskód Böngészése

RP2MCU: Fix timings for synchronous reads from SCSI

With rtotal_period_adjust declared as uint8_t, the value -1 was
turned into 255, which slowed down synchronous reads from SCSI
bus unnecessarily (affects writes to ZuluSCSI).

Instead applied a clock rate dependent limit to avoid DMA overrun
in the reception code.
Petteri Aimonen 7 hónapja
szülő
commit
38e481e90f

+ 11 - 1
lib/ZuluSCSI_platform_RP2MCU/scsi_accel_target.cpp

@@ -1154,6 +1154,7 @@ void scsi_accel_rp2040_init()
     channel_config_set_transfer_data_size(&cfg, DMA_SIZE_32);
     channel_config_set_read_increment(&cfg, false);
     channel_config_set_write_increment(&cfg, false);
+    channel_config_set_high_priority(&cfg, true);
     channel_config_set_dreq(&cfg, pio_get_dreq(SCSI_DMA_PIO, SCSI_DATA_SM, false));
     g_scsi_dma.dmacfg_read_chC = cfg;
 
@@ -1250,7 +1251,7 @@ bool scsi_accel_rp2040_setSyncMode(int syncOffset, int syncPeriod)
                 totalPeriod += g_zuluscsi_timings->scsi_20.total_period_adjust;
                 delay0 = g_zuluscsi_timings->scsi_20.delay0; //Data setup time, should be min 11.5ns according to the spec for FAST-20
                 delay1 = g_zuluscsi_timings->scsi_20.delay1; //pulse width, should be min 15ns according to the spec for FAST-20
-                delay2 = totalPeriod - delay0 - delay1 - 3;  //Data hold time, should be min 16.5ns according to the spec for FAST-20
+                delay2 = totalPeriod - delay0 - delay1 - 3;  //Data hold time, should be min 16.5ns from REQ falling edge according to the spec for FAST-20
                 if (delay2 < 0) delay2 = 0;
                 if (delay2 > 15) delay2 = 15;
                 rdelay1 = g_zuluscsi_timings->scsi_20.rdelay1;
@@ -1292,6 +1293,15 @@ bool scsi_accel_rp2040_setSyncMode(int syncOffset, int syncPeriod)
             SCSI_DMA_PIO->instr_mem[g_scsi_dma.pio_offset_sync_write + 1] = instr1;
             SCSI_DMA_PIO->instr_mem[g_scsi_dma.pio_offset_sync_write + 2] = instr2;
 
+            // The DMA-based parity verification method will start dropping bytes
+            // if total period for read from SCSI bus is less than 13 clock cycles.
+            // Limit it to 14 to be safe.
+#ifdef ZULUSCSI_MCU_RP23XX
+            if (rtotalPeriod < 14) rtotalPeriod = 14;
+#else
+            if (rtotalPeriod < 18) rtotalPeriod = 18; // RP2040 DMA is slightly slower
+#endif
+
             // And similar patching for scsi_sync_read_pacer
             int rdelay0 = rtotalPeriod - rdelay1 - 2;
             if (rdelay0 > 15) rdelay0 = 15;

+ 34 - 34
lib/ZuluSCSI_platform_RP2MCU/timings_RP2MCU.c

@@ -46,10 +46,10 @@ static zuluscsi_timings_t  predefined_timings[]  = {
         .scsi_20 =
         {
             .delay0 = 3 - 1,
-            .delay1 = 3 - 1,
+            .delay1 = 4 - 1,
             .total_period_adjust = -1,
-            .rdelay1 = 3 - 1,
-            .rtotal_period_adjust = -1,
+            .rdelay1 = 5 - 1,
+            .rtotal_period_adjust = 0,
             .max_sync = 12,
         },
 
@@ -59,7 +59,7 @@ static zuluscsi_timings_t  predefined_timings[]  = {
             .delay1 = 7 - 1,
             .total_period_adjust = -1,
             .rdelay1 = 6,
-            .rtotal_period_adjust = -1,
+            .rtotal_period_adjust = 0,
             .max_sync = 25,
         },
 
@@ -69,7 +69,7 @@ static zuluscsi_timings_t  predefined_timings[]  = {
             .delay1 = 15 - 1,
             .total_period_adjust = -1,
             .rdelay1 = 15 - 1,
-            .rtotal_period_adjust = -1,
+            .rtotal_period_adjust = 0,
             .max_sync = 50,
         },
 
@@ -108,10 +108,10 @@ static zuluscsi_timings_t  predefined_timings[]  = {
         .scsi_20 =
         {
             .delay0 = 3 - 1,
-            .delay1 = 3 - 1,
+            .delay1 = 4 - 1,
             .total_period_adjust = -1,
-            .rdelay1 = 3 - 1,
-            .rtotal_period_adjust = -1,
+            .rdelay1 = 5 - 1,
+            .rtotal_period_adjust = 1,
             .max_sync = 12,
         },
 
@@ -170,10 +170,10 @@ static zuluscsi_timings_t  predefined_timings[]  = {
         .scsi_20 =
         {
             .delay0 = 3 - 1,
-            .delay1 = 3 - 1,
+            .delay1 = 4 - 1,
             .total_period_adjust = -1,
-            .rdelay1 = 3 - 1,
-            .rtotal_period_adjust = -1,
+            .rdelay1 = 5 - 1,
+            .rtotal_period_adjust = 1,
             .max_sync = 12,
         },
 
@@ -183,7 +183,7 @@ static zuluscsi_timings_t  predefined_timings[]  = {
             .delay1 = 7 - 1,
             .total_period_adjust = -1,
             .rdelay1 = 7 - 1,
-            .rtotal_period_adjust = -1,
+            .rtotal_period_adjust = 0,
             .max_sync = 25,
         },
 
@@ -193,7 +193,7 @@ static zuluscsi_timings_t  predefined_timings[]  = {
             .delay1 = 15 - 1,
             .total_period_adjust = -1,
             .rdelay1 = 15 - 1,
-            .rtotal_period_adjust = -1,
+            .rtotal_period_adjust = 0,
             .max_sync = 50,
         },
 
@@ -235,10 +235,10 @@ static zuluscsi_timings_t  predefined_timings[]  = {
         .scsi_20 =
         {
             .delay0 = 2 - 1,
-            .delay1 = 3 - 1,
+            .delay1 = 4 - 1,
             .total_period_adjust = 0,
-            .rdelay1 = 3 - 1,
-            .rtotal_period_adjust = -1,
+            .rdelay1 = 5 - 1,
+            .rtotal_period_adjust = 1,
             .max_sync = 12,
 
         },
@@ -300,10 +300,10 @@ static zuluscsi_timings_t  predefined_timings[]  = {
         .scsi_20 =
         {
             .delay0 = 3 - 1,
-            .delay1 = 5 - 1,
+            .delay1 = 7 - 1,
             .total_period_adjust = 1,
-            .rdelay1 = 5 - 1,
-            .rtotal_period_adjust = -1,
+            .rdelay1 = 7 - 1,
+            .rtotal_period_adjust = 0,
             .max_sync = 12,
 
         },
@@ -363,10 +363,10 @@ static zuluscsi_timings_t  predefined_timings[]  = {
         .scsi_20 =
         {
             .delay0 = 2 - 1,
-            .delay1 = 3 - 1,
+            .delay1 = 4 - 1,
             .total_period_adjust = 0,
-            .rdelay1 = 3 - 1,
-            .rtotal_period_adjust = -1,
+            .rdelay1 = 5 - 1,
+            .rtotal_period_adjust = 0,
             .max_sync = 12,
 
         },
@@ -431,10 +431,10 @@ static zuluscsi_timings_t  predefined_timings[]  = {
         .scsi_20 =
         {
             .delay0 = 3 - 1,
-            .delay1 = 4 - 1,
+            .delay1 = 5 - 1,
             .total_period_adjust = -1,
-            .rdelay1 = 3 - 1,
-            .rtotal_period_adjust = -1,
+            .rdelay1 = 5 - 1,
+            .rtotal_period_adjust = 1,
             .max_sync = 12,
         },
 
@@ -495,11 +495,11 @@ static zuluscsi_timings_t  predefined_timings[]  = {
 
         .scsi_20 =
         {
-            .delay0 = 3 - 1,
-            .delay1 = 4 - 1,
-            .total_period_adjust = 1,
-            .rdelay1 = 5 - 1,
-            .rtotal_period_adjust = -1,
+            .delay0 = 2 - 1,
+            .delay1 = 5 - 1,
+            .total_period_adjust = 0,
+            .rdelay1 = 7 - 1,
+            .rtotal_period_adjust = 1,
             .max_sync = 12,
 
         },
@@ -563,10 +563,10 @@ static zuluscsi_timings_t  predefined_timings[]  = {
         .scsi_20 =
         {
             .delay0 = 3 - 1,
-            .delay1 = 5 - 1,
+            .delay1 = 7 - 1,
             .total_period_adjust = 1,
-            .rdelay1 = 5 - 1,
-            .rtotal_period_adjust = -1,
+            .rdelay1 = 7 - 1,
+            .rtotal_period_adjust = 0,
             .max_sync = 12,
 
         },
@@ -693,4 +693,4 @@ case SPEED_GRADE_MAX:
         return true;
     }
     return false;
-}
+}

+ 3 - 3
lib/ZuluSCSI_platform_RP2MCU/timings_RP2MCU.h

@@ -74,7 +74,7 @@ typedef struct
     {
         uint8_t delay0;
         uint8_t delay1;
-        uint8_t rtotal_period_adjust;
+        int8_t rtotal_period_adjust;
         uint8_t rdelay1;
         int16_t total_period_adjust;
         uint8_t max_sync;
@@ -84,7 +84,7 @@ typedef struct
     {
         uint8_t delay0;
         uint8_t delay1;
-        uint8_t rtotal_period_adjust;
+        int8_t rtotal_period_adjust;
         uint8_t rdelay1;
         int16_t total_period_adjust;
         uint8_t max_sync;
@@ -94,7 +94,7 @@ typedef struct
     {
         uint8_t delay0;
         uint8_t delay1;
-        uint8_t rtotal_period_adjust;
+        int8_t rtotal_period_adjust;
         uint8_t rdelay1;
         int16_t total_period_adjust;
         uint8_t max_sync;