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

📄 flash32bsc.c

📁 这是单板上DPRAM的驱动程序
💻 C
📖 第 1 页 / 共 2 页
字号:
    i=0;
    while(1)
    {
        if(data!=0xffffffff)
        {
                ULONG ii;	
                WriteReg(BaseAddr+(ULONG)(0x5555<<2),0x00aa00aa);
                WriteReg(BaseAddr+(ULONG)(0x2aaa<<2),0x00550055);
                WriteReg(BaseAddr+(ULONG)(0x5555<<2),0x00a000a0);
                *(ULONG *)start=data;
                for(ii=0;ii<FLASH_WRITE_LOOP;ii++){
                	    /*Data# polling(DQ7)*/
                        if((ReadReg((ULONG)start)&0x00800080)==(data&0x00800080))break;
                        }
                if(ii==FLASH_WRITE_LOOP)break;
				/*rc=ReadReg((ULONG)start)&0x00380038;
				WriteReg((ULONG)start,0x00ff00ff); 
                if(rc!=0)break;
                */
        }
        i+=4; start+=4;
        if(i>=DataLen)break; else data=0xffffffff;
        if((i+4)>DataLen)memmove((UCHAR *)&data,BufAddr+i,DataLen-i);
        else data=*(ULONG *)(BufAddr+i);
    }

    if(i<DataLen) return SDE_FLASH_FAIL;
    else
    {
        start = (UCHAR *)(BaseAddr + Offset);
        if(memcmp(start,mas->Base,mas->Size)!=0)return SDE_FLASH_FAIL;
        return SDE_OK;
    }
}

static int SstFlash32Cntrl(void *pDataBuf, int cmd, void *pParam, int maxlen)
{
    Flash32CfgStruct *pCfg=(Flash32CfgStruct *)pDataBuf;
    switch(cmd)
    {
        case SDC_GET_UNIT_SIZE:
            if(maxlen!=sizeof(ULONG))return SDE_INVALID_ARG;
            *(ULONG *)pParam=pCfg->UnitSize;
            return SDE_OK;
        case SDC_GET_BASE_ADDR:
            if(maxlen!=sizeof(ULONG))return SDE_INVALID_ARG;
            *(ULONG *)pParam=pCfg->BaseAddr;
            return SDE_OK;
        case SDC_GET_MAX_SIZE:
            if(maxlen!=sizeof(ULONG))return SDE_INVALID_ARG;
            *(ULONG *)pParam=pCfg->MaxSize;
            return SDE_OK;
        case SDC_WRITE_FLASH:
            return write_sstflash(pDataBuf,pParam,maxlen);
        case SDC_READ_FLASH:
            return read_sstflash(pDataBuf,pParam,maxlen);
        case SDC_ERASE_CHIP:
        {
	    ULONG cs;
            int ret=SDE_OK;
	    for(cs=0;cs<8;cs++)
	    {
                ULONG i;
                ULONG BaseAddr=pCfg->CSRange[cs][0]+pCfg->BaseAddr;
	    	if(pCfg->CSRange[cs][1]==0)break;
            
                WriteReg(BaseAddr+(ULONG)(0x5555<<2),0x00aa00aa);
                WriteReg(BaseAddr+(ULONG)(0x2aaa<<2),0x00550055);
                WriteReg(BaseAddr+(ULONG)(0x5555<<2),0x00800080);
                WriteReg(BaseAddr+(ULONG)(0x5555<<2),0x00aa00aa);
                WriteReg(BaseAddr+(ULONG)(0x2aaa<<2),0x00550055);
                WriteReg(BaseAddr+(ULONG)(0x5555<<2),0x00100010);            	
            
                for(i=0;i<FLASH_ERASE_CHIP_LOOP;i++)
                {
            	    if((ReadReg(BaseAddr)&0x00800080)==0x00800080)break;
                }
                if(i==FLASH_ERASE_CHIP_LOOP)ret=SDE_FLASH_FAIL;
	    }
            return ret;
        }
        case SDC_ERASE_SECTOR:
        {
            ULONG offset=*(ULONG *)pParam;
            int ret=SDE_OK;
            ULONG i;
            ULONG BaseAddr=0xFFFFFFFF;
	        for(i=0;i<8 && pCfg->CSRange[i][1]!=0;i++)
	        	if(pCfg->CSRange[i][0]<=offset &&pCfg->CSRange[i][1]> offset){ 
		   			BaseAddr=pCfg->CSRange[i][0]+pCfg->BaseAddr;
		   			offset -= pCfg->CSRange[i][0];
			}
	    	if(BaseAddr==0xFFFFFFFF)return SDE_INVALID_ARG;
            if(maxlen!=sizeof(ULONG))return SDE_INVALID_ARG;

            WriteReg(BaseAddr+(ULONG)(0x5555<<2),0x00aa00aa);            
            WriteReg(BaseAddr+(ULONG)(0x2aaa<<2),0x00550055);
            WriteReg(BaseAddr+(ULONG)(0x5555<<2),0x00800080);
            WriteReg(BaseAddr+(ULONG)(0x5555<<2),0x00aa00aa);
            WriteReg(BaseAddr+(ULONG)(0x2aaa<<2),0x00550055);
            WriteReg(BaseAddr+offset,0x00500050);            	

            for(i=0;i<FLASH_ERASE_SECTOR_LOOP;i++){
                if((ReadReg(BaseAddr+offset)&0x00800080)==0x00800080)break;
                }
            if(i==FLASH_ERASE_SECTOR_LOOP)ret=SDE_FLASH_FAIL;
            return ret; 
        }
        default:
            return SDE_UNKNOW_CMD;
    }
    /* return SDE_OK; */
}


/****************************************************************************/
/*   NOTE: The following are the INTEL TE28F320C3 flash operation functions */
/****************************************************************************/
static int IntelFlash32C3Cntrl(void *pDataBuf, int cmd, void *pParam, int maxlen)
{
    Flash32CfgStruct *pCfg=(Flash32CfgStruct *)pDataBuf;
    switch(cmd)
    {
        case SDC_GET_UNIT_SIZE:
            if(maxlen!=sizeof(ULONG))return SDE_INVALID_ARG;
            *(ULONG *)pParam=pCfg->UnitSize;
            return SDE_OK;
        case SDC_GET_BASE_ADDR:
            if(maxlen!=sizeof(ULONG))return SDE_INVALID_ARG;
            *(ULONG *)pParam=pCfg->BaseAddr;
            return SDE_OK;
        case SDC_GET_MAX_SIZE:
            if(maxlen!=sizeof(ULONG))return SDE_INVALID_ARG;
            *(ULONG *)pParam=pCfg->MaxSize;
            return SDE_OK;
        case SDC_WRITE_FLASH:
            return write_intelflash(pDataBuf,pParam,maxlen);
        case SDC_READ_FLASH:
            return read_intelflash(pDataBuf,pParam,maxlen);
        case SDC_ERASE_CHIP:
        {
	int ret=SDE_FLASH_FAIL;
            return ret;
        }
        case SDC_ERASE_SECTOR:
        {
            ULONG offset=*(ULONG *)pParam;
            int ret=SDE_OK;
            ULONG i,ii;
            ULONG BaseAddr=0xFFFFFFFF;
	    for(i=0;i<8 && pCfg->CSRange[i][1]!=0;i++)
	    if(pCfg->CSRange[i][0]<=offset && pCfg->CSRange[i][1]> offset)
	    { 
	        BaseAddr=pCfg->CSRange[i][0]+pCfg->BaseAddr;
	        offset -= pCfg->CSRange[i][0];
	    }
	    if(BaseAddr==0xFFFFFFFF)return SDE_INVALID_ARG;
            if(maxlen!=sizeof(ULONG))return SDE_INVALID_ARG;
            if(offset <pCfg->UnitSize )
            {
	        WriteReg(BaseAddr + 0x10,0x00900090);
	        for(i=0;i<0x50;i++);//wait Tida
	        i=ReadReg(BaseAddr + 0x04)&0x00000001;
	        WriteReg(BaseAddr,0x00ff00ff);
                if( i== 1) /* Intel C3 flash 16-Bottom */
                {
                    for(i=0;i<8;i++)
                    {
                        WriteReg(BaseAddr+ i*16*1024,0x00200020);
                        WriteReg(BaseAddr+ i*16*1024 ,0x00D000D0); 
                        for(i=0;i<FLASH_ERASE_SECTOR_LOOP;i++)
                        {
                            if((ReadReg(BaseAddr+ i*16*1024)&0x00800080)==0x00800080)break;
                        }
                        if(i==FLASH_ERASE_SECTOR_LOOP)ret=SDE_FLASH_FAIL;
                       
                        if((ReadReg(BaseAddr+ i*16*1024)&0x00380038) != 0)ret=SDE_FLASH_FAIL;
                        //ret= ReadReg(BaseAddr+ i*16*1024);
                        //if((ret&0x00380038) != 0);
                        WriteReg(BaseAddr+ i*16*1024,0x00ff00ff);
                    }
                }
            }
	    if(offset>=(pCfg->MaxSize - pCfg->UnitSize))
            {
		WriteReg(BaseAddr + 0x10,0x00900090);
		for(i=0;i<0x50;i++);//wait Tida
                i=ReadReg(BaseAddr + 0x04)&0x00000001;
                WriteReg(BaseAddr,0x00ff00ff);
                if(i == 0 ) /* Intel C3 flash 16-Top */
                {
                    for(i=1;i<9;i++)
                    {
                        WriteReg(BaseAddr+(pCfg->MaxSize)- i*16*1024,0x00200020);
                        WriteReg(BaseAddr+(pCfg->MaxSize)- i*16*1024,0x00D000D0); 
                        for(ii=0;ii<FLASH_ERASE_SECTOR_LOOP;ii++)
                        {
                            if((ReadReg(BaseAddr+(pCfg->MaxSize)- i*16*1024)&0x00800080)==0x00800080) 				break;}
                        if(i==FLASH_ERASE_SECTOR_LOOP)ret=SDE_FLASH_FAIL;
                            /*ret=ReadReg(BaseAddr+(pCfg->MaxSize)- i*16*1024); */
                            /*if((ret&0x00380038) != 0); */
                        if((ReadReg(BaseAddr+(pCfg->MaxSize)- i*16*1024)&0x00380038) != 0)ret=SDE_FLASH_FAIL;
                        WriteReg(BaseAddr+(pCfg->MaxSize)- i*16*1024,0x00ff00ff);
        	        }
        	    }
                }  
            WriteReg(BaseAddr,0x00200020);
            WriteReg(BaseAddr+offset,0x00D000D0); 
            for(i=0;i<FLASH_ERASE_SECTOR_LOOP;i++)
            {
                if((ReadReg(BaseAddr)&0x00800080)==0x00800080)break;
            }
            if(i==FLASH_ERASE_SECTOR_LOOP)ret=SDE_FLASH_FAIL;
            if((ReadReg(BaseAddr)&0x00380038) != 0)ret=SDE_FLASH_FAIL;
            //ret=ReadReg(BaseAddr);
            //if((ret&0x00380038) != 0);
            WriteReg(BaseAddr,0x00ff00ff);
            return ret; 
         }
        default:
        return SDE_UNKNOW_CMD;
    }
    /* return SDE_OK; */
}

/*-------------------------------------------------------------------
this is one of the SDEV drivers external PORT
---------------------------------------------------------------------*/


UCHAR *Flash32BspInit(int DEV, UCHAR *FreeMemPtr, Flash32CfgStruct *cfg)
{
    Flash32CfgStruct *pCfg=cfg; 
    ULONG BaseAddr=pCfg->BaseAddr;
    ULONG UnitSize=pCfg->UnitSize;
    ULONG MaxSize=pCfg->MaxSize;  	
    ULONG i,ii,iii;
    ULONG dwMCode,dwDCode;
   	
    /*Now read sst Product Identification*/
    WriteReg(BaseAddr+(ULONG)(0x5555<<2),0x00aa00aa);            
    WriteReg(BaseAddr+(ULONG)(0x2aaa<<2),0x00550055);
    WriteReg(BaseAddr+(ULONG)(0x5555<<2),0x00900090);
    
    for(i=0;i<SST_ID_READ_WAIT;i++);//wait Tida
    
    dwMCode=ReadReg(BaseAddr+(ULONG)(0x0<<2));
    dwDCode=ReadReg(BaseAddr+(ULONG)(0x1<<2));
    
    /*exit software ID read modes*/
    WriteReg(BaseAddr+(ULONG)(0x5555<<2),0x00aa00aa);            
   	WriteReg(BaseAddr+(ULONG)(0x2aaa<<2),0x00550055);
   	WriteReg(BaseAddr+(ULONG)(0x5555<<2),0x00F000F0);
   	
    for(i=0;i<SST_ID_READ_WAIT;i++);//wait Tida
    /*if the device is SST*/
    if( ((dwMCode==SST_MANUFACTURER_CODE) && (dwDCode==SST_DEVICE_CODE0))||((dwMCode==SST_MANUFACTURER_CODE) && (dwDCode==SST_DEVICE_CODE1)) )
    {             
        InstallSD(DEV,NULL,NULL,SstFlash32Cntrl,FreeMemPtr);
    }             
    else//If not sst,then st sharp and intel have the same operation
    {             
    	WriteReg(BaseAddr + 0x10,0x00900090);	/*Read configration start! Example ID and MCIDS*/
	for(i=0;i<0x50;i++);//wait Tida
	dwMCode=ReadReg(BaseAddr+(ULONG)(0x0<<2));
        dwDCode=ReadReg(BaseAddr+(ULONG)(0x1<<2));  
	             
        WriteReg(BaseAddr,0x00ff00ff);		/*Set the flash in read modes!*/
        
        if(dwMCode==SHARP_MANUFACTURER_CODE && (dwDCode & 0xFFF0FFF0)==SHARP_DEVICE_CODE)//block erase is diference betweem sharp and intel s3
        {
        	InstallSD(DEV,NULL,NULL,SharpFlash32Cntrl,FreeMemPtr);	
        }
        
        else
        {
	    	if((dwMCode== INTEL_C3MANUFACTURER_CODE && (dwDCode & 0xFFF0FFF0)== INTEL_C3)||		/*Intel C3 flash 16-B */
	       	(dwMCode== ST_MANUFACTURER_CODE      &&  dwDCode == ST_M28W320CT_DEVICE_CODE))   /*ST  flash 16-B */
	    	{
	    		InstallSD(DEV,NULL,NULL,IntelFlash32C3Cntrl,FreeMemPtr);
	    
    	    	for(i = 0; i < (MaxSize/UnitSize); i++)
    	    	{
	        		if(i==0 || i==(MaxSize/UnitSize)-1)
	        		{
		    			for(iii = 0; iii < 8; iii++)
		    			{
		    				WriteReg(BaseAddr+UnitSize*i +UnitSize/8*iii, 0x00600060);
	        			
	        				for(ii=0;ii<FLASH_WRITE_LOOP;ii++)
	        				{
	        					if((ReadReg(BaseAddr+UnitSize*i +UnitSize/8*iii)&0x00800080)==0x00800080)
	        					break;
	        				}
	        				WriteReg(BaseAddr+UnitSize*i +UnitSize/8*iii, 0x00d000d0);
	        				for(ii=0;ii<FLASH_WRITE_LOOP;ii++)
	        				{
	        					if((ReadReg(BaseAddr+UnitSize*i +UnitSize/8*iii)&0x00800080)==0x00800080)
	        					break;
	        				}
	        				WriteReg(BaseAddr+UnitSize*i +UnitSize/8*iii, 0x00ff00ff);
	        			}
	    			}
	        		WriteReg(BaseAddr+UnitSize*i, 0x00600060);
	        		for(ii=0;ii<FLASH_WRITE_LOOP;ii++)
	        		{
	        	    	if((ReadReg(BaseAddr+UnitSize*i)&0x00800080)==0x00800080)break;
	        		}
	        		WriteReg(BaseAddr+UnitSize*i, 0x00d000d0);
	        		for(ii=0;ii<FLASH_WRITE_LOOP;ii++)
	        		{
	        	    	if((ReadReg(BaseAddr+UnitSize*i)&0x00800080)==0x00800080)break;
	        		}
	       			WriteReg(BaseAddr+UnitSize*i, 0x00ff00ff);
	    		}
   			}
			else	
			{
				InstallSD(DEV,NULL,NULL,IntelFlash32Cntrl,FreeMemPtr);
			}
		}
	}		
    
    if(cfg->CSRange[0][1]==0)cfg->CSRange[0][1]=cfg->MaxSize;
    Flash32Init(FreeMemPtr, cfg); 
    FreeMemPtr += sizeof(Flash32CfgStruct);
    memcpy(FreeMemPtr,"*Flsh32Dat",8);
    FreeMemPtr += 8;
    return FreeMemPtr;
}



	   

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -