📄 flash.c
字号:
nop; \ bnez $2, 1b; \ nop; \ .set reorder \ " : : : "$2"); }}//// Function : FlashUnLock// Description : Set flash to unlock mode// Input : bBaseAddr -> flash base address// Output : none// Note :// void FlashUnLock(){ volatile unsigned char *pbReadAddr; pbReadAddr = (volatile unsigned char *)(ROM_BASE_UNCACHED-BOOTLOADER_CODESIZE+ROM1_OFFSET); *( (volatile unsigned char *)( (int)pbReadAddr | cmdFlash[iCmd][UNLOCK1_ADDR]) ) = FLASH_CMD_UNLOCK1; *( (volatile unsigned char *)( (int)pbReadAddr | cmdFlash[iCmd][UNLOCK2_ADDR]) ) = FLASH_CMD_UNLOCK2;}//// Function : FlashSendCmd// Description : Send Flash command to flash aaccording base address// Input : none// Output : none// Note :// void FlashSendCmd(unsigned char bCmd, unsigned int dwParam){ volatile unsigned char *pbReadAddr; pbReadAddr = (volatile unsigned char *)(ROM_BASE_UNCACHED-BOOTLOADER_CODESIZE+ROM1_OFFSET); *((volatile unsigned char *)((int)pbReadAddr|cmdFlash[iCmd][UNLOCK1_ADDR]))=FLASH_CMD_UNLOCK1; //1:0x555 =0xAA *((volatile unsigned char *)((int)pbReadAddr|cmdFlash[iCmd][UNLOCK2_ADDR]))=FLASH_CMD_UNLOCK2; //2:0x2AA =0x55 switch (bCmd) { case FLASH_CMD_RESET: case FLASH_CMD_ID: case FLASH_CMD_PROGRAM: *((volatile unsigned char *)((int)pbReadAddr|cmdFlash[iCmd][UNLOCK1_ADDR]))=bCmd; //3:0x555 =command break; case FLASH_CMD_ERASE_SECTOR: *((volatile unsigned char *)((int)pbReadAddr|cmdFlash[iCmd][CMD_OFFSET]))=FLASH_CMD_ERASE_SETUP; //3:0x555 =0x80 *((volatile unsigned char *)((int)pbReadAddr|cmdFlash[iCmd][UNLOCK1_ADDR]))=FLASH_CMD_UNLOCK1; //4:0x555 =0xAA *((volatile unsigned char *)((int)pbReadAddr|cmdFlash[iCmd][UNLOCK2_ADDR]))=FLASH_CMD_UNLOCK2; //5:0x2AA =0x55 *((volatile unsigned char *)((int)pbReadAddr|dwParam))=FLASH_CMD_ERASE_SECTOR; //6:SA =0x30 break; case FLASH_CMD_ERASE_CHIP: *((volatile unsigned char *)((int)pbReadAddr|cmdFlash[iCmd][CMD_OFFSET]))=FLASH_CMD_ERASE_SETUP; //3:0x555 =0x80 *((volatile unsigned char *)((int)pbReadAddr|cmdFlash[iCmd][UNLOCK1_ADDR]))=FLASH_CMD_UNLOCK1; //4:0x555 =0xAA *((volatile unsigned char *)((int)pbReadAddr|cmdFlash[iCmd][UNLOCK2_ADDR]))=FLASH_CMD_UNLOCK2; //5:0x2AA =0x55 *((volatile unsigned char *)((int)pbReadAddr|cmdFlash[iCmd][CMD_OFFSET]))=FLASH_CMD_ERASE_CHIP; //6:0x555 =0x10 break; }}//// Function : FlashReadID// Description : Get the flash ID(device-id + manufacturer-id)// Input : None// // Output : ID// Note : //UINT16 FlashReadID(){ volatile BYTE *pbBaseAddr; UINT16 uID; BYTE idM, idD; UINT32 oldCfg0, oldCfg1; UINT32 i; UINT32 old; #ifdef FLASH_SECOND_ROM regs0->rom1_base = 0x80; // rom1 base regs0->rom2_base = 0x100; // rom2 base #endif //disable irq //cpu_intr_disable(); HAL_DISABLE_INTERRUPTS(old); for (i=0; i<4; i++) { regs0->adt[i] = 0; regs0->dat[i] = 0; } regs0->adm[0] = 0; regs0->adm[1] = 0; regs0->dar = 0; 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); pbBaseAddr = (volatile unsigned char *)(ROM_BASE_UNCACHED-BOOTLOADER_CODESIZE+ROM1_OFFSET); for (iCmd=0; iCmd<FLASH_MAX_CMD; iCmd++) { FlashSendCmd(FLASH_CMD_RESET, 0); FlashSendCmd(FLASH_CMD_ID, 0); //A1A0(00):manufacturer code idM = *pbBaseAddr; cur_idM = idM; //A1A0(01):device code if (iCmd == 3) idD = *(pbBaseAddr + 2); else idD = *(pbBaseAddr + 1); cur_idD = idD; uID = (idD<<8) | idM; FlashDelay(15); FlashUnLock(); FlashSendCmd(FLASH_CMD_RESET, 0); FlashDelay(15); if (uID==0) uID=0xdead; if (uID==0xabcd) uID=0xdead; if (uID==0x9090) uID=0xdead; if (uID==0xffff) uID=0xdead; if (uID!=0xdead) break; } regs0->sft_cfg0 = oldCfg0; regs0->sft_cfg1 = oldCfg1; //enable //cpu_intr_enable(); HAL_RESTORE_INTERRUPTS(old); return uID; }//#define FLASH_DBG//// Function : FlashEraseUpgrade// Description : Erase whole flash chip// Input : pBuf -> pointer of system image// dwSize -> system image size// // Output : 1 -> success// <0 -> fail// Note : //int FlashEraseUpgrade(unsigned char *pBuf, unsigned int dwSize){ volatile unsigned char *pbBaseAddr; unsigned int iBaseAddr; unsigned char bToggle=2; unsigned int iTogCount=0; int iRes=0; unsigned char iTryCount=0; unsigned char cTest; int i; unsigned int dwSize0; unsigned char *pBuf0; int iEraseSectorNum; int iStartProgramPoint; int iProtectedSectors; int k,j; UINT32 old; iEraseSectorNum = 0; iStartProgramPoint = 0; iProtectedSectors = 0; #ifdef FLASH_ADVANCED_FUNCTION iEraseSectorNum = ERASE_METHOD; iStartProgramPoint = START_PROGRAM_POINT; iProtectedSectors = PROTECTED_SECTORS; if(iEraseSectorNum!=ERASE_CHIP) { if(dwSize<=0x80000) { iEraseSectorNum = ERASE_8_SECTORS; } else if(dwSize<=0x100000) { iEraseSectorNum = ERASE_16_SECTORS; } else if(dwSize<=0x200000) { iEraseSectorNum = ERASE_32_SECTORS; } } #endif iCmd=0; FlashReadID(); //disable irq //cpu_intr_disable(); HAL_DISABLE_INTERRUPTS(old); regs0->sft_cfg0 |= SFTCFG0_0_RA19_EN; regs0->sft_cfg1 |= (SFTCFG1_0_CS1_EN | SFTCFG1_4_OE_EN | SFTCFG1_5_WE_EN); iBaseAddr = ROM_BASE_UNCACHED+ROM1_OFFSET; pbBaseAddr = (volatile unsigned char *)(iBaseAddr); for (i=0; i<5; i++) { dwSize0 = dwSize; pBuf0 = pBuf; iTogCount=0; bToggle=2; iTryCount=0; iRes = 0; pbBaseAddr = (volatile unsigned char *)(iBaseAddr); FlashSendCmd(FLASH_CMD_RESET, 0); //joshua add sector erase function, 2004.7.20 //#if defined(UPGRADE_BY_ERASE_SECTOR_4M)||defined(UPGRADE_BY_ERASE_SECTOR_8M)||defined(UPGRADE_BY_ERASE_SECTOR_16M) switch(iEraseSectorNum) { case ERASE_CHIP: FlashSendCmd(FLASH_CMD_ERASE_CHIP, 0); FlashDelay(1000000); break; case ERASE_8_SECTORS: for(k=0;k<8;k++) { if((iProtectedSectors&(1<<k))==0) { if(k==0&&k==7) //joshua,2005.4.6 consider boot sector { for(j=0;j<8;j++) { FlashSendCmd(FLASH_CMD_ERASE_SECTOR, (unsigned int)(pbBaseAddr+k*65536+j*8192)); FlashDelay(500000); } } else { FlashSendCmd(FLASH_CMD_ERASE_SECTOR, (unsigned int)(pbBaseAddr+k*65536)); FlashDelay(1500000); } } } break; case ERASE_16_SECTORS: for(k=0;k<16;k++) { if((iProtectedSectors&(1<<k))==0) { if(k==0&&k==15) //joshua,2005.4.6 consider boot sector { for(j=0;j<8;j++) { FlashSendCmd(FLASH_CMD_ERASE_SECTOR, (unsigned int)(pbBaseAddr+k*65536+j*8192)); FlashDelay(500000); } } else { FlashSendCmd(FLASH_CMD_ERASE_SECTOR, (unsigned int)(pbBaseAddr+k*65536)); FlashDelay(1500000); } } } break; case ERASE_32_SECTORS: for(k=0;k<32;k++) { if((iProtectedSectors&(1<<k))==0) { if(k==0&&k==31) //joshua,2005.4.6 consider boot sector { for(j=0;j<8;j++) { FlashSendCmd(FLASH_CMD_ERASE_SECTOR, (unsigned int)(pbBaseAddr+k*65536+j*8192)); FlashDelay(500000); } } else { FlashSendCmd(FLASH_CMD_ERASE_SECTOR, (unsigned int)(pbBaseAddr+k*65536)); FlashDelay(1500000); } } } break; } while (1) { cTest = *pbBaseAddr; //cTest = *pbBaseAddr; //Toggle Bit Checking if (cTest & FLASH_TOGGLE_BIT) { //toggle to 1 if (bToggle==1) iTogCount++; //Q6 not Toggled bToggle = 1; } else { //toggle to 0 if (bToggle==0) iTogCount++; //Q6 not Toggled bToggle = 0; } if (iTogCount>5) { //Q6 not Toggled if ( (*pbBaseAddr != 0xff) || (*(pbBaseAddr+0x70000) != 0xff) ) { FlashDelay(50000); if (iTogCount < 100) { #ifdef FLASH_DBG R_LED(1); #endif continue; } else { iRes = -1; break; } } else { break; } } } //end of while (1) { if (iRes < 0) continue; //------------------------------------------------------------------ // PROGRAM all flash //------------------------------------------------------------------ iTryCount=0; pbBaseAddr = (volatile unsigned char *)(iBaseAddr); #ifdef FLASH_ADVANCED_FUNCTION pbBaseAddr += (iStartProgramPoint<<16); //one sector = 64KB #endif FlashSendCmd(FLASH_CMD_RESET, 0); //Program data to flash while (dwSize0) { iTogCount = 0; bToggle = 2; iRes = 0; FlashSendCmd(FLASH_CMD_PROGRAM, 0); *pbBaseAddr=*pBuf0; while (1) { cTest = *pbBaseAddr; cTest = *pbBaseAddr; //Toggle Bit Checking //if (*pbBaseAddr & FLASH_TOGGLE_BIT) { //toggle to 1 // if (bToggle==1) iTogCount++; //Q6 not Toggled // bToggle = 1; //} else { //toggle to 0 // if (bToggle==0) iTogCount++; //Q6 not Toggled // bToggle = 0; //} if (++iTogCount>3) { //Q6 not Toggled //Verify Byte if ( *pbBaseAddr==*pBuf0 ) { //write finished pbBaseAddr++; pBuf0++; dwSize0--; iTryCount = 0; } else { //write not ready if (iTogCount < 10) { FlashDelay(5);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -