📄 flash.cpp
字号:
/*
===========================================================================
File Name : Flash.cpp
Function : Flash Writer Function
Note :
UPDATE NOTE
----------+---------------------------------------------------+------------
DATE | Bug or Description for this Version | VERSION
----------+---------------------------------------------------+------------
2004/8/5 First Release V0.001
2004/8/5
Modified by Frank Chiang
============================================================================
*/
#include "Command.h"
#include "USB_init.h"
#include "USB_Base2.cpp"
/*
------------------------------------------------------------------------------
bool Initial_FlashWriter(void)
Function : Initial Flash Writer function
Input :
Output :
return 0 , Initial error
return 1 , Initial susceed
Note :
------------------------------------------------------------------------------
*/
bool Initial_NFlashWriter(void)
{
if ( ! Search_USB_Port() )
return 0;
return 1;
}
void Set_USB_Close(BYTE mode)
{
USB_Special_Patten = USB_Special_Patten + 0x40;
Write1L_Cmd( USB_CLOSE + USB_Special_Patten , mode );
}
bool Check_USB_Ready(void)
{
int Status;
BYTE data[64];
USB_Special_Patten = USB_Special_Patten + 0x40;
Write1L_Cmd( USB_READY + USB_Special_Patten , 0x01 );
Sleep(1);
int Count=0;
while (1)
{
Status = _USB_ReadIn(instance, &data[0] , 64 );
if ( Status == 64 )
{
if ( (data[0] == 0xa5) && (data[1] == 0x5a) ) // Firmware special pattern
break;
}
Count++;
if ( Count == 100 )
{
AfxMessageBox("Check USB Ready -> Handshake Error !!! ",MB_OK,0);
break;
}
Sleep(1);
}
return 1;
}
bool EraseNFlash (int FlashAddr)
{
int Status;
BYTE data[64];
UINT Command = FlashAddr;//( (0X40 & 0xFFFF) << 16 ) | ( 0X80 & 0xFFFF ) ;
USB_Special_Patten = USB_Special_Patten + 0x40;
Write4L_Cmd( Init_Flash + USB_Special_Patten ,Command );
Sleep(6);
USB_Special_Patten = USB_Special_Patten + 0x40;
Write4L_Cmd( ERASE_BLOCK + USB_Special_Patten ,Command );
Sleep(2);
data[0]=0;
while ((data[0]!=0X55) && (data[1]!=0xaa))
{
Status = USBICE_Read(&data[0], 64);
if ( ! Status )
break;
}
return 1;
Set_USB_Close(0x00);
}
bool EraseNFlashSector (int FlashAddr)
{
int Status;
BYTE data[64];
UINT Command = 0x400040;//( (0X40 & 0xFFFF) << 16 ) | ( 0X80 & 0xFFFF ) ;
USB_Special_Patten = USB_Special_Patten + 0x40;
Write4L_Cmd( Init_Flash + USB_Special_Patten ,Command );
Sleep(6);
Command = 0x478000;
USB_Special_Patten = USB_Special_Patten + 0x40;
Write4L_Cmd( SET_ADDRESS + USB_Special_Patten , Command );
USB_Special_Patten = USB_Special_Patten + 0x40;
Write4L_Cmd( Erase_Sector + USB_Special_Patten ,Command );
Sleep(2);
data[0]=0;
while ((data[0]!=0X55) && (data[1]!=0xaa))
{
Status = USBICE_Read(&data[0], 64);
if ( ! Status )
break;
}
return 1;
Set_USB_Close(0x00);
}
bool NFlashWrite(BYTE *DataPtr, unsigned long StartAddr, unsigned long Len)
{
//--Command write
USB_Special_Patten = USB_Special_Patten + 0x40;
Write4L_Cmd( SET_ADDRESS + USB_Special_Patten , StartAddr );
// Sleep(1);
USB_Special_Patten = USB_Special_Patten + 0x40;
Write4L_Cmd( WRITE_FILE + USB_Special_Patten , Len / 2 );
Sleep(1);
//--Download File
// Test EP7 transfer speed
/*
time_t StartTime,EndTime,WriteTime;
time( &StartTime );
*/
if ( ! USBICE_Write( DataPtr , Len ) ) return 0;
// Test EP7 transfer speed
/*
time( &EndTime );
WriteTime = EndTime - StartTime;
*/
return 1;
}
bool NFlashRead(BYTE *DataPtr, unsigned long StartAddr, unsigned long Len,int flag)
{
int Status;
//--Command write
USB_Special_Patten = USB_Special_Patten + 0x40;
Write4L_Cmd( SET_ADDRESS + USB_Special_Patten , StartAddr );
// Sleep(1);
USB_Special_Patten = USB_Special_Patten + 0x40;
if(0==flag)
{
Write4L_Cmd( READ_FILE + USB_Special_Patten , Len / 2 ); //IN ICE USE THIS COMMAND
}
else
{
Write4L_Cmd( USB_ReadNandFlash_Data_Cmd + USB_Special_Patten , Len / 2 ); //IN RealChip USE THIS COMMAND
}
// Sleep(1);
//--Bulk read
Len+=512;
do
{
for (int i=1;i<=8;i++)
{
Status = USBICE_Read(DataPtr,64);
DataPtr+=64;
}
Len-=512;
}while (Len>=512);
if (!Status)
return 0;
return 1;
}
bool VerifyFlash(BYTE *ProgramDataPtr, unsigned long StartAddr, unsigned long Len, unsigned long filelength,int flag)
{
bool OKFlag = true;
USB_Special_Patten = USB_Special_Patten + 0x40;
Write4L_Cmd(USB_SetCommandRam_Cmd+USB_Special_Patten, ((StartAddr&0xffff)<<16 | SetIx0Value));
USB_Special_Patten = USB_Special_Patten + 0x40;
Write4L_Cmd(USB_SetCommandRam_Cmd+USB_Special_Patten, ((StartAddr&0xffff0000) | SetIx0bkramValue));
USB_Special_Patten = USB_Special_Patten + 0x40;
Write4L_Cmd(USB_SetCommandRam_Cmd+USB_Special_Patten, (((Len-1)&0xffff)<<16 | SetMR0Value));
USB_Special_Patten = USB_Special_Patten + 0x40;
Write4L_Cmd(USB_SetCommandRam_Cmd+USB_Special_Patten, (((Len-1)&0xffff0000) | SetMR1Value));
USB_Special_Patten = USB_Special_Patten + 0x40;
if (flag)
{
Write4L_Cmd(USB_Program_Jmp_Cmd+USB_Special_Patten, CalCheckSum8bit); //Excute Nandflash Program
}
else
{
Write4L_Cmd(USB_Program_Jmp_Cmd+USB_Special_Patten, CalCheckSum); //Excute Nandflash Program
}
/*
USB_Special_Patten = USB_Special_Patten + 0x40;
Write4L_Cmd( SET_ADDRESS + USB_Special_Patten , StartAddr );
// Sleep(1);
USB_Special_Patten = USB_Special_Patten + 0x40;
Write4L_Cmd( USB_ReadNandFlash_Data_Cmd + USB_Special_Patten , Len );
if (flag)
{
Write4L_Cmd(USB_Program_Jmp_Cmd+USB_Special_Patten, CalCheckSum8bit); //Excute Nandflash Program
}
else
{
Write4L_Cmd(USB_Program_Jmp_Cmd+USB_Special_Patten, CalCheckSum); //Excute Nandflash Program
}
*/
//计算Checksum
BYTE data[64];
int Checksum=0;
unsigned long i;
for (i=0;i<filelength;i++)
{
Checksum=Checksum+(*ProgramDataPtr);
ProgramDataPtr++;
}
// Sleep(50);
unsigned long Status;
// Write4L_Cmd(USB_Program_Jmp_Cmd+USB_Special_Patten,UpLoadX0Data); //Set X0 DATA
Sleep(20);
data[0]=0;
data[1]=0;
while((data[0]!=0X55) && (data[1]!=0xaa))
{
Status = USBICE_Read(&data[0],64);
if (!Status)
return false;
//break;
}
Set_USB_Close(0x00);
if ((data[2]+data[3]*256)!=(Checksum&0xffff))
{
OKFlag = false;
}
return OKFlag;
}
bool PlaySong(UINT StartAddr)
{
//--Command write
USB_Special_Patten = USB_Special_Patten + 0x40;
Write4L_Cmd( SET_ADDRESS + USB_Special_Patten , StartAddr );
Sleep(1);
USB_Special_Patten = USB_Special_Patten + 0x40;
Write1L_Cmd( PLAY_SONG + USB_Special_Patten , 0x01 );
Set_USB_Close(0x00);
return 1;
}
void ReadFlashID (int FlashAddr)
{
int Status;
BYTE data[64];
UINT Command = FlashAddr;//( (0X40 & 0xFFFF) << 16 ) | ( 0X80 & 0xFFFF ) ;
USB_Special_Patten = USB_Special_Patten + 0x40;
Write4L_Cmd(USB_SetCommandRam_Cmd+USB_Special_Patten, ((FlashAddr&0xff)<<16 | SetIx1bkramValue));
USB_Special_Patten = USB_Special_Patten + 0x40;
Write4L_Cmd(USB_Program_Jmp_Cmd+USB_Special_Patten ,ReadMXFlashID );
USB_Special_Patten = USB_Special_Patten + 0x40;
Sleep(10);
data[0]=0;
while ((data[0]!=0X5B) && (data[1]!=0x5A))
{
Status = USBICE_Read(&data[0], 64);
if ( ! Status )
break;
}
Set_USB_Close(0x00);
}
//Croco pen的CS1是16BIT总线
void SwitchToCS1(void)
{
USB_Special_Patten = USB_Special_Patten + 0x40;
Write4L_Cmd(USB_Program_Jmp_Cmd+USB_Special_Patten ,CrocoPenDownloadCS1 );
}
//Croco pen的CS2是8BIT总线
void SwitchToCS2(void)
{
USB_Special_Patten = USB_Special_Patten + 0x40;
Write4L_Cmd(USB_Program_Jmp_Cmd+USB_Special_Patten ,CrocoPenDownloadCS2 );
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -