潦草的JTAG下载过程分析
===========
第一步
OpenPpt 检测端口部分
-----------
首先要检查GiveIo,不知道为何?好像跟系统分配的端口地址有关
nt InstallGiveIo(void)
{
HANDLE h;
OSVERSIONINFO osvi;
osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
GetVersionEx(&osvi);
if(osvi.dwPlatformId == VER_PLATFORM_WIN32_NT)
{
//OS=NT/2000
h = CreateFile("////.//giveio", GENERIC_READ, 0, NULL,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
CloseHandle(h);
if(h == INVALID_HANDLE_VALUE)
return 0;
else
return 0x2000;
}
else
{ //OS=WIN98
return 0x0098;
}
}
如果返回为空就说找不到giveio.sys (这个LPT的驱动)
------------
打开并口获取并口号
#define LPT1 0x378
#define LPT2 0x278
#define LPT3 0x3bc
int GetValidPpt(void)//返回值既是端口号
{
// search for valid parallel port
_outp(LPT1, 0x55);
if((int)_inp(LPT1) == 0x55)
return LPT1;
_outp(LPT2, 0x55);
if((int)_inp(LPT2) == 0x55)
return LPT2;
_outp(LPT3, 0x55);
if((int)_inp(LPT3) == 0x55)
return LPT3;
return 0;
}///原理就是先写后读,读出来得是0x55(写的数),就代表该端口开启。说白了还是列举然后挨个试。。。
----------------------
检测端口的最后一步就是趁机再设置一下
#define ECP_ECR (0x402)
#define ECR_STANDARD (0x0)
#define ECR_DISnERRORINT (0x10)
#define ECR_DISDMA (0x0)
#define ECR_DISSVCINT (0x4)
void SetPptCompMode(void)
{
_outp((unsigned short)(validPpt+ECP_ECR),ECR_STANDARD | ECR_DISnERRORINT | ECR_DISDMA | ECR_DISSVCINT);
}
validPpt为已获得的端口号,剩下那几个参数一知半解。。
====================
第二步 初始化JTAG & CPU
----
先要 获取下载文件大小();
------------
JTAG_Reset)(
JTAG_SET(TDI_H|TMS_H|TCK_L);
JTAG_DELAY();
JTAG_SET(TDI_H|TMS_H|TCK_H);
JTAG_DELAY();
//重启N次
------------------
JTAG_SET(TDI_H|TMS_L|TCK_L);JTAG_DELAY();
JTAG_SET(TDI_H|TMS_L|TCK_H);JTAG_DELAY();
//重复4次 启动测试状态
//S3C6400 IDCODE Instruction "1110"
JTAG_SET(TDI_L|TMS_L|TCK_L);JTAG_DELAY();
JTAG_SET(TDI_L|TMS_L|TCK_H);JTAG_DELAY(); // '0'
JTAG_SET(TDI_H|TMS_L|TCK_L);JTAG_DELAY();
JTAG_SET(TDI_H|TMS_L|TCK_H);JTAG_DELAY(); // '1'
JTAG_SET(TDI_H|TMS_L|TCK_L);JTAG_DELAY();
JTAG_SET(TDI_H|TMS_L|TCK_H);JTAG_DELAY(); // '1'
JTAG_SET(TDI_H|TMS_H|TCK_L);JTAG_DELAY();
JTAG_SET(TDI_H|TMS_H|TCK_H);JTAG_DELAY(); // '1', //Exit1-IR