From f8650efa3f53f6626694d7faad75946105e98036 Mon Sep 17 00:00:00 2001 From: Jacob Pease Date: Sat, 25 Feb 2023 16:32:20 -0600 Subject: [PATCH] Preliminary work on new bootloader using new SD peripheral. Rewrote copyflash to take advantage of the new peripheral. The new peripheral has the neat ability to use CMD18 in the SD card specification, allowing us to load multiple blocks in succession, ending the chain of CMD18 commands with a CMD17. --- tests/custom/boot/boot.c | 50 ++++++++++++++++++---------------------- tests/custom/boot/boot.h | 12 ++++++++++ 2 files changed, 34 insertions(+), 28 deletions(-) create mode 100644 tests/custom/boot/boot.h diff --git a/tests/custom/boot/boot.c b/tests/custom/boot/boot.c index 8546861f9..7f04c1514 100644 --- a/tests/custom/boot/boot.c +++ b/tests/custom/boot/boot.c @@ -1,4 +1,4 @@ - +#include "boot.h" /* Card type flags (card_type) */ #define CT_MMC 0x01 /* MMC ver 3 */ @@ -72,6 +72,7 @@ #define SDC_DAT_INT_STATUS_CRC 0x0008 // CRC error #define SDC_DAT_INT_STATUS_CFE 0x0010 // Data FIFO underrun or overrun + #define ERR_EOF 30 #define ERR_NOT_ELF 31 #define ERR_ELF_BITS 32 @@ -116,12 +117,7 @@ static int errno __attribute__((section(".bss"))); static DSTATUS drv_status __attribute__((section(".bss"))); static BYTE card_type __attribute__((section(".bss"))); static uint32_t response[4] __attribute__((section(".bss"))); -static FATFS fatfs __attribute__((section(".bss"))); static int alt_mem __attribute__((section(".bss"))); -static FIL fd __attribute__((section(".bss"))); - -extern unsigned char _fbss[]; -extern unsigned char _ebss[]; static const char * errno_to_str(void) { switch (errno) { @@ -252,7 +248,7 @@ static int send_data_cmd(unsigned cmd, unsigned arg, void * buf, unsigned blocks case CMD2: case CMD9: case CMD10: - // R2 + // R2 command |= 2; // 136 bits command |= 1 << 3; // resp CRC break; @@ -305,6 +301,9 @@ static int ini_sd(void) { /* Reset controller */ regs->software_reset = 1; while ((regs->software_reset & 1) == 0) {} + + // This clock divider is meant to initialize the card at + // 400kHz regs->clock_divider = 0x7c; regs->software_reset = 0; while (regs->software_reset) {} @@ -369,10 +368,16 @@ static int ini_sd(void) { return 0; } -DRESULT disk_read(BYTE drv, BYTE * buf, LBA_t sector, UINT count) { +int disk_read(BYTE * buf, LBA_t sector, UINT count) { - if (!count) return RES_PARERR; - if (drv_status & STA_NOINIT) return RES_NOTRDY; + /* This is not needed. This has everything to do with the FAT + filesystem stuff that I'm not including. All I need to do is + initialize the SD card and read from it. Anything in here that is + checking for potential errors, I'm going to have to temporarily + do without. + */ + // if (!count) return RES_PARERR; + /* if (drv_status & STA_NOINIT) return RES_NOTRDY; */ /* Convert LBA to byte address if needed */ if (!(card_type & CT_BLOCK)) sector *= 512; @@ -389,30 +394,19 @@ DRESULT disk_read(BYTE drv, BYTE * buf, LBA_t sector, UINT count) { return RES_OK; } -void disk_read(BYTE drv, BYTE * buf, LBA_t sector, UINT count) { +void copyFlash(QWORD address, QWORD * Dst, DWORD numBlocks) { + ini_sd(); - if (!count) return RES_PARERR; - if (drv_status & STA_NOINIT) return RES_NOTRDY; - - /* Convert LBA to byte address if needed */ - if (!(card_type & CT_BLOCK)) sector *= 512; - while (count > 0) { - UINT bcnt = count > MAX_BLOCK_CNT ? MAX_BLOCK_CNT : count; - unsigned bytes = bcnt * 512; - if (send_data_cmd(bcnt == 1 ? CMD17 : CMD18, sector, buf, bcnt) < 0) return RES_ERROR; - if (bcnt > 1 && send_cmd(CMD12, 0) < 0) return RES_ERROR; - sector += (card_type & CT_BLOCK) ? bcnt : bytes; - count -= bcnt; - buf += bytes; - } - - return RES_OK; + BYTE * buf = (BYTE *)Dst; + + if (disk_read(buf, (LBA_t)address, (UINT)numBlocks) < 0) /* UART Print function?*/; } +/* int main() { ini_sd(); - return 0; } +*/ diff --git a/tests/custom/boot/boot.h b/tests/custom/boot/boot.h new file mode 100644 index 000000000..ef620cda0 --- /dev/null +++ b/tests/custom/boot/boot.h @@ -0,0 +1,12 @@ +#ifndef WALLYBOOT +#define WALLYBOOT 10000 + +#include +typedef unsigned int UINT; /* int must be 16-bit or 32-bit */ +typedef unsigned char BYTE; /* char must be 8-bit */ +typedef uint16_t WORD; /* 16-bit unsigned integer */ +typedef uint32_t DWORD; /* 32-bit unsigned integer */ +typedef uint64_t QWORD; /* 64-bit unsigned integer */ +typedef WORD WCHAR; + +#endif // WALLYBOOT