BeagleBone Black eMMC烧写全记录(基于AM335x SDK06)
eMMC存储介质目前越来越广泛的应用在嵌入式系统中,AM335x的用户也越来越多的使用EMMC作为系统的主要存储介质。目前AM335x的几款官方demo板中,只有BeagleBone Black上加入了对eMMC芯片的支持,很多用户也是参考BeagleBone Black进行自己AM335x系统的eMMC设计。笔者最近分别通过TI Uniflash和SD卡完成了BeagleBone Black上eMMC芯片的烧写验证工作,软件基于AM335x Linux SDK06,总结出来供大家参考。
1.使用TI UniFlash工具通过USB RNDIS烧写
1.1 TI Uniflash 简介
Uniflash是TI开发的存储器烧写工具,可以支持AM335x系统的NAND Flash,NOR Flash, SPI Flash,eMMC烧写。可以参考wiki上的guide:
processors.wiki.ti/index.php/Sitara_Uniflash_Quick_Start_Guide,在Windows宿主机上下载并安装Uniflash,并按照其中3.3节所述在Windows宿主机上安装USB RNDIS 驱动。
1.2 eMMC 烧写原理
本文介绍的验证方法是使用Uniflash工具通过USB 对BeagleBone Black上的eMMC进行烧写,原理是通过Romcode,SPL和u-boot三个阶段,将一个专门用于eMMC烧写的Linux操作系统在BeagleBone Black板上运行起来,并自动运行脚本进行烧写。
第一阶段,通过设置AM335x的sysboot管脚,使AM335x的启动项包含USB0启动。BeagleBone Black的默认启动设置为:MMC1->MMC0->UART0->USB0,MMC1和MMC0分别连接了eMMC和SD卡,如果eMMC为空,并且不插SD卡,芯片上电后执行的Romcode就会执行USB启动。Romcode会初始化USB RNDIS以太网络通信协议,通过Windows宿主机上Uniflash自带的DHCP服务器进程拿到分配的IP地址,然后再通过Windows宿主机上Uniflash自带的TFTP服务器进程将Uniflash设定的tftp目录下用于eMMC烧写的特殊的SPL下载到AM335x的内部ram中并运行。
第二阶段,用于eMMC烧写的特殊的SPL执行之后,会初始化USB RNDIS以太网络通信协议,并通过Windows宿主机上Uniflash自带的DHCP服务器程序拿到分配的IP地址,然后再通过宿主机上Uniflash自带的TFTP服务器程序将Uniflash设定的tftp目录下用于eMMC烧写的特殊的U-boot.img下载到板子上的DDR3中并运行。
第三阶段,用于eMMC烧写的特殊的U-boot.img执行之后,通过执行u-boot中的DHCP和TFTP命令,将Windows宿主机上Uniflash 设定的tftp目录下的用于烧录eMMC 的Linux uImage下载到板子的DDR3中并运行。这个Linux uImage会通过执行启动脚本,
通过tftp的方式,将Windows宿主机上Uniflash设定的tftp目录下名为debrick.sh脚本下载并执行,debrick.sh可实现eMMC的擦除和烧写。
1.3 eMMC烧写流程
1.3.1 制作u-boot-spl-restore.bin和u-boot-restore.img
用于烧录eMMC的特殊的SPL和u-boot.img可以通过指定特定的编译参数编译SDK06的U-boot源码获得,在编译之前需要加几个patch如下:
1)延长USB RNDIS连接等待时间的patch:
修改/drivers/usb/gadget/ether.c文件:
index de880ff..926c6f2 100644
--- a/drivers/usb/gadget/ether.c
+++ b/drivers/usb/gadget/ether.c
@@ -108,7 +108,11 @@ static const char driver_desc[] = DRIVER_DESC;
|USB_CDC_PACKET_TYPE_PROMISCUOUS \
|USB_CDC_PACKET_TYPE_DIRECTED)
+#if defined(CONFIG_RESTORE_FLASH) && defined(CONFIG_SPL_USBETH_SUPPORT)
+#define USB_CONNECT_TIMEOUT (15 * CONFIG_SYS_HZ)
+#else
#define USB_CONNECT_TIMEOUT (3 * CONFIG_SYS_HZ)
+#endif
2)使能U-boot中cache用于加快传输时间的patch:
修改/include/configs/am335x_evm.件:
fa1e90 100644
--- a/include/configs/am335x_evm.h
+++ b/include/configs/am335x_evm.h
@@ -236,6 +236,7 @@
#define CONFIG_CMD_FAT
#define CONFIG_FAT_WRITE
#define CONFIG_CMD_EXT2
+#define CONFIG_CMD_CACHE
3)修改bootcmd启动参数,在/include/configs/am335x_evm.h 中182行修改如下:
#ifdef CONFIG_SPL_USBETH_SUPPORT
#define CONFIG_BOOTCOMMAND \
"dcache on; " \
"setenv autoload no; " \
"setenv ethact usb_ether; " \
"dhcp; " \
connect下载"if tftp 81000000 uImage; then " \
"bootm 81000000; " \
"fi"
#else
加入以上3个patch之后,在u-boot源码目录下输入以下编译指令:
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- O=flash-restore
am335x_evm_restore_flash_usbspl
在U-boot源码目录下的boards.cfg文件中,可以看到
am335x_evm_restore_flash_usbspl这个编译选项设定了宏RESTORE_FLASH,
SPL_USBETH_SUPPORT。
生成的u-boot.img和u-boot-spl.bin分别在在flash-restore\和flash-restore\spl目录下,要将其改为u-boot-restore.img和u-boot-spl-restore.bin并放置Windows宿主机上Uniflash
设定的tftp目录下。
1.3.2 制作uImage
用于烧录eMMC的Linux uImage,以Initcramf的方式包含了一个用于烧录的Ramdisk
文件系统,下面是具体配置和生成的步骤。
在SDK06的Linux源码目录下,执行:
make CROSS_COMPILE=arm-linux-gnueabihf- ARCH=arm tisdk_am335x-evm_defconfig make CROSS_COMPILE=arm-linux-gnueabihf- ARCH=arm menuconfig
1)配置内核所包含的文件系统目录。
将用于烧录的Ramdisk文件系统解压到虚拟机的某个目录下,如
/home/zhoujian/Flasher。
进入general setup目录,按图1-1配置Initcramfs所在目录
图 1-1
2)进入Device Drivers,按照图1-2,图 1-3,图1-4和图 1-5 配置kernel对USB
RNDIS的支持
图 1-2 选择进入Device Drivers
图 1-3选择进入USB support
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论