最近在调试MT6765平台,需要新增raw data分区,并且在lk和kernel可以读取到分区信息。感觉非常繁琐,而且做错一步要重新编译整个SDK,非常耗时。因此,记录下这个过程的关键点,希望大家能在上面少踩一些坑。
1. lk能读取到raw data分区,在lk中将相关数据写到dts,kernel从dts读取。数据比较少时,可以直接传数据;数据比较多时,传buffer地址,buffer记得在lk中使用预留内存接口分配。
2. 配置分区表和相关信息:
a. 修改分区表vendor\mediatek\proprietary\tools\ptgen\MT6765\partition_table_emmc_ab.csv,参照logo分区新增自定义分区,如custom.bin。注意分区最小大小是32KB。
b. 修改分区img信息vendor\mediatek\proprietary\custom\mt6765\security\cert_config\img_list.txt,比如新增custom分区img信息
custom.bin=custom
c. 修改分区img版本信息vendor\mediatek\proprietary\custom\mt6765\security\cert_config\img_ver.txt, 比如新增custom分区版本信息:
[vcom]
img_ver = 0
img_group = 1
d. MTK android 11默认开启了分区verify功能,需要给分区配公钥密钥。在vendor\mediatek\proprietary\custom\mt6765\security\cert_config\cert1下拷贝logo_cert1.der,并重命名为custom_cert1.der。在vendor\mediatek\proprietary\custom\mt6765\security\cert_config\cert2_key目录下拷贝logo_privk2.pem并重命名为custom_privk2.pem。
配置完这些后,系统才知道新增了这么个分区,而且需要verify。那它要到哪里去找这个custom.bin呢?怎么让它在编译SDK的时候也参与编译呢?
3. 制作分区
a. 分区custom.bin由于配置的是raw data,所以直接用命令echo "custom test info" > custom.bin生成即可。生成后,拷贝到vendor\mediatek\proprietary\bootable\bootloader\lk\dev\logo目录下(也可以拷贝到别的目录下,但makefile要跟着改,略麻烦,这里参考logo分区修改即可)。
b. 在上面目录下,新增img_custom.cfg文件,内容是:
NAME = custom
上面步骤已经把分区制作完成,下面怎么让SDK在编译的时候找到它呢?没错,就是修改Makefile。
4. 修改makefile,让分区参与编译
a. 修改vendor\mediatek\proprietary\bootable\bootloader\lk\dev\logo\rule.mk,给分区加相关头信息。关键修改如下:
+IMG_CUSTOM_CFG := $(LOCAL_DIR)/img_custom.cfg
$(LOGO_IMAGE):$(MKIMG) $(BOOT_LOGO_RESOURCE)
@echo "MKING $(LOGO_IMAGE) start"
@echo $(MKIMG)
@echo $(BOOT_LOGO_RESOURCE)
@echo $(LOGO_IMAGE)
$(MKIMG) $(BOOT_LOGO_RESOURCE) $(IMG_HDR_CFG) > $(LOGO_IMAGE)
+ @echo "copy custom.bin to build out directory"
+ $(MKIMG) $(BOOT_LOGO_DIR)/custom.bin $(IMG_CUSTOM_CFG) > $(BUILDDIR)/custom.bin
b. 修改vendor\mediatek\proprietary\bootable\bootloader\lk\Android.mk,编译时让该分区参与编译并verify。
.PHONY: lk check-lk-config check-mtk-config
droid lk: check-lk-config
check-mtk-config: check-lk-config
check-lk-config:
ifneq (yes,$(strip $(DISABLE_MTK_CONFIG_CHECK)))
python device/mediatek/build/build/tools/check_kernel_config.py -c $(MTK_TARGET_PROJECT_FOLDER)/ProjectConfig.mk -l $(LK_DIR)/project/$(LK_PROJECT).mk -p $(MTK_PROJECT_NAME)
else
-python device/mediatek/build/build/tools/check_kernel_config.py -c $(MTK_TARGET_PROJECT_FOLDER)/ProjectConfig.mk -l $(LK_DIR)/project/$(LK_PROJECT).mk -p $(MTK_PROJECT_NAME)
endif
else
INSTALLED_LK_TARGET := $(PRODUCT_OUT)/lk.img
INSTALLED_LOGO_TARGET := $(PRODUCT_OUT)/logo.bin
+ INSTALLED_CUSTOM_TARGET := $(PRODUCT_OUT)/custom.bin
$(INSTALLED_LOGO_TARGET): $(dir $(TARGET_PREBUILT_LK))$(notdir $(INSTALLED_LOGO_TARGET))
$(hide) mkdir -p $(dir $@)
$(hide) cp -f $< $@
+$(INSTALLED_CUSTOM_TARGET): $(dir $(TARGET_PREBUILT_LK))$(notdir \ $(INSTALLED_CUSTOM_TARGET))
+ $(hide) mkdir -p $(dir $@)
+ $(hide) cp -f $< $@
.PHONY: lk
-droidcore lk: $(INSTALLED_LK_TARGET) $(INSTALLED_LOGO_TARGET)
+droidcore lk: $(INSTALLED_LK_TARGET) $(INSTALLED_LOGO_TARGET) $(INSTALLED_CUSTOM_TARGET)
endif#TARGET_PREBUILT_LK
c. 修改vendor\mediatek\proprietary\bootable\bootloader\lk\build_lk.mk。意思同上,只是一个是单独编译时用到,一个是编Android时用到(个人理解,不一定对)。
+INSTALLED_CUSTOM$(LK_MODE)_TARGET := $(PRODUCT_OUT)/custom$(call to-lower,$(LK_MODE)).bin
+$(INSTALLED_CUSTOM$(LK_MODE)_TARGET): $(BUILT_LK$(LK_MODE)_TARGET)
+ $(hide) mkdir -p $(dir $@)
+ $(hide) cp -f $(dir $<)custom.bin $@
clean-lk$(LK_MODE):
- $(hide) rm -rf $(INSTALLED_LK$(PRIVATE_MODE)_TARGET) $(INSTALLED_LOGO$(PRIVATE_MODE)_TARGET) $(TARGET_LK$(PRIVATE_MODE)_OUT)
+ $(hide) rm -rf $(INSTALLED_LK$(PRIVATE_MODE)_TARGET) $(INSTALLED_LOGO$(PRIVATE_MODE)_TARGET) $(INSTALLED_CUSTOM$(PRIVATE_MODE)_TARGET) $(TARGET_LK$(PRIVATE_MODE)_OUT)
ifneq ($(LK_MODE),_FES)
-droidcore lk: $(INSTALLED_LK$(LK_MODE)_TARGET) $(INSTALLED_LOGO$(LK_MODE)_TARGET)
+droidcore lk: $(INSTALLED_LK$(LK_MODE)_TARGET) $(INSTALLED_LOGO$(LK_MODE)_TARGET) $(INSTALLED_WAVEFORM$(LK_MODE)_TARGET)
endif
至此,我们执行make编译整个SDK后,并执行./k65v1_64_get_downimage.sh脚本后,就会在最终的固件目录上看到custom.bin。在烧录工具smart phone flash tool导入MT6765_Android_scatter.txt文件后,将会出现刚新增的custom分区。 直接烧录即可。
注意:新增分区、或者修改分区内容,需要删除掉out目录,重新执行make编译整个SDK。这样非常低效,应该有更简便的方式(待发掘)。所以,修改分区尽量做到一步到位,否则将非常耗时。
建议:笔者做过RK、全志、MTK平台,就属MTK最难最难配置了。合理的做法是,用户只需要提供一个custom.bin,以及在分区表中新增该分区信息即可。
我们已经知道了如何新增一个分区,那么,在LK和kernel上怎么去读写这个分区的内容呢?先给自己挖个坑,下一篇再讲。