本帖最后由 z913457894 于 2021-7-24 15:14 编辑
我们这里说的fastboot/uboot模式,准确的说只能叫uboot模式(在嵌入式领域都称为bootloader模式,你可以理解为平常电脑的bios),而fastboot是运行在uboot模式之上的一种协议,这种协议是可以通过USB或以太网与引导加载程序通信的机制,我们这里只针对这种模式来讲,不谈协议。 下面是我手上的两个盒子进入fastboot/uboot模式的终端输出,也就是你们俗称跑码。 第一个 天邑TY1208-Z,可以看到上面显示是Uboot
第二个是广电九联科技HDC2100k,上面显示为fastboot
以上不管是fastboot还是uboot,源代码都是由芯片厂商提供,和芯片厂商提供的刷机工具(比如海思的hitool)是配套的,后期盒子厂家会在fastboot/uboo代码基础上适配自己的其他基础硬件,网卡,wifi等,但和上层的刷机工具通信的协议是不会改变的。 看完这个你就会明白为什么我一直在花力气进这个模式的原因,离开了这个模式刷机工具啥都干不了。 本来这里是准备通过我的盒子HDC2100k修改fastboot环境变量,加入ctrl+c的bootdelaykey,hitool就可以正常备份刷写固件的案列,来证明fastboot模式对刷机工具hitool的重要性,加入证明让帖子变得变得难以让人看懂,之后会再写一篇帖子帖子------hdc2100k如何支持hitool工具。 这种模式各个厂家的指令大同小异,都是类似的,因为他们的代码都是仿照开源uboot代码写的,我这里以手上的HDC2100K介绍下fastboot/uboot下指令的用法,看懂了,其它的基本也就都会了。 我们现在就演示下fastboot下各个指令是如何使用。串口终端我推荐SecureCRT。
我们首先输入指令help,回车来看看你有哪些指令可以用,我只是简单的列举了几个常用指令。
环境变量相关 我们输入指令printenv回车查看一下环境变量,可以看到tftp的ip设置,设备的mac地址,启动信息等
我们还可以修改环境变量,以修改加载kenel等待时间为例,输入setenv bootdely 1 回车,然后在输入 saveenv回车 很好理解设置完,保存,如果不保存,就是重启无效。 传输相关 传输就是上载和下载,电脑到机顶盒内存,机顶盒内存到电脑,这里都是以机顶盒内存为中间桥梁,这里很重要,必须要理解,就拿我们现在要刷系统的某个分区,我们必须分两步走,一是系统分区文件从电脑传输到机顶盒内存,二是再从机顶盒内存到emmc或者其它存储芯片。 传输方式有很多,串口,网口,usb都可以。 串口传输 输入指令loady 0x1FFBFC0 后面1FFBFC0是内存地址,同样你可以通过指令getinfo ddrfree获取空闲地址。 如果用的是SecureCRT的话,直接选择 传输->发送Ymodem,选择你要发送的文件点击确定就行了。 如果是上载到电脑的,输入指令uploadx 0x1FFBFC0 , SecureCRT上直接选择 传输->接收Xmodem,保存文件就可以了。这里Xmodem和Ymodem是两个不同协议,根据具体指令选择,loadx就是Xmodem,loady就是ymodem。
网络传输 速度比较快,适合大文件传输,但我们需要在电脑上有一个tftp的服务器工具。 首先我们设置环境变量IP地址信息,指令 setenv serverip 192.168.0.119 setenv ipaddr 192.168.0.139 setenv gatewayip 192.168.0.250 ping 192.168.0.119 都很好理解,设置服务器ip,自己的ip,网关地址,ping下服务器,根据自己情况设置。
电脑打开tftp的服务器工具,下载的文件改名file.bin,放到程序同级目录,准备好之后输入指令 tftp 0x1FFBFC0 file.bin ,等待传输完成就行
上传之需要在上面指令多加一个参数,上传字节数,比如我们需要上传0x400字节 tftp 0x1FFBFC0 file.bin 0x400 ,等待传输完成后,程序目录就会生成文件file.bin
usb传输 我不太想讲,要看具体盒子支持些什么指令,天邑Ty1208-z支持USB_burning指令,可以直接文件放到U盘(格式化成fast32)里面,然后直接文件写入emmc分区,这个盒子没这个指令,显得有点复杂,我简单把指令列出来,有兴趣自己尝试。 usb start 打开初始化usb usb storage 列举出已经插入的usb设备 fatls 展开usb设备中文件列表 fatload 将文件加载到内存
内存操作相关 下载完数据,如何查看数据是不是正确的,显示内存数据,输入指令md.b 0x1FFBFC0 0x400 md.b 按单字节显示; md.w按双字节显示;md.l 按四字节显示 第二个参数和第三个参数分别是内存地址和显示字节数,显示字节数是以前面指令模式为单位的,md.l就会显示4倍的显示字节数。
修改内存nm.b nm.w nm.l
查看空闲内存地址getinfo ddrfree 这里面的地址范围可以用在上面所有和内存相关的地方
Emmc读取写入相关 emmc写入,输入指令mmcwrite 0 0x1FFBFC0 0x1000 2 Write 后第一个参数0是指的设备0,有的设备mmcwrite没有这个参数; 第二个0x1FFBFC0上面已经提过了内存地址; 第三个0x1000是扇区号,就是写入的扇区地址,一个扇区0x200(512)字节,比如我们要写入偏移地址0x200000,我只需要偏移地址除以扇区大小0x200就可以得到扇区地址0x1000; 第四个2就是写入两个扇区1024字节
emmc读取,输入指令mmcread 0 0x1FFBFC0 0x1000 2 参数跟前面mmc write一致。
总结 上面介绍的东西基本已经覆盖了百分之九十的常用指令,用这些最基本的指令,我们就可以完成固件读取,写入的操作,Hitool 刷机软件的所有功能也都是建立在这些指令之上的,你要是会写软件,基本上也可以写一个hitool 出来。作为一名程序开发者,从程序猿角度科普下,希望刷机的朋友们不只单单知道有包就可以刷,而真正去理解程序是怎么运作的。
|