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

📄 flash.c

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