linux脚本ipddr.sh 是什么,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不能兼容

1ce1494e1927de50260d018fbade2e46.png

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启动流程分析&lpar;三&rpar;

1.前言 在前面的文章Uboot启动流程分析(二)中,链接如下: https://www.cnblogs.com/Cqlismy/p/12002764.html 已经对_main函数的整个大体调用流程 ...

zedboard如何从PL端控制DDR读写&lpar;三&rpar;——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°   ...

随机推荐

反编译&period;NET工程

工具:       1.  .Net Reflector       2.   远程桌面 步骤: 1. 远程桌面连接到服务器 IP,port,user,pwd 2. 打开 IIS 这里面就是所部属的网 ...

gnuplot使用2

设置图中连线的颜色.宽度.连线样式等 set style line 每个显示终端都有默认的线类型和点类型集合,可以通过在命令行输入: test查看,如下图显示了在wxt终端模式下默认的线的集合和点的集 ...

iOS开发拓展篇—UIDynamic&lpar;简单介绍&rpar;

iOS开发拓展篇—UIDynamic(简单介绍) 一.简单介绍 1.什么是UIDynamic UIDynamic是从iOS 7开始引入的一种新技术,隶属于UIKit框架 可以认为是一种物理引擎,能模拟 ...

&lbrack;C&num;&rsqb; Extension Method 扩展方法

当我们引用第三方的DLL.或者Visual Studio自己的库的时候,或许会发现这样的一个情况,如果这个类型有一个XX的方法就好了.这时候我们可以用到扩展方法,是我们的代码更加灵活和高效. 这里我举 ...

bzoj 2243 &lbrack;SDOI2011&rsqb;染色(树链剖分,线段树)

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样本地址: ...

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值