简易JTAG烧写程序的执行逻辑和流程
本文摘自王洪辉老师的《嵌入式系统Linux内核开发实战指南(ARM平台)》一书
网上有很多种简易JTAG烧写程序,有用标准C写的,有用VC写的,有Windows系统下使用的版本,也有Linux系统下使用的版本,读者可以自行下载后作适当修改重新编译就可使用了。
不管什么版本的程序,其基本原理和执行逻辑应该是差不多的,本书附带光盘中有我所下载、修改、使用的JTAG烧写程序完整源代码,读者可以参考阅读。如图10-6所示是该程序的总体流程。
烧写程序维护两个扫描链表缓冲区,一个对应输入,一个对应输出。一个扫描链缓冲区就是一个int型整数数组,数组的长度为CPU的管脚(PIN)数,数组中的每个元素对应一个管脚的状态,一个管脚的状态只有两种:0或者1,事实上用1位就可以描述这两种状态,而程序中用一个int整数来描述是很浪费的,感兴趣的读者可以对程序进行修改优化。输入扫描链表数组用来保存刚从CPU扫描出来的每个管脚的状态,而输出扫描链表数组用来保存将扫描到CPU的管脚中的状态。
对flash芯片编成首先必须将flash芯片擦除,然后再对其进行写操作,擦除flash芯片可以逐个扇区擦除,也可以一次擦除整个芯片,对flash芯片进行擦写的时序和命令请查看具体flash芯片型号的datasheet。
通过简易JTAG线缆读写flash芯片数据必须逐个字节进行读写,操作过程都很类似,以读flash为例,操作过程如下:
1)把CPU各管脚的安全状态写入到输出扫描链表数组中;
2)将“SAMPLE”命令扫描到CPU的TAP控制器中;
3)将输出扫描链表数组中的状态扫描到CPU的TAP控制器中;
4)再次将“SAMPLE”命令扫描到CPU的TAP控制器中;
5)将“EXTEST”命令扫描到CPU的TAP控制器中;
6)执行for循环逐个字节读取数据,循环次数等于要读取的数据长度:先将要读取的flash的地址的地址管脚状态写入输出扫描链表数组对应的元素中,然后将输出扫描链表数组中的状态扫描到CPU的TAP控制器中,与此同时将CPU管脚的状态同步输入到输入扫描链表数组中,然后从输入链表数组中提取flash数据。