昨天分析到了check_rom_info函数,提到access_rom是整个的核心
其实这么说也不大准确,应该说access_rom是最底层操作的函数,它首先将TAP控制器状态移到ShiftDR,然后把准备好的各个引脚的电平状态设置好(没怎么搞懂高阻态是如何动作的,也许扫描链比实际引脚会多几个脚),移入扫描链中,然后把TAP控制器状态移到ShiftIR,把extest指令移入,使器件进入外部逻辑测试状态,刚才为扫描链中移入的电平就放到了引脚上。access_rom把参数addr放到器件的地址引脚上,把数据放到数据引脚上,同时把引脚原本的引脚信号移出TDO,就可以把flash返回在数据线上信号返回。
正如代码里面的那段注释:
To read data from the Flash Memory you must first fill the processor JTAG chain
with the Address, then pump the entire chain out.
however while pumping data out you can be pumping the next cycle's Address in
Therefore the JTAG chain looks like a pipeline, valid read data always coming
out one cycle late.
当前flash返回的数据要下一次扫描的时候才能返回,所以access_rom函数返回的值是上次地址读到的数据
check_rom_info的代码比较长,而且都是一些通过flash的CFI(Common Flash Interface)对flash信息简单的读取操作,这里就不再贴出来了。
check_rom_info成功返回之后,程序开始检查将要写进flash的文件的合法性,主要是大小是否合法,如果比flash还大,就返回错误信息并退出
如果成功,经过一些简单的界面交互过程之后,程序开始调用test_lock_flash来检查相应的块是否已经被lock,如果被锁定,则发送命令将其unlock,然后返回
之后,程序调用erase_flash和program,函数同样是使用acess_rom调用来在flash引脚上产生相应的时序来完成相应的操作。大家可以参考相应的flash芯片的资料。
最后,程序再把flash里面的数据读取出来进行与文件进行验证,检查烧写是否成功。
(全文完)
后记:第一次接触JTAG是大学学习数字逻辑的时候,那个时候在maxplus里面画好原理图或者用HDL写好描述,编译之后,就使用JTAG下载到alter的芯片里面,那个芯片就按照我们的原理动起来了!!真是神奇,当时觉得那是大学里面最好玩的试验课。正是那门课,让我走进嵌入式的世界。之后开始做DSP,是TI公司的C5402的芯片,使用的闻亭的仿真器,当时更是疑惑,为什么一个通过JTAG就能够控制住芯片的行为呢?带着一知半解,继续学习了ARM系列的芯片,好像跟JTAG有仇一样,每个芯片(当中其实使用过一款AVR的AT90S8515,使用ISP进行烧写,不过听说现在已经停产了)都有JTAG(实际上是因为JTAG确实很优秀)。于是断断续续的对JTAG有一些了解。使得我对JFlash有进行分析的原因是我们有一块44b0的板子出了问题,烧写老是出毛病,我真的就束手无策了,bootloader下不去,我天大的本事也是枉然。于是我想到了JTAG控制,既然程序是用JTAG烧写进去的,那么我用JTAG去操作、检查总应该是对的。就这样,我开始断断续续的看一下JFlash的源代码。刚开始的时候,觉得是个好复杂的问题,前面的几个函数看得还真有点吃力,不过随着对JTAG的了解增多,到后面基本上没甚么障碍了。看代码的同时,把分析的过程记录下来,希望网友们可以对Jflash有更多的了解。