#define VERSION "1.0"
#include <stdio.h>
#include <time.h>
#include "s3c4510.h"
#include "def.h"
#include <asm/io.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;
int io_access_on( unsigned long port )
{
if (ioperm (port, 3, 1))
{
perror ("ioperm()");
return 0;
}
if (ioperm (0x80, 1, 1))
{
perror ("ioperm()");
return 0;
}
return 1;
}
void io_access_off( unsigned long port )
{
ioperm (port, 3, 0);
ioperm (0x80, 1, 0);
}
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;
if( io_access_on(LPT1) )
{
OUTB(LPT1, 0x55);
if(INB(LPT1) == 0x55) lpt_address = LPT1;
io_access_off(LPT1);
}
if( io_access_on(LPT2) )
{
OUTB(LPT2, 0x55);
if(INB(LPT2) == 0x55) lpt_address = LPT2;
io_access_off(LPT2);
}
if( io_access_on(LPT3) )
{
OUTB(LPT3, 0x55);
if(INB(LPT3) == 0x55) lpt_address = LPT3;
io_access_off(LPT3);
}
io_access_on(lpt_address);
return(lpt_address);
}
int putp(int tdi, int tms, int rp)
{
// Output pins (LPT driving)
// LPT D3 Pin 4 and TCK (bit 2 lptaddress )
// LPT D2 Pin 5 and TDI (bit 3 lptaddress )
// LPT D1 Pin 3 and TMS (bit 1 lptaddress )
// LPT D0 Pin 2 and TRST (bit 0 lptaddress )
//
// Input pin (S3C4510 board drives)
// LPT BUSY Pin 11 and TDO (bit 7 lptaddress + 2)
int tdo = -1;
int t1,t2;
t1 = tdi*8+tms*2;
OUTB(lpt_address, t1+0x01); //TCK low
t1= tdi*8+tms*2+4;
OUTB(lpt_address, t1+0x01); // TCK high
if(rp == RP)
{
OUTB(lpt_address, tdi*8+tms*2+0x01); // 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, 0); // TRST low
OUTB(lpt_address, 0); // TRST low
OUTB(lpt_address, 0); // TRST low
OUTB(lpt_address, 1); // TRST high
OUTB(lpt_address, 1); // TRST high
OUTB(lpt_address, 1); // TRST high
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];
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';