MTK6577+Android编译之uboot
开发环境:虚拟机+Ubuntu14.04
MTK6577采用的内存芯片为H9TP32A4GDMCPR,包括4GB的eNAND和512MB的 LPDDR2,先升级为H9TP32A8JDMCPR,包括4GB的eNAND和1GB的LPDDR2
先来看MTK源代码树概观图:
图1
由图1可知编译的入口是makeMtk文件,其采用perl语言编写的,包装了编译命令,下面来看编译系统的概述:
图2
1. 编译命令、时间和生成的文件
(1) 编译命令和时间
编译命令./mk r ub,时间约为2分15s。
(2) 编译生成的文件
编译后发现有更新的镜像文件有EBR1、MBR、logo.bin、uboot_hsimobile77_ics2.bin
编译后有更新的log文件有hsimobile77_ics2_check-dep、hsimobile77_ics2_custgen、hsimobile77_ics2_uboot、hsimobile77_ics2_ptgen
MT6577_Android_scatter_emmc.txt文件也有更新,其中hsimobile77_ics2_check-dep、hsimobile77_ics2_custgen、hsimobile77_ics2_ptgen和编译preloader部分内容是一样的,可参考:
http://blog.csdn.net/loongembedded/article/details/38706537
(3) Uboot镜像的文件名
uboot镜像文件有uboot_$(PROJECT).bin和logo.bin
我们来看\mediatek\build\makemtk.mk下面的相关内容:
UBOOT_WD = bootable/bootloader/uboot UBOOT_IMAGES := $(UBOOT_WD)/uboot_$(PROJECT).bin \ $(UBOOT_WD)/logo.bin
这里的PROJECT在源代码根目录下的makeMtk.ini配置文件中赋值的,如下:
project =hsimobile77_ics2
由此可见编译生成的uboot镜像文件有uboot_ hsimobile77_ics2.bin和logo.bin,所在的目录为\bootable\bootloader\uboot,当然最后都会复制到\out\target\product\hsimobile77_ics2目录下。
详细的细节还可以看\bootable\bootloader\uboot\build.sh
2. uboot编译流程
2.1 uboot编译的主要流程
图3
(1) ./mk rub
找到makeMtk源码(perl语言),编译命令最终是通过调用
$makeCmd ="make -f mediatek/build/makemtk.mk $cmdArg @mOpts";
这个编译命令进行编译的。GNU make可以添加DEBUG参数来获取调试信息,比如--debug=v。
可以通过修改$makeCmd来增加调试信息,比如:
$makeCmd ="make --debug=v -f mediatek/build/makemtk.mk $cmdArg @mOpts";
(2) makemtk.mk
$makeCmd命令指定makefile文件mediatek/build/makemtk.mk,其对应
uboot: ifeq($(BUILD_UBOOT),yes) $(hide) echo $(SHOWTIME) $(SHOWBUILD)ing$@... $(hide) echo -e \\t\\t\\t\\b\\b\\b\\bLOG:$(S_MODULE_LOG) ifneq ($(ACTION),) $(hide) cd $(UBOOT_WD) && \ (make distclean $(DEAL_STDOUT) && \ $(SHOWRSLT)$${PIPESTATUS[0]} $(MODULE_LOG) $(ACTION) || \ $(SHOWRSLT) $${PIPESTATUS[0]} $(MODULE_LOG) $(ACTION)) && cd$(MKTOPDIR) else ifneq (,$(filterMT6516 MT6575 MT6577 MT6573,$(MTK_PLATFORM))) $(hide) perlmediatek/build/tools/emigen/$(MTK_PLATFORM)/emigen.pl $(CUSTOM_MEMORY_HDR) \ $(MEMORY_DEVICE_XLS)$(MTK_PLATFORM) $(PROJECT) $(DEAL_STDOUT) endif ifneq (,$(filterMT6575 MT6577 MT6573,$(MTK_PLATFORM))) $(hide) perlmediatek/build/tools/emigen/$(MTK_PLATFORM)/nandgen.pl \ $(CUSTOM_NAND_HDR) \ $(MEMORY_DEVICE_XLS) \ $(MTK_PLATFORM) \ $(PROJECT) \ $(MTK_NAND_PAGE_SIZE) \ $(DEAL_STDOUT) endif $(hide) perl $(MEM_PARTITION_GENERATOR) \ MTK_PLATFORM=$(MTK_PLATFORM) \ PROJECT=$(PROJECT) \ MTK_LCA_SUPPORT=$(MTK_LCA_SUPPORT) \ MTK_NAND_PAGE_SIZE=$(MTK_NAND_PAGE_SIZE) \ MTK_EMMC_SUPPORT=$(MTK_EMMC_SUPPORT) \ EMMC_CHIP=$(EMMC_CHIP) \ MTK_LDVT_SUPPORT=$(MTK_LDVT_SUPPORT) \ TARGET_BUILD_VARIANT=$(TARGET_BUILD_VARIANT) \ MTK_EMMC_OTP_SUPPORT=$(MTK_EMMC_SUPPORT_OTP)\ $(DEAL_STDOUT_PTGEN) $(hide) perl $(OTA_SCATTER_GENERATOR)$(SCATTER_FILE) $(OTA_SCATTER_FILE) $(hide) cd $(UBOOT_WD) && \ (MAKEJOBS=$(MAKEJOBS) ./build.sh $(ACTION) $(DEAL_STDOUT) && \ cd $(MKTOPDIR) && \ $(callchkImgSize,$(ACTION),$(PROJECT),$(SCATTER_FILE),$(UBOOT_IMAGES),$(DEAL_STDOUT)&&) \ $(SHOWRSLT) $${PIPESTATUS[0]} $(MODULE_LOG) || \ $(SHOWRSLT) $${PIPESTATUS[0]} $(MODULE_LOG)) endif else $(hide) echo Not support $@. Endif
它是通过bootable/bootloader/uboot/build.sh来生成logo.bin和uboot镜像文件的。
(3) bootable/bootloader/uboot/build.sh
主要的相关部分如下:
make${MTK_PROJECT}_config; make ${makejobs} if [ ! -f"${CUR_DIR}/u-boot.bin" ]; then echo "COMPILE FAIL!!!!!!!!!!!!!!!!" exit 1 fi if [ ! -x ${MKIMG}]; then chmod a+x ${MKIMG}; fi if [ -d${UBOOT_LOGO_PATH} ]; then cd ${UBOOT_LOGO_PATH}; ./update ${BOOT_LOGO}; cd - > /dev/null ${MKIMG} ${UBOOT_LOGO_PATH}/${BOOT_LOGO}.rawLOGO > ${CUR_DIR}/logo.bin fi ${MKIMG}${CUR_DIR}/u-boot.bin UBOOT > ${UBOOT_IMAGE}
通过make ${MTK_PROJECT}_config;来生成u-boot.bin。并mkimage工具生成最终的logo.bin和uboot_${MTK_PROJECT}.bin文件,均位于\bootable\bootloader\uboot目录下,然后从此目录下拷贝 *.bin到\out\Download\flash,拷贝的文件有preloader_hsimobile77_ics2.bin 、logo.bin和uboot_hsimobile77_ics2.bin。
这里重点学习上面这些语句:
${MKIMG}${UBOOT_LOGO_PATH}/${BOOT_LOGO}.raw LOGO > ${CUR_DIR}/logo.bin
表示mkimage在\mediatek\custom\out\hsimobile77_ics2\uboot\logo\wvga.raw基础上增加包含有LOGO的512标识头后生成新的logo.bin。BOOT_LOGO在mediatek\config\prj\ProjectConfig.mk定义:
BOOT_LOGO=wvga
编译生成为wvga.raw。
${MKIMG}${CUR_DIR}/u-boot.bin UBOOT > ${UBOOT_IMAGE}
表示mkimage增加包含有UBOOT信息的512标识头到uboot_$prject.bin,位于\bootable\bootloader\uboot:
图4
右边uboot_hsimobile77_ics2.bin是在左边的uboot.bin基础上增加512字节标识头。
(4) 执行chkImgSize(if MTK_CHKIMGSIE_SUPPORT=yes)
主要是为了检查scatter file文件(MT6577_Android_scatter_emmc.txt)为uboot分配的空间是否可以容纳生成的image,目前看了mediatek\config\prj\ProjectConfig.mk文件中没有MTK_CHKIMGSIE_SUPPORT定义,后面应该考虑添加进来。
3. Uboot编译涉及的源代码目录
\bootable\bootloader\uboot
\mediatek\platform\mt6577\uboot
\mediatek\custom\common\uboot
\mediatek\custom\mt6577\uboot
\mediatek\custom\hsimobile77_ics2\uboot
\mediatek\custom\hsimobile77_ics2\common
参考链接:
《Android_Build_System_for_customer》
http://www.cnblogs.com/chyl411/p/3178531.html