MTK6577+Android编译之kernel

MTK6577+Android编译之kernel

 

开发环境:虚拟机+Ubuntu14.04

 

MTK6577采用的内存芯片为H9TP32A4GDMCPR,包括4GB的eNAND和512MB的 LPDDR2,先升级为H9TP32A8JDMCPR,包括4GB的eNAND和1GB的LPDDR2

 

先来看MTK源代码树概观图:


图1

由图1可知编译的入口是makeMtk文件,其采用perl语言编写的,包装了编译命令,下面来看编译系统的概述:

MTK6577+Android编译之kernel_第1张图片

图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

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

AndroidMTKAndroid 编译命令

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

MTK Android 编译命令

http://blog.csdn.net/cbk861110/article/details/8758108

你可能感兴趣的:(MTK6577+Android编译之kernel)