1.代码的编译

部分私有的代码在modem中,参考平台对应的release_note(在vendor下),进行modem的编译和ap部分私有代码的拷贝。

编译preloader  make pl

编译lk  make lk

编译kernel make bootimage 

编译dtbo make dtboimage

编译modem 参考[FAQ21675] Modem编译步骤

2.工程暗码

*#*#3646633#*#*,无相应的测试应用,有开机factory模式。

3.调屏

用dct工具(vendor/mediatek/proprietary/tools/dct)确认RST脚是否配置成LCM_RST,代码里直接控制相应的寄存器,如果配置不对,会导致rst脚无法拉高,默认应该是LCM_RST的,但笔者使用的工程偏偏是gpio模式,导致无法点亮屏幕。

默认只配置一款屏幕时lcm_compare_id函数不跑的,配置了两款屏幕以上才跑,如果读id都失败,会默认采取第一款屏的配置。

PLL_CLOCK的计算,参考FAQ11002

1、DSI vdo mode下的数据速率data_rate的大致计算公式为:
Data rate= (Height+VSA+VBP+VFP)*(Width+HSA+HBP+HFP)* total_bit_per_pixel*frame_per_second/total_lane_num

2、DSI cmd mode下的数据速率data_rate的大致计算公式为:
Data rate= width*height*1.2* total_bit_per_pixel*frame_per_second/total_lane_num

参数注释:
data_rate : 表示的是数据速率
width,height  :屏幕分辨率
VSA VBP VFP :DSI vdo mode的vertical porch配置参数
HSA HBP HFP :DSI vdo mode的horizontal porch配置参数
total_bit_per_pixel :表示的是一个pixel需要用几个bit来表示,比如RGB565的话就是16个bit
frame_per_second :就是我们通常看到的fps,叫做帧率,表示每秒发送多少个帧,一般是60帧每秒
total_lane_num :表示的是data lane的对数。

	params->dsi.LANE_NUM = LCM_FOUR_LANE;
	params->dsi.data_format.format = LCM_DSI_FORMAT_RGB888;
	params->dsi.vertical_sync_active = 4;
	params->dsi.vertical_backporch = 16;
	params->dsi.vertical_frontporch = 40;
	params->dsi.vertical_active_line = 1440;

	params->dsi.horizontal_sync_active = 20;
	params->dsi.horizontal_backporch = 80;
	params->dsi.horizontal_frontporch = 80;
	params->dsi.horizontal_active_pixel = 720;
	params->dsi.ssc_disable = 1;

	params->dsi.PLL_CLOCK = 255;	/* this value must be in MTK suggested table */

(4+16+60+1440)(20+80+80+720)*60*24%4%2=246240000=246M

4.TP

mtk自行设计了一套tp架构,看不出有什么作用,感觉简单的东西复杂化了。

5.矩阵按键

用dct工具配置引脚,并配置相应的按键功能,遇到按键无功能时,cat mt_gpio查看引脚状态,如果状态不对,可能是引脚被占用了。

6.dct工具

dct(vendor/mediatek/proprietary/tools/dct)工具的用来辅助配置dts和配置引脚功能,最终生成dtbo.img。习惯了文本界面的编辑,一下子还真习惯不了这种方式,但最终会在out目录的dts文件夹下生成文本形式的dts,可直接查看。

该工具有window和linux版本。点击Gen,Gen all,可以生成对应的dts文件。
如果提示找不到python解析器件,在window下需要配置环境变量(保证cmd下能调用到python)
对于高版本的ubuntu,系统默认是python3,重新改下
cd /usb/bin
ln -s python2.7 python
如果还报编码错误,在该文件夹子下DrvGen.py的import xxx后面加上
reload(sys)
sys.setdefaultencoding("utf-8")

7.mic没功能

默认mic为dcc模式,如果电路设计为acc模式,需修改audio_custom_exp.h

dcc:mic电路串电感/或不串(micbias接到pmic外部就是模式2,接到pmic内部就是5/6(外部电路没看到micbias))

acc:mic电路串电容

typedef enum
{
    AUDIO_MIC_MODE_ACC = 1,
    AUDIO_MIC_MODE_DCC = 2,
    AUDIO_MIC_MODE_DMIC = 3,
    AUDIO_MIC_MODE_DMIC_LP = 4,
    AUDIO_MIC_MODE_DCCECMDIFF = 5,
    AUDIO_MIC_MODE_DCCECMSINGLE = 6,
} AUDIO_MIC_MODE;
#define PHONE_MIC_MODE (5)
#define PHONE_MIC_MODE (2)  //dcc
#define PHONE_MIC_MODE (1)  //acc

双mic

MTK_DUAL_MIC_SUPPORT = yes

主辅mic翻转(应该弃用了)

MTK_AUDIO_MIC_INVERSE = no

8.sensor配置

手机平台默认都采用的sensorhub架构,该方式能计步,功耗更低等。拿到相应的代码后,参考平台默认的代码都能移植编译过去,可参考MTK平台 Sensor Hub配置(以stk3x3x光感为例)(Android 9.0)_Healer-CSDN博客

实时查看scp log

while true; do cat /dev/scp;done

9.摄像头

摄像头移植部分和几年前变化不大,效果部分在hal文件夹,摄像头上电和驱动部分放置在kernel层。

10.串口

默认的串口波特率为921600,默认Android启动完成后(user/userdebug),会关掉串口log,可输入如下命令重新打开

echo 1 > /proc/mtprintk

 或者修改程序(屏蔽mt_disable_uart函数)

bool mt_get_uartlog_status(void)
{
	if (printk_ctrl == 1)
		return false;
	else if ((printk_ctrl == 0) || (printk_ctrl == 2))
		return true;
	return true;
}

static ssize_t mt_printk_ctrl_write(struct file *filp,const char *ubuf, size_t cnt, loff_t *data)
{
	char buf[64];
	long val;
	int ret;

	if (cnt >= sizeof(buf))
		return -EINVAL;

	if (copy_from_user(&buf, ubuf, cnt))
		return -EFAULT;

	buf[cnt] = 0;

	ret = kstrtoul(buf, 10, (unsigned long *)&val);

	if (ret < 0)
		return ret;

	switch (val) {
#ifdef CONFIG_PRINTK_MTK_UART_CONSOLE
	case 0:
		mt_disable_uart();
		break;
	case 1:
		mt_enable_uart();
		break;
#endif
#ifdef CONFIG_LOG_TOO_MUCH_WARNING
	case 2:
		set_logtoomuch_enable(0);
		break;
	case 3:
		set_logtoomuch_enable(1);
		break;
	case 4:
		mt_print_much_log();
		break;
	default:
		if (val > 100)
			set_detect_count(val);
		break;
#else
	default:
		break;
#endif
	}
	return cnt;
}

11.nv修改

nv位置mcu/pcore/custom/modem,每次修改nv后,需要重新编译代码,这个比较不人性化,因为需要驱动工程师去编译,但nv是射频工程师去配置的。像展讯平台,nv能直接修改,并烧写进系统,不需要编译。

12.sim热插拔

这部分比较简单,如果不支持热插拔,直接关掉该引脚功能,支持热插拔,配置plugout电平高低就行。一般热插拔都是开启的,只是插卡极性有差异,配置下开拔出的电平就行。

如果默认没有开启热插拔,需要配置对应的引脚(上拉),可以参考其他项目的dws配置上去,同时在ProjectConfig.mk加上(MD side默认开启热插拔)

MTK_SIM_HOT_SWAP = yes 

可参考文档:SIM热插拔功能异常debug_SOP.pdf 

13.镜像打包

打包脚本可参考

#!/bin/sh
if [ -d "image" ]; then
       rm -rf image
       mkdir image
else
       mkdir image
fi
mkdir image/DataBase
product=tb8765ap1_64_bsp
echo "start copy image"
cp out/target/product/$product/obj/KERNEL_OBJ/vmlinux image/
cp out/target/product/$product/preloader_$product.bin image/
cp out/target/product/$product/logo-verified.bin image/
cp out/target/product/$product/vbmeta.img image/
cp out/target/product/$product/vbmeta_system.img image/
cp out/target/product/$product/vbmeta_vendor.img image/
cp out/target/product/$product/md1img-verified.img image/
cp out/target/product/$product/md1dsp-verified.img image/
cp out/target/product/$product/spmfw-verified.img image/
cp out/target/product/$product/mcupmfw-verified.img image/
cp out/target/product/$product/lk-verified.img image/
cp out/target/product/$product/loader_ext-verified.img image/
cp out/target/product/$product/boot.img image/
cp out/target/product/$product/dtbo-verified.img image/
cp out/target/product/$product/tee-verified.img image/
cp out/target/product/$product/super.img image/
cp out/target/product/$product/userdata.img image/
cp out/target/product/$product/MT6739_Android_scatter.txt image/
echo "start copy DB file"
cp vendor/mediatek/proprietary/modem/XXXX/MDDB.META.ODB_MT6739_S00* image/DataBase/
cp out/target/product/$product/vendor/etc/apdb/APDB_MT6739_S01__W2202  image/DataBase/
echo "stop copy image"
time=$(date "+%Y%m%d_%H%M")
zip -r YYYY_$time.zip image

14.下载

在linux和windows下,都有对应的下载工具。点击下载,插上usb就行,电池也可以不接,这点比较方便。

下载到userdata镜像时,如果工具报镜像太大(ERROR:STATUS_TOO_LARGE(-1073479676)),可适当减少BOARD_MTK_USERDATA_SIZE_KB的值

15.兼容DDR

修改custom_MemoryDevice.h,MemoryDeviceList_MTXXX.xls,如果MemoryDeviceList_MTXXX.xls没有该型号的emmc,到官网下载最新的,更新到MemoryDeviceList_MTXXX.xls。

16.加大CONFIG_LOG_BUF_SHIFT

增大CONFIG_LOG_BUF_SHIFT的值,可以保存更多的内核log。

17.外置audio PA

在Ext_Speaker_Amp_Change函数中加入控制PA的函数,二合一喇叭可参考FAQ20649,更多常见音频问题参考Audio常用配置.docx。

18.双卡改单卡

MTK_MULTI_SIM_SUPPORT = dsds 改为 MTK_MULTI_SIM_SUPPORT = ss

19.网络制式

六模C/Lf/Lt/W/T/G

C-->CDMA/CMDA2000
Lf-->FDD
Lt-->TDD
W-->WCDMA
T-->TD_SCDMA(移动)
G->GSM

L代表LTE(4G),有FDD和TDD两种

2G:CDMA,GSM

3G:WCDMA,CDMA2000,TD_SCDMA

4G:TDD,FDD

注意下MTK_PROTOCOL2_RAT=W/G这个配置,要根据贴的cpu型号来。比如mt6739有多种型号(MT6739WW/MT6739WB/MT6739CH/MT6739CW等),卡2支持的网络能力不一样,如果配置出错,就会出现卡1有信号,卡2没信号的情况。

可以通过丝印/串口/dmesg(dmesg查看kernel缓冲区信息/类似logcat,过了信息就会覆盖,可开机阶段查看)查看cpu型号,如

<6>[    0.000000] -(0)[0:swapper]Machine model: MT8765WB
<6>[    0.000000] -(0)[0:swapper]Machine model: MT6739WW

在lk阶段,会读出具体的cpu型号(lk/platform/mtxx/),然后传到内核。 

20.SPI使用DMA模式

见如下代码spi-mt65xx.c,要使用dma模式,数据长度必须为4的倍数,否则以fifo的方式进行数据传输。

static bool mtk_spi_can_dma(struct spi_master *master,
			    struct spi_device *spi,
			    struct spi_transfer *xfer)
{
	/* Buffers for DMA transactions must be 4-byte aligned */
	return (xfer->len > MTK_SPI_MAX_FIFO_SIZE &&
		(unsigned long)xfer->tx_buf % 4 == 0 &&
		(unsigned long)xfer->rx_buf % 4 == 0);
}

21.OTA升级

请参考这份文档,目前Android11对应的是V3.5
CS6000-BD12A-AND-V3.5EN_Android_OTA_SDCARD_update.pdf

22.CAR_TUNE_VALUE校准

rfg阻值校准方法_Android开发-CSDN博客

23.音频调试工具

官网下载Audio_Tuning_Tool,工程模式打开音频调试模式Log and Debugging-->ATCI-->ALWAYS ENABLE ATCI,如果电脑没有mtk usb驱动,设备管理器是提示cdc serial,安装驱动成功后,端口里多出来了一个VCOM,然后运行Audio_Tuning_Tool(连接不上以管理员身份运行)

24.合入音频参数

Audio_Tuning_Tool导出来的是一个压缩文件,解压后有许多xml文件。mtk默认音频参数放这个路径device/mediatek/vendor/common/audio_param/,工程下有又有几个同名的文件device/mediatek/mt6xxx/audio_param/,那组合起来的参数就是工程audio_param+device/mediatek/vendor/common/audio_param/。
我们合入的参数直接放工程路径就行,如device/mediatek/mt6761/audio_param/,因为工程里的参数优先。
可通过编译后的音频参数(/vendor/etc/audio_param)和要合入的音频参数做对比,确保合入无误。

 25.调整i2c速率&&上下拉电阻

用dct工具打开dws文件(最终生成dts)进行编辑就行,但有些在dts里也配置了节点,导致配置失败。如TP的dts里默认有

​​​​​​​&i2c0 {
        clock-frequency = <400000>;
};

要改就要同时该,或者屏蔽dts里面的clock-frequency = <400000>;,到out目录的dts文件夹进行搜索,看有没有配置成功。如要配置成100k,那编译出来的节点就应该是

​​​​​​​&i2c0 {
        clock-frequency = <100000>;
        ...
};

上拉电阻可以配置的,修改文件

vendor/mediatek/proprietary/bootable/bootloader/preloader/platform/mt6xxx/src/drivers/i2c.c

 26. [FAQ22441] Porting Camera Sensor 的时候新增metadata与tuning files的方法

1.新增tuning files

要先创建对应的文件夹,然后运行脚本

mkdir -p imx135_mipi_raw/AWB_Tuning_Para
mkdir -p imx135_mipi_raw/AE_Tuning_Para
from pathlib import Path
import re

cur_path = Path(r'/home/w/sp5508_mipi_raw')

in_text = 'sp5508'
out_text = 'imx135'

AllFiles = set()
AllPaths = set()

def find_one_level_subpaths(current_path):
    temp_paths = set()
    for tmp_p in current_path.iterdir():
        if tmp_p.is_dir():
            temp_paths.add(tmp_p)
    return temp_paths

def find_all_level_subpaths(current_path):
    all_sub_paths = set()
    new_sub_paths = set()
 
    all_sub_paths = find_one_level_subpaths(current_path)
    all_sub_paths.add(current_path)

    new_sub_paths = all_sub_paths
    while(new_sub_paths != set()):
        tmp_new_sub_collection = set()
        for tmp_path in new_sub_paths:
            tmp_new_sub = find_one_level_subpaths(tmp_path)
            tmp_new_sub_collection = tmp_new_sub_collection | tmp_new_sub
        all_sub_paths = all_sub_paths | tmp_new_sub_collection
        new_sub_paths = tmp_new_sub_collection - new_sub_paths

    return all_sub_paths

def find_one_level_file(current_path):
    temp_files = set()
    for tmp_f in current_path.iterdir():
        if tmp_f.is_file():
            temp_files.add(tmp_f)
    return temp_files 

AllPaths = find_all_level_subpaths(cur_path)
for tmp_p in AllPaths:
    tmp_f = find_one_level_file(tmp_p)
    AllFiles = AllFiles | tmp_f

rep_pattern = re.compile(in_text, re.I)

def repl(matchobj):
    if matchobj.group(0) == in_text:
        return out_text
    else:
        return out_text.upper()

def repl_in_a_file(cur_file):
    tmp_file = []
    r_file = open(cur_file,'r', encoding='UTF-8')
    for tmp_string in r_file.readlines():
        tmp_repl = rep_pattern.sub(repl, tmp_string)
        tmp_file.append(tmp_repl)
    r_file.close()

    w_file = open(cur_file,'w')
    for tmp_string in tmp_file:
        w_file.write(tmp_string)
    w_file.close()

for tmp_f in AllFiles:
    if tmp_f.suffix != '.xlsx':
        try:
            repl_in_a_file(tmp_f)
        except:
            print(tmp_f)

for tmp_f in AllFiles:
    new_file = rep_pattern.sub(repl, str(tmp_f))
    tmp_f.rename(new_file)

2.新增metadata

用上面的脚本运行后,只该了文件里的名字,但文件里的内容没改到,需手工修改下,注意metadata放两个位置,在某些平台如果漏了common/hal/imgsensor_metadata/sensor/yyyy_mipi_raw会导致打开摄像头黑屏。

vendor/mediatek/proprietary/custom/common/hal/imgsensor_metadata/sensor/sp5508_mipi_raw

vendor/mediatek/proprietary/custom/mtxxxx/hal/imgsensor_metadata/sp5508_mipi_raw

 27.lk按鍵

lk/target/k6xxx_yy_bsp/include/target/cust_key.h
默认是9*9按键  
如果用0作为KEY_VOLUMEUP键,打开preloader/custom/k6xxx_yy_bsp/dct/dct/codegen.dws,有类似的表格
 <keyMatrix>            2 OK NC LEFT VOLUMEUP VOLUMEDOWN NC NC NC
                                7 POUND NC 4 CALL 1 NC NC NC
                                BACK 0 NC STAR 9 8 NC NC NC
                                5 RIGHT NC 6 3 NC NC NC NC
                                NC NC NC NC NC NC NC NC NC
                                NC NC NC NC NC NC NC NC NC
                                NC NC NC NC NC NC NC NC NC
                                NC NC NC NC NC NC NC NC NC</keyMatrix>
0改好对应19(从0开始  从左往右,从上往下)

 28.闪光灯配置

双闪:由一颗低色温和一颗高色温组合而成
dts配置单闪还是双闪 

参考Flashlight_Driver_Porting_Guide.pdf

     flashlights_mt6370: flashlights_mt6370 {
                compatible = "mediatek,flashlights_mt6370";
                decouple = <0>;
                channel@1 {
                        type = <0>;
                        ct = <0>;
                        part = <0>;
                };
                channel@2 {
                        type = <0>;
                        ct = <1>;
                        part = <0>;
                };
        };

decouple:分离
0代表双闪
1代表单闪

同时注意下hal配置的是不是也是单闪
vendor/mediatek/proprietary/custom/mt676x/hal/flashlight/flash_custom.cpp

if(sensorDev == DUAL_CAMERA_MAIN_SENSOR || sensorDev == DUAL_CAMERA_MAIN_2_SENSOR)
   return 1; // 双色温LED
else
   return 0;

闪光灯要作校准(没校准拍出来的图片可能会偏色),校准可参考释放出来的最新文档和视频,如Flashlight_Introduction.pptx等
成功校准时,闪光灯会闪多下,大概耗时2min,将生成的文件(/data/vendor/flash)合入代码里(FAQ21724),涉及到的文件

vendor/mediatek/proprietary/custom/mt676x/hal/flashlight/flash_tuning_custom.cpp
vendor/mediatek/proprietary/custom/mt676x/hal/flashlight/flash_tuning_custom_cct.cpp
vendor/mediatek/proprietary/custom/mt676x/hal/imgsensor/xxx_mipi_raw/camera_flash_awb_para_xxxmipiraw.h

校准方法: 

adb root
adb shell setprop vendor.flash_ratio 1

然后在特定的环境下,点击拍照(使用的平台进入校准的方法是点击屏幕)

29.T卡热插拔配置

1、未插卡中断Pin是高电平,插入卡中断Pin是低电平
        cd_level = /bits/ 8 <MSDC_CD_LOW>;
2、未插卡中断Pin是低电平,插入卡中断Pin是高电平
        cd_level = /bits/ 8 <MSDC_CD_HIGH>

dws里的中断极性也要配置下

30.内核版本确认

源码根目录下一般有几套内核,可以根据ProjectConfig.mk里的LINUX_KERNEL_VERSION判定具体用哪个内核。

31.查看修改引脚状态

mtk平台的mt_gpio节点说明_Android开发-CSDN博客

32.调整充电电流 

充电电流在dts里就可以调整,但还有温控电流,可使用thermal_config_tool进行编辑,参考官网文档,如abcct电流调整FAQ23043

Adaptive Battery Charger Current Throttle(PID算法控制)
abcct默认是绑在tsAp上的,并非是默认绑在battery上的。
根据当前温度与目标温度的差值计算下一时刻要调节的充电电流,直到当前温度=目标温度
 
限流手段:
1.先限制Charging current limit(进电池电流)
主要控制手段(max chr current limit ==> min chr current limit)
2.Input current limit(充电线cable 的电流)
 需要以下两个条件满足
1.Input_current_limit_on 有开启 (設為1)
2.min chr current limit 需设置0 (可以限制到0) 且已经限制到0
 
假如当绑定tsAP且目标温度为46000mc
每一次Tz 更新进行一次迭代运算, ex: per second
当tsAP 47000 > 46000
P (比例项)贡献:(47000 – 46000)/1000 = 1 (align to 50mA)
当高于目标温度时每次迭代current – 50mA
I (积分项): 几乎忽略
D (微分项): (47000 - 46000) / 5 = 200mA
当温度往上再攀升一度,每次迭代current – 200mA

 

33.工具

电脑usb驱动Windows_Com_Driver_SDK/Driver_Auto_Installer_exe
下载工具SP_Flash_Tool
写imei(可以不导入DB文件(直接读取手机DB),直接写)SN_Write_tool
摄像头效果调试 CCT/ISP_Tuning/AF_Tuning/DebugParser_exe
音频调试工具 Audio_Tuning_Tool/Audio_Parameter_Compare_Tool
温控配置工具Thermal_Config_Tool
camera metadata检查工具Camera_MetaAnalysis
系统死机分析工具GAT
ATA调试工具SP_ATA_tool
电池曲线编辑工具GMAT_TOOL
校准综测MTK_MultiATE
多路下载工具[SP Multiport Download Tool]SP_MDT
modem工具(编辑nv/写号等)ModemMETA
modmem log抓取/分析 ELT(lite为精简版)

34.调整分区大小

分区文件vendor/mediatek/proprietary/tools/ptgen/MT6739/YY.cvs  可以用文件编辑器编辑,用excel提示保存不了。还有就是看下device下有没有BOARD_MTK_<Partition_Name>_SIZE_KB(优先级最高),一般不需要删out编译。编译成功后,通过对比前后的分区文件MT6739_Android_scatter.txt,确保生效了。(FAQ21282)

system/vendor/odm/product等分区会合并成一个super分区,通过lpdump查看(FAQ22340)

其中,proloader镜像每个平台都是固定的,不能随意更改(preloader/platform/mt67xx/check_size.sh)

35.读取DDR速率

cat /sys/bus/platform/drivers/emi_clk_test/read_dram_data_rate

DDR频率=read_dram_data_rate/2,比如读出来1066,DDR跑的频率就是533M

36.默认imei/交换sim卡

需要修改modem源码

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐