【转】wiggler 与 sdt JTAG(二)
来源:百度文库 编辑:神马文学网 时间:2024/05/01 17:23:29
wiggler 与 sdt JTAG(二)
嵌入式开发2007-11-07 09:36:33阅读118评论0 字号:大中小 订阅
博创PXA270平台提供的JTAG是什么电路? 是否兼容Wiggler? 是否通用于ARM7?
实验平台使用博创UP-TECHPXA270A型教学科研平台. 平台附带的JTAG头可和JflashMM配合烧录BLOB启动程序.
为了探究BLOB, 想通过JTAG调试底层程序, 就和ARM7,ARM9以及其他通常嵌入式硬件平台的调试方式类似.我测试了多种软件, 包括原IntelJflashMM, 都不能连接硬板, 则怀疑博创的JTAG有特别之处, 或者Xscale[PXA270]本身就要求与普通ARM不同的JTAG头.
到博创论坛求教, 未果, 真乃民族高科技, 对直接用户也如此保密, 叹!. 殊不知, 这些底层细节和技术才是关键, 才是嵌入式教学的重点, 而不是在一个现成的Linux平台上作类似主机的编码. 这样的教学科研平台和其名不甚相符, 再叹!
再到网上搜索求助, 巨量的信息夹杂着各家平台的广告, 对我的疑惑都没有直接的帮助, 看来只能自力更生。
查看博创硬板原理图, 发现硬板上14针JTAG接口的管脚定义是和通常的Wiggler兼容的:
VCC-1,13,GND-2,4,6,8,10,14, nTRST-3, TDI-5, TMS-7, TCK-9, TDO-11, nRESET-12.
于是将原用于S3C44B0X的一个Wiggler头和博创硬板连接, 再测试了多种主机软件, 仍不能连接硬板, 迷惑更甚.
无奈之下, 只有测量JTAG头实际电路, 以明白其工作原理. 用了一天多时间, 边测量边画出了博创JTAG头和Wiggler的电路原理图. 比较两种原理图, 以及twentyone 的HJTAG和sendtoyou的调试代理的提示, 明白了博创JTAG头的原理:
博创JTAG头采用的是SDT标准. 和Wiggler相比, 基本原理是相同的, 都是用74HC244作信号传递的电平变化, 限流电阻都为100, 上拉电阻都用2.2K. 而和Wiggle主要区别在于PC并口管脚定义, 以及一些小的区别: nTRST的传递方式, 信号是否上拉等.
SDT(左)和Wiggler(右)的信号比较如下:
PC2 tck PC4
PC3 tms PC3
PC4 ntrst PC2
PC8 tdi PC5
PC13 tdo PC11
明白这些, 再用博创JTAG头连接S3C44B0X硬板, HJTAG中选择SDT, 可以识别ARM7TMDI核标示. 可以认为, 博创JTAG头可用于ARM7调试, 并未因Xscale和PXA270而特别.
在这个过程中我收集了不少JTAG电路图和相关文档. 后面若有时间可深入学习, 主要针对如下问题和方向:
JTAG的内部工作原理?
在CPLD和FPGA中使用的JTAG是否原理类似?
简单的Wiggler类JTAG的速度问题, 主要受PC并口电平变化的速度限制, 可使用CPLD辅助信号逻辑, 或使用USB接口, 或支持以太网的CPU辅助信号逻辑. 三种方式各有优缺点: CPLD方式可广泛兼容现有的JTAG软件, 但速度提升可能有限; USB和以太网可极大提升速度, 但支持软件是问题, 且实现较复杂, CPU方式复杂度最高. 综合比较下, USB方式应该是较好的选择.
JTAG和ISP的关系? ISP也使用JTAG类似信号线, 是否ISP是JTAG的子集, 利用其串行时序, 仅用于单片机(如AT89C5X)Flash烧录, 而不支持程序在线调试. 在网上见”可用ISP配合FLASHPGMCR烧写片内片外存储”, 不知FLASHPGMCR是否指MacraigorSystems的软件, 需要测试.
JTAG和BDM的关系?
BSDL描述文件和IBIS模型的应用?
博创PXA270平台附带的JTAG头可和什么软件配合使用以完成调试和烧录?
使用Intel下载的JflashMM不能连接JTAG?
博创JflashMM使用的Giveio和Intel的也不相同?
Intel的Jflashmm基于Windows, 而博创提供的Jflash Linux版从何而来?
Jflash显示信息中的Mainstone是什么?
JflashMM是否可指定地址烧录?
JflashMM是否可指定地址下载到RAM中, 并启动运行, 若修改代码添加上述功能是否简单可行?
博创平台提供JFlashMM配合JTAG头来完成BLOB的烧录. JflashMM有Windows版和Linux版.
为了找到一个支持博创JTAG头调试的工具, 测试了多种软件, 都未成功. 从JflashMM运行信息得知其出自Intel公司(信息行后的说明是后来慢慢明白的):
D:\Linux\JFlash_MM>jflashmm bc16 –I /*bc16.dat为CPU信息和配置文件, -I选项用于识别CPU和Flash类型*/
JFLASH Version 5.01.007 /*版本号, 5.01.007为最新版, 2004.2发布*/
COPYRIGHT (C) 2000 - 2003 Intel Corporation
PLATFORM SELECTION:
Processor= PXA27x /*CPU类型, bc16.dat中确定*/
Development System= Mainstone /*硬板类型, bc16.dat中确定, Mainstone为Intel开发板, 有I,II,III*/
Data Version= 1.00.001 /*bc16.dat数据文件版本*/
PXA27x revision C5 /*CPU的小版本标识[SteppingLabels], 4位标识从CPU读取, 在bc16.dat找对应的串名*/
Found flash type: 28F128J3A /*该型号由Flash_18_1_2.dat确定, 而文件名由硬板Flash芯片反馈信息确定*/
error, can not open binary input file /*上面的命令行未写入要烧录的内容文件*/
如果未连接硬板而运行JflashMM会出现如下信息, 表示从JTAG获得的CPU ID和数据文件中不一致:
error, failed to read device ID check cables andpower
ACT: 1111 1111111111111111 11111111111 1 /*从JTAG读取的实际(Actual)的CPU ID*/
EXP: **** 1001001001100101 00000001001 1 /*数据文件中期望(Expect)的CPU ID*/
CPU ID的前4位为小版本标识, CPU类型判别时只比较后28位(EXP中的”****”则表示该意), 若ACT和EXP不同, 则出现上面的提示信息.
为了确定JTAG头的类型, 我从Intel网上下载了JflashMM, 安装完成后在安装目录下有JflashMM和Giveio源代码包. 使用安装的JflashMM配合博创JTAG连接硬板不成功. 由此可见, 博创对JflashMM的源代码作了修改以适应自己的JTAG头.另外, 博创使用的Giveio也和Intel的不同, 好像为国人所作.
Giveio为Windows下的并口驱动程序, 要操作连接并口的JTAG头须经由它来完成. 博创JflashMM所带的Giveio为国人sendtoyou所作, 安装和卸载驱动比原Giveio更为方便. Sendtoyou的Giveio可从网上下载:
http://www.armjtag.com/jtag.htm
Giveio是sendtoyou发布的调试代理软件的一部分, 该调试代理支持一些ARM9/ARM7CPU和SDT, ADS调试, 类似twentyone 的HJTAG.Sendtoyou发布网站还提供配合使用的SDT和Wiggler两种JTAG头的电路原理图. 虽我没测试过该调试代理, 但相信可成为ARM调试的另一个选择. 我后面修改的JflashMM也使用sendtoyou的Giveio, 没有深入学习, 还不明白Giveio的工作原理.
到Intel网站下载JflashMM时, 发现一个专用于Xscale的IDE环境:
Intel C++ Software Development Tool Suite -v2.0.1 Xscale
下载了一个评估版, 从其ReleaseNote知道, 它支持两种JTAG头:
Intel JTAG Cable和Macraigor OCDemon Raven ARM 20 JTAGinterface
而从JflashMM的ReleaseNote也知它也支持两种JTAG头:
Insight IJC-1 connector and IJC-2 cable 和Intel JTAGcable
也就是说, C++ SDTS和JflashMM都支持Intel JTAG cable, 但不知道Intel JTAG cable的构成, 网上也有人询问该JTAG Cable的电路图, 不过无人回答. 所以我希望通过研究JflashMM的代码能确定Intel JTAGcable的工作原理, 并能修改代码以支持SDT和Wiggler JTAG.
原JflashMM是在VC6下完成的, 而我是采用Visual Stdio 2005来编译JflashMM源代码.
LART的JFlash-我查到的最早版本
LART是一个基于SA1100的一个开发平台
LART对Linux在Intel CPU嵌入式系统中的应用有很大的影响, 如BLOB就来自LART
2000.07 面向SA1100, steve修改以支持Linux.
这个版本和Intel的Jflash有一些函数类似, 但不能两个版本的渊源.
Intel的JFlash-主要面向Xscale系列.
xxxx.xx SA1110JFlashKit_V12 , 不确定是否为intel的产品
2002.08 JFlash_DBPXA2xx_V2_09_001_Kit用于DBPXA250和DBPXA210开发平台.
2002.12 JFlash_DBPXA26x_V2_10_002_Kit用于DBPXA261和DBPXA262开发平台.
其中标志文件为cotullajtag.h, 为Cotulla边界扫描链定义管脚, Cotulla为PXA25X的内核代号
2003.03 JFlash_MM_V5_01_003_Kit, 开始改为MM(Multi Mode)版, 面向多个平台(可能是MM的本意).
其中有一个标志文件xjd.cpp, 为Debug handler.
2004.01 JFlash_MM_V5_01_006_Kit
2004.04 JFlash_MM_V5_01_007, Intel的最终版, 不会再有更新, 因为Intel已将相关产业出售.
基于Intel的JFlash_MM_V5_01_007, 修改以适应自己的JTAG和支持Linux, 补不足之处
JFlash_Xsbase255, JFlash_Xsbase270.
SECJTAG FLASH(SJF)- Sumsung的类似软件, 有时也称为JFlash, 但和Intel的没有关系,
2003.09 Sjf2440-rev01
从执行文件大小, 个人推测, 博创所用的为亿道的版本, 作了适应JTAG头的调整
使用2004.04的Intel JFlash_MM_V5_01_007
原JflashMM是在VC6下完成的, 而我是采用Visual Stdio 2005来编译JflashMM源代码.直接转换原工程使用.
在不动原来的源代码, 编译出现两问题, 需要修改:
@建议引用安全库函数的警告[deprecation warnings]:
在jflash.cpp的开始处添加”#define _CRT_SECURE_NO_DEPRECATE”, 可禁止该警告
@Jflash.cpp的1674行和1725行的lj变量定义错:
从for语句中移出, 放到for语句前一行定义
添加新JTAG头类型(SDT和WIG):
@添加两个新类型
修改Jflash.h的CABLE_TYPES
Jflash.cpp的297行处, 添加新类型的参数支持
修改Jflash.cpp中putp(), 添加两新类型的端口操作实现(见后面)
@修改Global_Variables.h中CableType初值和Jflash.cpp的Cable_Type[4]初值确定缺省使用的类型
CableType初值: 命令行参数少于6个时起作用
Cable_Type[4]初值: 命令行参数大于等于6个时起作用
其他参数的使用也需要注意, 最好用批处理文件写全格式命令.
@修改Jflash.cpp中id_command ()的constructed_string定义,增加串长, 消除堆栈溢出错误.
@修改Jflash.cpp的usage()的使用说明.
并口操作相关:
要编写并口的操作, 需要知道并口相关寄存器的定义:
[基地址]处为数据寄存器: D7-D0, 对应PC9-PC2. 各类型的管脚定义如下所列
Wiggler SDT Intel
tck PC4 PC2 PC2
tms PC3 PC3 PC4
ntrst PC6(?) PC4 ?(不在数据端口,或取反)
tdi PC5 PC8 PC3
tdo PC11 PC13 PC11
[基地址+1]处为状态寄存器, 管脚,名称和数据位如下所列:
PC15 nError D3
PC13 Select D4
PC12 PageOut D5
PC10 nAck D6
PC11 Busy D7
新类型的端口操作实现
实现代码很简单, 参考不同JTAG的管脚定义就行.
if(CableType == SDT_Jtag)
{
// NTRST is D2, TMS is D1, TDI is D6, and TCKis D0, TDI is D4(PC13).
_outp(lpt_address,(1<<2)+tms*(1<<1)+tdi*(1<<6)); // TCK low
_outp(lpt_address,(1<<2)+tms*(1<<1)+tdi*(1<<6)+(1<<0));// TCK high
if(rp == READ_PORT)
_outp(lpt_address,(1<<2)+tms*(1<<1)+tdi*(1<<6)); // TCK low
if(rp == READ_PORT)
tdo = ((int)((_inp(lpt_address +1)>>4)&1)); // get TDO data
}
else if(CableType == Wiggler_Jtag)
{
// NTRST is (D0,D4), TMS is D1, TDI is D3, andTCK is D2, TDI is D7(PC11).
_outp(lpt_address,(1<<0)+(1<<4)+tms*(1<<1)+tdi*(1<<3)); // TCK low
_outp(lpt_address,(1<<0)+(1<<4)+tms*(1<<1)+tdi*(1<<3)+(1<<2));//TCK high
if(rp == READ_PORT)
_outp(lpt_address,(1<<0)+(1<<4)+tms*(1<<1)+tdi*(1<<3)); //TCK low
if(rp == READ_PORT)
tdo =! ((int)((_inp(lpt_address +1)>>7)&1)); // get TDO data
}
这儿有几点说明:
@注意将复位管脚(NTRST)拉高
@原Intel实现读取tdo有问题, 没有屏蔽位
@Busy脚需取反, 而Select脚不用
@Wiggler的复位脚不确定, 将PC2和PC6都拉高
CPU数据文件:
JflashMM会要使用配置数据文件用于JTAG操作和CPU初始化. 不同CPU和硬板使用不同的文件. 文件的模板可以从Intel下载, 自己定制修改.
对应PXA270, 我下载了PXA27x_DataFiles.zip, 使用其中的bulbcx_16.dat(修改小版本7对应的代号). 压缩包中还有bulax.dat,bulbcx.dat. 文件的命名规则为: bul= Bulverde(PXA270内核代号), Ax=A0,A1, BCx=B0,B1,C0,C2(Ax,Bx,Cx为小版本, 我使用的PXA270为C5), 数值后缀表总线宽度, 32位默认省略.
bulax.dat和bulbcx.dat差别很大. bulbcx.dat和bulbcx_16.dat差别较小, 仅总线宽度和并行Flash数不同.
Flash数据文件:
该数据文件用于描述确定对应硬板上的Flash特性, 确定应该采用何种操作. 不同Flash使用不同文件, 文件名称随类型不同而异[有格式], JflashMM会自动探测Flash类型, 确定需要使用的Flash数据文件的名称.
名称格式为: Flash_ + ID数值 + 并行设备数 + 总线宽度 +.dat
Intel Flash安装完成后, 在安装目录下有很多Flash数据文件, 一般适合可用. 其他Flash类型的支持可参考现有的数据文件进行修改(不同类型数据文件差别不大), 具体可参考Intel的 Appliationnote - 30980101 - Adding Support for Intel Flash for JFlashMM.pdf.
GIVEIO并口驱动:
可使用JflashMM自带的, 也可使用sendtoyou制作的Giveio驱动.