From 50b6db6a6b64b54f0020b431ed286a65baa7bbe0 Mon Sep 17 00:00:00 2001 From: rob-ng15 <58272847+rob-ng15@users.noreply.github.com> Date: Tue, 17 Mar 2020 09:50:16 +0000 Subject: [PATCH] SPI hardware bitbanging from SD CARD --- litex/soc/software/bios/boot.c | 26 ++++++++++++++++++++++++++ litex/soc/software/bios/boot.h | 4 ++++ litex/soc/software/bios/main.c | 28 +++++----------------------- 3 files changed, 35 insertions(+), 23 deletions(-) diff --git a/litex/soc/software/bios/boot.c b/litex/soc/software/bios/boot.c index f49d89e49..355f20a08 100644 --- a/litex/soc/software/bios/boot.c +++ b/litex/soc/software/bios/boot.c @@ -487,3 +487,29 @@ void romboot(void) boot(0, 0, 0, ROM_BOOT_ADDRESS); } #endif + +// SPI HARDWARE BITBANG +#ifdef CSR_SPI_BASE +#include + +void spisdboot(void) +{ + printf("SD Card via SPI Initialising\n"); + if(spi_sdcard_goidle() == 0) { + printf("SD Card Timeout\n"); + return; + } + + if(spi_sdcard_readMBR() == 0) { + printf("SD Card MBR Timeout\n"); + return; + } + + if(spi_sdcard_readFile("IMAGE","",MAIN_RAM_BASE+KERNEL_IMAGE_RAM_OFFSET)==0) return; + if(spi_sdcard_readFile("ROOTFS~1","CPI",MAIN_RAM_BASE+ROOTFS_IMAGE_RAM_OFFSET)==0) return; + if(spi_sdcard_readFile("RV32","DTB",MAIN_RAM_BASE+DEVICE_TREE_IMAGE_RAM_OFFSET)==0) return; + if(spi_sdcard_readFile("EMULATOR","BIN",EMULATOR_RAM_BASE)==0) return; + + boot(0,0,0,EMULATOR_RAM_BASE + EMULATOR_IMAGE_RAM_OFFSET); +} +#endif diff --git a/litex/soc/software/bios/boot.h b/litex/soc/software/bios/boot.h index 65dcf4574..fd1d06a2e 100644 --- a/litex/soc/software/bios/boot.h +++ b/litex/soc/software/bios/boot.h @@ -6,4 +6,8 @@ void netboot(void); void flashboot(void); void romboot(void); +#ifdef CSR_SPI_BASE +void spisdboot(void); +#endif + #endif /* __BOOT_H */ diff --git a/litex/soc/software/bios/main.c b/litex/soc/software/bios/main.c index 83bff1e10..d1ca017e2 100644 --- a/litex/soc/software/bios/main.c +++ b/litex/soc/software/bios/main.c @@ -388,12 +388,8 @@ static void help(void) puts("sdinit - SDCard initialization"); puts("sdtest - SDCard test"); #endif -#ifdef USDDRPHY_DEBUG - puts(""); - puts("sdram_cdly value - Set SDRAM clk/cmd delay"); - puts("sdram_cal - run SDRAM calibration"); - puts("sdram_mpr - read SDRAM MPR"); - puts("sdram_mrwr reg value - write SDRAM mode registers"); +#ifdef CSR_SPI_BASE + puts("spisdboot - boot from SDCard via SPI hardware bitbang"); #endif } @@ -486,24 +482,10 @@ static void do_command(char *c) else if(strcmp(token, "sdinit") == 0) sdcard_init(); else if(strcmp(token, "sdtest") == 0) sdcard_test(atoi(get_token(&c))); #endif -#ifdef USDDRPHY_DEBUG - else if(strcmp(token, "sdram_cdly") == 0) - ddrphy_cdly(atoi(get_token(&c))); - else if(strcmp(token, "sdram_cal") == 0) - sdrcal(); - else if(strcmp(token, "sdram_mpr") == 0) - sdrmpr(); - else if(strcmp(token, "sdram_mrwr") == 0) { - unsigned int reg; - unsigned int value; - reg = atoi(get_token(&c)); - value = atoi(get_token(&c)); - sdrsw(); - printf("Writing 0x%04x to SDRAM mode register %d\n", value, reg); - sdrmrwr(reg, value); - sdrhw(); - } +#ifdef CSR_SPI_BASE + else if(strcmp(token, "spisdboot") == 0) spisdboot(); #endif + else if(strcmp(token, "") != 0) printf("Command not found\n"); }