MTK DDR调试
1. 获取 flash id:
硬件信息:通过这个节点可以知道当前flash的id,上层根据id找到对应的flash名字。
cat /sys/block/mmcblk0/device/cid
\kernel-4.4\drivers\mmc\core\Mmc.c
MMC_DEV_ATTR(cid, "%08x%08x%08x%08x\n", card->raw_cid[0], card->raw_cid[1]
MT8163_MT8127
GDT42A32ED7_T2E 0x700100543532373332010585581e937d
MT8321 只支持如下方式兼容:
1. EMCP类: 只要emmc id不同,就可以兼容。
2. discrete lp2 类: dram vendor ID不同,就可以兼容(也就是说不同晶圆厂家兼容,具体对应的是datasheet中的MR5值,对应到code中MemoryDeviceList_xxxx.xlsx 表格的MODE_REG5 列)
3. discrete lp3 类: dram vendor ID不同,就可以兼容(也就是说不同晶圆厂家兼容,具体对应的是datasheet中的MR5值,对应到code中MemoryDeviceList_xxxx.xlsx 表格的MODE_REG5 列)
4. PCDDR3类:不支持。
编译脚本
判断哪些ddr可以兼容,编译时会允许这个脚本
vendor/mediatek/proprietary/bootable/bootloader/preloader/tools/emigen/MT8127/emigen.pl
if ($scan_idx eq $PartNum) # scan column for Part Number {
my $boardid ;
$boardid = &xls_cell_value($Sheet, $row, $COLUMN_BOARD_ID) ;
if ($CustBoard_ID eq $boardid)
{
$rows_part_found[$num_part_found] = $row; print "\nPartNum($PartNum==$scan_idx) found in row $row\n" ;
$Total_PART_NUMBER[$TotalCustemChips] = $PartNum;
$num_part_found += ;
$TotalCustemChips += ;
}
}
if ($num_part_found == )
{
print "\n[Error]unsupported part number $PartNum\n" ;
die "\n[Error]unsupported part number $PartNum\n" ;
}
①:Board ID不匹配,不支持
[Error]unsupported part number H9TKNNN8KDMP
所以xls表格里面配置的board id跟当前平台不一致的话,会报不支持。
②:兼容不了LPDDR2和LPDDR3同时选配
TotalCustemChips:2
[Error] LPDDR2 and LPDDR3 are not allowed to be mixed in the Combo Discrete DRAM list.
③:兼容不了多个PCDDR3同时选配
[Error] At most one discrete PCDDR3 DRAM is allowed in the Combo MCP list
④:兼容不了LPDDR3和PCDDR3同时选配
[Error] At most one discrete PCDDR3 DRAM is allowed in the Combo MCP list
编译过后会生成
out/target/product/hiteq8127_ce/obj/PRELOADER_OBJ/inc/custom_emi.h
此文件包含兼容的所有ddr时序,就是将xls表格里的时序信息构建成数组。开机时会利用这个数组emi_settings[]找到指定的ddr。
EMI_SETTINGS emi_settings[] =
{ //K4E6E304EE_EGCF
{
0x0, /* sub_version */
0x0003, /* TYPE */
, /* EMMC ID/FW ID checking length */
, /* FW length */
{0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0}, /* NAND_EMMC_ID */
{0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0}, /* FW_ID */
0x000250A2, /* EMI_CONA_VAL */
0xAA00AA00, /* DRAMC_DRVCTL0_VAL */
0xAA00AA00, /* DRAMC_DRVCTL1_VAL */
0x66CB4619, /* DRAMC_ACTIM_VAL */
0x01000000, /* DRAMC_GDDR3CTL1_VAL */
0xF00487C3, /* DRAMC_CONF1_VAL */
0xC00652D1, /* DRAMC_DDR2CTL_VAL */
0xBF090401, /* DRAMC_TEST2_3_VAL */
0x01806C60, /* DRAMC_CONF2_VAL */
0xD1643542, /* DRAMC_PD_CTRL_VAL */
0x00008888, /* DRAMC_PADCTL3_VAL */
0x88888888, /* DRAMC_DQODLY_VAL */
0x00000000, /* DRAMC_ADDR_OUTPUT_DLY */
0x00000000, /* DRAMC_CLK_OUTPUT_DLY */
0x11000D21, /* DRAMC_ACTIM1_VAL*/
0x17800000, /* DRAMC_MISCTL0_VAL*/
0x040004C1, /* DRAMC_ACTIM05T_VAL*/
{0x40000000,0x40000000,,}, /* DRAM RANK SIZE */
{,,,,,,,,,}, /* reserved 10 */
0x00C30001, /* LPDDR3_MODE_REG1 */
0x000A0002, /* LPDDR3_MODE_REG2 */
0x00020003, /* LPDDR3_MODE_REG3 */
0x00000001, /* LPDDR3_MODE_REG5 */
0x00FF000A, /* LPDDR3_MODE_REG10 */
0x0000003F, /* LPDDR3_MODE_REG63 */
} ,
};
vendor/mediatek/proprietary/bootable/bootloader/preloader/platform/mt8127/src/drivers/inc/emi.h
这个结构体在emi.h中定义
typedef struct
{
int sub_version; // sub_version: 0x1 for new version
int type; /* 0x0000 : Invalid
0x0001 : Discrete DDR1
0x0002 : Discrete LPDDR2
0x0003 : Discrete LPDDR3
0x0004 : Discrete PCDDR3
0x0101 : MCP(NAND+DDR1)
0x0102 : MCP(NAND+LPDDR2)
0x0103 : MCP(NAND+LPDDR3)
0x0104 : MCP(NAND+PCDDR3)
0x0201 : MCP(eMMC+DDR1)
0x0202 : MCP(eMMC+LPDDR2)
0x0203 : MCP(eMMC+LPDDR3)
0x0204 : MCP(eMMC+PCDDR3)
*/
int id_length; // EMMC and NAND ID checking length
int fw_id_length; // FW ID checking length
char ID[];
char fw_id[]; // To save fw id
int EMI_CONA_VAL; //@0x3000
int DRAMC_DRVCTL0_VAL; //@0x40B8 -> customized TX I/O driving
int DRAMC_DRVCTL1_VAL; //@0x40BC -> customized TX I/O driving
int DRAMC_ACTIM_VAL; //@0x4000
int DRAMC_GDDR3CTL1_VAL; //@0x40F4
int DRAMC_CONF1_VAL; //@0x4004
int DRAMC_DDR2CTL_VAL; //@0x407C
int DRAMC_TEST2_3_VAL; //@0x4044
int DRAMC_CONF2_VAL; //@0x4008
int DRAMC_PD_CTRL_VAL; //@0x41DC
int DRAMC_PADCTL3_VAL; //@0x4014 -> customized TX DQS delay
int DRAMC_DQODLY_VAL; //@0x4200~0x420C -> customized TX DQ delay
int DRAMC_ADDR_OUTPUT_DLY; // for E1 DDR2 only
int DRAMC_CLK_OUTPUT_DLY; // for E1 DDR2 only
int DRAMC_ACTIM1_VAL; //@0x41E8
int DRAMC_MISCTL0_VAL; //@0x40FC
int DRAMC_ACTIM05T_VAL; //@0x41F8
int DRAM_RANK_SIZE[];
int reserved[]; union
{
struct
{
int LPDDR2_MODE_REG_1;
int LPDDR2_MODE_REG_2;
int LPDDR2_MODE_REG_3;
int LPDDR2_MODE_REG_5;
int LPDDR2_MODE_REG_10;
int LPDDR2_MODE_REG_63;
};
struct
{
int DDR1_MODE_REG;
int DDR1_EXT_MODE_REG;
};
struct
{
int PCDDR3_MODE_REG0;
int PCDDR3_MODE_REG1;
int PCDDR3_MODE_REG2;
int PCDDR3_MODE_REG3;
int PCDDR3_MODE_REG4;
int PCDDR3_MODE_REG5;
};
struct
{
int LPDDR3_MODE_REG_1;
int LPDDR3_MODE_REG_2;
int LPDDR3_MODE_REG_3;
int LPDDR3_MODE_REG_5;
int LPDDR3_MODE_REG_10;
int LPDDR3_MODE_REG_63;
};
};
} EMI_SETTINGS;
三:开机检测ddr
Discrete lp3 (LPDDR3类) 或Discrete lp2 (LPDDR2类)
vendor/mediatek/proprietary/bootable/bootloader/preloader/platform/mt8163/src/drivers/emi.c
static int mt_get_mdl_number (void)
//try to find discrete dram by DDR2_MODE_REG5(vendor ID)
for (i = ; i < num_of_emi_records; i++)
{
if (TYPE_LPDDR2 == dram_type)
mode_reg_5 = emi_settings[i].LPDDR2_MODE_REG_5;
else if (TYPE_LPDDR3 == dram_type)
mode_reg_5 = emi_settings[i].LPDDR3_MODE_REG_5;
printf("emi_settings[i].MODE_REG_5:%x,emi_settings[i].type:%x\n",mode_reg_5,emi_settings[i].type);
//only check discrete dram type
if (((emi_settings[i].type & 0x0F00) == 0x0000) || ((emi_settings[i].type & 0x0F00) == 0x0F00))
{
//support for compol discrete dram
if ((mode_reg_5 == manu_id) )
{
mdl_number = i;
found = ;
break;
}
}
}
对应log:
[EMI]MR5:3 ----------->读出来的值
emi_settings[i].MODE_REG_5:3,emi_settings[i].type:3
MODE_REG_5---------->时序表中MODE_REG5列配置的值
eMCP类
eMCP类的DDR是通过读emmc_id来实现兼容的。
/* 1.
* if there is MCP dram in the list, we try to find emi setting by emmc ID
* */
if (mcp_dram_num > )
{
result = platform_get_mcp_id (id, emmc_nand_id_len,&fw_id_len); for (i = ; i < num_of_emi_records; i++)
{
if (emi_settings[i].type != )
{
if ((emi_settings[i].type & 0x0F00) != 0x0000)
{
if (result == )
{ /* valid ID */ if ((emi_settings[i].type & 0x0F00) == 0x100)
{
/* NAND */
if (memcmp(id, emi_settings[i].ID, emi_settings[i].id_length) == ){
memset(id + emi_settings[i].id_length, , sizeof(id) - emi_settings[i].id_length);
mdl_number = i;
found = ;
break; /* found */
}
}
else
{ /* eMMC */
if (memcmp(id, emi_settings[i].ID, emi_settings[i].id_length) == )
{
#if 0
printf("fw id len:%d\n",emi_settings[i].fw_id_length);
if (emi_settings[i].fw_id_length > )
{
char fw_id[];
memset(fw_id, , sizeof(fw_id));
memcpy(fw_id,id+emmc_nand_id_len,fw_id_len);
for (j = ; j < fw_id_len;j ++){
printf("0x%x, 0x%x ",fw_id[j],emi_settings[i].fw_id[j]);
}
if(memcmp(fw_id,emi_settings[i].fw_id,fw_id_len) == )
{
mdl_number = i;
found = ;
break; /* found */
}
else
{
printf("[EMI] fw id match failed\n");
}
}
else
{
mdl_number = i;
found = ;
break; /* found */
}
#else
mdl_number = i;
found = ;
break; /* found */
#endif
}
else{
printf("[EMI] index(%d) emmc id match failed\n",i);
} }
}
}
}
}
}
所以:
可以兼容的情况:
1:兼容列表的ddr类型都是Discrete LPDDR2 (MODE_REG5不能有相同的)
2:兼容列表的ddr类型都是Discrete LPDDR3 (MODE_REG5不能有相同的)
不能兼容的情况:
1:兼容列表中不能同时包含LPDDR2,LPDDR3或PCDDR3类型
2:多个PCDDR3类型的ddr不能兼容
MTK DDR调试的更多相关文章
- MTK android flash配置
关于6573集成MCP nandflash的方法,driver_allinone 和Memory Customer Document pdf的说明里面漏了很多细节.在此补上. 1.首先确认flash型 ...
- MTK65XX平台充电调试总结
MTK平台充电调试总结 摘要:调试电池的充放电管理,首先须要深入了解锂电池的电池原理和特点.充放电特性以及主要的电池安全问题.然后须要对MTK的电池管理驱动程序有深入的了解.理解电池充放电算法的基本原 ...
- 高通LCD驱动调试
本文转载自:http://www.itgo.me/a/x6305658852004979994/lcd%20qcom 来自 :http://blog.csdn.net/dacaozuo/article ...
- Camera 涉及的文件70
点击打开链接 Camera 涉及的文件 1.上电时序 Mediate/custom/$PROJECT/Camera/Camera/kd_camera_hw.c Mediate/custom/$PROJ ...
- uboot常用命令详解
dnw:在进入系统之前进入指令行,输入该指令可下载烧录文件. re:重新启动嵌入式系统. printenv:打印当前系统环境变量. setenv:设置环境变量,格式:setenv name value ...
- Uboot启动流程分析(三)
1.前言 在前面的文章Uboot启动流程分析(二)中,链接如下: https://www.cnblogs.com/Cqlismy/p/12002764.html 已经对_main函数的整个大体调用流程 ...
- zedboard如何从PL端控制DDR读写(三)——AXI-FULL总线调试
之前的项目和培训中,都只用到了AXI-Lite或者AXI-Stream,对于AXI-FULL知之甚少,主要是每次一看到那么多接口信号就望而却步了. 现在为了调试DDR,痛下决心要把AXI-FULL弄懂 ...
- mtk android lcm调试
参考MTK 文档LCM_Customer_document_MT6575.pdf The following shows the steps to add a new LCM driver: (1) ...
- MTK camera 闪光灯Flashlight驱动调试流程
MTK camera 闪光灯Flashlight驱动调试流程 分类: MtkDev | 作者: topicdev 相关 | 发布日期 : 2014-09-26 | 热度 : 153° ...
随机推荐
- Win7如何自定义鼠标右键菜单 添加新建PowerPoint文档
鼠标右键添加新建PowerPoint文档.reg Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\.ppt] "Content ...
- python(38)- 网络编程socket
一 客户端/服务器架构 即C/S架构,包括 1.硬件C/S架构(打印机) 2.软件C/S架构(web服务) 美好的愿望: 最常用的软件服务器是 Web 服务器.一台机器里放一些网页或 Web 应用程序 ...
- 怎样在C语言里实现“面向对象编程”
有人觉得面向对象是C++/Java这样的高级语言的专利,实际不是这样.面向对象作为一种设计方法.是不限制语言的.仅仅能说,用C++/Java这样的语法来实现面向对象会更easy.更自然一些. 在本节中 ...
- UVA 610 - Street Directions(割边)
UVA 610 - Street Directions option=com_onlinejudge&Itemid=8&page=show_problem&category=5 ...
- poj3211 Washing Clothes
Description Dearboy was so busy recently that now he has piles of clothes to wash. Luckily, he has a ...
- hdu3251 最小割
题意: 给n个城市,m条有向边.每条边有权值,如今有些城市能够选择得到.可选的城市有一个价值.可是要满足从1到达不了这些城市,为了满足要求能够去掉一些边,须要花费边的权值,问终于得到的最大价值是多少, ...
- VMware Workstation 11 安装MAC OS X 10.10 Yosemite(14B25)图解 2015-01-13 12:26:01|
VMware Workstation 11 安装MAC OS X 10.10 Yosemite(14B25)图解 2015-01-13 12:26:01| 分类: 网络互联 | 标签:10.10 ...
- CCNET自动构建之路
人永远追求效率(想偷懒),不想手动编译项目.发布站点于是产生了自动构建技术,.NET领域中CCNET是个不错的选择. 一路问题不少,记录一下. 准备环境 服务器上需要有iis.vs(与开发环境的版本一 ...
- Python之Pandas库常用函数大全(含注释)
前言:本博文摘抄自中国慕课大学上的课程<Python数据分析与展示>,推荐刚入门的同学去学习,这是非常好的入门视频. 继续一个新的库,Pandas库.Pandas库围绕Series类型和D ...
- mysql分页查询-limit
分页查询的sql: select * from table limit 4,10; 4表示查询的索引,索引是从0开始,4表示从第五条数据开始查询,10表示要查询多少条数据,10表示查询十条数据 如果从 ...