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 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° ...
随机推荐
反编译.NET工程
工具: 1. .Net Reflector 2. 远程桌面 步骤: 1. 远程桌面连接到服务器 IP,port,user,pwd 2. 打开 IIS 这里面就是所部属的网 ...
gnuplot使用2
设置图中连线的颜色.宽度.连线样式等 set style line 每个显示终端都有默认的线类型和点类型集合,可以通过在命令行输入: test查看,如下图显示了在wxt终端模式下默认的线的集合和点的集 ...
iOS开发拓展篇—UIDynamic(简单介绍)
iOS开发拓展篇—UIDynamic(简单介绍) 一.简单介绍 1.什么是UIDynamic UIDynamic是从iOS 7开始引入的一种新技术,隶属于UIKit框架 可以认为是一种物理引擎,能模拟 ...
[C#] Extension Method 扩展方法
当我们引用第三方的DLL.或者Visual Studio自己的库的时候,或许会发现这样的一个情况,如果这个类型有一个XX的方法就好了.这时候我们可以用到扩展方法,是我们的代码更加灵活和高效. 这里我举 ...
bzoj 2243 [SDOI2011]染色(树链剖分,线段树)
2243: [SDOI2011]染色 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 4637 Solved: 1726[Submit][Status ...
Linux DM9000网卡驱动程序完全分析
Linux DM9000网卡驱动程序完全分析http://blog.csdn.net/ypoflyer/article/details/6209922
【Demo 0001】Java基础-数据类型
本章学习要点: 1. 了解Java 语言 2. 了解Java程序结构; 3. 了解Java中基本数据类型; 4. 掌握基本数据类型之间的运算 ...
kali linux安装到U盘并增加persistence功能
这里写两种方法,其实本质是一样的,都是利用grub4dos重新写mbr,同时建立persistence分区并写入配置文件. 一, 1,首先将U盘分区,分两个即可,一个可当U盘使用存储数据,另一个则用来 ...
最详细的Windows平台安装MongoDB教程
一.MongoDB简介 MongoDB是一个基于分布式文件存储的数据库,由C++语言编写,旨在为WEB应用提供可扩展的高性能数据存储解决方案. MongoDB将数据存储为一个文档,数据结构由键值(ke ...
flex-手机端主页布局实例---构造页面结构
Flexbox页面布局实例,成本效果图如下, 源码下载在最下面. 源码下载:https://pan.baidu.com/s/18o5hVuWtflUpgvMk3LzQ5w 提取码:wiyc样本地址: ...