您的位置:首页 > 移动开发 > Android开发

MTK6577+Android编译之kernel

2014-09-24 11:19 477 查看
 

开发环境:虚拟机+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下面的相关内容:

[plain] view
plaincopy

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,其对应

[plain] view
plaincopy

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

主要的相关部分如下:

[plain] view
plaincopy

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  

用mkimage工具由zImage增加包含了KERNEL信息的512标识头后生成最终的kernel_hsimobile77_ics2.bin文件,位于\kernel\out目录下,然后从此目录下拷贝 *.bin到\out\Download\flash,但是在此目录下并没有找到kernel的镜像文件。

 

 

(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》

【Android】MTKAndroid 编译命令

http://www.cnblogs.com/rayray/p/3736918.html

MTK Android 编译命令
http://blog.csdn.net/cbk861110/article/details/8758108
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: