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

📄 jflash.cpp

📁 ARM7202上通过JTAG烧录Flash的工具源代码
💻 CPP
📖 第 1 页 / 共 3 页
字号:
	
}

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 + -