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:
http://processors.wiki.ti.com/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.h 文件:
index 90e35ee..efa1e90 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; "
\
"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
评论