📄 s3c4510.c
字号:
#define VERSION "1.0"
#include <stdio.h>
#include <windows.h>
#include <time.h>
#include <conio.h>
#include "s3c4510.h"
int pin[] =
{
1, // UARXD1_IN
0, // nUADSR0_OUT
1, // UATXD0_OUT
1, // nUADTR0_IN
1, // UARXD0_IN
0, // SDA_OUT
1, // SDA_IN
0, // SCL_OUT
1, // SCL_IN
0, // P_17_ENB
0, // P_17_OUT
0, // P_17_IN
0, // P_16_ENB
0, // P_16_OUT
0, // P_16_IN
0, // P_15_ENB
0, // P_15_OUT
0, // P_15_IN
0, // P_14_ENB
0, // P_14_OUT
0, // P_14_IN
0, // P_13_ENB
0, // P_13_OUT
0, // P_13_IN
0, // P_12_ENB
0, // P_12_OUT
0, // P_12_IN
0, // P_11_ENB
0, // P_11_OUT
0, // P_11_IN
0, // P_10_ENB
0, // P_10_OUT
0, // P_10_IN
0, // P_9_ENB
0, // P_9_OUT
0, // P_9_IN
0, // P_8_ENB
0, // P_8_OUT
0, // P_8_IN
0, // P_7_ENB
0, // P_7_OUT
0, // P_7_IN
0, // P_6_ENB
0, // P_6_OUT
0, // P_6_IN
0, // P_5_ENB
0, // P_5_OUT
0, // P_5_IN
0, // P_4_ENB
0, // P_4_OUT
0, // P_4_IN
0, // P_3_ENB
0, // P_3_OUT
0, // P_3_IN
0, // P_2_ENB
0, // P_2_OUT
0, // P_2_IN
0, // P_1_ENB
0, // P_1_OUT
0, // P_1_IN
0, // P_0_ENB
0, // P_0_OUT
0, // P_0_IN
0, // D_31_OUT
0, // D_31_IN
0, // D_30_OUT
0, // D_30_IN
0, // D_29_OUT
0, // D_29_IN
0, // D_28_OUT
0, // D_28_IN
0, // D_27_OUT
0, // D_27_IN
0, // D_26_OUT
0, // D_26_IN
0, // D_25_OUT
0, // D_25_IN
0, // D_24_OUT
0, // D_24_IN
0, // D_23_OUT
0, // D_23_IN
0, // D_22_OUT
0, // D_22_IN
0, // D_21_OUT
0, // D_21_IN
0, // D_20_OUT
0, // D_20_IN
0, // D_19_OUT
0, // D_19_IN
0, // D_18_OUT
0, // D_18_IN
0, // D_17_OUT
0, // D_17_IN
0, // D_16_OUT
0, // D_16_IN
0, // D_15_OUT
0, // D_15_IN
0, // D_14_OUT
0, // D_14_IN
0, // D_13_OUT
0, // D_13_IN
0, // D_12_OUT
0, // D_12_IN
0, // D_11_OUT
0, // D_11_IN
0, // D_10_OUT
0, // D_10_IN
0, // D_9_OUT
0, // D_9_IN
0, // D_8_OUT
0, // D_8_IN
0, // D_7_OUT
0, // D_7_IN
0, // D_6_OUT
0, // D_6_IN
0, // D_5_OUT
0, // D_5_IN
0, // D_4_OUT
0, // D_4_IN
0, // D_3_OUT
0, // D_3_IN
0, // D_2_OUT
0, // D_2_IN
0, // D_1_OUT
0, // D_1_IN
0, // D_0_OUT
0, // D_0_IN
1, // D_OUT_ENB
0, // A_21_OUT
0, // A_20_OUT
0, // A_19_OUT
0, // A_18_OUT
0, // A_17_OUT
0, // A_16_OUT
0, // A_15_OUT
0, // A_14_OUT
0, // A_13_OUT
0, // A_12_OUT
0, // A_11_OUT
0, // A_10_OUT
0, // A_9_OUT
0, // A_8_OUT
0, // A_7_OUT
0, // A_6_OUT
0, // A_5_OUT
0, // A_4_OUT
0, // A_3_OUT
0, // A_2_OUT
0, // A_1_OUT
0, // A_0_OUT
0, // ExtMACK_OUT
0, // ExtMREQ_IN
1, // nWBE_3_OUT
1, // nWBE_2_OUT
1, // nWBE_1_OUT
1, // nWBE_0_OUT
1, // nDWE_OUT
1, // nCAS_3_OUT
1, // nCAS_2_OUT
1, // nCAS_1_OUT
1, // nCAS_0_OUT
1, // nRAS_3_OUT
1, // nRAS_2_OUT
1, // nRAS_1_OUT
1, // nRAS_0_OUT
1, // nRCS_5_OUT
1, // nRCS_4_OUT
1, // nRCS_3_OUT
1, // nRCS_2_OUT
1, // nRCS_1_OUT
0, // CLKSEL_IN
0, // nRESET_IN
0, // MCLK_IN
0, // MCLKO_OUT
0, // CLKOEN_IN
1, // nRCS_0_OUT
1, // B0SIZE_1_IN
1, // B0SIZE_0_IN
1, // nOE_OUT
1, // nEWAIT_IN
1, // nECS_3_OUT
1, // nECS_2_OUT
1, // nECS_1_OUT
1, // nECS_0_OUT
0, // DIS_BUS
1, // UCLK_IN
1, // TMODE_IN
0, // MDC_OUT
1, // LITTLE_IN
0, // MDIO_OE
0, // MDIO_OUT
0, // MDIO_IN
0, // TX_EN_TXEN_10M_OUT
0, // TX_CLK_TXCLK_10M_OUT
0, // TX_ERR_PCOMP_10M_OUT
0, // TXD3_OUT
0, // TXD2_OUT
0, // TXD1_LOOP10_OUT
0, // TXD0_TXD_10M_OUT
1, // COL_COL_10M_IN
1, // RX_CLK_RXCLK_10M_IN
1, // RX_ERR_IN
1, // RXD3_IN
1, // RXD2_IN
1, // RXD1_IN
1, // RXD0_RXD_10M_IN
1, // RX_DV_LINK10_IN
1, // CRS_CRS_10M_IN
0, // TXCBEN
0, // TXCB_OUT
1, // TXCB_IN
0, // nSYNCB_OUT
1, // RXCB_IN
1, // nDCDB_IN
1, // nCTSB_IN
0, // TXDB_OUT
0, // nRTSB_OUT
1, // RXDB_IN
0, // nDTRB_OUT
0, // TXCAEN
0, // TXCA_OUT
1, // TXCA_IN
0, // nSYNCA_OUT
1, // RXCA_IN
1, // nDCDA_IN
1, // nCTSA_IN
0, // TXDA_OUT
0, // nRTSA_OUT
1, // RXDA_IN
0, // nDTRA_OUT
0, // nUADSR1_OUT
0, // UATXD1_OUT
1 // nUADTR1_IN
};
int lpt_address;
void error_out(char *error_string)
{
printf("%s\n",error_string);
exit(0);
}
unsigned short test_port(void)
{
// search for valid parallel port
lpt_address = 0;
_outp(LPT1, 0x55);
if(_inp(LPT1) == 0x55) lpt_address = LPT1;
_outp(LPT2, 0x55);
if(_inp(LPT2) == 0x55) lpt_address = LPT2;
_outp(LPT3, 0x55);
if(_inp(LPT3) == 0x55) lpt_address = LPT3;
return(lpt_address);
}
int putp(int tdi, int tms, int rp)
{
// Output pins (LPT driving)
// LPT ST(-) Pin 1 and TCK (bit 0 lptaddress + 2)
// LPT D0 Pin 2 and TDI
// LPT SEL_IN(-) Pin 17 and TMS (bit 3 lptaddress + 2)
// LPT INIT Pin 16 and TRST (bit 2 lptaddress + 2)
//
// Input pin (S3C4510 board drives)
// LPT ACK Pin 10 and TDO (bit 6 lptaddress + 1)
int tdo = -1;
_outp(lpt_address, tdi); // TDI
_outp(lpt_address+2, !tms*8+TRST+1); // TCK low
_outp(lpt_address+2, !tms*8+TRST); // TCK high
if(rp == RP)
{
_outp(lpt_address+2, !tms*8+TRST+1); // TCK low
tdo = ((int)_inp(lpt_address + 1) >> 6)&1; // get TDO data
}
return tdo;
}
void reset_jtag(void)
{
_outp(lpt_address+2, 0); // TRST low
_outp(lpt_address+2, TRST); // TRST high
}
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_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);
}
unsigned char read_rom(DWORD address)
{
access_bus(READ, address, 0, IP);
return (unsigned char)(access_bus(READ, address, 0 , RP)&0xff);
}
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 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;
}
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);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -