【转】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平台上作类似主机的编码. 这样的教学科研平台和其名不甚相符, 再叹!
再到网上搜索求助, 巨量的信息夹杂着各家平台的广告, 对我的疑惑都没有直接的帮助, 看来只能自力更生。

      查看博创硬板原理图, 发现硬板上14JTAG接口的管脚定义是和通常的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 HJTAGsendtoyou的调试代理的提示, 明白了博创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调试, 并未因XscalePXA270而特别.

        在这个过程中我收集了不少JTAG电路图和相关文档. 后面若有时间可深入学习, 主要针对如下问题和方向:
JTAG的内部工作原理?
CPLDFPGA中使用的JTAG是否原理类似?
简单的WigglerJTAG的速度问题, 主要受PC并口电平变化的速度限制, 可使用CPLD辅助信号逻辑, 或使用USB接口, 或支持以太网的CPU辅助信号逻辑. 三种方式各有优缺点: CPLD方式可广泛兼容现有的JTAG软件, 但速度提升可能有限; USB和以太网可极大提升速度, 但支持软件是问题, 且实现较复杂, CPU方式复杂度最高. 综合比较下, USB方式应该是较好的选择.
JTAGISP的关系? ISP也使用JTAG类似信号线, 是否ISPJTAG的子集, 利用其串行时序, 仅用于单片机(AT89C5X)Flash烧录, 而不支持程序在线调试. 在网上见”可用ISP配合FLASHPGMCR烧写片内片外存储”, 不知FLASHPGMCR是否指MacraigorSystems的软件, 需要测试.
JTAGBDM的关系?
BSDL描述文件和IBIS模型的应用?

博创PXA270平台附带的JTAG头可和什么软件配合使用以完成调试和烧录?
使用Intel下载的JflashMM不能连接JTAG?
博创JflashMM使用的GiveioIntel的也不相同?
IntelJflashmm基于Windows, 而博创提供的Jflash Linux版从何而来?
Jflash显示信息中的Mainstone是什么?
JflashMM是否可指定地址烧录?
JflashMM是否可指定地址下载到RAM, 并启动运行, 若修改代码添加上述功能是否简单可行?

博创平台提供JFlashMM配合JTAG头来完成BLOB的烧录. JflashMMWindows版和Linux.

  为了找到一个支持博创JTAG头调试的工具, 测试了多种软件, 都未成功. JflashMM运行信息得知其出自Intel公司(信息行后的说明是后来慢慢明白的):

D:\Linux\JFlash_MM>jflashmm bc16 –I /*bc16.datCPU信息和配置文件, -I选项用于识别CPUFlash类型*/

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中确定, MainstoneIntel开发板, 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中的”****”则表示该意), ACTEXP不同, 则出现上面的提示信息.

  为了确定JTAG头的类型, 我从Intel网上下载了JflashMM, 安装完成后在安装目录下有JflashMMGiveio源代码包. 使用安装的JflashMM配合博创JTAG连接硬板不成功. 由此可见, 博创对JflashMM的源代码作了修改以适应自己的JTAG.另外, 博创使用的Giveio也和Intel的不同, 好像为国人所作.

  

  GiveioWindows下的并口驱动程序, 要操作连接并口的JTAG头须经由它来完成. 博创JflashMM所带的Giveio为国人sendtoyou所作, 安装和卸载驱动比原Giveio更为方便. SendtoyouGiveio可从网上下载:

  http://www.armjtag.com/jtag.htm

  Giveiosendtoyou发布的调试代理软件的一部分, 该调试代理支持一些ARM9/ARM7CPUSDT, ADS调试, 类似twentyone HJTAG.Sendtoyou发布网站还提供配合使用的SDTWiggler两种JTAG头的电路原理图. 虽我没测试过该调试代理, 但相信可成为ARM调试的另一个选择. 我后面修改的JflashMM也使用sendtoyouGiveio, 没有深入学习, 还不明白Giveio的工作原理.

  Intel网站下载JflashMM, 发现一个专用于XscaleIDE环境:

  Intel C++ Software Development Tool Suite -v2.0.1 Xscale

  下载了一个评估版, 从其ReleaseNote知道, 它支持两种JTAG: 

  Intel JTAG CableMacraigor OCDemon Raven ARM 20 JTAGinterface

  而从JflashMMReleaseNote也知它也支持两种JTAG:

  Insight IJC-1 connector and IJC-2 cable Intel JTAGcable

  也就是说, C++ SDTSJflashMM都支持Intel JTAG cable, 但不知道Intel JTAG cable的构成, 网上也有人询问该JTAG Cable的电路图, 不过无人回答. 所以我希望通过研究JflashMM的代码能确定Intel JTAGcable的工作原理, 并能修改代码以支持SDTWiggler JTAG.

JflashMM是在VC6下完成的, 而我是采用Visual Stdio 2005来编译JflashMM源代码.

LARTJFlash-我查到的最早版本

LART是一个基于SA1100的一个开发平台

LARTLinuxIntel CPU嵌入式系统中的应用有很大的影响, BLOB就来自LART

2000.07 面向SA1100, steve修改以支持Linux.

这个版本和IntelJflash有一些函数类似, 但不能两个版本的渊源.

IntelJFlash-主要面向Xscale系列.

xxxx.xx SA1110JFlashKit_V12 , 不确定是否为intel的产品

2002.08 JFlash_DBPXA2xx_V2_09_001_Kit用于DBPXA250DBPXA210开发平台.

2002.12 JFlash_DBPXA26x_V2_10_002_Kit用于DBPXA261DBPXA262开发平台.

      其中标志文件为cotullajtag.h, Cotulla边界扫描链定义管脚, CotullaPXA25X的内核代号

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已将相关产业出售.

基于IntelJFlash_MM_V5_01_007, 修改以适应自己的JTAG和支持Linux, 补不足之处

JFlash_Xsbase255, JFlash_Xsbase270.

SECJTAG FLASH(SJF)- Sumsung的类似软件, 有时也称为JFlash, 但和Intel的没有关系,

2003.09 Sjf2440-rev01

从执行文件大小, 个人推测, 博创所用的为亿道的版本, 作了适应JTAG头的调整

使用2004.04Intel JFlash_MM_V5_01_007

JflashMM是在VC6下完成的, 而我是采用Visual Stdio 2005来编译JflashMM源代码.直接转换原工程使用.

在不动原来的源代码, 编译出现两问题, 需要修改:

  @建议引用安全库函数的警告[deprecation warnings]:

      jflash.cpp的开始处添加”#define _CRT_SECURE_NO_DEPRECATE, 可禁止该警告

  @Jflash.cpp1674行和1725行的lj变量定义错:

      for语句中移出, 放到for语句前一行定义

  

添加新JTAG头类型(SDTWIG):

@添加两个新类型

  修改Jflash.hCABLE_TYPES

  Jflash.cpp297行处, 添加新类型的参数支持

  修改Jflash.cppputp(), 添加两新类型的端口操作实现(见后面)

@修改Global_Variables.hCableType初值和Jflash.cppCable_Type[4]初值确定缺省使用的类型

  CableType初值: 命令行参数少于6个时起作用

  Cable_Type[4]初值: 命令行参数大于等于6个时起作用

  其他参数的使用也需要注意, 最好用批处理文件写全格式命令.

@修改Jflash.cppid_command ()constructed_string定义,增加串长, 消除堆栈溢出错误.

@修改Jflash.cppusage()的使用说明.

并口操作相关:

  要编写并口的操作, 需要知道并口相关寄存器的定义:

  [基地址]处为数据寄存器: 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的复位脚不确定, PC2PC6都拉高

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为小版本, 我使用的PXA270C5), 数值后缀表总线宽度, 32位默认省略.

bulax.datbulbcx.dat差别很大. bulbcx.datbulbcx_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驱动.