1.编译代码
一些私有代码在modem中,参考平台对应release_note(在vendor下),进行modem的编译和ap复制部分私有代码。
编译preloader make pl
编译lk make lk
编译kernel make bootimage
编译dtbo make dtboimage
2.工程暗码
*#*#3646633#*#*,没有相应的测试应用
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辅助配置工具dts并配置引脚功能,最终生成dtbo.img。习惯了文本界面的编辑,真的不习惯这种方式,但最终会在out目录的dts文件夹生成文本形式dts,可直接查看。
7.mic没功能
默认mic为dcc如果电路设计为模式,acc模式,需要修改audio_custom_exp.h
#define PHONE_MIC_MODE (2) //dcc #define PHONE_MIC_MODE (1) //acc #define MAIN_REF_MIC_INVERSE 0 双mic
MTK_DUAL_MIC_SUPPORT = yes mic翻转(这个配置比较人性化,在展览平台硬件反转的情况下,很久没有拿出来)
MTK_AUDIO_MIC_INVERSE = no 8.sensor配置
默认使用手机平台sensorhub这种方法可以计步,功耗更低。获得相应代码后,参考平面台湾默认代码可以移植和编译过去,可参考https://blog.csdn.net/qq_22370409/article/details/104940127
实时查看scp log
while true; do cat /dev/scp;done 9.摄像头
相机移植部分和几年前没有变化,效果部分在hal文件夹放置在摄像头上的电源和驱动部分kernel层。
10.串口
默认串口波特率为921600,默认Android启动后,串口将关闭log,可输入以下命令重新打开
echo 1 > /proc/mtprintk 11.nv修改
nv位置mcu/pcore/custom/modem,每次修改nv之后需要重新编译代码,比较不人道,因为需要驱动工程师编译,但是nv是射频工程师配置的。像展示平台,nv无需编译即可直接修改并烧写到系统中。
12.sim热插拔
这部分比较简单。如果不支持热插拔,直接关闭引脚功能,支持热插拔,配置plugout电平就行。
13.镜像打包
可参考打包脚本
#!/bin/sh if [ -d "image" ]; then rm -rf image mkdir image else mkdir image fi mkdir image/apdb echo "start copy image" cp out/target/product/k65v1_hdp_ref/obj/KERNEL_OBJ/vmlinux image/ cp out/target/product/k65v1_hdp_ref/preloader_k65v1_hdp_ref.bin image/ cp out/target/product/k65v1_hdp_ref/lk.img image/ cp out/target/product/k65v1_hdp_ref/dtbo.img image/ cp out/target/product/k65v1_hdp_ref/logo.bin image/ cp out/target/product/k65v1_hdp_ref/boot.img image/ cp out/target/product/k65v1_hdp_ref/md1img.img image/ cp out/target/product/k65v1_hdp_ref/super.img image/ cp out/target/product/k65v1_hdp_ref/userdata.img image/ cp out/target/product/k65v1_hdp_ref/MT6765_Android_scatter.txt image/ cp out/target/product/k65v1_hdp_ref/scp.img image/ cp out/target/product/k65v1_hdp_ref/spmfw.img image/ cp out/target/product/k65v1_hdp_ref/sspm.img image/ cp out/target/product/k65v1_hdp_ref/tee.img image/ cp out/target/product/k65v1_hdp_ref/vbmeta.img image/ cp out/target/product/k65v1_hdp_ref/vbmeta_system.img image/ cp out/target/product/k65v1_hdp_ref/vbmeta_vendor.img image/ cp vendor/mediatek/propritary/modem/XXX/MDDB.META.ODB_MT6765_S00* image/ cp out/target/product/k65v1_hdp_ref/vendor/etc/apdb/* image/apdb/ echo "stop copy image" time=$(date "%Y%m%d_%H%M") zip -r XXX_$time.zip image 14.下载
在linux和windows下,都有对应的下载工具。点击下载,插上usb就行,电池也可以不接,这点比较方便。
下载到userdata镜像时,如果工具报镜像太大(ERROR:STATUS_TOO_LARGE(-1073479676)),可适当减少BOARD_MTK_USERDATA_SIZE_KB的值
15.兼容emmc和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
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校准
https://blog.csdn.net/mike8825/article/details/116897756
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的方法
要先创建对应的文件夹,然后运行脚本
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) 26.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开始 从左往右,从上往下)
26.闪光灯配置
双闪:由一颗低色温和一颗高色温组合而成 dts配置单闪还是双闪
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 然后在特定的环境下,点击拍照(使用的平台进入校准的方法是点击屏幕)