最近在调试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. 制作分区

也可以拷贝到别的目录下,但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

个人理解,不一定对)。

+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上怎么去读写这个分区的内容呢?先给自己挖个坑,下一篇再讲。