/****************************************************************************** * FunctionName : Cache_Read_Enable_New * Returns : none *******************************************************************************/ void Cache_Read_Enable_New(void) { #ifdef USE_DUAL_FLASH if(dual_flash_flag) Cache_Read_Enable(1,0,1); else #endif Cache_Read_Enable_def(); }
/****************************************************************************** * FunctionName : spi_flash_read * Description : чтение массива байт из flash * читает из flash по QSPI блоками по SPI_FBLK байт * в ROM-BIOS SPI_FBLK = 32 байта, 64 - предел SPI буфера * Parameters : flash Addr, pointer, кол-во * Returns : SpiFlashOpResult 0 - ok * Опции gcc: -mno-serialize-volatile ! *******************************************************************************/ SpiFlashOpResult __attribute__((optimize("O2"))) spi_flash_read(uint32 faddr, void *des, uint32 size) { #if DEBUGSOO > 5 ets_printf("fread:%p<-%p[%u]\n", des, faddr, size); #endif if(des == NULL) return SPI_FLASH_RESULT_ERR; if(size != 0) { faddr <<= 8; faddr >>= 8; Cache_Read_Disable(); Wait_SPI_Idle(flashchip); uint32 blksize = (uint32)des & 3; if(blksize) { blksize = 4 - blksize; if(size < blksize) blksize = size; SPI0_ADDR = faddr | (blksize << 24); SPI0_CMD = SPI_READ; size -= blksize; faddr += blksize; while(SPI0_CMD); register uint32 data_buf = SPI0_W0; do { *(uint8 *)des = data_buf; des = (uint8 *)des + 1; data_buf >>= 8; } while(--blksize); } while(size) { if(size < SPI_FBLK) blksize = size; else blksize = SPI_FBLK; SPI0_ADDR = faddr | (blksize << 24); SPI0_CMD = SPI_READ; size -= blksize; faddr += blksize; while(SPI0_CMD); uint32 *srcdw = (uint32 *)(&SPI0_W0); while(blksize >> 2) { *((uint32 *)des) = *srcdw++; des = ((uint32 *)des) + 1; blksize -= 4; } if(blksize) { uint32 data_buf = *srcdw; do { *(uint8 *)des = data_buf; des = (uint8 *)des + 1; data_buf >>= 8; } while(--blksize); break; } } Cache_Read_Enable_def(); }
//============================================================================= // Инициализация QSPI и cache //----------------------------------------------------------------------------- static void set_qspi_flash_cache(void) { SPI0_USER |= SPI_CS_SETUP; // +1 такт перед CS = 0x80000064 // SPI на 80 MHz #if USE_FIX_QSPI_FLASH == 80 GPIO_MUX_CFG |= BIT(MUX_SPI0_CLK_BIT); // QSPI = 80 MHz SPI0_CTRL = (SPI0_CTRL & SPI_CTRL_F_MASK) | SPI_CTRL_F80MHZ; #else // SPI на 40 MHz GPIO_MUX_CFG &= ~(1<< MUX_SPI0_CLK_BIT); SPI0_CTRL = (SPI0_CTRL & SPI_CTRL_F_MASK) | SPI_CTRL_F40MHZ; #endif #ifdef USE_ALTBOOT #endif flashchip->chip_size = 512*1024; // песочница для SDK в 512 килобайт flash // Всё - включаем кеширование, далее можно вызывать процедуры из flash Cache_Read_Enable_def(); }
void __attribute__((section(".entry.text"))) call_user_start1(void) { SPI0_USER |= SPI_CS_SETUP; // +1 такт перед CS = 0x80000064 // SPI на 80 MHz #if USE_FIX_QSPI_FLASH == 80 GPIO_MUX_CFG |= BIT(MUX_SPI0_CLK_BIT); // QSPI = 80 MHz SPI0_CTRL = (SPI0_CTRL & SPI_CTRL_F_MASK) | SPI_CTRL_F80MHZ; #else // SPI на 40 MHz GPIO_MUX_CFG &= ~(1<< MUX_SPI0_CLK_BIT); SPI0_CTRL = (SPI0_CTRL & SPI_CTRL_F_MASK) | SPI_CTRL_F40MHZ; #endif flashchip->chip_size = 512*1024; // песочница для SDK в 512 килобайт flash // Всё - включаем кеширование, далее можно вызывать процедуры из flash Cache_Read_Enable_def(); // Инициализация startup(); // Очистка стека и передача управления в ROM-BIOS asm volatile ( "movi a2, 1;" "slli a1, a2, 30;" ); ets_run(); }
void __attribute__((section(".entry.text"))) call_user_start1(void) { // коррекция QSPI на 80 MHz SPI0_USER |= SPI_CS_SETUP; // +1 такт перед CS = 0x80000064 #if USE_FIX_QSPI_FLASH == 80 GPIO_MUX_CFG |= (1<< MUX_SPI0_CLK_BIT); // QSPI = 80 MHz SPI0_CTRL = 0x016ab000; // ((SPI0_CTRL >> 12) << 12) | BIT(12); #else GPIO_MUX_CFG &= 0xfffffeff; SPI0_CTRL = 0x016aa101; #endif flashchip->chip_size = 512*1024; // песочница для SDK в 512 килобайт flash // Всё - включаем кеширование, далее можно вызывать процедуры из flash Cache_Read_Enable_def(); // Инициализация startup(); // Очистка стека и передача управления в ROM-BIOS asm volatile ( "movi a2, 1;" "slli a1, a2, 30;" ); ets_run(); }
SpiFlashOpResult __attribute__((optimize("O3"))) spi_flash_read(uint32 faddr, void *des, uint32 size) { #if DEBUGSOO > 5 ets_printf("fread:%p<-%p[%u]\n", des, faddr, size); #endif if(des == NULL) return SPI_FLASH_RESULT_ERR; if(size != 0) { faddr <<= 8; faddr >>= 8; // faddr &= (1 << 24) - 1; // if((faddr >> 24) || ((faddr + size) >> 24)) return SPI_FLASH_RESULT_ERR; Cache_Read_Disable(); Wait_SPI_Idle(flashchip); uint32 blksize = (uint32)des & 3; if(blksize) { blksize = 4 - blksize; #if DEBUGSOO > 4 ets_printf("fr1:%p<-%p[%u]\n", des, faddr, blksize); #endif if(size < blksize) blksize = size; SPI0_ADDR = faddr | (blksize << 24); SPI0_CMD = SPI_READ; size -= blksize; faddr += blksize; while(SPI0_CMD); register uint32 data_buf = SPI0_W0; do { *(uint8 *)des = data_buf; des = (uint8 *)des + 1; data_buf >>= 8; } while(--blksize); } while(size) { if(size < SPI_FBLK) blksize = size; else blksize = SPI_FBLK; #if DEBUGSOO > 5 ets_printf("fr2:%p<-%p[%u]\n", des, faddr, blksize); #endif SPI0_ADDR = faddr | (blksize << 24); SPI0_CMD = SPI_READ; size -= blksize; faddr += blksize; while(SPI0_CMD); //__asm__ __volatile__("memw" : : : "memory"); // volatile uint32 *srcdw = (volatile uint32 *)(SPI0_BASE+0x40); uint32 *srcdw = (uint32 *)(&SPI0_W0); // uint32 *srcdw = (uint32 *)(SPI0_BASE+0x40); while(blksize >> 2) { *((uint32 *)des) = *srcdw++; des = ((uint32 *)des) + 1; blksize -= 4; } if(blksize) { #if DEBUGSOO > 4 ets_printf("fr3:%p<-%p[%u]\n", des, faddr, blksize); #endif uint32 data_buf = *srcdw; do { *(uint8 *)des = data_buf; des = (uint8 *)des + 1; data_buf >>= 8; } while(--blksize); break; } } Cache_Read_Enable_def(); }