软件模拟NT68661升级

软件模拟NT68661升级

平台: RK3288_SWH5184 ARM [email protected]处理器
概述:之前NT68661是通过厂商提供的升级工具升级,不过该升级方式很麻烦,需要安装驱动,禁用系统的签名等等。所以想了一个办法,通过RK3288板卡模拟升级波形给NT68661升级。即:RK3288板卡与NT68661使用I2c总线连接,通过发送I2c数据,对NT68661的flash进行读写操作。
1.问题:编写简单的测试模块,向nt68661发送设备地址时,得不到响应。
方法:抓波形查看手册,发现升级工具在升级前需要发生一段同步波形,使MCU进行ISP RESET之后才能,进行i2c传输。

2.问题:想法一修改驱动,先将i2c4总线复用成gpio功能,发同步波形,然后再复用成i2c功能,给mcu发送升级数据,但是操作gpio模拟需要的波形时,发现无法在i2c总线已经创建后,将其复用成gpio;
方法:准备用两个gpio直接模拟i2c总线,不走i2c总线控制器。 linux已经有了gpio模拟i2c的驱动,只需要修改一下dts,配置一下gpio和延迟就可以使用。驱动位置:drivers/i2c/busses/i2c-gpio.c;驱动赋值的传输函数和功能函数位置:drivers/i2c/algos/i2c-algo-bit.c。

3.问题:编程时,每次编程512字节数据,发现每次都会在512字节数据后边多一个字节,怀疑是类似于校验的字节;
方法:mcu的flash是以512字节扇区为单位编程的,但是需要每次编译是513字节,第513字节为前面字节的异或校验(前面所有字节包括设备地址和寄存器地址)。
软件模拟NT68661升级_第1张图片

4.问题:程序编写完成后,无法测试是否擦除或者编程完成;
方法:编译两个bin文件,一个bin文件将某一个GPIO上拉,某一个BIN文件将GPIO下拉,通过烧写不同的bin文件,可以判断是否编程成功。(比较经典好用的是,拉屏幕的背光脚,当然前提是屏幕的背光脚在NT68661上)

5.问题+方法: flash编程时,编程命令中有一字节是fileops,编程到flash中的位置参数。命令每次编程512字节,而我的编程bin文件是256k字节,要编程512次。 而辨识位置只有一个字节,最多表示256个位置; 所以,在编程时,有命令可以使fileops为1时,编程的是第257的位置。
软件模拟NT68661升级_第2张图片

6.问题: flash编程时,编程命令中有一字节是fileops,编程到flash中的位置参数。命令每次编程512字节,而我的编程bin文件是256k字节,要编程512次。 而辨识位置只有一个字节,最多表示256个位置; 所以,在编程时,有命令可以使fileops为1时,编程的时第257的位置。
flash以64k字节bank为单位存储,每bank都没存满,需要跳过每个bank没有存放数据的部分。
软件模拟NT68661升级_第3张图片

7.问题:测试,发现可以进入isp模式,拉高flash写保护脚,也可以编程数据,但是编程之后,再从flash读取出来,发现数据不对。怀疑是擦除有问题。理由如下:
拿flash的前3个字节数据为例,编程之前flash数据为02.34.3e,我编程的bin文件前3字节为02.34.6b,最后编程后,flash数据为02.34.2a。发现是编程成功了,但结果不对,现象好像是擦除没有成功,因为在flash数据为0x3e时,直接写入6b刚好为2a。再次抓烧录器波形,发现擦除时,不仅有i2c波形,还有一段3秒的其他波形。感觉像是硬件识别到这样的波形才能擦除成功,明天继续研究。
方法:使用烧录器和程序,交叉测试,即编程器去进行isp on,我的程序进行擦除和编程时,发现可以正确编程,所以是我的程序的isp on有问题。

8.问题: 如何解决我的ISP ON有问题导致的烧录失败?
对比烧录器的ISP ON的数据和我的程序的数据: 发现有个别数据在68661里的bin文件不同时,数据不同,最后此变化无影响。
对比烧录器的ISP ON的波形和我的程序的波形:发现ISP ON之后会有发送0xE0,0xE0,0xE0,0xE0的波形, 将该波形使用烧录器模拟后,编程成功。
说白了就是对比数据和波形,只要模拟的够准确,绝对可以编程!

两个说明:
1.I2C总线读取数据时,单独发送一条读数据命令,是可以正确读取出数据的。
即使有的I2c总线最后出来的波形是,start,0x6f,restart,0x6f,0x1,0x87,0xe9,stop
软件模拟NT68661升级_第4张图片
2.i2c总线每次写完一个字节数据后,i2c的SCL会拉低延迟拉高,这个操作不会影响I2c总线。但是这个操作也没有任何别的意义

你可能感兴趣的:(LinuxOS,基础总线I2C,SPI)