📄 s3c4510.c.bak
字号:
int tdo = -1;
int t1,t2;
t1 = tdi*8+tms*2;
OUTB(lpt_address, t1); //TCK low
t1= tdi*8+tms*2+4;
OUTB(lpt_address, t1); // TCK high
if(rp == RP)
{
OUTB(lpt_address, tdi*8+tms*2); // TCK low
t1 = INB(lpt_address + 1);
t2 = t1>>7;
tdo = !t2; // get TDO data
}
return tdo;
}
void reset_jtag(void) //不用动
{
int i;
OUTB(lpt_address, TRST); // TRST low
Sleep(5);
OUTB(lpt_address, 0); // TRST high
Sleep(5);
for( i=0; i<8; i++) putp(1,1,IP); // move to TEST_LOGIC/RESET
putp(1,0,IP); // move to Run_Test/Idle
}
void test_logic_reset(void)
{
putp(1,1,IP); // keep TMS set to 1 force a test logic reset
putp(1,1,IP); // no matter where you are in the TAP controller
putp(1,1,IP);
putp(1,1,IP);
putp(1,1,IP);
putp(1,1,IP);
}
int check_id(char *device_id)
{
// compare passed device ID to the one returned from the ID command
char in_id[40];
BOOL error_flag = FALSE;
int i;
for(i = 34; i >= 0; i--)
{
if(i == 4 || i == 21 || i == 33)
{
in_id[i] = ' ';
i--;
}
if(putp(1,0,RP) == 0)
in_id[i] = '0';
else
in_id[i] = '1';
if((in_id[i] != *(device_id + i)) && (*(device_id + i) != '*'))
{
error_flag = TRUE;
}
}
in_id[35] = 0;
if(error_flag)
{
printf("error, failed to read device ID\n");
printf("check cables and power\n");
printf("ACT: %s\n",in_id);
printf("EXP: %s\n\n",device_id);
return -1;
}
if(!strcmp(device_id,S3C4510ID)) // print S3C4510 device revision
{
int s3c_rev =
(int)(in_id[0] - '0') * 8 +
(int)(in_id[1] - '0') * 4 +
(int)(in_id[2] - '0') * 2 +
(int)(in_id[3] - '0');
printf("S3C4510 revision %d\n",s3c_rev);
}
return 0;
}
void id_command(void)
{
putp(1,0,IP); //Run-Test/Idle
putp(1,0,IP); //Run-Test/Idle
putp(1,0,IP); //Run-Test/Idle
putp(1,0,IP); //Run-Test/Idle
putp(1,1,IP);
putp(1,1,IP); //select IR scan
putp(1,0,IP); //capture IR
putp(1,0,IP); //shift IR
putp(0,0,IP); //S3C4510 IDCODE, LSB first
putp(1,0,IP); //
putp(1,0,IP); //
putp(1,1,IP); //Exit1-IR
putp(1,1,IP); //Update-IR
putp(1,0,IP); //Run-Test/Idle
putp(1,0,IP); //Run-Test/Idle
putp(1,0,IP); //Run-Test/Idle
putp(1,1,IP); //select DR scan
putp(1,0,IP); //capture DR
if(check_id(S3C4510ID))
error_out("failed to read device ID for the S3C4510");
putp(1,1,IP); //Exit1-DR
putp(1,1,IP); //Update-DR
putp(1,0,IP); //Run-Test/Idle
putp(1,0,IP); //Run-Test/Idle
putp(1,0,IP); //Run-Test/Idle
}
void bypass_all(void)
{
putp(1,0,IP); //Run-Test/Idle
putp(1,0,IP); //Run-Test/Idle
putp(1,0,IP); //Run-Test/Idle
putp(1,0,IP); //Run-Test/Idle
putp(1,1,IP);
putp(1,1,IP); //select IR scan
putp(1,0,IP); //capture IR
putp(1,0,IP); //shift IR
putp(1,0,IP); //S3C4510 BYPASS
putp(1,0,IP); //
putp(1,0,IP); //
putp(1,1,IP); //Exit1-IR
putp(1,1,IP); //Update-IR
putp(1,0,IP); //Run-Test/Idle
putp(1,0,IP); //Run-Test/Idle
putp(1,0,IP); //Run-Test/Idle
}
void extest(void)
{
putp(1,0,IP); //Run-Test/Idle
putp(1,0,IP); //Run-Test/Idle
putp(1,0,IP); //Run-Test/Idle
putp(1,0,IP); //Run-Test/Idle
putp(1,1,IP);
putp(1,1,IP); //select IR scan
putp(1,0,IP); //capture IR
putp(1,0,IP); //shift IR
putp(0,0,IP); //S3C4510 extest
putp(0,0,IP); //
putp(0,0,IP); //
putp(0,1,IP); //Exit1-IR
putp(1,1,IP); //Update-IR
putp(1,0,IP); //Run-Test/Idle
putp(1,0,IP); //Run-Test/Idle
putp(1,0,IP); //Run-Test/Idle
}
void write_rom2(DWORD address, WORD data)
{
access_bus2(WRITE, address, data, IP);
access_bus2(SETUP, address, data, IP); // clear status register
}
WORD read_rom2(DWORD address)
{
access_bus2(READ, address, 0, IP); //相当于写地址
return (WORD)(access_bus2(READ, address, 0 , RP)); //相当于读书局
}
DWORD access_bus2(int rw, DWORD address, DWORD data, int rp) // acess the cs1 rom bank1
{
return s3c4510_bus2(nRCS_0_OUT, rw, address, data, rp);
}
DWORD s3c4510_bus2(int cs, int rw, DWORD address, DWORD data, int rp)
{
int out_dat[300], i;
DWORD li, busdat = 0;
// Preset S3C4510 pins to default values (all others set in S3C4510.h)
pin[nRCS_0_OUT] = 1;
pin[nRCS_1_OUT] = 1;
pin[nRCS_2_OUT] = 1;
pin[nRCS_3_OUT] = 1;
/*
pin[nRCS_4_OUT] = 1;
pin[nRCS_5_OUT] = 1;
pin[nECS_0_OUT] = 1;
pin[nECS_1_OUT] = 1;
pin[nECS_2_OUT] = 1;
pin[nECS_3_OUT] = 1;
*/
pin[nWBE_DWE_OE_CS0_OUT_ENB] = 0;
pin[nOE_OUT] = 0;
pin[nWBE_0_OUT] = 1;
pin[nWBE_1_OUT] = 1;
pin[nWBE_2_OUT] = 1;
pin[nWBE_3_OUT] = 1;
pin[nDWE_OUT] = 1;
pin[nGCS_6_OUT] = 1; //sdram
pin[D7_0_OUT_ENB] = 0;
pin[D15_8_OUT_ENB] = 0;
pin[A15_1_OUT_ENB] = 0;
pin[A0_OUT_ENB] = 0;
pin[A16_OUT_ENB] = 0;
pin[A17_OUT_ENB] = 0;
pin[A18_OUT_ENB] = 0;
pin[A19_OUT_ENB] = 0;
pin[A20_OUT_ENB] = 0;
pin[A21_OUT_ENB] = 1;
pin[A22_OUT_ENB] = 1;
pin[A23_OUT_ENB] = 1;
pin[A24_OUT_ENB] = 1;
for(i = 1; i < 15; i++) //set A1-A14
pin[67+i] = (int)((address >> i) & 1); // a1 = cell 68
for(i = 15; i < 25; i++) //set A15-A24
pin[82+(i-15)*2] = (int)((address >> i) & 1); //a15 = 82
if(rw == READ)
{
pin[cs] = 0;
pin[D7_0_OUT_ENB] = 1;
pin[D15_8_OUT_ENB] = 1;
// pin[D_OUT_ENB] = 1;
pin[nOE_OUT] = 0;
}
if(rw == WRITE)
{
pin[cs] = 0;
pin[nDWE_OUT]= 0; //pin[nWBE_0_OUT]
pin[nOE_OUT] = 1;
pin[D7_0_OUT_ENB] = 0;
pin[D15_8_OUT_ENB] = 0;
// pin[D_OUT_ENB] = 0; // switch data pins to drive
for(li = 0L; li < 8L; li++) //设置D0-D7
pin[102+li*2] = (int)((data >> li) & 1L); // serialize data pins
for(li = 0L; li < 8L; li++) //设置D8-D15
pin[119+li*2] = (int)((data >> (li+8)) & 1L); // serialize data pins
}
if( rw == HOLD) // just like a write except WE, WE needs setup time
{
pin[cs] = 0;
pin[nOE_OUT] = 1;
pin[D7_0_OUT_ENB] = 1;
pin[D15_8_OUT_ENB] = 1;
// pin[D_OUT_ENB] = 0;
pin[nDWE_OUT]= 1;
//pin[nWBE_0_OUT] = 1;
//for(li = 0L; li < 32L; li++)
// pin[125-li*2] = (int)((data >> li) & 1L); // serialize data pins
}
if(rw == SETUP ) // just like a write except WE, WE needs setup time
{
pin[cs] = 0;
pin[nOE_OUT] = 1;
pin[D7_0_OUT_ENB] = 0;
pin[D15_8_OUT_ENB] = 0;
// pin[D_OUT_ENB] = 0;
pin[nDWE_OUT]= 1;
// pin[nWBE_0_OUT] = 1;
for(li = 0L; li < 8L; li++) //设置D0-D7
pin[102+li*2] = (int)((data >> li) & 1L); // serialize data pins
for(li = 0L; li < 8L; li++) //设置D8-D15
pin[119+li*2] = (int)((data >> (li+8)) & 1L); // serialize data pins
}
if(rw == RS) // setup prior to RD_nWR_OUT
{
pin[nOE_OUT] = 1;
pin[cs] = 0;
//pin[nWBE_0_OUT] = 0;
pin[nDWE_OUT]= 0;
}
putp(1,0,IP); // Run-Test/Idle
putp(1,0,IP); // Run-Test/Idle
putp(1,0,IP); // Run-Test/Idle
putp(1,0,IP); // Run-Test/Idle
putp(1,1,IP); // select DR scan
putp(1,0,IP); // capture DR
putp(1,0,IP); // shift IR
for(i = 0; i < 256; i++) // shift write data in to JTAG port and read data out
out_dat[i] = putp(pin[i],0,rp);
putp(0,1,IP); // Exit1-DR
putp(1,1,IP); // Update-DR
putp(1,0,IP); // Run-Test/Idle
putp(1,0,IP); // Run-Test/Idle
putp(1,0,IP); // Run-Test/Idle
busdat = 0;
for(i = 0; i < 7; i++) // convert serial data to single DWORD
{
busdat = busdat | (DWORD)(out_dat[102 + i*2] << i);
}
busdat = busdat | (DWORD)(out_dat[117] << 7);
for(i = 0; i < 7; i++) // convert serial data to single DWORD
{
busdat = busdat | (DWORD)(out_dat[119 + i*2] << (i+8)); //????
}
busdat = busdat | (DWORD)(out_dat[134] << 15);
// printf("busdat %x\n",busdat);
return(busdat);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -