由于存储限制,需要将u-boot.bin控制在128K以下,并能正常引导系统,花了点时间研究了u-boot的结构组织,得出结论。
评估结论:
通过下面内容的分析,u-boot.Bin在支持本公司A项目所必须的功能后,将无法保证缩减到128KB的情况下且保证能够正常启动。
u-boot使用版本说明:
u-boot用于评估的版本为合作公司发布的第一个u-boot版本,目录结构位于bootable\bootloader\uboot\Y1810下,编译的配置文件为comip_Y1810_config. 编译出来的u-boot.bin的大小81460Bytes。此版本针对源码已经做了大量的精简和裁剪,导致该u-boot并不适合我公司的开发需要。
u-boot用于对比的完整版本为android4.0.3 sdmmc启动版本,最终编译出来的u-boot.bin大小为175764Bytes.
u-boot评估标准:
通过在精简u-boot版本上加入我司此项目必须的功能后,是否uboot.bin的大小控制在128KB以下,且能够正常启动加载系统。
精简u-boot版本源码中强制去掉的编译文件:
通过比较源码,下面列出,本是源码中默认编译的文件,而联芯裁剪时在Makefile中强制去掉编译的C文件列表。
|-arch
||-arm
|||-lib ---_ashldi3.c
---_ashrdi3.c
---bootm.c
u-boot |-common ---s_record.c
---xyzModem.c
---cmd_boot.c //config_cmd_defaults.h有定义开关宏,这里强制去掉。
---ddr_spd.c
---flash.c
---cmd_bootm.c
|-lib ---net_utils.c
对比完整版本,相比精简u-boot版本多出的功能:
#define CONFIG_CMD_PING
/* ping support
*/
#define CONFIG_CMD_USB
/* USB Support
*/
#define CONFIG_CMD_CACHE
/* icache, dcache
*/
#define CONFIG_CMD_EXT2
/* EXT2 Support
*/
#define CONFIG_CMD_FAT
/* FAT support
*/
#define
CONFIG_CMD_I2C
/* I2C serial bus support
*/
#define CONFIG_CMD_RSTENV
/* reset env
*/
以下定义在config_cmd_default.h中
#define CONFIG_CMD_BDI
/* bdinfo
*/
#define CONFIG_CMD_BOOTD
/* bootd
*/
#define CONFIG_CMD_CONSOLE
/* coninfo
*/
#define CONFIG_CMD_ECHO
/* echo arguments
*/
#define CONFIG_CMD_EDITENV
/* editenv
*/
#define CONFIG_CMD_ITEST
/* Integer (and string) test
*/
#define CONFIG_CMD_LOADB
/* loadb
*/
#define CONFIG_CMD_LOADS
/* loads
*/
#define CONFIG_CMD_MEMORY
/* md mm nm mw cp cmp crc base loop mtest */
#define CONFIG_CMD_MISC
/* Misc functions like sleep etc*/
#define CONFIG_CMD_NET
/* bootp, tftpboot, rarpboot
*/
#define CONFIG_CMD_RUN
/* run command in env variable
*/
#define CONFIG_CMD_SAVEENV
/* saveenv
*/
#define CONFIG_CMD_SOURCE
/* "source" command support
*/
#define CONFIG_CMD_XIMG
/* Load part of Multi Image
*/
通过分析,我司必须增加的功能如下:
需要支持tftp下载kernel调试开发
#define CONFIG_CMD_PING
/* ping support
*/
#define CONFIG_CMD_USB
/* USB Support
*/
#define CONFIG_CMD_NET
/* bootp, tftpboot, rarpboot
*/
环境变量的保存,编辑,恢复默认值
#define CONFIG_CMD_RSTENV
/* reset env
*/
#define CONFIG_CMD_EDITENV
/* editenv
*/
#define CONFIG_CMD_SAVEENV
/* saveenv
*/
命令启动的支持,可选,用于处于边界大小的定位评估。
#define CONFIG_CMD_BOOTD
/* bootd
*/
cache的支持,可选,用于处于边界大小的定位评估。
#define CONFIG_CMD_CACHE
/* icache, dcache
*/
tftp下载kernel调试开发的增加:
编译完成后u-boot.bin将增加至125,868 Bytes,load到EVB板上,系统已经无法正常启动。步骤如下:
(1)
加入lib/net_utils.c的编译。
(2) 在common的Makefile加入如下:
ifdef CONFIG_CMD_USB
COBJS-y += cmd_usb.o
COBJS-y += usb.o
COBJS-$(CONFIG_USB_STORAGE) += usb_storage.o
Endif
(3) 在driver/usb/host/Makefile中加入
COBJS-$(CONFIG_USB_XX088X) += ehci-vc088x.o
(4) 在include/configs/comip_Y1810.h中加入如下定义
#define CONFIG_USB_XX088X 1
#define CONFIG_USB_EHCI 1
#define CONFIG_USB_HOST_ETHER
#define CONFIG_USB_ETHER_SMSC95XX
#define CONFIG_CMD_PING
#define CONFIG_CMD_USB
#define CONFIG_CMD_NET
#define CONFIG_ETHADDR
00:1A:A9:53:F7:D8
#define CONFIG_NETMASK
255.255.255.0
#define CONFIG_IPADDR
192.168.0.23
#define CONFIG_SERVERIP
192.150.0.100
环境变量的增加:
编译完成后u-boot.bin将增加至131,948 Bytes
(1)
在include/configs/comip_Y1810.h中加入如下定义
#define CONFIG_ENV_IS_IN_MMC
1
#define CONFIG_SYS_MMC_ENV_DEV 0
#define CONFIG_CMD_RSTENV
/* reset env
*/
#define CONFIG_CMD_EDITENV
/* editenv
*/
#define CONFIG_CMD_SAVEENV
/* saveenv
*/
(2)
在include/configs/comip_Y1810.h中去掉如下定义
//#define CONFIG_ENV_IS_NOWHERE
到此步,u-boot.bin的大小已经超过128KB。
同时,为了验证SDMMC的u-boot是否通过裁掉不必要的功能,而能够缩减到128KB以下。最终结论为:只有去掉USB和NET的编译(同时去掉usbnet),u-boot.bin的大小减少50KB左右,才能将u-boot.bin降到128KB以下,且能够保证正常启动。
但是这样的话,u-boot.bin将不支持tftp下载kernel调试功能。
所以由于必须要支持TFTP下载kernel调试的功能,u-boot.bin将无法小于128KB。