}
-// WARNING
-// KESTREL SPECIFIC
-#define TERCEL_SPI_REG_SYS_PHY_CFG1 0x10
-#define TERCEL_SPI_REG_SYS_FLASH_CFG5 0x24
-#define TERCEL_SPI_PHY_CLOCK_DIVISOR_MASK 0xff
-#define TERCEL_SPI_PHY_CLOCK_DIVISOR_SHIFT 0
-#define TERCEL_SPI_FLASH_EN_MULTCYC_READ_MASK 0x1
-#define TERCEL_SPI_FLASH_EN_MULTCYC_READ_SHIFT 0
-static inline uint32_t read_tercel_register(uint8_t reg)
-{
- return readl((unsigned long)(SPI_FCTRL_BASE+reg));
-}
-
-static inline void write_tercel_register(uint8_t reg, uint32_t value)
-{
- writel(value, (unsigned long)(SPI_FCTRL_BASE+reg));
-}
-
-// TODO: need to use this
-// https://gitlab.raptorengineering.com/kestrel-collaboration/kestrel-firmware/bare-metal-firmware/-/blob/master/main.c#L2328
-
-/* this is a "level 1" speed-up, which gets an initial improvement of 10-50x
- * over the default speed (which is a scant 100 bytes per second).
- */
-static void crank_up_qspi_level1(void)
-{
- // WARNING: KESTREL SPECIFIC
- // Set SPI clock cycle divider to 1
- uint32_t dword;
- dword = read_tercel_register(TERCEL_SPI_REG_SYS_PHY_CFG1);
- dword &= ~(TERCEL_SPI_PHY_CLOCK_DIVISOR_MASK <<
- TERCEL_SPI_PHY_CLOCK_DIVISOR_SHIFT);
- dword |= ((1 & TERCEL_SPI_PHY_CLOCK_DIVISOR_MASK) <<
- TERCEL_SPI_PHY_CLOCK_DIVISOR_SHIFT);
- write_tercel_register(TERCEL_SPI_REG_SYS_PHY_CFG1, dword);
- // Enable read merging
- dword = read_tercel_register(TERCEL_SPI_REG_SYS_FLASH_CFG5);
- dword |= (TERCEL_SPI_FLASH_EN_MULTCYC_READ_MASK <<
- TERCEL_SPI_FLASH_EN_MULTCYC_READ_SHIFT);
- write_tercel_register(TERCEL_SPI_REG_SYS_FLASH_CFG5, dword);
-}
+extern void crank_up_qspi_level1(void);
+extern int host_spi_flash_init(void);
static bool fl_read(void *dst, uint32_t offset, uint32_t size)
{
puts("\r\n");
if (ftr & SYS_REG_INFO_HAS_SPI_FLASH) {
- // speed up the QSPI to at least a sane level
- crank_up_qspi_level1();
-
puts("SPI Offset: ");
spi_offs = readl(SYSCON_BASE + SYS_REG_SPI_INFO);
uart_writeuint32(spi_offs);
//volatile uint8_t *qspi_bytes = (uint8_t*)spi_offs;
// let's not, eh? writel(0xDEAF0123, (unsigned long)&(qspi[0]));
// tmp = readl((unsigned long)&(qspi[0]));
- for (int i=0;i<2;i++) {
+ for (int i=0;i<10;i++) {
tmp = readl((unsigned long)&(qspi[i]));
uart_writeuint32(tmp);
puts(" ");
if ((i & 0x7) == 0x7) puts("\r\n");
}
puts("\r\n");
+
+ // speed up the QSPI to at least a sane level
+ crank_up_qspi_level1();
+ // run at saner level
+ host_spi_flash_init();
+
+ puts("SPI Offset: ");
+ spi_offs = readl(SYSCON_BASE + SYS_REG_SPI_INFO);
+ uart_writeuint32(spi_offs);
+ puts("\r\n");
+
/*
for (i=0;i<256;i++) {
tmp = readb((unsigned long)&(qspi_bytes[i]));
volatile uint32_t *mem = (uint32_t*)0x1000000;
fl_read(mem, // destination in RAM
0x600000, // offset into QSPI
- 0x1000000); // length - shorter (testing) 0x8000);
+ 0x8000); // length - shorter (testing) 0x8000);
+ //0x1000000); // length
puts("dump mem\n");
for (int i=0;i<256;i++) {
tmp = readl((unsigned long)&(mem[i]));