潦草的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
----
先要 获取下载文件大小()&#