📄 jflash.cpp
字号:
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 + -