概述
由于之前把JN5169的开发环境挪到了VSCode上并实现了编译的全过程后,想通过命令行方式将烧录过程一并完成的时候,发现原版的设计上使用了FT232RL的两个GPIO引脚来拉低MISO和NRST引脚完成芯片的重启和片内Bootloader,而我换用了更便宜的国产CH3xx芯片并使用了串口中的DTR和RTS来完成的时候,发现Programmer在烧录过程中把这两个引脚持续拉低,因此无法完成烧录过程。因此,根据NXP的JN-AN-1003关于JN51XX片内Bootloader的操作手册,结合逻辑分析仪抓取的数据,完成了此文以留备用。
由于最近使用QT比较多,脑子里关于它的内容还热乎着,因此DIY的烧录器准备使用QT来完成,创建一个QT命令行的程序,首先第一步是通过操作DRT和RTS引脚,让JN5169完成重启和Bootloader的进入,项目到这里位置没有难度,而且通过手册里约定的38k4 8N1方式,成功的实现了和JN5169的连接,向它发送GET_CHIP_ID请求的,收到了来自芯片的答复,一个0x0B字节的回文,根据说明,这个回文包括3个内容,即status,chip_id和bl_version。到此进展正常,原本我考虑这个烧录过程,应该是进入BL,GET_CHIP_ID后,Change_Baud_Rate为1Mbps就开始将程序烧录进去的,但是发现这个请求收不到回复,因此就拿出逻辑分析仪勾线后,使用BS里的烧录工具,重新对抓包器(NXP的图纸,抓包器使用了FT232RL和JN5169实现)的烧录过程进行捕捉,获得了对JN5169进行编程全过程的数据包,通过分析,发现该工具的运行流程是这样的:
1、首先也是GetChipId的数据包请求,并获得了回文,这一点和我之前所执行的是一致的;
2、烧录工具却是向芯片发起了一个RAM read request,地址是0x01001500,长度是0x0010。这就让我觉得很奇怪了哎。。。为什么?经查,这个地址是指向JN5169的OTP区第一个字的地址,0x10即读取了4个字,是Internal Use根据字面的解释,Internal Use应该是不用我们操心的,这里返回的数据是一连串的0xff,先mark下来不管它,继续往下分析
3、接下来的操作,就是SelectFlashType了,通过这份bootloader我才发现JN5169貌似是可以通过外置存储来启动的,因此这一步,可能就是在遍历是否存在外置flash,这个遍历的过程是:选择0x04(ST MP25P05-A) 返回OK,ReadFlashID 返回ManuID=0x0B,DevID=0x12。
选择0x00(ST MP25P10-A)返回OK,ReadFlashID 返回ManuID=0x0B,DevId=0x12。
选择0x05(ST MP25P20-A)返回OK,ReadFlashID 返回ManuID=0x0B,DevID=0x12。
选择0x03(ST M25P40)返回OK,ReadFlashID 返回ManuID=0x0B,DevID=0x12。
选择0x01(SST 25VF010A)返回OK,ReadFlashID 返回ManuID=0x0B,DevID=0x12。
选择0x02(Atmel 25F512)返回OK,ReadFlashID 返回ManuID=0x0B,DevID=0x12。至此所有支持的外置存储型号遍历完成了,因为没有外置存储,因此返回值都是0x0B12。这个返回值和所有外置芯片的ManuID都不吻合,可能就是以此标识报告给芯片吧。(后来本着细致认真的态度,剥掉了抓包器的外皮,发现板子上确实有一颗SPI Flash,放大以后看是芯天下的XT25F04B,然后就查阅了这款芯片的数据手册,后发现该芯片的ID Number
(XTX Manufacturer ID)为0BH且DevID为12)。
4、之后烧录工具继续向5169发出了RAM read request,地址是0x01001570,长度是2个字,这里的目的就比较明确了是为了获取芯片的MAC地址(芯片有两个MAC一个是设备固化的MAC地址,还有一个是Customer自定义的MAC地址),这里是自定义的MAC地址,返回的值依旧是全0xff,
5、还是一条RAM read request,地址0x01001580获取设备的固化MAC地址
6、还是RAM read request,地址是0x01001400,长度0x10这条数据没有查到信息,MARK下来,因为不知道这个地址的内容,所以也不知道返回的数据是什么。
7、RAM read request 地址01001510,这里获取到的是芯片的自定义参数
8、Select Flash Type:0x08,这里就是重点了选择内部存储为目标,紧接着才是我期盼已久的ChangeBaudRate,将芯片的通信速率设置为115200bps,并返回Success;
9、从这一步开始,芯片才是正式的开始烧录,烧录的第一步当然毫无疑问的,0x07将所有扇区清除,100毫秒左右之后,芯片返回Success,然后从0x00开始,读取0x40个字节的数据,可能是用于判断扇区是否完成清除,如果是被清除的区域,存储的数据应该是0xff。之后就向该扇区写入数据每个数据包传输128字节的固件内容,在完成所有字节的传输之后,向0x00001400,写入一串短数据作用未知。烧录工具还会读取Flash的数据,应该是进行校验。
10、依然是看不懂的,RAM write request 地址指向0x04000400.不管。MARK之,写进去以后又把它读取出来。再又是RAM write request 地址0x040004F8。写完还是会读取出来。然后接着是0x040005f0,0x040006e8,0x040007E0,0x040008D8,0x040009d0,0x04000ac8,0x04000bc0,0x04000cb8,0x04000db0,0x04000ea8,0x04000efc,
11、完成了这部分的RAM写入,就要求程序从0x04000be9开始执行,返回执行成功后。又发送了一个0x36的数据包目前也未知作用,然后过了较长一段时间后,返回了一个0x37的数据包,往返的数据内容都是0x00,再之后要求程序从0x00000066启动并返回成功至此BootLoader应该完成了它的全部运行;
这里有几点比较有疑问的就是,Bootloader手册我也没有完全阅读,因此很多知识可能并未get到,因此回头我会重新阅读一遍尽量将MARK起来的疑问弄清楚,还有一方面就是不知道是不是由于文件版本的差异,我实际获得的手册和Bootloader的内容有少许出入。但是这确实是我最近才从NXP官网获得的数据,好在差别不大,等回头再看看是怎么回事吧。
最后
以上就是务实咖啡豆为你收集整理的JN5169 Bootload 烧录过程和DIY烧录程序(一)的全部内容,希望文章能够帮你解决JN5169 Bootload 烧录过程和DIY烧录程序(一)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复