⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 flash.c

📁 凌阳公司机sunplus1002在这个芯片下
💻 C
📖 第 1 页 / 共 3 页
字号:
		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 + -