am335x usb启动更新

文章目录

  • 一.基本原理
    • 1.第一阶段
    • 2.第二阶段
  • 二.具体实现
  • 三.关键步骤

前段时间由于工作需要研究了am335x的usb启动功能,由于在网上找的方法不全,很多细节需要自己摸索,在这里我记录了自己的实现过程,现在已经能从usb更新系统镜像。
uniflash版本:3.3或3.4。 (5.x的好像不支持am33xx系列的芯片)
uniflash下载地址:https://processors.wiki.ti.com/index.php/CCS_UniFlash_v3.4.1_Release_Notes
uboot版本: uboot-201x的都可以,只要移植好能够在am335x上运行的都可以。
(网上说补丁我没有找到,其实不需要,自己简单改一下,也就是更改等待时间和开启cache加速)
系统版本最好为win7, win10的为识别为串口设备,需要手动安装驱动

一.基本原理

1.第一阶段

am335x从usb启动,irom中实现了usb虚拟网卡功能,上位机软件uniflash实现了dhcp服务和tftp服务,板子启动后通过dhcp获取到ip后,就会下载spl镜像到sram中运行(spl镜像名字为:u-boot-spl-restore.bin,是uboot编译出的u-boot-spl.bin改名得到的,这个名字是在uniflash的dhcp服务中设定的,板子的dhcp在获取到ip后,会接收到dhcp服务发出的vendor-class-identifier字段,这个里面包含的文件名为u-boot-spi-restore.bin);

2.第二阶段

spl配置为usbeth启动后(uboot配置时添加定义宏:CONFIG_SPL_USBETH_SUPPORT),spl会再次通过usb模拟网络,电脑会再次识别网络设备。这时spl再次通过dhcp获取ip,下载u-boot-restore.bin到板子的drr中运行,这时uboot就正常启动,更新过程就由 uboot控制了。
具体am335x的usb启动更新原理可以参考:http://software-dl.ti.com/processor-sdk-linux/esd/docs/latest/linux/Foundational_Components_Tools.html#sitara-uniflash

二.具体实现

1.使用spl支持usb启动,在配置文件include/configs/xxx.h中添加宏:CONFIG_SPL_USBETH_SUPPORT即可:

#define CONFIG_SPL_USBETH_SUPPORT

2.修改usb连接超时时间,修改drivers/usb/gadget/ether.c

+#ifdef CONFIG_SPL_USBETH_SUPPORT
+#define USB_CONNECT_TIMEOUT (30 * CONFIG_SYS_HZ)
+#else 
 #define USB_CONNECT_TIMEOUT (3 * CONFIG_SYS_HZ)
+#endif
+

3.修改bootcmd,通过dhcp获取ip,然后获取debrick.scr, 运行其中的命令。

#define CONFIG_BOOTCOMMAND \
    "setenv autoload no; " \
    "setenv ethact usb_ether; " \
    "dhcp; "        \
    "if tftp 80000000 debrick.scr; then "   \
        "source 80000000; "     \
    "fi"

4.debrick.scr文件的制作,新建debrick.txt,内容如下:

tftp 0x81000000 MLO
nand write 0x81000000 0x00000000 0x00020000
nand write 0x81000000 0x00020000 0x00020000
nand write 0x81000000 0x00040000 0x00020000
nand write 0x81000000 0x00060000 0x00020000
tftp 0x81000000 hmi.dtb
nand write 0x81000000 0x00080000 0x00040000
tftp 0x81000000 u-boot.img
nand write 0x81000000 0x000C0000 0x00100000
tftp 0x81000000 zImage
nand write 0x81000000 0x00200000 0x00800000
tftp 0x81000000 ubi.img
nand write 0x81000000 0x00A00000 0x1F600000
setenv bootcmd 0
setenv bootcmd 'run nandboot'
saveenv
boot

通过如下命令制作debrick.scr:

mkimage -A arm -O u-boot -C none -T script -d debrick.txt debrick.scr

5.将编译出的u-boot.bin, u-boot-spl.bin分别改名为u-boot-restore.bin, u-boot-spl-restore.bin,放到D:\AM335x_Flashtool\images目录下,同时将debrick.scr及里面要更新的镜像放到其中:
am335x usb启动更新_第1张图片
6.启动Uniflash,点击New Target Configuration,选择Sitara Flash Connections,设置ip如下图,然后点击 Start Flashing,开户dhcp和tftp服务,等待连接即可.
am335x usb启动更新_第2张图片
7.设置板子从usb启动,电脑上识别到网络设备后,设置ip地址为:192.168.2.1,子网掩码为255.255.255.0,其它不用设置,即可完成启动更新.
am335x usb启动更新_第3张图片

三.关键步骤

我认为实现过程有几下关键点:
1.第一点当然是uboot移植好,spl能够正常启动,第一步可以直接通过usb下载正常运行的u-boot-spl.bin,看能否正常输出。
2.spl能够从usbeth启动,实现虚拟网络功能,因为项目中的spl是从物理设备,比如nor/nand/mmc读取uboot镜像,要实现从usbeth启动,可以直接在include/configs/xxx.h配置文件中添加宏CONFIG_SPL_USBETH_SUPPORT,即可从usbeth启动uboot
3.第三点就是uboot的网络更新功能,uboot的网络设备要设置成usb_ether,即usb虚拟出的网口

你可能感兴趣的:(arm,am335x,usb)