📄 flash.c
字号:
continue; } else { iRes = -1; break; } } break; } } //end of while (1) { if (iRes < 0) { iTryCount++; FlashSendCmd(FLASH_CMD_RESET, 0); if (iTryCount > 10) { break; } } } // end ofwhile (dwSize0) if (iTryCount == 0) break; } //for (i=0; i<10; i++) {#if 0 //blacking frame buffer and wait { volatile int *buf; //regs0->osd_en = 0; buf = (volatile int *)(0xBFFE8510); *buf = 0;#ifdef UPGRADE_SUCCESS_NEW_UI //modified by liuchuanyi 051219. volatile int *iopdata0,*iopdata1,*iopdata2; iopdata0 = (volatile int *)(0xBFFE8720); iopdata1 = (volatile int *)(0xBFFE8724); iopdata2 = (volatile int *)(0xBFFE8728); *iopdata2=0x0d; *iopdata1=(*iopdata1&0xf0)|0x04; *iopdata0=(*iopdata0&0xfff)|0x2000; { Show_Upgrade_Success(); } #else { //(60, 60) -> (60, 220) ShowUpgradeOK(60, 60, 10, 160, 0x0, 0x8080); //(60, 60) -> (140, 220) ShowUpgradeOK(60, 60, 80, 10, 0x0, 0x8080); //(140, 60) -> (140, 220) ShowUpgradeOK(140, 60, 10, 160, 0x0, 0x8080); //(60, 210) -> (140, 210) ShowUpgradeOK(60, 210, 80, 10, 0x0, 0x8080); //(200, 60) -> (200, 220) ShowUpgradeOK(200, 60, 10, 160, 0x0, 0x8080); //(280, 60) -> (200, 140) for (i=0; i<80; i++) { ShowUpgradeOK(280-i, 60+i, 10, 1, 0x0, 0x8080); } //(220, 120) -> (200, 140) for (i=0; i<90; i++) { ShowUpgradeOK(210+i, 130+i, 10, 1, 0x0, 0x8080); } }#endif while (1) ; }#endif return iRes; }//// Function : FlashEraseSector// Description : erase one of section on flash// Input : unSectorNum -> flash section number// Output : > 0 -> sucess// < 0 -> fail // Note : // sector address is from A16//// MX29F040 SECTOR ADDRESS TABLE// --------------------------------------------------// Sector A18 A17 A16 Address-Range// --------------------------------------------------// SA0 0 0 0 00000h-0FFFFh// SA1 0 0 1 10000h-1FFFFh// SA2 0 1 0 20000h-2FFFFh// SA3 0 1 1 30000h-3FFFFh// SA4 1 0 0 40000h-4FFFFh// SA5 1 0 1 50000h-5FFFFh// SA6 1 1 0 60000h-6FFFFh// SA7 1 1 1 70000h-7FFFFh// SA8//// we assume 64KBytes/Sector// we will erase flash from (unSectorNum<<16) ~ ( (unSectorNum<<16) + (64<<10) ) Byteint FlashEraseSector(UINT32 unSectorNum){ volatile unsigned char *pbBaseAddr; UINT32 oldCfg0, oldCfg1; int iRes=-1; int iTry, iTimeOut; unsigned int iFlashID; UINT32 old; iCmd=0; iFlashID = FlashReadID(); //disable irq //cpu_intr_disable(); HAL_DISABLE_INTERRUPTS(old); FlashDelay(10); oldCfg0 = regs0->sft_cfg0; oldCfg1 = regs0->sft_cfg1; regs0->sft_cfg0 |= SFTCFG0_0_RA19_EN; regs0->sft_cfg1 |= (SFTCFG1_0_CS1_EN | SFTCFG1_4_OE_EN | SFTCFG1_5_WE_EN); FlashDelay(10); for (iTry=0; iTry<3; iTry++) { pbBaseAddr = (volatile unsigned char *)(ROM_BASE_UNCACHED+ROM1_OFFSET); FlashSendCmd(FLASH_CMD_RESET, 0); #ifdef _NONUNIFORM64K_SECTOR_IN_FLASH pbBaseAddr = (volatile unsigned char *)(ROM_BASE_UNCACHED-BOOTLOADER_CODESIZE+ROM1_OFFSET + FlashRange[unSectorNum].uiSecStartAddr); #else pbBaseAddr = (volatile unsigned char *)(ROM_BASE_UNCACHED-BOOTLOADER_CODESIZE+ROM1_OFFSET + (unSectorNum<<FLASH_SECTOR_ADDR)); #endif FlashSendCmd(FLASH_CMD_ERASE_SECTOR, (unsigned int)pbBaseAddr); iTimeOut = 0; while (1) { unsigned char c0, c1; #ifdef _NONUNIFORM64K_SECTOR_IN_FLASH pbBaseAddr = (volatile unsigned char *)(ROM_BASE_UNCACHED-BOOTLOADER_CODESIZE+ROM1_OFFSET + FlashRange[unSectorNum].uiSecStartAddr); #else pbBaseAddr = (volatile unsigned char *)(ROM_BASE_UNCACHED-BOOTLOADER_CODESIZE+ROM1_OFFSET + (unSectorNum<<FLASH_SECTOR_ADDR)); #endif c0 = *pbBaseAddr; c1 = *pbBaseAddr; if ( (c0==0xff) && (c1==0xff) ) { iRes = 0; break; } else { if (++iTimeOut > 0x7000000) break; if (iTimeOut > 0x1000) FlashDelay(100000); } } //end of while (1) if (iRes==0) break; } //for (iTry=0; iTry<3; iTry++) //erase sector end pbBaseAddr = (volatile unsigned char *)(ROM_BASE_UNCACHED+ROM1_OFFSET); FlashSendCmd(FLASH_CMD_RESET, 0); regs0->sft_cfg0 = oldCfg0; regs0->sft_cfg1 = oldCfg1; //enable //cpu_intr_enable(); HAL_RESTORE_INTERRUPTS(old); return iRes;}int FlashEraseSecRange(UINT32 uiStartAdd, UINT32 iLen){ BYTE SecIdx = 0, SSecIdx = 0, ESecIdx = 0; UINT32 uiEndAdd = uiStartAdd + iLen -1; int iSecLoop; int iRes=-1; do { #ifdef _NONUNIFORM64K_SECTOR_IN_FLASH if((uiStartAdd >= FlashRange[SecIdx].uiSecStartAddr) && (uiStartAdd <= FlashRange[SecIdx].uiSecEndAddr)) { SSecIdx = SecIdx; break; } #else if((uiStartAdd >= (SecIdx<<FLASH_SECTOR_ADDR)) && (uiStartAdd < ((SecIdx+1)<<FLASH_SECTOR_ADDR))) { SSecIdx = SecIdx; break; } #endif SecIdx++; } while(SecIdx < MAX_SECTORS); SecIdx = 0; do { #ifdef _NONUNIFORM64K_SECTOR_IN_FLASH if((uiEndAdd >= FlashRange[SecIdx].uiSecStartAddr) && (uiEndAdd <= FlashRange[SecIdx].uiSecEndAddr)) { ESecIdx = SecIdx; break; } #else if((uiEndAdd >= (SecIdx<<FLASH_SECTOR_ADDR)) && (uiEndAdd < ((SecIdx+1)<<FLASH_SECTOR_ADDR))) { ESecIdx = SecIdx; break; } #endif SecIdx++; } while(SecIdx < MAX_SECTORS); ecos_printf("SSecIdx=%d, ESecIdx=%d\n",SSecIdx,ESecIdx); for(iSecLoop = SSecIdx; iSecLoop <= ESecIdx; iSecLoop++) { iRes = FlashEraseSector(iSecLoop); if(iRes < 0) { return iRes; } } return iRes;}//// Function : FlashWrite// Description : write data to flash// Input : iStartAddr -> offset address of flash// *pBuf -> buffer// iLen -> read length// // Output : >0 -> sucess// <0 -> fail // // Note ://int FlashWrite(UINT32 iStartAddr, BYTE *pBuf, UINT32 iLen){ volatile unsigned char *pbBaseAddr; UINT32 oldCfg0, oldCfg1; UINT32 iTogCount=0; int iTryCount=0; int iRes = -1; UINT32 iSize; UINT32 old; iCmd=0; FlashReadID(); //disable irq //cpu_intr_disable(); HAL_DISABLE_INTERRUPTS(old); oldCfg0 = regs0->sft_cfg0; oldCfg1 = regs0->sft_cfg1; regs0->sft_cfg0 |= SFTCFG0_0_RA19_EN; regs0->sft_cfg1 |= (SFTCFG1_0_CS1_EN | SFTCFG1_4_OE_EN | SFTCFG1_5_WE_EN); FlashDelay(10); pbBaseAddr = (volatile unsigned char *)(ROM_BASE_UNCACHED+ROM1_OFFSET); FlashSendCmd(FLASH_CMD_RESET, 0); iSize = iLen; //Program data to flash while (iSize > 0) { iTogCount = 0; iRes = -1; pbBaseAddr = (volatile unsigned char *)(ROM_BASE_UNCACHED-BOOTLOADER_CODESIZE+ROM1_OFFSET+iStartAddr+(iLen-iSize)); FlashSendCmd(FLASH_CMD_PROGRAM, 0); *pbBaseAddr=*pBuf; while (1) { unsigned char c0, c1; c0 = *pbBaseAddr; c1 = *pbBaseAddr; if ( (c0==*pBuf) && (c1==*pBuf) ) { pBuf++; iTryCount = 0; iRes = 0; break; } else { if (++iTogCount > 10) FlashDelay(5); if (iTogCount > 0x7000) { //timeout break; } } } //end of while (1) { if (iRes == -1) { if (++iTryCount < 5) { pbBaseAddr = (volatile unsigned char *)(ROM_BASE_UNCACHED+ROM1_OFFSET); FlashSendCmd(FLASH_CMD_RESET, 0); continue; } else { break; } } iSize--; } // end ofwhile (iSize) pbBaseAddr = (volatile unsigned char *)(ROM_BASE_UNCACHED+ROM1_OFFSET); FlashSendCmd(FLASH_CMD_RESET, 0); regs0->sft_cfg0 = oldCfg0; regs0->sft_cfg1 = oldCfg1; //enable //cpu_intr_enable(); HAL_RESTORE_INTERRUPTS(old); return iRes;}//// Function : FlashRead// Description : read flash1 data// Input : iStartAddr -> offset address of flash// *pBuf -> buffer// iLen -> read length// // Output : >0 -> sucess// <0 -> fail // // Note : operate flash1 is danger, because interrupt and exception // is runnig in here, //int FlashRead(UINT32 iStartAddr, BYTE *pBuf, UINT32 iLen){ volatile unsigned char *pbBaseAddr; int iRes=0; //cpu_intr_disable(); pbBaseAddr = (volatile unsigned char *)(ROM_BASE_UNCACHED-BOOTLOADER_CODESIZE+ROM1_OFFSET+iStartAddr); while (iLen) { *pBuf++ = *pbBaseAddr++; iLen--; } //cpu_intr_enable(); return iRes;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -