📄 jflash.cpp
字号:
}
void JTAG_Go_new(unsigned int *context)
{
unsigned int i, null;
JTAG_Select_Scan_Chain(DEBUG);
JTAG_Step(0xE89F0001, &null); //ldmia r14,{r0-pc}
JTAG_Step(NOP, &null);
JTAG_Step(NOP, &null);
JTAG_Step(context[15], &null);
JTAG_Step(NOP, &null);
JTAG_Step(NOP, &null);
JTAG_Step_System_Speed(NOP);
JTAG_Step(BRANCH_PC, &null); //b 0x8008
JTAG_Shift_ir(RESTART, IDLE);
for(null = 0; null < ADD_WAIT_STATE; null++);
}
void JTAG_Read_Bkru(unsigned int address, unsigned int *data)
{
unsigned int loop, readvalue;
readvalue = 0;
JTAG_TMS( HIGH ); JTAG_TCK( LOW ); JTAG_TCK( HIGH );
JTAG_TMS( LOW ); JTAG_TCK( LOW ); JTAG_TCK( HIGH );
JTAG_TDI( LOW ); JTAG_TCK( LOW ); JTAG_TCK( HIGH );
if(address & 0x1) JTAG_TDI( HIGH );
else JTAG_TDI( LOW );
JTAG_TCK( LOW ); JTAG_TCK( HIGH );
if(address & 0x2) JTAG_TDI( HIGH );
else JTAG_TDI( LOW );
JTAG_TCK( LOW ); JTAG_TCK( HIGH );
if(address & 0x4) JTAG_TDI( HIGH );
else JTAG_TDI( LOW );
JTAG_TCK( LOW ); JTAG_TCK( HIGH );
if(address & 0x8) JTAG_TDI( HIGH );
else JTAG_TDI( LOW );
JTAG_TCK( LOW ); JTAG_TCK( HIGH );
if(address & 0x10) JTAG_TDI( HIGH );
else JTAG_TDI( LOW );
JTAG_TCK( LOW ); JTAG_TCK( HIGH );
JTAG_TMS( HIGH );
JTAG_TDI( LOW );
JTAG_TCK( LOW ); JTAG_TCK( HIGH );
JTAG_TDI( HIGH ); JTAG_TCK( LOW ); JTAG_TCK( HIGH );
JTAG_TMS( LOW ); JTAG_TCK( LOW ); JTAG_TCK( HIGH );
JTAG_TMS( HIGH ); JTAG_TCK( LOW ); JTAG_TCK( HIGH );
JTAG_TMS( LOW ); JTAG_TCK( LOW ); JTAG_TCK( HIGH );
JTAG_TDI( LOW ); JTAG_TCK( LOW ); JTAG_TCK( HIGH );
for(loop = 0; loop < 31; loop++)
{
JTAG_TCK( LOW ); JTAG_TCK( HIGH );
if(JTAG_TDO()) readvalue |= (0x1 << loop);
}
JTAG_TMS( HIGH );
JTAG_TCK( LOW ); JTAG_TCK( HIGH );
if(JTAG_TDO()) readvalue |= 0x80000000;
JTAG_TDI( HIGH ); JTAG_TCK( LOW ); JTAG_TCK( HIGH );
JTAG_TMS( LOW ); JTAG_TCK( LOW ); JTAG_TCK( HIGH );
*data = readvalue;
}
void JTAG_Write_Bkru(unsigned int address, unsigned int data)
{
unsigned int loop;
JTAG_TMS( HIGH ); JTAG_TCK( LOW ); JTAG_TCK( HIGH );
JTAG_TMS( LOW ); JTAG_TCK( LOW ); JTAG_TCK( HIGH );
JTAG_TDI( LOW ); JTAG_TCK( LOW ); JTAG_TCK( HIGH );
for(loop = 0; loop < 32; loop++)
{
if(data & (0x1 << loop)) JTAG_TDI( HIGH );
else JTAG_TDI( LOW );
JTAG_TCK( LOW ); JTAG_TCK( HIGH );
}
if(address & 0x1) JTAG_TDI( HIGH );
else JTAG_TDI( LOW );
JTAG_TCK( LOW ); JTAG_TCK( HIGH );
if(address & 0x2) JTAG_TDI( HIGH );
else JTAG_TDI( LOW );
JTAG_TCK( LOW ); JTAG_TCK( HIGH );
if(address & 0x4) JTAG_TDI( HIGH );
else JTAG_TDI( LOW );
JTAG_TCK( LOW ); JTAG_TCK( HIGH );
if(address & 0x8) JTAG_TDI( HIGH );
else JTAG_TDI( LOW );
JTAG_TCK( LOW ); JTAG_TCK( HIGH );
if(address & 0x10) JTAG_TDI( HIGH );
else JTAG_TDI( LOW );
JTAG_TCK( LOW ); JTAG_TCK( HIGH );
JTAG_TMS( HIGH );
JTAG_TDI( HIGH );
JTAG_TCK( LOW ); JTAG_TCK( HIGH );
JTAG_TDI( HIGH ); JTAG_TCK( LOW ); JTAG_TCK( HIGH );
JTAG_TMS( LOW ); JTAG_TCK( LOW ); JTAG_TCK( HIGH );
}
void Flash_Write_Halfword(unsigned int vaddress, unsigned int vdata)
{
JTAG_Write_Memory(vaddress<<1, vdata, HALFWORD);
}
void Flash_Write_Halfword2(unsigned int vaddress, unsigned int vdata)
{
JTAG_Write_Memory(vaddress, vdata, HALFWORD);
}
void Flash_Write2(unsigned int vaddress, unsigned int vdata)
{
JTAG_Write_Memory(vaddress, vdata, WORD);
}
unsigned int Flash_Read_Halfword(unsigned int vaddress)
{
unsigned int vdata;
JTAG_Read_Memory(vaddress<<1, &vdata, HALFWORD);
return(vdata);
}
unsigned int Flash_Read_Halfword2(unsigned int vaddress)
{
unsigned int vdata;
JTAG_Read_Memory(vaddress, &vdata, HALFWORD);
return(vdata);
}
unsigned int Flash_Read_Word(unsigned int vaddress)
{
unsigned int vdata;
JTAG_Read_Memory(vaddress<<1, &vdata, WORD);
return(vdata);
}
unsigned int Flash_Read_Word2(unsigned int vaddress)
{
unsigned int vdata;
JTAG_Read_Memory(vaddress, &vdata, WORD);
return(vdata);
}
/*******************************************************************************
* flash opration
*/
#define MAX_FILE_NAME 50
#define MAX_ROM_WORD 0xfffff
unsigned int WriteBuffer[MAX_ROM_WORD]; //Global Buffer implement File Content
unsigned int ReadBuffer[MAX_ROM_WORD]; //Global Buffer implement File Content
//秦寸 颇老狼 郴侩阑 滚欺俊 持绢霖促.
int ReadFileData32(char* szFileName, unsigned int* buffer)
{
FILE* in_file;
if( (in_file = fopen(szFileName, "rb" )) == NULL)
error_out("error, can not open binary input file");
for(int i = 0; i < MAX_ROM_WORD; i++)
{
int n = fread((__int32* )&buffer[i], sizeof(__int32) , 1, in_file);
if(feof(in_file))
break;
}
fclose(in_file);
return (i);
}
unsigned int WriteFileToFlash(char *filename, unsigned int vaddress)
{
unsigned int i, Len;
if(filename == NULL)
{
printf(" Error!!! -> No File Name\n" );
return FALSE;
}
Len = ReadFileData32(filename , WriteBuffer);
if(Len < 0 || Len > MAX_ROM_WORD)
error_out("File Content Size Invalid");
// printf(" Write File Len = %d\n", Len*4 );
// for(i=0; i<Len; i++)
// {
// if((i%16)==0) printf("\n%02x: ", i);
// printf("%08x ", *(WriteBuffer+i));
// }
Program_29LV160( (unsigned int)WriteBuffer, Len*4, vaddress);
return TRUE;
}
/*
* Program_29LV160()
* flash烧写函数
* downloadAddress--烧写数据缓冲区地址
* downloadProgramSize--烧写数据长度
* targetAddress--烧写到flash的起始地址
*/
void Program_29LV160(unsigned int downloadAddress, unsigned int downloadProgramSize, unsigned int targetAddress)
{
int i;
unsigned int tmp;
unsigned int size=downloadProgramSize, src=downloadAddress, dst=targetAddress; // 保存校验地址和长度
printf("Program target address=0x%x\n", targetAddress);
printf("Program Size=0x%x\n", downloadProgramSize);
Flash_EraseSector(targetAddress);
Sleep(1000); // 250ms
if(!Flash_BlankCheck(targetAddress))
{
printf("Blank Check Error!!!\n");
//return;
}
printf("Start of the data writing: 0x%x Sector size: 0x%x\n", targetAddress, targetSize);
while (downloadProgramSize != 0)
{
if (downloadProgramSize <targetSize )
targetSize =downloadProgramSize;
for(i=0;i<targetSize;i+=2)
{
Flash_Write( i+targetAddress, *( (unsigned short *)(downloadAddress+i) ) );
if((i%0x1000)==0)
printf("%x ",i);
}
_RESET();
printf("\nEnd of the data writing!!!\n");
downloadAddress = downloadAddress + targetSize;
downloadProgramSize = downloadProgramSize - targetSize;
targetAddress = targetAddress + targetSize;
if (downloadProgramSize ==0 )
{
printf("Program end.\n");
break;
}
//usleep(250000); // 250ms
Flash_EraseSector(targetAddress);
Sleep(1500); // 1500ms
if(!Flash_BlankCheck(targetAddress))
{
printf("Blank Check Error!!!\n");
return;
}
printf("Start of the data writing: 0x%x\n", targetAddress);
}
Sleep(300); // 250ms
printf("Verifying Start.\n");
for(i=0x0;i<size;i+=2)
{
tmp = Flash_Read_Halfword2(i+dst);
if( tmp != *( (unsigned short *)(src+i) ) )
{
printf("%x=%x(%x) verify error\n", i+dst, tmp, *( (unsigned short *)(src+i) ));
return;
}
if((i%0x1000)==0)
printf("%x ",i);
}
printf("\nVerifying End!!!\n");
}
void FlashDump(int targetAddr, int size)
{
unsigned int i, tmp;
for(i=0; i<size; i+=2)
{
tmp=Flash_Read_Halfword2(i+targetAddr);
if((i%16)==0) printf("\n%0x:\t", i+targetAddr);
printf("%04x ", tmp);
}
}
static void InputTargetAddr(void)
{
//targetAddress=Uart_GetIntNum();
targetAddress=BIOS_START;//0x100000;
printf("\ntarget address=0x%x",targetAddress);
}
int Flash_CheckId(void)
{
unsigned int manId,devId;
_RESET();
Flash_Write_Halfword(0x555,0xaaaa);
Flash_Write_Halfword(0x2aa,0x5555);
Flash_Write_Halfword(0x555,0x9090);
manId=Flash_Read_Halfword2(0x0);
Flash_Write_Halfword(0x555,0xaaaa);
Flash_Write_Halfword(0x2aa,0x5555);
Flash_Write_Halfword(0x555,0x9090);
devId=Flash_Read_Halfword2(0x2);
_RESET();
printf("> Man ID = %04x\n", manId);
printf("> Dev ID = %04x\n", devId);
printf("> Flash Type : ");
if (manId==0x01) {
printf("AM29LV160");
}
else if (manId==0xad) {
printf("HY29LV160");
}
else if (manId==0xc2) {
printf("MX29LV160");
}
else {
printf("Unkown!!!");
//return 0;
}
if (devId==0x2249) {
BootMode=BOTTOM_BOOT;
printf("-B\n");
}
else if (devId==0x22c4) {
BootMode=TOP_BOOT;
printf("-T\n");
}
else {
printf("\nCan't prog flash!!!\n");
//return 0;
}
return 1;
}
void Flash_EraseChip(void)
{
printf("Sector Erase is started...");
_RESET();
Flash_Write_Halfword(0x555,0xaaaa);
Flash_Write_Halfword(0x2aa,0x5555);
Flash_Write_Halfword(0x555,0x8080);
Flash_Write_Halfword(0x555,0xaaaa);
Flash_Write_Halfword(0x2aa,0x5555);
Flash_Write_Halfword(0x555,0x1010);// back to origian place
_WAIT();
_RESET();
printf("OK.\n");
}
void Flash_EraseSector(int targetAddr)
{
printf("Erase the sector:0x%x...",targetAddr);
_RESET();
Flash_Write_Halfword(0x555,0xaaaa);
Flash_Write_Halfword(0x2aa,0x5555);
Flash_Write_Halfword(0x555,0x8080);
Flash_Write_Halfword(0x555,0xaaaa);
Flash_Write_Halfword(0x2aa,0x5555);
Flash_Write_Halfword(BADDR2WADDR(targetAddr),0x3030);// back to origian place
_WAIT();
_RESET();
printf("OK.\n");
// Sleep(100);
}
int Flash_BlankCheck(int targetAddr)
{
unsigned int i, tmp;
// Sleep(100);
//bottom boot
if (BootMode==BOTTOM_BOOT) {
if(targetAddr==0x0000)
targetSize=0x4000;
else if(targetAddr==0x4000)
targetSize=0x2000;
else if(targetAddr==0x6000)
targetSize=0x2000;
else if(targetAddr==0x8000)
targetSize=0x8000;
else
targetSize=0x10000;
}
//top boot
else if (BootMode==TOP_BOOT) {
if(targetAddr<0x1F0000)
targetSize=0x10000;
else if(targetAddr<0x1F8000)
targetSize=0x8000;
else if(targetAddr<0x1FC000)
targetSize=0x2000;
else
targetSize=0x4000;
}
// for(i=0; i<256; i+=2)
// {
// tmp=Flash_Read_Halfword2(i);
// if((i%16)==0) printf("\n%02x: ", i);
// printf("%04x ", tmp);
// }
for(i=0;i<targetSize;i+=2)
{
tmp=Flash_Read_Halfword2(i+targetAddr);
if( tmp!=0xffff)
{
printf("\nErr:%x=%x",(i+targetAddr),tmp);
return 0;
}
}
return 1;
}
int _WAIT(void) //Check if the bit6 toggle ends.
{
volatile unsigned int flashStatus,old;
old=Flash_Read_Halfword2(0x0);
while(1)
{
flashStatus=Flash_Read_Halfword2(0x0);
if( (old&0x40) == (flashStatus&0x40) )
break;
if( flashStatus&0x20 ) //Time_limit_over check(in case normally end with set DQ5)
{
//printf("[DQ5=1:%x]\n",flashStatus);
old=Flash_Read_Halfword2(0x0);
flashStatus=Flash_Read_Halfword2(0x0);
if( (old&0x40) == (flashStatus&0x40) )
return 1; //No toggle
else
return 0; //toggling
}
//printf(".");
old=flashStatus;
}
//printf("!\n");
return 1;
}
int Flash_Write(unsigned int realAddr,unsigned int data)
{
Flash_Write_Halfword(0x555,0xaaaa);
Flash_Write_Halfword(0x2aa,0x5555);
Flash_Write_Halfword(0x555,0xa0a0);
Flash_Write_Halfword2(realAddr, data);
return _WAIT();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -