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

📄 jflash.cpp

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

void JTAG_Shift_ir(unsigned int instruction, unsigned int idle)
{
JTAG_TMS( HIGH ); 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_TMS( LOW  ); JTAG_TCK( LOW  ); JTAG_TCK( HIGH );
	
	if(instruction & 0x1) 
		JTAG_TDI( HIGH );
	else 
		JTAG_TDI( LOW );
	
JTAG_TCK( LOW  ); JTAG_TCK( HIGH );
	
	if(instruction & 0x2) 
		JTAG_TDI( HIGH );
	else 
		JTAG_TDI( LOW );
	
JTAG_TCK( LOW  ); JTAG_TCK( HIGH );
	
	if(instruction & 0x4) JTAG_TDI( HIGH );
	else JTAG_TDI( LOW );
	
	JTAG_TCK( LOW  ); JTAG_TCK( HIGH );

	if(instruction & 0x8) JTAG_TDI( HIGH );
	else JTAG_TDI( LOW );
	
	JTAG_TMS( HIGH ); JTAG_TCK( LOW  ); JTAG_TCK( HIGH );  

	JTAG_TMS( HIGH ); JTAG_TCK( LOW  ); JTAG_TCK( HIGH ); 

	if(idle)
	{
		JTAG_TMS( LOW  ); JTAG_TCK( LOW  );	JTAG_TCK( HIGH );
	}

}

void JTAG_Shift_dr_4_bits(unsigned int data)
{

	JTAG_TMS( HIGH ); JTAG_TCK( LOW  ); JTAG_TCK( HIGH );

	JTAG_TMS( LOW  ); JTAG_TCK( LOW  ); JTAG_TCK( HIGH );
	
	JTAG_TMS( LOW  ); JTAG_TCK( LOW  ); JTAG_TCK( HIGH );

	if(data & 0x1) JTAG_TDI( HIGH );
	else JTAG_TDI( LOW );

	JTAG_TCK( LOW  ); JTAG_TCK( HIGH );
	
	if(data & 0x2) JTAG_TDI( HIGH );
	else JTAG_TDI( LOW );

	JTAG_TCK( LOW  ); JTAG_TCK( HIGH );
	
	if(data & 0x4) JTAG_TDI( HIGH );
	else JTAG_TDI( LOW );

	JTAG_TCK( LOW  ); JTAG_TCK( HIGH );

	if(data & 0x8) JTAG_TDI( HIGH );
	else JTAG_TDI( LOW );

	JTAG_TMS( HIGH ); JTAG_TCK( LOW  ); JTAG_TCK( HIGH ); 
	JTAG_TMS( HIGH ); JTAG_TCK( LOW  ); JTAG_TCK( HIGH ); 
	JTAG_TMS( LOW  ); JTAG_TCK( LOW  );	JTAG_TCK( HIGH );

}

void JTAG_IDCode(unsigned int *idcode)
{
	unsigned int loop;
	unsigned int 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 );
	
	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_TMS( HIGH ); JTAG_TCK( LOW  ); JTAG_TCK( HIGH ); 

	JTAG_TMS( LOW  ); JTAG_TCK( LOW  );	JTAG_TCK( HIGH );

	*idcode = readvalue;
}

void JTAG_Step(unsigned int instruction, unsigned int *data) 
{
unsigned int loop, readvalue, compare;
	
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 );
	
JTAG_TDI( LOW  );
JTAG_TCK( LOW  ); JTAG_TCK( HIGH );

	for(loop = 0; loop < 31; loop++)
		{
		compare = 0x80000000 >> loop;
		
			if(instruction & compare) 
				JTAG_TDI( HIGH );
			else 
				JTAG_TDI( LOW );
		
		JTAG_TCK( LOW  ); JTAG_TCK( HIGH );
		
			if(JTAG_TDO()) 
				readvalue |= compare;
		}

JTAG_TMS( HIGH ); 

	if(instruction & 0x1) 
		JTAG_TDI( HIGH );
	else 
		JTAG_TDI( LOW );

JTAG_TCK( LOW  ); JTAG_TCK( HIGH ); 
	if(JTAG_TDO()) 
		readvalue |= 0x1;

JTAG_TDI( HIGH ); JTAG_TCK( LOW  ); JTAG_TCK( HIGH ); 

JTAG_TMS( LOW  ); JTAG_TCK( LOW  ); JTAG_TCK( HIGH );

*data = readvalue;	
}

void JTAG_Step_System_Speed(unsigned int instruction)
{
	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 );
	
	JTAG_TDI( HIGH ); 
	JTAG_TCK( LOW  ); JTAG_TCK( HIGH );

	for(loop = 0; loop < 31; loop++)
	{		
		if(instruction & (0x80000000 >> loop)) JTAG_TDI( HIGH );
		else JTAG_TDI( LOW );
		
		JTAG_TCK( LOW  ); JTAG_TCK( HIGH );				
	}

	JTAG_TMS( HIGH ); 
	if(instruction & 0x1) JTAG_TDI( HIGH );
	else 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 );
	
}

void JTAG_Select_Scan_Chain(unsigned int sc)
{

	JTAG_Shift_ir(SCAN_N, NO_IDLE);

	JTAG_Shift_dr_4_bits(sc);

	JTAG_Shift_ir(INTEST, NO_IDLE);

}

unsigned int JTAG_Read_Debug_Status(void)
{
unsigned int value;
	
JTAG_Select_Scan_Chain(ICE_BREAKER);
JTAG_Read_Bkru(ICE_DBG_STS, &value);

return (value & ICE_DBG_STS_MASK);
}

unsigned int JTAG_Read_Debug_CTRL(void)
{
unsigned int value;
	
JTAG_Select_Scan_Chain(ICE_BREAKER);
JTAG_Read_Bkru(ICE_DBG_CTRL, &value);

return (value & ICE_DBG_STS_MASK);
}

unsigned int JTAG_Test_Is_Breaked(unsigned int value)
{
unsigned int temp;
unsigned int watchdog = 0;

	while ((watchdog < value) && ((JTAG_Read_Debug_Status() & READ_DEBUG_STATUS_MASK) != READ_DEBUG_STATUS_MASK))
		{
		watchdog++;
		}
	
	if (watchdog < value)
		{
		return TRUE;	
		}
	else 
		{
		printf("  Debug Status : %x\n", JTAG_Read_Debug_Status());
		return FALSE;
		}
}

void JTAG_Write_Memory(unsigned int address, unsigned int value, unsigned int halfword)
{
unsigned int null;

JTAG_Select_Scan_Chain(DEBUG);

JTAG_Step(LDMIA_R0_R0_R1, &null);

JTAG_Step(NOP, &null);
JTAG_Step(NOP, &null);

JTAG_Step(address, &null);
JTAG_Step(value, &null);
	
JTAG_Step(NOP, &null);
JTAG_Step(NOP, &null);
JTAG_Step(NOP, &null);

JTAG_Step_System_Speed(NOP);

	if(halfword)
		{
		JTAG_Step(WRITE_MEM_HALFWORD, &null);
		}
	else
		{
		JTAG_Step(WRITE_MEM, &null);
		}

JTAG_Step(NOP, &null);

JTAG_Shift_ir(RESTART, IDLE);		

	for(null = 0; null < ADD_WAIT_STATE; null++);	
	
}

void JTAG_MMU_RESET(unsigned int address, unsigned int value, unsigned int number)
{
unsigned int null;

JTAG_Select_Scan_Chain(DEBUG);

JTAG_Step(LDMIA_R0_R0_R1, &null);

JTAG_Step(NOP, &null);
JTAG_Step(NOP, &null);

JTAG_Step(address, &null);
JTAG_Step(value, &null);
	
JTAG_Step(NOP, &null);
JTAG_Step(NOP, &null);
JTAG_Step(NOP, &null);

JTAG_Step_System_Speed(NOP);

		JTAG_Step(WRITE_MMU_setting, &null);
	
JTAG_Step(NOP, &null);

JTAG_Shift_ir(RESTART, IDLE);		

	for(null = 0; null < ADD_WAIT_STATE; null++);	
	
}

void JTAG_Read_MMU(unsigned int *value)
{
unsigned int null;

JTAG_Select_Scan_Chain(DEBUG);

JTAG_Step(READ_MMU, &null);

JTAG_Shift_ir(RESTART, IDLE);	//* Shift RESTART instruction	
	
	for(null = 0; null < ADD_WAIT_STATE; null++);	
	
JTAG_Select_Scan_Chain(DEBUG);

JTAG_Step(READ_REG, &null);				

JTAG_Step(NOP, &null);
JTAG_Step(NOP, &null);

JTAG_Step(NOP, value);							

JTAG_Step(NOP, &null);
JTAG_Step(NOP, &null);
}

void JTAG_Read_CPU_STATUS(unsigned int *value)
{
unsigned int null;

JTAG_Select_Scan_Chain(DEBUG);

JTAG_Step(READ_CPU, &null);

JTAG_Shift_ir(RESTART, IDLE);	//* Shift RESTART instruction	
	
	for(null = 0; null < ADD_WAIT_STATE; null++);	
	
JTAG_Select_Scan_Chain(DEBUG);

JTAG_Step(READ_REG, &null);				

JTAG_Step(NOP, &null);
JTAG_Step(NOP, &null);

JTAG_Step(NOP, value);							

JTAG_Step(NOP, &null);
JTAG_Step(NOP, &null);
}

void JTAG_CPU_SET(unsigned int address, unsigned int value, unsigned int number)
{
unsigned int null;

JTAG_Select_Scan_Chain(DEBUG);

JTAG_Step(LDMIA_R0_R0_R1, &null);

JTAG_Step(NOP, &null);
JTAG_Step(NOP, &null);

JTAG_Step(address, &null);
JTAG_Step(value, &null);
	
JTAG_Step(NOP, &null);
JTAG_Step(NOP, &null);
JTAG_Step(NOP, &null);

JTAG_Step_System_Speed(NOP);

		JTAG_Step(WRITE_CPU_SET, &null);
	
JTAG_Step(NOP, &null);

JTAG_Shift_ir(RESTART, IDLE);		

	for(null = 0; null < ADD_WAIT_STATE; null++);	
	
}

void JTAG_Read_Memory(unsigned int address, unsigned int *value, unsigned int halfword)
{
unsigned int null;

JTAG_Select_Scan_Chain(DEBUG);

JTAG_Step(WRITE_REG, &null);

JTAG_Step(NOP, &null);
JTAG_Step(NOP, &null);

JTAG_Step(address, &null);						
	
JTAG_Step(NOP, &null);
JTAG_Step(NOP, &null);
JTAG_Step(NOP, &null);

JTAG_Step_System_Speed(NOP);

	if(halfword)
		{
		JTAG_Step(READ_MEM_HALFWORD, &null);	
		}
	else
		{
		JTAG_Step(READ_MEM, &null);
		}

JTAG_Shift_ir(RESTART, IDLE);	//* Shift RESTART instruction	
	
	for(null = 0; null < ADD_WAIT_STATE; null++);	
	
JTAG_Select_Scan_Chain(DEBUG);

JTAG_Step(READ_REG|(R1<<12), &null);				

JTAG_Step(NOP, &null);
JTAG_Step(NOP, &null);

JTAG_Step(NOP, value);							

JTAG_Step(NOP, &null);
JTAG_Step(NOP, &null);
}

unsigned int JTAG_Stop(void)
{
unsigned int null;

JTAG_Write_ICEBreaker(ICE_WTP0_ADDR_VAL, 0x0);
JTAG_Write_ICEBreaker(ICE_WTP0_ADDR_MASK, 0xFFFFFFFF);	
	
JTAG_Write_ICEBreaker(ICE_WTP0_DATA_VAL, 0x0);
JTAG_Write_ICEBreaker(ICE_WTP0_DATA_MASK, 0xFFFFFFFF);

JTAG_Write_ICEBreaker(ICE_WTP0_CTRL_VAL, 0x00000100);	// Enable bit
JTAG_Write_ICEBreaker(ICE_WTP0_CTRL_MASK, 0xFFFFFFf7);  
		
	if (JTAG_Test_Is_Breaked(WATCHDOG) == TRUE)
		{
		printf("  The ARM is in debug mode\n");
		printf("  The value in the debug status register is 0x%08X \n", JTAG_Read_Debug_Status());
		JTAG_Write_ICEBreaker(ICE_WTP0_CTRL_VAL, 0x00000000);	// Enable bit
		}	
	else
		{
		printf("  The core is NOT stopped !!!\n");
		printf("  The value in the debug status register is 0x%08X \n", JTAG_Read_Debug_Status());
		return(FALSE);	
		}

return(TRUE);
}

void JTAG_Write_ICEBreaker(unsigned int address, unsigned int data)
{

	JTAG_Select_Scan_Chain(ICE_BREAKER);

	JTAG_Write_Bkru(address, data);

}

void JTAG_Read_ICEBreaker(unsigned int address, unsigned int *data)
{

	JTAG_Select_Scan_Chain(ICE_BREAKER);

	JTAG_Read_Bkru(address, data);

}

unsigned int Read_ID_Code(void)
{
unsigned int code;
	
JTAG_Reset();
JTAG_Shift_ir(IDCODE, NO_IDLE);
JTAG_IDCode(&code);

printf("  The target's ID code is : 0x%08X\n", code);

	if(code == CORE_IDCODE) 
		return(TRUE);
   	else 
		return(FALSE);
}

void Reset(void)
{
JTAG_Reset();
//printf("  The value in the debug status register is 0x%08X \n", JTAG_Read_Debug_Status());
}

void JTAG_Go(unsigned int *context)
{
unsigned int i, null;

JTAG_Select_Scan_Chain(DEBUG); 

JTAG_Step(0xE89EFFFF, &null);    //ldmia    r14,{r0-pc}

JTAG_Step(NOP, &null);   

JTAG_Step(NOP, &null);
	
	for(i = 0; i < 16; i++)	
		JTAG_Step(context[i], &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++);	

⌨️ 快捷键说明

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