[]【HarmonyOS HiSpark AI Camera试用连载 】用Python自己做一个图形化烧写工具

阅读量0
2
2
对于HiTool烧写工具的使用和具体分析同伴们已经做了太多,我这里就不一一列举了。但是HiTool工具真的很好用吗?我觉得不太符合期望。以下图为例:
对于板卡的设置有串口、服务器IP地址,板卡IP地址,子网……
对于待烧写文件的设置有文件、器件类型、文件格式、长度……
图片1.png
分析一下,真的需要全部都手工设置吗?
我们习惯用串口+网口的方式去烧录,因为就在本地一般也不会说有存在跨网段访问的需求,板上的IP地址完全可以根据电脑接口的IP地址自动随机生成clientIP地址,而无需人工干预,所以在网络这块只需要选择串口+ip就行。
对于文件来说,Uboot文件我们一般不会去动它,而且一般固定就是1M
对于我们手边的某个特定设备,比如AI Camera,我们知道所谓长度,实际上就是存放的空间大小和操作时使用0xff填写的内容,只要比文件大就行,比如我这里生成领一个4.93MB的文件,我可以选择5M也可以选择10M,这里是因为在自带启动文件里面的有“bootcmd=mmc read 0x0 0x80000000 0x800 0x4800”,猜测9M是比较合适的。
同理,我们可以根据rootfsuserfs的文件大小再增加5~10M作为写入的初始参数。所以真正需要指定的只有文件本身。
uboot下烧录,需要手工插拔电,但我们知道实际上,无论是在uboot还是在系统中,都可以用reset重启设备,因此我们只需要在烧写前从串口输入“reset”,再等待重启就行。
另外,烧写文件之后,环境变量env的配置也应该根据我们烧写的内容有所调整,例如:
bootargs=console=ttyAMA0,115200n8 root=emmc fstype=vfat rootaddr=6M rootsize=15M rw
其中的6M15M实际上应该对应的是rootfs的两个值,但我们hitool工具并不会帮我们设置,而是要手工调整。
于是乎,用python做了一个简单的烧写工具,界面如下:
图片2.png
功能比起hitool要少得多,但使用也要简单得多。
大家看到界面基本就能使用。在选择image之后,会自动选择同一目录下的rootfsuserfs(也可以手工调整)。虽然没有必要,但我相信大部分还是每次三个文件一起烧录的,所以在这里做没有类似hitool专门选择是否烧录的复选框。
在各项内容填写完成后,点击“开始烧写”,将先向板卡发送一个“reset”指令,等待“Hit any key to stop autoboot:”后,发送“回车”,进入uboot
根据所选的IP地址,为板卡设置同网段的IP、随机的一个单播MAC(网关可以不设)、TFTP服务器地址等,调用socket创建udp套接字,为单一文件建立tftp服务。
传送完成后,获得一个传送文件大小的返回值,类似
Bytes transferred = 5177028 (4efec4 hex)
将这个数值和本地的文件进行大小比较,确认数值一样后,再做crc32判断。
板卡上的crc命令
crc32 81000000 4efec4
确认比较一样后,再进行写入
mmc write 0x0 0x81000000 0x800 0x2780
根据文件功能和大小不同,起始位置0x800,长度0x2780等也是根据文件分区512字节用乘法计算出来的。
例如0x800就是1M0x2780就是5,177,344字节(图一右,文件占空间)等。
三个文件写完后,修改环境变量
setenv bootargs 'console=ttyAMA0,115200n8 root=emmc fstype=vfat rootaddr=10M rootsize=20M rw'
setenv bootcmd 'mmc read 0x0 0x80000000 0x800 0x4800;go 0x80000000'
把临时信息fileaddrfilesize删除,并保存。
图片3.png
做这个工具遇到的几个困难和解决办法:
1、在网上找到基于pythontftp server代码时,传输userfs.img文件必然出错。
也许是网友们都没试过传输超过512*65535大小的文件(大概33Mb左右)吧,找了超过5个不同位置的代码分别尝试,发现都是同一问题,不支持传输大文件。仔细看了一下,在调用udpSocket发帧的时候,手工设定的帧序号只有增加,所以超过65535怎么办?重新置为0就行了。
if frameNum==65536:
                    frameNum=0
2、文件名获取不正确,会莫名其妙多出一个octet timeout 5 blksiz”其中应该还有一些不可视的字符。
这个对于我们来说,其实是最简单的,触发tftp的同时,本地打开对应的文件发送就行。
3、socket读取接口地址,无法获取掩码
解决办法很简单,不从socket.getaddrinfo获取地址,使用netifaces.ifaddresses获取接口地址就行了。
4、多线程的时候,打印消息会混乱,字符之间会穿插显示
解决方法是加上少许等待时间,例如time.sleep(0.5)
5、重启时倒计数无法及时发送回车
原因是pyserial中的readline只有在确定一行显示完成后再读取,因此在倒计时的时候,只能使用read来获取
6、获取可用串口名称错误
这个我没找到原因,直接使用在源码中定义了,所以这块大家要使用的话,需要手工改动一下。
图片4.png
未来改进:
1、这是在windows下的,移植到linux下应该很容易
2、去掉各种选项之后,直接改成编译+烧录一次完成也行
3、赶工期,“开始烧录”按钮按下之后,没有锁各tk控件,也就是说烧写的同时,还可以修改各设置项,这个在正式发布版本的时候肯定是需要修改的
4、布局采用grid形式,所以在点击按钮之后,按钮文字发生变化,按钮会变宽,显得有些丑
图片5.png
未来可以改进一下,各控件固定位置和宽度
5、随机IP地址的可用性没有做预判断,未来可以增加接口类型和状态的读取,可以减少如127.0.0.1等地址使用,另外可以增加该IP上是否学习到对应arp来判断随机IP是否可用,如果出现冲突,就自动换一个IP的功能。

写在最后:代码上传似乎没成功,大家需要的话,在微信里找我要吧,或者明天我请容哥帮忙传一下。。。

回帖

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容图片侵权或者其他问题,请联系本站作侵删。 侵权投诉
链接复制成功,分享给好友