📄 jtag_operates.cpp
字号:
reset_jtag();
id_command();
extest();
}
/**********************************************************************
* 功 LPT_uninitialization - 系统退出之前
* 函 数参 数:无
* 返 回 值: 无
* 函 数 原形:
* 注 意:
***********************************************************************/
void LPT_uninitialization()
{
extest();
}
/**********************************************************************
* 功 能:putp - 并口输出信息
* 函 数参 数:无
* 返 回 值: 无
* 函 数 原形:
* 注 意:
**********************************************************************
*一般并口有5个寄存器,如下:
* --------------------------------------------------------
* |名 称 | 地址偏移 | 读 写 |大 小 | 功 能 |
* |------------------------------------------------------|
* |ecpAFifo | 0x000 | W-R/W |大小 |地址寄存器 |
* |------------------------------------------------------|
* |dsr | 0x001 | R |字节 |状态寄存器 |
* |------------------------------------------------------|
* |dcr | 0x002 | R/W |字节 |控制寄存器 |
* |------------------------------------------------------|
* |ecpDFifo | 0x400 | R/W |双字节 |数据寄存器 |
* |------------------------------------------------------|
* |ecr | 0x402 | R/W |字节 |扩展控制寄存器 |
* |------------------------------------------------------|
*
* 地址、数据寄存器
* |------------------------------------------------
* | 位 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
* |------------------------------------------------
* |意义 | D0 | D1 | D2 | D3 | D4 | D5 | D6 | D7 |
* |------------------------------------------------
* |对应脚 |PIN2|PIN3|PIN4|PIN5|PIN6|PIN7|PIN8|PIN9|
* |------------------------------------------------
*
* 状态寄存器
* |--------------------------------------------------------------
* | 位 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
* |--------------------------------------------------------------
* |意义 |保留|保留|IRQ |ERROR|Select IN|Paper Out|ACK |Busy |
* |--------------------------------------------------------------
* |对应脚 | 无 | 无 | 无 | P15 |PIN13 | PIN12 |PIN10|PIN11 |
* |--------------------------------------------------------------
***********************************************************************/
int putp(int tdi, int tms, int rp)
{
// Output pins (LPT driving)
// LPT D3 Pin 5 and TDI (bit 3 lptaddress )
// LPT D2 Pin 4 and TCK (bit 2 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 + 1)
//std jtag pin connect
// 13 SELECTED 11 TDO (bit 4 lptaddress + 1)
// 8 DATA6 5 TDI
// 4 DATA2 3 nTRT
// 3 DATA1 7 TMS
// 2 DATA0 9 TCK
int tdo = -1;
int t1,t2;
t1 = tdi*64+tms*2;
OUTB(lpt_address, t1); //TCK low
t1= tdi*64+tms*2+1;
OUTB(lpt_address, t1); // TCK high
if(rp == RP)
{
OUTB(lpt_address, tdi*64+tms*2); // TCK low
t1 = INB(lpt_address + 1);
t2 = (t1 & 0x10)>>4;
tdo = t2; // get TDO data
}
return tdo;
}
/**********************************************************************
* 功 access_rom - 并口读写
* 函 数参 数:无
* 返 回 值: 无
* 函 数 原形:
* 注 意:
**********************************************************************/
WORD access_rom(int rw, DWORD address, WORD data, int rp)
{
return (access_bus(rw, address, data, rp));
}
/**********************************************************************
* 功 能:write_command - 并口写
* 函 数参 数:无
* 返 回 值: 无
* 函 数 原形:
* 注 意:
**********************************************************************/
WORD read_command(DWORD addr)
{
access_rom(READ, addr, 0, IP); //相当于写地址
return (WORD)(access_rom(READ, addr, 0 , RP)); //相当于读数据
}
/**********************************************************************
* 功 能:write_command - 并口写
* 函 数参 数:无
* 返 回 值: 无
* 函 数 原形:
* 注 意:
**********************************************************************/
int write_command(DWORD addr, WORD command)
{
access_rom(SETUP, addr, command, IP);
access_rom(WRITE, addr, command, IP);
access_rom(HOLD, addr, command, IP);
return 0;
}
/*********************************************************************
*该函数是否能够保证操作的时序需要确认(刘文龙)
*********************************************************************/
/**********************************************************************
* 功 能:access_bus - 访问ROM对应的总线
* 函 数参 数:无
* 返 回 值: 无
* 函 数 原形:
* 注 意:
**********************************************************************/
WORD access_bus(int rw, DWORD address, WORD data, int rp)
{
int out_dat[LXFXP25E208_CHAIN_LENGTH], i;
DWORD li=0;
WORD busdat = 0;
// Preset SA-1110 pins to default values (all others set in sa1110jtag.h)
// enable pin for nCS0, nOE, nWE.
pin[CPU_FALSH_CS_ENB] = 1;
pin[CPU_FALSH_RD_ENB] = 1;
pin[CPU_FALSH_WE_ENB] = 1;
pin[CPU_FALSH_CS] = 1;
pin[CPU_FALSH_RD] = 0;
pin[CPU_FALSH_WE] = 1;
//设置地址开始
pin[addresspin[0]] = 0; //两个字节对齐
pin[addresspin_enb[0]] = 1; //两个字节对齐
for(i=0; i<CPU_ADDRESS_BITS_NUMBERS; i++)
{
pin[addresspin[i]] = (int)((address >> i) & 1);
pin[addresspin_enb[i]] = (int)(1);
}
for(i=0; i<CPU_DATA_BITS_NUMBERS; i++)
{
pin[datapin_enb[li]] = (int)(0L); // serialize data pins
}
if(rw == READ)
{
for(i=0; i<CPU_DATA_BITS_NUMBERS; i++)
{
pin[datapin_enb[li]] = (int)(1L); // serialize data pins
}
pin[CPU_FALSH_CS] = 0;
pin[CPU_FALSH_RD] = 0;
pin[CPU_FALSH_WE] = 1;
}
if(rw == WRITE)
{
pin[CPU_FALSH_CS] = 0;
pin[CPU_FALSH_RD] = 1;
pin[CPU_FALSH_WE] = 0;
// set the data
for(li = 0L; li < CPU_DATA_BITS_NUMBERS; li++) //设置D0-D15
{
pin[datapin[li]] = (int)((data >> li) & 1L); // serialize data pins
}
}
if(rw == SETUP || rw == HOLD) // just like a write except WE, WE needs setup time
{
pin[CPU_FALSH_CS] = 1;
pin[CPU_FALSH_RD] = 1;
pin[CPU_FALSH_WE] = 1;
// set the data
for(li = 0L; li < CPU_DATA_BITS_NUMBERS; li++) //设置D0-D15
{
pin[datapin[li]] = (int)((data >> li) & 1L); // serialize data pins
}
}
if(rw == RS) // setup prior to RD_nWR_OUT
{
pin[CPU_FALSH_RD] = 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 < LXFXP25E208_CHAIN_LENGTH; 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 < CPU_DATA_BITS_NUMBERS; i++) // convert serial data to single WORD
{
busdat = busdat | (WORD)(out_dat[datapin[i]] << i);
}
extest();
return (busdat);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -