Petteri Aimonen 3 жил өмнө
parent
commit
90525adad7

+ 22 - 60
lib/AzulSCSI_platform_GD32F205/gd32_sdio_sdcard.c

@@ -146,10 +146,6 @@ static sd_error_enum sd_scr_get(uint16_t rca, uint32_t *pscr);
 /* get the data block size */
 static uint32_t sd_datablocksize_get(uint16_t bytesnumber);
 
-/* configure the GPIO of SDIO interface */
-static void gpio_config(void);
-/* configure the RCU of SDIO and DMA */
-static void rcu_config(void);
 /* configure the DMA for SDIO transfer request */
 static void dma_transfer_config(uint32_t *srcbuf, uint32_t bufsize);
 /* configure the DMA for SDIO receive request */
@@ -165,8 +161,6 @@ sd_error_enum sd_init(void)
 {
     sd_error_enum status = SD_OK;
     /* configure the RCU and GPIO, deinitialize the SDIO */
-    rcu_config();
-    gpio_config();
     sdio_deinit();
 
     /* configure the clock and work voltage */
@@ -435,7 +429,7 @@ sd_error_enum sd_transfer_mode_config(uint32_t txmode)
     \param[in]  blocksize: the data block size
     \retval     sd_error_enum
 */
-sd_error_enum sd_block_read(uint32_t *preadbuffer, uint32_t readaddr, uint16_t blocksize)
+sd_error_enum sd_block_read(uint32_t *preadbuffer, uint64_t readaddr, uint16_t blocksize)
 {
     /* initialize the variables */
     sd_error_enum status = SD_OK;
@@ -567,7 +561,7 @@ sd_error_enum sd_block_read(uint32_t *preadbuffer, uint32_t readaddr, uint16_t b
     \param[in]  blocksnumber: number of blocks that will be read
     \retval     sd_error_enum
 */
-sd_error_enum sd_multiblocks_read(uint32_t *preadbuffer, uint32_t readaddr, uint16_t blocksize, uint32_t blocksnumber)
+sd_error_enum sd_multiblocks_read(uint32_t *preadbuffer, uint64_t readaddr, uint16_t blocksize, uint32_t blocksnumber)
 {
     /* initialize the variables */
     sd_error_enum status = SD_OK;
@@ -727,7 +721,7 @@ sd_error_enum sd_multiblocks_read(uint32_t *preadbuffer, uint32_t readaddr, uint
     \param[out] none
     \retval     sd_error_enum
 */
-sd_error_enum sd_block_write(uint32_t *pwritebuffer, uint32_t writeaddr, uint16_t blocksize)
+sd_error_enum sd_block_write(uint32_t *pwritebuffer, uint64_t writeaddr, uint16_t blocksize)
 {
     /* initialize the variables */
     sd_error_enum status = SD_OK;
@@ -914,7 +908,7 @@ sd_error_enum sd_block_write(uint32_t *pwritebuffer, uint32_t writeaddr, uint16_
     \param[out] none
     \retval     sd_error_enum
 */
-sd_error_enum sd_multiblocks_write(uint32_t *pwritebuffer, uint32_t writeaddr, uint16_t blocksize, uint32_t blocksnumber)
+sd_error_enum sd_multiblocks_write(uint32_t *pwritebuffer, uint64_t writeaddr, uint16_t blocksize, uint32_t blocksnumber)
 {
     /* initialize the variables */
     sd_error_enum status = SD_OK;
@@ -1122,7 +1116,7 @@ sd_error_enum sd_multiblocks_write(uint32_t *pwritebuffer, uint32_t writeaddr, u
     \param[out] none
     \retval     sd_error_enum
 */
-sd_error_enum sd_erase(uint32_t startaddr, uint32_t endaddr)
+sd_error_enum sd_erase(uint64_t startaddr, uint64_t endaddr)
 {
     /* initialize the variables */
     sd_error_enum status = SD_OK;
@@ -1826,6 +1820,23 @@ sd_error_enum sd_card_information_get(sd_card_info_struct *pcardinfo)
     return status;
 }
 
+void sd_cid_get(uint8_t *cid)
+{
+    // SdFat expects the data in big endian format.
+    for (int i = 0; i < 16; i++)
+    {
+        cid[i] = (sd_cid[i / 4] >> (24 - (i % 4) * 8)) & 0xFF;
+    }
+}
+
+void sd_csd_get(uint8_t *csd)
+{
+    for (int i = 0; i < 16; i++)
+    {
+        csd[i] = (sd_csd[i / 4] >> (24 - (i % 4) * 8)) & 0xFF;
+    }
+}
+
 /*!
     \brief      check if the command sent error occurs
     \param[in]  none
@@ -2344,38 +2355,6 @@ static uint32_t sd_datablocksize_get(uint16_t bytesnumber)
     return DATACTL_BLKSZ(exp_val);
 }
 
-/*!
-    \brief      configure the GPIO of SDIO interface
-    \param[in]  none
-    \param[out] none
-    \retval     none
-*/
-static void gpio_config(void)
-{
-    /* configure the PB.8, PB.9, PC.6, PC.7, PC.8, PC.9, PC.10, PC.11, PC.12 and PD.2 */
-    gpio_init(GPIOB, GPIO_MODE_AF_PP, GPIO_OSPEED_10MHZ, GPIO_PIN_8 | GPIO_PIN_9);
-    gpio_init(GPIOC, GPIO_MODE_AF_PP, GPIO_OSPEED_10MHZ, GPIO_PIN_6 | GPIO_PIN_7 | GPIO_PIN_8 |
-              GPIO_PIN_9 | GPIO_PIN_10 | GPIO_PIN_11 | GPIO_PIN_12);
-    gpio_init(GPIOD, GPIO_MODE_AF_PP, GPIO_OSPEED_10MHZ, GPIO_PIN_2);
-}
-
-/*!
-    \brief      configure the RCU of SDIO and DMA
-    \param[in]  none
-    \param[out] none
-    \retval     none
-*/
-static void rcu_config(void)
-{
-    rcu_periph_clock_enable(RCU_GPIOB);
-    rcu_periph_clock_enable(RCU_GPIOC);
-    rcu_periph_clock_enable(RCU_GPIOD);
-    rcu_periph_clock_enable(RCU_AF);
-
-    rcu_periph_clock_enable(RCU_SDIO);
-    rcu_periph_clock_enable(RCU_DMA1);
-}
-
 /*!
     \brief      configure the DMA1 channel 3 for transferring data
     \param[in]  srcbuf: a pointer point to a buffer which will be transferred
@@ -2443,20 +2422,3 @@ static void dma_receive_config(uint32_t *dstbuf, uint32_t bufsize)
     dma_circulation_disable(DMA1, DMA_CH3);
     dma_channel_enable(DMA1, DMA_CH3);
 }
-
-sd_error_enum sd_card_read_ocr(uint32_t *ocr)
-{
-    sd_error_enum status = SD_OK;
-
-    sdio_command_response_config(SD_CMD_READ_OCR, 0, SDIO_RESPONSETYPE_SHORT);
-    sdio_wait_type_set(SDIO_WAITTYPE_NO);
-    sdio_csm_enable();
-    /* check if some error occurs */
-    status = r3_error_check();
-    if(SD_OK != status) {
-        return status;
-    }
-    
-    *ocr = sdio_response_get(SDIO_RESPONSE0);
-    return SD_OK;
-}

+ 8 - 7
lib/AzulSCSI_platform_GD32F205/gd32_sdio_sdcard.h

@@ -73,7 +73,6 @@ extern "C" {
 #define SD_CMD_LOCK_UNLOCK                    ((uint8_t)42)  /* CMD42, LOCK_UNLOCK */
 #define SD_CMD_APP_CMD                        ((uint8_t)55)  /* CMD55, APP_CMD */
 #define SD_CMD_GEN_CMD                        ((uint8_t)56)  /* CMD56, GEN_CMD */
-#define SD_CMD_READ_OCR                       ((uint8_t)58)
 
 /* SD memory card application specific commands index */
 #define SD_APPCMD_SET_BUS_WIDTH               ((uint8_t)6)   /* ACMD6, SET_BUS_WIDTH */
@@ -229,15 +228,15 @@ sd_error_enum sd_bus_mode_config(uint32_t busmode);
 sd_error_enum sd_transfer_mode_config(uint32_t txmode);
 
 /* read a block data into a buffer from the specified address of a card */
-sd_error_enum sd_block_read(uint32_t *preadbuffer, uint32_t readaddr, uint16_t blocksize);
+sd_error_enum sd_block_read(uint32_t *preadbuffer, uint64_t readaddr, uint16_t blocksize);
 /* read multiple blocks data into a buffer from the specified address of a card */
-sd_error_enum sd_multiblocks_read(uint32_t *preadbuffer, uint32_t readaddr, uint16_t blocksize, uint32_t blocksnumber);
+sd_error_enum sd_multiblocks_read(uint32_t *preadbuffer, uint64_t readaddr, uint16_t blocksize, uint32_t blocksnumber);
 /* write a block data to the specified address of a card */
-sd_error_enum sd_block_write(uint32_t *pwritebuffer, uint32_t writeaddr, uint16_t blocksize);
+sd_error_enum sd_block_write(uint32_t *pwritebuffer, uint64_t writeaddr, uint16_t blocksize);
 /* write multiple blocks data to the specified address of a card */
-sd_error_enum sd_multiblocks_write(uint32_t *pwritebuffer, uint32_t writeaddr, uint16_t blocksize, uint32_t blocksnumber);
+sd_error_enum sd_multiblocks_write(uint32_t *pwritebuffer, uint64_t writeaddr, uint16_t blocksize, uint32_t blocksnumber);
 /* erase a continuous area of a card */
-sd_error_enum sd_erase(uint32_t startaddr, uint32_t endaddr);
+sd_error_enum sd_erase(uint64_t startaddr, uint64_t endaddr);
 /* process all the interrupts which the corresponding flags are set */
 sd_error_enum sd_interrupts_process(void);
 
@@ -259,7 +258,9 @@ uint32_t sd_card_capacity_get(void);
 /* get the detailed information of the SD card based on received CID and CSD */
 sd_error_enum sd_card_information_get(sd_card_info_struct *pcardinfo);
 
-sd_error_enum sd_card_read_ocr(uint32_t *ocr);
+/* Get card information in raw format */
+void sd_cid_get(uint8_t *cid);
+void sd_csd_get(uint8_t *csd);
 
 #ifdef __cplusplus
 }

+ 34 - 11
lib/AzulSCSI_platform_GD32F205/sd_card_sdio.cpp

@@ -27,8 +27,19 @@ static bool logSDError(int line)
 
 bool SdioCard::begin(SdioConfig sdioConfig)
 {
-    return checkReturnOk(sd_init())
-        && checkReturnOk(sd_card_information_get(&g_sdio_card_info))
+    rcu_periph_clock_enable(RCU_SDIO);
+    rcu_periph_clock_enable(RCU_DMA1);
+    nvic_irq_enable(SDIO_IRQn, 0, 0);
+
+    g_sdio_error = sd_init();
+    if (g_sdio_error != SD_OK)
+    {
+        // Don't spam the log when main program polls for card insertion.
+        azdbg("sd_init() failed: ", (int)g_sdio_error);
+        return false;
+    }
+
+    return checkReturnOk(sd_card_information_get(&g_sdio_card_info))
         && checkReturnOk(sd_card_select_deselect(g_sdio_card_info.card_rca))
         && checkReturnOk(sd_cardstatus_get(&g_sdio_card_status))
         && checkReturnOk(sd_bus_mode_config(SDIO_BUSMODE_4BIT))
@@ -65,19 +76,21 @@ uint32_t SdioCard::kHzSdClk()
 
 bool SdioCard::readCID(cid_t* cid)
 {
-    memcpy(cid, &g_sdio_card_info.card_cid, sizeof(cid_t));
+    sd_cid_get((uint8_t*)cid);
     return true;
 }
 
 bool SdioCard::readCSD(csd_t* csd)
 {
-    memcpy(csd, &g_sdio_card_info.card_csd, sizeof(csd_t));
+    sd_csd_get((uint8_t*)csd);
     return true;
 }
 
 bool SdioCard::readOCR(uint32_t* ocr)
 {
-    return checkReturnOk(sd_card_read_ocr(ocr));
+    // SDIO mode does not have CMD58, but main program uses this to
+    // poll for card presence. Return status register instead.
+    return sd_cardstatus_get(ocr) == SD_OK;
 }
 
 bool SdioCard::readData(uint8_t* dst)
@@ -88,12 +101,12 @@ bool SdioCard::readData(uint8_t* dst)
 
 bool SdioCard::readSector(uint32_t sector, uint8_t* dst)
 {
-    return checkReturnOk(sd_block_read((uint32_t*)dst, sector, 512));
+    return checkReturnOk(sd_block_read((uint32_t*)dst, sector * 512, 512));
 }
 
 bool SdioCard::readSectors(uint32_t sector, uint8_t* dst, size_t n)
 {
-    return checkReturnOk(sd_multiblocks_read((uint32_t*)dst, sector, 512, n));
+    return checkReturnOk(sd_multiblocks_read((uint32_t*)dst, sector * 512, 512, n));
 }
 
 bool SdioCard::readStart(uint32_t sector)
@@ -151,7 +164,11 @@ bool SdioCard::stopTransmission(bool blocking)
 
 bool SdioCard::syncDevice()
 {
-    return stopTransmission(true);
+    if (sd_transfer_state_get() != SD_NO_TRANSFER)
+    {
+        return stopTransmission(true);
+    }
+    return true;
 }
 
 uint8_t SdioCard::type() const
@@ -172,12 +189,12 @@ bool SdioCard::writeData(const uint8_t* src)
 
 bool SdioCard::writeSector(uint32_t sector, const uint8_t* src)
 {
-    return checkReturnOk(sd_block_write((uint32_t*)src, sector, 512));
+    return checkReturnOk(sd_block_write((uint32_t*)src, sector * 512, 512));
 }
 
 bool SdioCard::writeSectors(uint32_t sector, const uint8_t* src, size_t n)
 {
-    return checkReturnOk(sd_multiblocks_write((uint32_t*)src, sector, 512, n));
+    return checkReturnOk(sd_multiblocks_write((uint32_t*)src, sector * 512, 512, n));
 }
 
 bool SdioCard::writeStart(uint32_t sector)
@@ -194,7 +211,7 @@ bool SdioCard::writeStop()
 
 bool SdioCard::erase(uint32_t firstSector, uint32_t lastSector)
 {
-    return checkReturnOk(sd_erase(firstSector, lastSector));
+    return checkReturnOk(sd_erase(firstSector * 512, lastSector * 512));
 }
 
 
@@ -208,4 +225,10 @@ void azplatform_set_sd_callback(sd_callback_t func, const uint8_t *buffer)
 void sdCsInit(SdCsPin_t pin) {}
 void sdCsWrite(SdCsPin_t pin, bool level) {}
 
+// Interrupt handler for SDIO
+extern "C" void SDIO_IRQHandler(void)
+{
+    sd_interrupts_process();
+}
+
 #endif

+ 4 - 0
src/AzulSCSI.cpp

@@ -114,6 +114,10 @@ void init_logfile()
   bool truncate = first_open_after_boot;
   int flags = O_WRONLY | O_CREAT | (truncate ? O_TRUNC : O_APPEND);
   g_logfile = SD.open(LOGFILE, flags);
+  if (!g_logfile.isOpen())
+  {
+    azlog("Failed to open log file: ", SD.sdErrorCode());
+  }
   save_logfile(true);
 
   first_open_after_boot = false;

+ 1 - 1
src/AzulSCSI_bootloader.cpp

@@ -84,7 +84,7 @@ int bootloader_main(void)
 
     azlog("Bootloader version: " __DATE__ " " __TIME__ " " PLATFORM_NAME);
 
-    if (SD.begin(SD_CONFIG))
+    if (SD.begin(SD_CONFIG) || SD.begin(SD_CONFIG))
     {
         FsFile fwfile;
         char name[MAX_FILE_PATH + 1];

+ 1 - 1
src/build_bootloader.py

@@ -21,7 +21,7 @@ for nodelist in env["PIOBUILDFILES"]:
         filename = str(node.rfile())
         if 'AzulSCSI_main.o' not in filename:
             dep_objs.append(node)
-print("Bootloader dependencies: ", type(dep_objs), str([str(f.rfile()) for f in dep_objs]))
+# print("Bootloader dependencies: ", type(dep_objs), str([str(f.rfile()) for f in dep_objs]))
 
 # Build bootloader.elf
 bootloader_elf = env2.Program(

+ 17 - 0
utils/run_gdb_v1_1.sh

@@ -0,0 +1,17 @@
+#!/bin/bash
+
+# This script runs GDB with openocd and stlink to
+# allow debugging and seeing the SWO log output in realtime.
+
+killall orbuculum
+killall orbcat
+rm -f swo.log
+
+arm-none-eabi-gdb \
+       -iex 'target extended | openocd -f interface/stlink.cfg -f target/stm32f1x.cfg -c "gdb_port pipe"' \
+       -iex 'mon reset_config srst_only' \
+       -iex 'mon halt' \
+       -iex 'mon tpiu config internal swo.log uart false 38400000 2000000' \
+       -iex 'shell bash -m -c "orbuculum -f swo.log &"' \
+       -iex 'shell bash -m -c "orbcat -c 0,%c &"' \
+       .pio/build/AzulSCSIv1_1/firmware.elf