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.htmlMTK Android 编译命令
http://blog.csdn.net/cbk861110/article/details/8758108
相关文章推荐
- android kernel下载及编译
- 如何编译Android的kernel
- linaro pandaboard android 编译kernel
- Build Android-x86 ICS 4 Virtualbox from Google Virtualbox Target and Intel Kernel 编译体验
- Android kernel 下载编译笔记
- HTC Kaiser 编译Android Kernel zImage
- 64bit windows 7 VMWare+ 64bit Ubuntu12.04 uboot ,kernel,android编译环境搭建教程
- 在Ubuntu上下载、编译和安装Android4.0.3 source与 kernel 源码
- 编译andorid kernel for moudle (android LKM)的配置
- android和kernel编译版本显示更改
- Android 编译2.6.36的kernel akm8975 driver时unknown field 'ioctl' specified in initializer的问题
- Android kernel 下载 编译- 2012/04/06
- 【Android内核】下载编译android kernel( 原文地址 http://blog.csdn.net/chizhaolin/archive/2010/07/08/5721539.aspx)
- Android kernel 编译
- 郁闷,怎么我的S5pv210 android kernel 怎么突然不能make编译了?
- Ubuntu 环境编译Kernel和Android
- Android源码编译(二)----------->Android’s kernel for beagleboard-xm
- 下载android4.0源代码和kernel及编译
- 下载编译android kernel
- 下载 编译 Android源代码 和 Android kernel源代码