コード例 #1
0
ファイル: spi_flash.c プロジェクト: Lstt2005/esp8266web
/******************************************************************************
 * 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();
}
コード例 #2
0
ファイル: spi_flash.c プロジェクト: pvvx/SDKnoWiFi
/******************************************************************************
 * 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();
	}
コード例 #3
0
//=============================================================================
// Инициализация 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();
}
コード例 #4
0
ファイル: app_main.c プロジェクト: itmaktub/esp8266web
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();
}		
コード例 #5
0
ファイル: app_main.c プロジェクト: diannt/esp8266web
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();
}		
コード例 #6
0
ファイル: spi_flash.c プロジェクト: Lstt2005/esp8266web
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();
	}