一般所说的JTAG大致分两类,一类用于测验芯片的电气特性,检测芯片是否有问题;一类用于Debug;一般支撑JTAG的CPU内都包括了这两个模块。
一个含有JTAG Debug接口模块的CPU,只需时钟正常,就能够经过JTAG接口拜访CPU的内部寄存器和挂在CPU总线上的设备,如FLASH,RAM,SOC(比方4510B,44Box,AT91M系列)内置模块的寄存器,象UART,Timers,GPIO等等的寄存器。上面说的仅仅JTAG接口所具有的才干,要运用这些功用,还需求软件的合作,详细完结的功用则由详细的软件决议。例如下载程序到RAM功用。了解SOC的都知道,要运用外接的RAM,需求参照SOCDataSheet的寄存器阐明,设置RAM的基地址,总线宽度,拜访速度等等。有的SOC则还需求Remap,才干正常作业。运转Firmware时,这些设置由Firmware的初始化程序完结。但假如运用JTAG接口,相关的寄存器或许还处在上电值,乃至时过错值,RAM不能正常作业,所以下载必定要失利。要正常运用,先要想办法设置RAM。在ADW中,能够在Console窗口经过Let 指令设置,在AXD中能够在Console窗口经过Set指令设置。
下面是一个设置AT91M40800的指令序列,封闭中止,设置CS0-CS3, 并进行Remap,适用于AXD(ADS带的Debug)
setmem 0xfffff124,0xFFFFFFFF,32 —封闭一切中止
setmem 0xffe00000,0x0100253d,32 —设置CS0 0xffe00004,0x02002021,32 —设置CS1
setmem 0xffe00008,0x0300253d,32 —设置CS2
setmem 0xffe0000C,0x0400253d,32 —设置CS3
setmem 0xffe00020,1,32 —Remap
假如要在ADW(SDT带的DEBUG)中运用,则要改为:
let 0xfffff124=0xFFFFFFFF —封闭一切中止
let 0xffe00000=0x0100253d —设置CS0
let 0xffe00004=0x02002021 —设置CS1
let 0xffe00008=0x0300253d —设置CS2
let 0xffe0000C=0x0400253d —设置CS3
let 0xffe00020=1 —Remap
为了便利运用,能够将上述指令保存为一个文件config.ini, 在Console窗口输入 ob config.ini 即可履行。
运用其他debug,大体相似,仅仅指令和指令的格局不同。
设置RAM时,设置的寄存器以及寄存器的值有必要和要运转程序的设置共同。一般编译生成的方针文件是ELF格局,或相似的格局,包括有方针码运转地址,运转地址在Link时分确认。Debug下载程序时依据ELF文件中的地址信息下载程序到指定的地址。假如在把RAM的基地址设置为0x10000000, 而在编译的时分指定Firmware的开端地址在0x02000000, 下载的时分,方针码将被下载到0x02000000,明显下载会失利。
经过JTAG下载程序前应封闭一切中止,这一点和Firmware初始化时封闭中止的原因相同。在运用JTAG接口的时分,各中止的使能不知道,尤其是FLASH里有可履行码的状况,或许会有一些中止被使能。运用JTAG下载完代码,要履行时,有或许因为未完结初始化就发生了中止,导致程序反常。所以,需求先封闭中止,一般经过设置SOC的中止操控寄存器完结。运用JTAG写Flash。在理论上,经过JTAG能够拜访CPU总线上的一切设备,所以应该能够写FLASH,可是FLASH写入办法和RAM大不相同,需求特别的指令,并且不同的FLASH擦除,编程指令不同,并且块的巨细,数量也不同,很难供给这一项功用。所以一般Debug不供给写Flash功用,或许仅支撑少数几种Flash。现在就我知道的,针对arm,只要FlashPGM这个软件供给写FLASH功用,但运用也十分费事。AXD,ADW都不供给写FLASH功用。我写Flash的办法时是,自己写一个简略的程序,专门用于写方针板的FLASH,运用JTAG接口,下载到方针板,再把要烧写的方针码装成BIN格局,也下到方针板(地址和烧FLASH的程序的地址不同),然后运转现已下载的烧FLASH的程序。运用这种办法,比起FlashPGM的写Flash,速度好像要快一些。
关于简略JTAG电缆。
现在有各式各样简略JTAG电缆,其实仅仅一个电平转化电路,一起还起到维护效果。JTAG的逻辑则由运转在PC上的软件完结,所以在理论上,任何一个简略JTAG电缆,都能够支撑各种应用软件,如Debug等。我就曾运用同一个JTAG电缆写Xilinx CPLD,AXD/ADW调试程序。要害再于软件的支撑,大多数软件都不供给设定功用,因此只能支撑某种JTAG电缆。
关于简略JTAG电缆的速度。JTAG是串行接口,运用打印口的简略JTAG电缆,运用的是打印口的输出带锁存的特色,运用软件经过I/O发生JTAG时序。由JTAG规范决议,经过JTAG写/读一个字节要一系列的操作,依据我的剖析,运用简略JTAG电缆,运用打印口,经过JTAG输出一个字节到方针板,均匀需求43个打印口I/O, 在我机器上(P4 1.7G),每秒大约可进行660K次 I/O 操作,所以下载速度大约在660K/43, 约等于15K Byte/S. 关于其他机器,I/O速度大致相同,一般在600K ~ 800K.
关于怎么进步JTAG下载速度。
很明显,运用简略JTAG电缆无法进步速度。要进步速度,大致有两种办法,
1。运用嵌入式体系供给JTAG接口,嵌入式体系和微机之间经过USB/Ethernet相连,这要求运用MCU。
2。运用CPLD/FPGA供给JTAG接口,CPLD/FPGA和微机之间运用EPP接口(一般微机打印口都支撑EPP形式),EPP接口完结微机和CPLD/FPGA之间的数据传输,CPLD/FPGA完结JTAG时序。
这两种办法自己都完结过。第一个办法能够到达比较高的速度,实测超过了200KByte/S(留意:是Byte,不是Bit);可是相对来说,硬件杂乱,制作相对杂乱。第二种相对来说,下载速度要慢一些,最快时到达96KByte/S,但电路简略,制作便利,并且速度能够满足需求。第二种计划还有一个缺陷,因为进行I/O操作时,CPU不会被开释,因此在下载程序时,微机CPU显得很繁忙。
总的来说,自己以为,关于个人爱好者来说,第二种办法更可取。