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

📄 fmd.cpp

📁 EP9315的wince下载程序。download.exe
💻 CPP
📖 第 1 页 / 共 5 页
字号:
        {
		pusDest32= (volatile PULONG)g_FMDInfo.ChipBaseAddress;

		WRITE_COMMAND(pusDest32+ AMD_SETUP_ADDR1,AMD_SETUP_CODE1);
		//	     RETAILMSG(1, (TEXT("DoWordWrite: write over 0-1\r\n")));		
		WRITE_COMMAND(pusDest32+ AMD_SETUP_ADDR2,AMD_SETUP_CODE2);
		//	     RETAILMSG(1, (TEXT("DoWordWrite: write over 0-2\r\n")));	
		WRITE_COMMAND(pusDest32+ AMD_SETUP_ADDR1,0x0020);
		//	     RETAILMSG(1, (TEXT("DoWordWrite: write over 0-3\r\n")));	
         }
	 else
	 {
		pusDest16= (volatile PUSHORT)g_FMDInfo.ChipBaseAddress;

		WRITE_COMMAND(pusDest16+ AMD_SETUP_ADDR1,AMD_SETUP_CODE1);
		//	     RETAILMSG(1, (TEXT("DoWordWrite: write over 0-1\r\n")));		
		WRITE_COMMAND(pusDest16+ AMD_SETUP_ADDR2,AMD_SETUP_CODE2);
		//	     RETAILMSG(1, (TEXT("DoWordWrite: write over 0-2\r\n")));	
		WRITE_COMMAND(pusDest16+ AMD_SETUP_ADDR1,0x0020);
		//	     RETAILMSG(1, (TEXT("DoWordWrite: write over 0-3\r\n")));	
	 
	  }




		m_offset=physicalSectorAddr-g_FMDInfo.ChipBaseAddress;

		
	    for(k = 0 ; k < dwWordCount ; k += 1)
	    {
	    //RETAILMSG(1, (TEXT("DoWordWrite: write over 0 :chipbase=%x,block =%x des addes %x num=%x databuffer addr=%x\r\n"),
	    //								g_FMDInfo.ChipBaseAddress,ulBlockAddress,physicalSectorAddr,dwWordCount,
	    //								pBuffer));
	        if (g_bPairedFlash)
	        {

			//m_offset=physicalSectorAddr-g_FMDInfo.ChipBaseAddress;
#if 0//AMD_unlock
	            pusDest32= (volatile PULONG)g_FMDInfo.ChipBaseAddress;
	            //RETAILMSG(1, (TEXT(" 0\r\n")));
	            //WRITE_ULONG (g_FMDInfo.ChipBaseAddress+ AMD_SETUP_ADDR1, (AMD_SETUP_CODE1 << 16) | AMD_SETUP_CODE1);
		     //WRITE_COMMAND(g_FMDInfo.ChipBaseAddress+ AMD_SETUP_ADDR1,AMD_SETUP_CODE1);
		     // *((ULONG *)g_FMDInfo.ChipBaseAddress+ AMD_SETUP_ADDR1)=(AMD_SETUP_CODE1 << 16) | AMD_SETUP_CODE1;
		     *(pusDest32+ AMD_SETUP_ADDR1)=(AMD_SETUP_CODE1 << 16) | AMD_SETUP_CODE1;		
		     //RETAILMSG(1, (TEXT("DoWordWrite: write over 0-1\r\n")));		
	            //WRITE_ULONG (g_FMDInfo.ChipBaseAddress+ AMD_SETUP_ADDR2, (AMD_SETUP_CODE2 << 16) | AMD_SETUP_CODE2);
		     //WRITE_COMMAND(g_FMDInfo.ChipBaseAddress+ AMD_SETUP_ADDR1,AMD_SETUP_CODE2);
		      *(pusDest32+ AMD_SETUP_ADDR2)=(AMD_SETUP_CODE2 << 16) | AMD_SETUP_CODE2;			
		     //RETAILMSG(1, (TEXT("DoWordWrite: write over 0-2\r\n")));		
	            //WRITE_ULONG (g_FMDInfo.ChipBaseAddress+ AMD_SETUP_ADDR1, (AMD_PROGRAM << 16) | AMD_PROGRAM);
		     //WRITE_COMMAND(g_FMDInfo.ChipBaseAddress+ AMD_SETUP_ADDR1,AMD_PROGRAM);
		     *(pusDest32+ AMD_SETUP_ADDR1)=(0x0020 << 16) | 0x0020;	

#endif

			
	            pusDest32= (volatile PULONG)g_FMDInfo.ChipBaseAddress;
	            //RETAILMSG(1, (TEXT(" 0\r\n")));


/*
	            //WRITE_ULONG (g_FMDInfo.ChipBaseAddress+ AMD_SETUP_ADDR1, (AMD_SETUP_CODE1 << 16) | AMD_SETUP_CODE1);
		     WRITE_COMMAND(pusDest32+ AMD_SETUP_ADDR1,AMD_SETUP_CODE1);
		     // *((ULONG *)g_FMDInfo.ChipBaseAddress+ AMD_SETUP_ADDR1)=(AMD_SETUP_CODE1 << 16) | AMD_SETUP_CODE1;
		     //*(pusDest32+ AMD_SETUP_ADDR1)=(AMD_SETUP_CODE1 << 16) | AMD_SETUP_CODE1;		
		     RETAILMSG(1, (TEXT("DoWordWrite: write over 0-1\r\n")));		
	            //WRITE_ULONG (g_FMDInfo.ChipBaseAddress+ AMD_SETUP_ADDR2, (AMD_SETUP_CODE2 << 16) | AMD_SETUP_CODE2);
		     WRITE_COMMAND(pusDest32+ AMD_SETUP_ADDR2,AMD_SETUP_CODE2);
		     // *((ULONG *)g_FMDInfo.ChipBaseAddress+ AMD_SETUP_ADDR2)=(AMD_SETUP_CODE2 << 16) | AMD_SETUP_CODE2;
		      //*(pusDest32+ AMD_SETUP_ADDR2)=(AMD_SETUP_CODE2 << 16) | AMD_SETUP_CODE2;			
		     RETAILMSG(1, (TEXT("DoWordWrite: write over 0-2\r\n")));		
	            //WRITE_ULONG (g_FMDInfo.ChipBaseAddress+ AMD_SETUP_ADDR1, (AMD_PROGRAM << 16) | AMD_PROGRAM);
		     WRITE_COMMAND(pusDest32+ AMD_SETUP_ADDR1,AMD_PROGRAM);
		     // *((ULONG *)g_FMDInfo.ChipBaseAddress+ AMD_SETUP_ADDR1)=(AMD_PROGRAM << 16) | AMD_PROGRAM;		     
		     //*(pusDest32+ AMD_SETUP_ADDR1)=(AMD_PROGRAM << 16) | AMD_PROGRAM;				
		      //RETAILMSG(1, (TEXT("DoWordWrite: write over 0-3\r\n")));		
			RETAILMSG(1, (TEXT(" 0-0\r\n")));	
	            //WRITE_ULONG (physicalSectorAddr + k, *(pLongBuffer+k));
		     //*((ULONG *)physicalSectorAddr + k)=*(pLongBuffer+k) ;
		       //pusDest32= (PULONG)physicalSectorAddr;
			//*(pusDest32+k)=*(pLongBuffer+k) ;
	*/		
	
			WRITE_COMMAND(pusDest32+ 0x00000,0x00a0);
//	     RETAILMSG(1, (TEXT("DoWordWrite: write over 0-4\r\n")));
	
			*(pusDest32+(m_offset>>2)+k)=*(pLongBuffer+k) ;	
			//*((ULONG *)physicalSectorAddr+k)=*(pLongBuffer+k) ;	
			//*((ULONG *)ulBlockAddress) =*(pLongBuffer+k) ;	
//WRITE_COMMAND(pusDest32+ AMD_SETUP_ADDR1,0x0090);

//WRITE_COMMAND(pusDest32+ AMD_SETUP_ADDR2,0x0000);

			  
			DelayInuSec(100);
	    	       ulCount = 0;

			//RETAILMSG(1, (TEXT(" 0-0-0\r\n")));	   
			//WRITE_COMMAND(pusDest32+(m_offset>>2)+k, AMD_RESET);
			//WRITE_COMMAND((volatile ULONG *)g_FMDInfo.ChipBaseAddress, AMD_RESET);
			//RETAILMSG(1, (TEXT(" 1  %x \r\n"),m_offset));
			//RETAILMSG(1, (TEXT(" 1  %x \r\n"),pLongBuffer));
			//RETAILMSG(1, (TEXT(" 1  %x \r\n"),*(pLongBuffer+k)));
			//RETAILMSG(1, (TEXT(" 1  %x \r\n"),ulBlockAddress));
			//RETAILMSG(1, (TEXT(" 1  %x \r\n"),*((ULONG *)ulBlockAddress)));	
			//RETAILMSG(1, (TEXT(" 1  %x \r\n"),pusDest32+(m_offset>>2)+k));
			//RETAILMSG(1, (TEXT(" 1  %x \r\n"),*(pusDest32+(m_offset>>2)+k)));
			while ( *(pusDest32+(m_offset>>2)+k) != *(pLongBuffer+k)   )
			//while ( *(pLongBuffer+k) !=*(pusDest32+(m_offset>>2)+k)  )	
	        	{
		    		//RETAILMSG(1, (TEXT("DoWordWrite: write over 1-1 =%x,%x \r\n"),*((ULONG *)physicalSectorAddr+k),*(pLongBuffer+k)));					
		    		DelayInuSec(1);
					
		    		if ( ulCount++== 100)
		    		{
		        		RETAILMSG(1, (TEXT("DoWordWrite: %x  %x\r\n"),*(pusDest32+(m_offset>>2)+k),*(pLongBuffer+k) ));
					iResult = FLASH_ERR_DRV_TIMEOUT;		
		        		//return 0;
		        		break;
		    		}
	        	  }
	        	 
	        	  
			//RETAILMSG(1, (TEXT("%x \r\n"),pLongBuffer+k));
			//RETAILMSG(1, (TEXT("%x \r\n"),*(pLongBuffer+k) ));
			//RETAILMSG(1, (TEXT("%x \r\n"),pusDest32+k));
			//RETAILMSG(1, (TEXT("%x \r\n"),*(pusDest32+k) ));
//			RETAILMSG(1, (TEXT("%x %x\r\n"),*(pLongBuffer+k),*((ULONG *)physicalSectorAddr+k) ));
//			//RETAILMSG(1, (TEXT("DoWordWrite: write over 2 =%x,%x \r\n"),*((ULONG *)physicalSectorAddr+k),*(pLongBuffer+k)));	
						
	        }
	        else
	        {
	            pusDest16= (PUSHORT)g_FMDInfo.ChipBaseAddress;
	            //RETAILMSG(1, (TEXT(" 0\r\n")));
	            //WRITE_ULONG (g_FMDInfo.ChipBaseAddress+ AMD_SETUP_ADDR1, (AMD_SETUP_CODE1 << 16) | AMD_SETUP_CODE1);
		     //WRITE_COMMAND(g_FMDInfo.ChipBaseAddress+ AMD_SETUP_ADDR1,AMD_SETUP_CODE1);
		     // *((ULONG *)g_FMDInfo.ChipBaseAddress+ AMD_SETUP_ADDR1)=(AMD_SETUP_CODE1 << 16) | AMD_SETUP_CODE1;
		     //*(pusDest16+ AMD_SETUP_ADDR1)=(AMD_SETUP_CODE1 << 16) | AMD_SETUP_CODE1;		
		     //RETAILMSG(1, (TEXT("DoWordWrite: write over 0-1\r\n")));		
	            //WRITE_ULONG (g_FMDInfo.ChipBaseAddress+ AMD_SETUP_ADDR2, (AMD_SETUP_CODE2 << 16) | AMD_SETUP_CODE2);
		     //WRITE_COMMAND(g_FMDInfo.ChipBaseAddress+ AMD_SETUP_ADDR1,AMD_SETUP_CODE2);
		     // *(pusDest16+ AMD_SETUP_ADDR2)=(AMD_SETUP_CODE2 << 16) | AMD_SETUP_CODE2;			
		     //RETAILMSG(1, (TEXT("DoWordWrite: write over 0-2\r\n")));		
	            //WRITE_ULONG (g_FMDInfo.ChipBaseAddress+ AMD_SETUP_ADDR1, (AMD_PROGRAM << 16) | AMD_PROGRAM);
		     //WRITE_COMMAND(g_FMDInfo.ChipBaseAddress+ AMD_SETUP_ADDR1,AMD_PROGRAM);
		     //*(pusDest16+ AMD_SETUP_ADDR1)=(AMD_PROGRAM << 16) | AMD_PROGRAM;				
		      //RETAILMSG(1, (TEXT("DoWordWrite: write over 0-3\r\n")));		
			//RETAILMSG(1, (TEXT(" 0-0\r\n")));	
	            //WRITE_ULONG (physicalSectorAddr + k, *(pLongBuffer+k));
		     //*((ULONG *)physicalSectorAddr + k)=*(pLongBuffer+k) ;
		     
			WRITE_COMMAND(pusDest16+ 0x00000,0x00a0);
			  
			*(pusDest16+(m_offset>>1)+k)=*(pShortBuffer+k) ;	
				
			DelayInuSec(1);
	    	       ulCount = 0;
			//RETAILMSG(1, (TEXT(" 1\r\n")));
			
			while ( *(pusDest16+(m_offset>>1)+k) != *(pShortBuffer+k)   )
	        	{
		    		//RETAILMSG(1, (TEXT("DoWordWrite: write over 1-1 =%x,%x \r\n"),*((ULONG *)physicalSectorAddr+k),*(pLongBuffer+k)));					
		    		DelayInuSec(1);
					
		    		if ( ulCount++== 1000 )
		    		{
		        		RETAILMSG(1, (TEXT("DoWordWrite: Timed out writing buffered data 1\r\n")));
					iResult = FLASH_ERR_DRV_TIMEOUT;		
		        		//return 0;
		        		break;
		    		}
	        	  }
	        	 
	        	  
			//RETAILMSG(1, (TEXT("%x \r\n"),pShortBuffer+k));
			//RETAILMSG(1, (TEXT("%x \r\n"),*(pShortBuffer+k) ));
			//RETAILMSG(1, (TEXT("%x \r\n"),pusDest16+k));
			//RETAILMSG(1, (TEXT("%x \r\n"),*(pusDest16+k) ));
//			//RETAILMSG(1, (TEXT("%x %x\r\n"),*(pLongBuffer+k),*((ULONG *)physicalSectorAddr+k) ));
//			//RETAILMSG(1, (TEXT("DoWordWrite: write over 2 =%x,%x \r\n"),*((ULONG *)physicalSectorAddr+k),*(pLongBuffer+k)));	
	
				
	        }
			
	        DelayInuSec(1);
	    	ulCount = 0;

		//RETAILMSG(1, (TEXT("3\r\n")));

		/*
	      if (g_bPairedFlash)
	     {

				
			 if (FLASH_ERR_OK != iResult)
		        {
		             WRITE_COMMAND(g_FMDInfo.ChipBaseAddress, AMD_RESET);
			      RETAILMSG(1, (TEXT("DoWordWrite: Timed out writing buffered data 1\r\n")));
			   	return FALSE;
		        }
					
		        if  (*((ULONG *)physicalSectorAddr + k)!=*(pLongBuffer+k))
		       {
		            // Only update return value if erase operation was OK
		             if (FLASH_ERR_OK == iResult) 
			      {
			     		iResult = FLASH_ERR_DRV_VERIFY;
				}

				RETAILMSG(1, (TEXT("DoWordWrite: data error...addre=%x value=%x should value=%x\r\n"),
							(physicalSectorAddr + k),*((ULONG *)physicalSectorAddr + k),*(pLongBuffer+k)));
			  
		        }		

	        	
	      	}
		else
		{
	        	
				
			 if (FLASH_ERR_OK != iResult)
		        {
		             WRITE_COMMAND(g_FMDInfo.ChipBaseAddress, AMD_RESET);
			      RETAILMSG(1, (TEXT("DoWordWrite: Timed out writing buffered data 1\r\n")));
			   	return FALSE;
		        }
					
		        if  (*((USHORT *)physicalSectorAddr + k)!=*(pShortBuffer+k))
		       {
		            // Only update return value if erase operation was OK
		             if (FLASH_ERR_OK == iResult) 
			      {
			     		iResult = FLASH_ERR_DRV_VERIFY;
				}

				RETAILMSG(1, (TEXT("DoWordWrite: data error...addre=%x value=%x should value=%x\r\n"),
							(physicalSectorAddr + k),*((USHORT *)physicalSectorAddr + k),*(pShortBuffer+k)));
			  
		        }		
	        		
	      	}
	      	
		RETAILMSG(1, (TEXT("DoWordWrite: write over 2\r\n")));
		*/
   	 }


        if (g_bPairedFlash)
	{
		pusDest32= (volatile PULONG)g_FMDInfo.ChipBaseAddress;
		WRITE_COMMAND(pusDest32+ AMD_SETUP_ADDR1,0x0090);
		WRITE_COMMAND(pusDest32+ AMD_SETUP_ADDR2,0x0000);
   		// WRITE_COMMAND(g_FMDInfo.ChipBaseAddress, AMD_RESET);
        }

	else
	{
		pusDest16= (volatile PUSHORT)g_FMDInfo.ChipBaseAddress;
		WRITE_COMMAND(pusDest16+ AMD_SETUP_ADDR1,0x0090);
		WRITE_COMMAND(pusDest16+ AMD_SETUP_ADDR2,0x0000);
   		// WRITE_COMMAND(g_FMDInfo.ChipBaseAddress, AMD_RESET);

	}


	
#endif


  

    return NumWriteBytes;
}
#else
DWORD DoBufferedWrite(volatile ULONG ulBlockAddress,
                      volatile SECTOR_ADDR physicalSectorAddr,
                      PUCHAR pBuffer,
                      USHORT NumWriteBytes)
{
    DWORD k = 0;
    DWORD dwBusWidth = g_bPairedFlash ? sizeof(ULONG) : sizeof(USHORT);
    ULONG ulCount;

    // Let the flash know the size of the buffer we plan to send (note that this is a 0-based word count and we simulatenously
    // write it to both flash parts (upper and lower).
    DWORD dwWordCount = (NumWriteBytes / dwBusWidth) - 1;


   WRITE_COMMAND(ulBlockAddress, CLEAR_STATUS_CMD);
   
    WRITE_COMMAND(ulBlockAddress, BUFFER_WRITE_CMD);
//    DelayInuSec(1000);
    ulCount = 0;
	while (!CHECK_STATUS(ulBlockAddress, STATUS_READY_MASK))
    {
        DelayInuSec(1);
        if ( ulCount++ == 1000 )
        {
            RETAILMSG(1, (TEXT("DoBufferedWrite: Timed out writing buffered data 0\r\n")));
            return 0;
        }
    }
   WRITE_COMMAND(ulBlockAddress, CLEAR_STATUS_CMD);
   
//    RETAILMSG(1, (TEXT("DoBufferedWrite: dwWordCount = %d should 15 \r\n"), dwWordCount));
    if (g_bPairedFlash)
    {
        PULONG pLongBuffer = (PULONG)pBuffer;
        WRITE_ULONG (ulBlockAddress, (dwWordCount << 16) | dwWordCount);
        
        for(k = 0 ; k < NumWriteBytes ; k += dwBusWidth)
        {
            WRITE_ULONG (physicalSectorAddr + k, *pLongBuffer++);
            ulCount = 0;

		WRITE_COMMAND(ulBlockAddress, READ_STATUS_CMD);	
        	while (!CHECK_STATUS(ulBlockAddress, STATUS_READY_MASK))
            {
                DelayInuSec(1);
                if ( ulCount++ == 1000 )
                {
                    RETAILMSG(1, (TEXT("DoBufferedWrite: Timed out writing buffered data 1\r\n")));
                    return 0;
                }
            }
		WRITE_COMMAND(ulBlockAddress, CLEAR_STATUS_CMD);
		
        }
    }
    else 
    {
        PUSHORT pShortBuffer = (PUSHORT)pBuffer;
        WRITE_USHORT (ulBlockAddress, (USHORT)dwWordCount);
        
        for(k = 0 ; k < NumWriteBytes ; k += dwBusWidth)
        {
            WRITE_USHORT (physicalSectorAddr + k, *pShortBuffer++);        
            ulCount = 0;

		WRITE_COMMAND(ulBlockAddress, READ_STATUS_CMD);	
        	while (!CHECK_STATUS(ulBlockAddress, STATUS_READY_MASK))
            {
                DelayInuSec(1);
                if ( ulCount++ == 1000 )
                {
                    RETAILMSG(1, (TEXT("DoBufferedWrite: Timed out writing buffered data 2\r\n")));
                    return 0;
                }
            }
		WRITE_COMMAND(ulBlockAddress, CLEAR_STATUS_CMD);
		
        }
    }        

    // Now program the buffer into flash...
    //
    WRITE_COMMAND(ulBlockAddress, BLOCK_PROCEED_CMD);
//    DelayInuSec(100);
    ulCount = 0;
    WRITE_COMMAND(ulBlockAddress, READ_STATUS_CMD);
	while (!CHECK_STATUS(ulBlockAddress, STATUS_READY_MASK))
    {
        DelayInuSec(1);
        if ( ulCount++ == 1000 )
        {
            RETAILMSG(1, (TEXT("DoBufferedWrite: Timed out writing buffered data 3\r\n")));
            return 0;

⌨️ 快捷键说明

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