Ver Fonte

GD32F4: Safeguard against weird DMA count values.

Haven't studied in depth, but I sometimes got 65535 here which
crashed in scsiLogDataIn() because the length became negative.
Petteri Aimonen há 2 anos atrás
pai
commit
66bc1b4f0d
1 ficheiros alterados com 8 adições e 2 exclusões
  1. 8 2
      lib/ZuluSCSI_platform_GD32F450/gd32_sdio_sdcard.c

+ 8 - 2
lib/ZuluSCSI_platform_GD32F450/gd32_sdio_sdcard.c

@@ -554,8 +554,14 @@ sd_error_enum sd_block_read(uint32_t *preadbuffer, uint64_t readaddr, uint16_t b
             }
             if (callback)
             {
-                uint32_t complete = (blocksize - DMA_CHCNT(DMA1, DMA_CH3) * 4);
-                callback(complete);
+                // FIXME: DMA_CHCNT seems to give wrong values on GD32F4
+                // Initial transfer size of e.g. 128 changes to 65535 when DMA channel is enabled.
+                uint32_t remain = DMA_CHCNT(DMA1, DMA_CH3) * 4;
+                if (remain >= 0 && remain <= blocksize)
+                {
+                    uint32_t complete = (blocksize - remain);
+                    callback(complete);
+                }
             }
         }
     } else {