MTK6577+Android编译之kernel
开发环境:虚拟机+Ubuntu14.04
MTK6577采用的内存芯片为H9TP32A4GDMCPR,包括4GB的eNAND和512MB的 LPDDR2,先升级为H9TP32A8JDMCPR,包括4GB的eNAND和1GB的LPDDR2
先来看MTK源代码树概观图:
图1
由图1可知编译的入口是makeMtk文件,其采用perl语言编写的,包装了编译命令,下面来看编译系统的概述:
图2
1. 编译命令、时间和生成的文件
(1) 编译命令和时间
编译命令./mk r k,时间约为10分钟。
(2) 编译生成的文件
编译后发现有更新的镜像文件有EBR1、MBR、kernel_hsimobile77_ics2.bin
编译后有更新的log文件有hsimobile77_ics2_check-dep、hsimobile77_ics2_custgen、hsimobile77_ics2_ptgen、hsimobile77_ics2_kernel
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) kernel镜像的文件名boot.img
kernel镜像文件为boot.img=ramdisk.img+kernel(也就是kernel_$(PROJECT).bin,用对比工具对比过是一样的)。
我们来看\mediatek\build\makemtk.mk下面的相关内容:
KERNEL_WD = kernel ifeq ($(strip$(KBUILD_OUTPUT_SUPPORT)),yes) KERNEL_IMAGES := $(KERNEL_WD)/out/kernel_$(PROJECT).bin else KERNEL_IMAGES := $(KERNEL_WD)/kernel_$(PROJECT).bin Endif
就是说如果在\mediatek\config\hsimobile77_ics2\ ProjectConfig.mk文件中做了下面的定义:
KBUILD_OUTPUT_SUPPORT=yes
生成的kernel镜像文件kernel_$(PROJECT).bin会生成在\kernel\out目录下,当然最后都会复制到\out\target\product\hsimobile77_ics2目录下。
这里的PROJECT在源代码根目录下的makeMtk.ini配置文件中赋值的,如下:
project =hsimobile77_ics2
详细的细节还可以看\kernel\build.sh
2. kernel编译流程
2.1 kernel编译的主要流程
图3
(1) ./mk rk
找到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,其对应
kernel: ifeq($(BUILD_KERNEL),yes) ifeq ($(ACTION),) $(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) endif ifneq ($(KMOD_PATH),) $(hide) echobuilding kernel module KMOD_PATH=$(KMOD_PATH) $(hide) cd $(KERNEL_WD) && \ (KMOD_PATH=$(KMOD_PATH) ./build.sh$(ACTION) $(KERNEL_ARG) ) && cd $(MKTOPDIR) else $(hide) echo $(SHOWTIME) $(SHOWBUILD)ing$@... $(hide) echo -e \\t\\t\\t\\b\\b\\b\\bLOG:$(S_MODULE_LOG) $(hide) cd $(KERNEL_WD) && \ (MAKEJOBS=$(MAKEJOBS) ./build.sh $(ACTION) $(PROJECT) $(DEAL_STDOUT)&& \ cd $(MKTOPDIR) && \ $(call chkImgSize,$(ACTION),$(PROJECT),$(SCATTER_FILE),$(if $(strip$(ACTION)),,$(KERNEL_IMAGES)),$(DEAL_STDOUT),&&) \ $(SHOWRSLT) $${PIPESTATUS[0]} $(MODULE_LOG) $(ACTION) || \ $(SHOWRSLT) $${PIPESTATUS[0]} $(MODULE_LOG) $(ACTION)) # $(hide) $(SHOWTIMECMD) endif else $(hide) echo Not support $@. Endif
它是通过kernel/build.sh来生成kernel镜像文件的。
(3) kernel/build.sh
主要的相关部分如下:
echo "****Building ****" make ${makeflags}${makejobs} ${makedefs} if [ $? -ne 0 ];then exit 1; fi mkimg="${MTK_ROOT_BUILD}/tools/mkimage" if ["${KBUILD_OUTPUT_SUPPORT}" == "yes" ]; then kernel_img="${outdir}/arch/arm/boot/Image" kernel_zimg="${outdir}/arch/arm/boot/zImage" else kernel_img="${curdir}/arch/arm/boot/Image" kernel_zimg="${curdir}/arch/arm/boot/zImage" fi 编译生成image和zimage,放在\kernel\out\arch\arm\boot目录下。 echo "****Generate download images ****" if [ ! -x ${mkimg}]; then chmod a+x ${mkimg}; fi if ["${KBUILD_OUTPUT_SUPPORT}" == "yes" ]; then ${mkimg} ${kernel_zimg} KERNEL >out/kernel_${MTK_PROJECT}.bin else ${mkimg} ${kernel_zimg} KERNEL > kernel_${MTK_PROJECT}.bin fi copy_to_legacy_download_flash_folder kernel_${MTK_PROJECT}.binrootfs_${MTK_PROJECT}.bin
(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. kernel编译涉及的源代码目录
修改以下文件或者目录需要./mk r(n) k 然后执行./mk bootimage打包成boot.img,./mk bootimage编译生成boot和ramdisk
\kernel
\mediatek\platform\mt6577\kernel
\mediatek\source\kernel
\mediatek\custom\common\kernel
\mediatek\custom\mt6577\kernel
\mediatek\custom\hsimobile77_ics2\kernel
\mediatek\custom\hsimobile77_ics2\common
\mediatek\custom\common\hal
\mediatek\custom\hsimobile77_ics2\hal
比如修改了mediatek\custom\prj\kernel\leds\mt65xx\cust_leds.c文件
(1) ./mk r k,编译生成MBR、EBR1和kernel_hsimobile77_ics2.bin
(2) ./mk bootimage,编译生成boot、ramdisk和kernel,如下图:
图4
从这个图似乎可以看出应该是boot=ramdisk+kernel,
(3) 下载boot.img即可
参考链接:
《Android_Build_System_for_customer》
http://www.cnblogs.com/rayray/p/3736918.html
MTK Android 编译命令
http://blog.csdn.net/cbk861110/article/details/8758108