📄 s3c4510.c
字号:
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];
int 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("Found S3C4510B, 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_rom(DWORD address, unsigned char data)
{
access_bus(SETUP, address, data, IP); // clear status register
access_bus(WRITE, address, data, IP);
// access_bus(HOLD, address, data, IP);
}
void write_rom2(DWORD address, WORD data)
{
access_bus2(WRITE, address, data, IP);
access_bus2(SETUP, address, data, IP); // clear status register
}
unsigned char read_rom(DWORD address)
{
access_bus(READ, address, 0, IP);
return (unsigned char)(access_bus(READ, address, 0 , RP)&0xff);
}
WORD read_rom2(DWORD address)
{
access_bus2(READ, address, 0, IP);
return (WORD)(access_bus2(READ, address, 0 , RP));
}
DWORD access_rom(int rw, DWORD address, DWORD data, int rp)
{
return(access_bus(rw, address, data, rp));
}
DWORD access_bus(int rw, DWORD address, DWORD data, int rp)
{
return s3c4510_bus(nRCS_0_OUT, rw, address, data, 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_bus(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[nOE_OUT] = 0;
pin[nWBE_0_OUT] = 1;
pin[nWBE_1_OUT] = 1;
pin[nWBE_2_OUT] = 1;
pin[nWBE_3_OUT] = 1;
pin[D_OUT_ENB] = 1;
for(i = 0; i < 22; i++)
pin[149-i] = (int)((address >> i) & 1); // set address 0 thru 21
if(rw == READ)
{
pin[cs] = 0;
//pin[nOE_OUT] = 1;
}
if(rw == WRITE)
{
pin[cs] = 0;
pin[nWBE_0_OUT] = 0;
pin[nOE_OUT] = 1;
pin[D_OUT_ENB] = 0; // switch data pins to drive
for(li = 0L; li < 32L; li++)
pin[125-li*2] = (int)((data >> li) & 1L); // set data pins
}
if(rw == SETUP || rw == HOLD) // just like a write except WE, WE needs setup time
{
pin[nOE_OUT] = 1;
pin[D_OUT_ENB] = 0;
for(li = 0L; li < 32L; li++)
pin[125-li*2] = (int)((data >> li) & 1L); // serialize data pins
}
if(rw == RS) // setup prior to RD_nWR_OUT
{
pin[nOE_OUT] = 1;
}
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 < 232; 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 < 32; i++) // convert serial data to single DWORD
{
busdat = busdat | (DWORD)(out_dat[125 - i*2] << i);
}
return(busdat);
}
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[nOE_OUT] = 0;
pin[nWBE_0_OUT] = 1;
pin[nWBE_1_OUT] = 1;
pin[nWBE_2_OUT] = 1;
pin[nWBE_3_OUT] = 1;
pin[D_OUT_ENB] = 0;
for(i = 0; i < 22; i++)
pin[149-i] = (int)((address >> i) & 1); // set address 0 thru 21
if(rw == READ)
{
pin[cs] = 0;
pin[D_OUT_ENB] = 1;
pin[nOE_OUT] = 0;
}
if(rw == WRITE)
{
pin[cs] = 0;
pin[nWBE_0_OUT] = 0;
pin[nOE_OUT] = 1;
pin[D_OUT_ENB] = 0; // switch data pins to drive
for(li = 0L; li < 32L; li++)
pin[125-li*2] = (int)((data >> li) & 1L); // set data pins
}
if( rw == HOLD) // just like a write except WE, WE needs setup time
{
pin[cs] = 1;
pin[nOE_OUT] = 1;
pin[D_OUT_ENB] = 0;
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[D_OUT_ENB] = 0;
pin[nWBE_0_OUT] = 1;
for(li = 0L; li < 32L; li++)
pin[125-li*2] = (int)((data >> li) & 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;
}
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 < 232; 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 < 32; i++) // convert serial data to single DWORD
{
busdat = busdat | (DWORD)(out_dat[125 - i*2] << i);
}
return(busdat);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -