【Android驱动实践】EMMC兼容性配置与DDR时序调优实战指南

张开发
2026/4/11 17:38:23 15 分钟阅读

分享文章

【Android驱动实践】EMMC兼容性配置与DDR时序调优实战指南
1. EMMC兼容性配置实战在Android驱动开发中EMMC存储芯片的兼容性配置是个绕不开的坎。记得我第一次接手MTK平台的项目时就遇到了EMMC识别失败的问题折腾了好几天才发现是MemoryDeviceList配置有问题。下面我就把这些年总结的实战经验分享给大家。1.1 硬件信息确认首先得搞清楚硬件到底用了什么型号的EMMC和DDR芯片。这个看似简单但很多新手都会在这里栽跟头。我建议按照这个流程操作找到硬件原理图确认EMMC和DDR的具体型号向供应商索要完整的芯片资料手册记录关键参数容量配置比如64GB4GB、厂商编号等举个例子常见的配置可能是EMMC: Samsung KLMCG4JETD_B041DDR: H9CKNNNDATMUPR_NUH这些信息后面会直接关系到配置文件的修改一定要确保准确无误。1.2 MemoryDeviceList配置MTK平台有个很关键的文件MemoryDeviceList_MTxxxx.xlsxxxx对应芯片型号这个Excel表格相当于存储芯片的花名册。我遇到过不少情况都是因为这里没配置好导致系统起不来。具体操作步骤找到路径vendor/mediatek/proprietary/bootable/bootloader/preloader/tools/emigen/MT6797/打开MemoryDeviceList_MT6797.xls检查是否包含你的EMMC型号如果没有就需要手动添加一行新记录添加时要注意这些字段Part Number必须与硬件完全一致EMMC ID对应芯片手册中的CID值Capacity注意单位是Mb还是MBTiming参数建议先用厂商推荐的默认值1.3 custom_MemoryDevice.h修改这个头文件是编译时生成emi配置的源头。需要修改的主要是这几个宏定义#define BOARD_ID MT6797_EVB #define CS_PART_NUMBER[0] H9CKNNNDATMUPR #define EMMC_ID 700100453248373332010585581E937D修改后一定要clean build因为preloader的编译有缓存机制。我建议用这个命令强制重新生成emi配置make clean-preloader make preloader2. DDR时序调优技巧DDR时序调优是个精细活调好了系统稳如泰山调不好就是各种玄学问题。下面分享几个关键点的调优经验。2.1 时序参数解析编译完成后在out目录会生成custom_emi.h里面有这些关键参数EMI_SETTINGS emi_settings[] { { 0x0, // sub_version 0x0202, // TYPE 9, // EMMC ID检查长度 0x00025052, // EMI_CONA_VAL 0xAA00AA00, // DRAMC_DRVCTL0_VAL 0x44584493, // DRAMC_ACTIM_VAL //...其他参数 } }这些十六进制值看着头疼其实都有规律DRAMC_DRVCTL0/1控制驱动强度DRAMC_ACTIM主要时序参数tRCD/tRP/tRAS等EMI_CONA_VALEMI控制器配置建议先用厂商推荐的默认值等系统能正常启动后再微调。2.2 常见时序问题排查遇到DDR相关问题时可以按照这个流程排查确认当前DDR频率adb shell cat /sys/bus/platform/drivers/emi_clk_test/read_dram_data_rate检查DDR电压是否正常使用万用表测量实际电压对比芯片手册要求的电压范围查看preloader日志搜索EMI关键字重点检查MR5Mode Register 5值是否匹配我遇到过最棘手的一个案例是DDR在高温下不稳定最后发现是tREF参数需要根据温度调整在emi_settings里增加了温度补偿才解决。2.3 频率与电压调整有时候为了优化功耗或性能需要调整DDR频率。MTK平台修改频率的主要步骤修改pll2.c中的初始化代码void mt_pll_post_init(void) { mt_mempll_init(DDR1066, PLL_MODE_1); // 修改这里的频率值 memfreq_val 1066000; // 同步修改这个值 }添加自定义频率如果需要enum { DDR533 533, DDR800 800, // 新增频率 DDR1066 1066, //... };关闭DVFS否则内核会动态调整// 在dramc2.h中注释掉 // #define ENABLE_DFS电压调整更需谨慎建议每次调整不超过50mV并通过稳定性测试。可以通过pmic接口调整pmic_config_interface(MT6328_SLDO_ANA_CON0, 0, 0x3, 0); // 1.24V pmic_config_interface(MT6328_SLDO_ANA_CON1, 0x0D, 0xF, 8); // 0.6V3. 兼容性配置实战不同厂商的EMMC和DDR芯片混用时兼容性问题就特别让人头疼。下面分享几种典型场景的处理方法。3.1 多厂商EMMC兼容EMCP类存储的兼容相对简单主要通过EMMC ID来区分。在MemoryDeviceList中配置多个EMMC条目即可例如{ .nand_emmc_id {0x70,0x01,0x00,0x45,0x48,0x38,0x45,0x42}, // 三星 .type TYPE_EMMC, .capacity 0x1000, // 16GB }, { .nand_emmc_id {0x15,0x01,0x00,0x53,0x54,0x32,0x44,0x41}, // 东芝 .type TYPE_EMMC, .capacity 0x1000, }系统启动时会自动匹配正确的配置。但要注意每个EMMC ID必须唯一容量单位要统一时序参数可以不同3.2 DDR兼容性处理DDR的兼容性要复杂得多主要分这几类情况LPDDR2/LPDDR3兼容通过MR5Mode Register 5值区分在MemoryDeviceList的MODE_REG5列配置不同厂商的MR5值不能相同不兼容的情况LPDDR2和LPDDR3不能混用多个PCDDR3不能共存LPDDR3和PCDDR3不能混用调试时可以查看preloader日志确认MR5值[EMI]MR5:3 emi_settings[i].MODE_REG_5:3,emi_settings[i].type:33.3 兼容性检查脚本MTK平台有个重要的检查脚本emigen.pl编译时会自动执行。它会检查这些常见错误Board ID不匹配[Error]unsupported part number H9TKNNN8KDMPDDR类型混用[Error] LPDDR2 and LPDDR3 are not allowed to be mixed建议在修改配置后手动运行这个脚本提前发现问题perl vendor/mediatek/proprietary/bootable/bootloader/preloader/tools/emigen/MT6797/emigen.pl4. 常见问题解决方案在实际项目中EMMC和DDR的问题千奇百怪。这里总结几个最常遇到的坑和解决方法。4.1 下载失败问题遇到enable Dram fail错误时可以按照这个流程排查基础检查使用最新版本的flash tool确认memory经过MTK验证检查ett测试日志软件原因检查custom_MemoryDevice.h配置确认emi参数生成正确对比ETT测试的DRAM timing硬件原因交叉测试确认是memory还是主板问题检查周边电路上拉电阻、滤波电容等测量电源纹波有个典型案例客户反馈量产时10%的设备下载失败最后发现是DDR电源走线太长导致信号完整性差在PCB上加了个去耦电容就解决了。4.2 开机重启问题频繁重启很多情况下和EMMC有关特别是HS400模式。可以尝试降速模式mmc-hs400-1_8v; → mmc-hs200-1_8v;调整驱动强度DRAMC_DRVCTL0_VAL 0xAA00AA00; → 0x55005500;增加初始化延时msdc_set_timeout(host, 3000); // 默认是1000ms4.3 性能优化技巧提升存储性能有几个实用方法启用HS400模式mmc-hs400-1_8v; bus-width 8;优化调度策略echo fifo /sys/block/mmcblk0/queue/scheduler调整DDR频率需平衡功耗mt_mempll_init(DDR1280, PLL_MODE_1);启用CMD排队host-caps | MMC_CAP_CMD_QUEUE;这些优化后实测顺序读写性能可以提升30%以上但要注意做好稳定性测试。

更多文章