QCM6490 QUDTT测试

news/2024/11/18 15:21:45/

前言:

基于最新版 QDUTT(QCOM DDR USB TEST TOOL) 2.0.2 介绍了如何使用 QDUTT 对 QCM6490运行 DDR 调试映像 (DDI) 测试。本文对这些设备进行内存测试的软件工程师有用。

QCM6490中引入了 DDI,以提供 XML 绑定语言 (XBL) 的 DDR 测试环境,该平台DDI 测试嵌入到 xbl.elf 映像中,不再需要单独的 DDI 映像 (ddi.elf)。用户在进行 DDI 测试之前必须刷写整个编译映像(非 HLOS 映像和 HLOS 映像)。


内容:

所有 DDI 测试用例均存储在文件 ddi_protocol_config.xml 中,该 xml 文件与每个 BOOT CRM版本一起打包为二进制文件。该文件还会反映所有测试用例及其输入和预期输出。

QDUTT 属于 PC 工具,用于与 DDI 进行通信,以便在目标设备上运行 DDI 测试用例。QDUTT 会解析 ddi_protocol_config.xml,然后通过 QDUTT GUI 显示所有 DDI 支持的测试用例。QDUTT 通过调用 ddi.py python 脚本来运行 DDI 测试用例。
boot_images/boot/QcomPkg/Tools/DDI/ddi_protocol_config.xml

DDI python 脚本 ddi.py 将用户在 QDUTT GUI 中选择的 DDI 测试命令(识别为 DDI 测试标志)集成到 xbl_config 分区,一旦 XBL 检测到 DDI 测试标志,XBL 便会跳到 DDI 项运行DDI 测试,而不运行正常启动例程。

SDM845/SM6150/QCM6490/SM8250/SM7250 DDI 测试用
例(不同平台测试用例数量可能不一样):
 读取
 写入
 读-写
 延迟
 频率切换
 眼图
 获取设备信息
 读取接口设置(或读取 eCDT)
 读取 AC 时序
 获取安全模式信息
boot_images/boot/QcomPkg/Tools/DDI/ddi.py


测试步骤:

1、 从QPM安装QDUTT。 2、 打开QDUTT,选择DDI。

在这里插入图片描述

3、 选择standard mode。
在这里插入图片描述
4、 选择standard mode,选择qcm6490-la-1-0_amss_standard_oem\boot_images\boot\QcomPkg\Tools\DDI\ddi_protocol_config.xml

注意此文件一定要从编译环境中取,你测试的版本编译环境要保留,下面选择的文件都是从里面取的
在这里插入图片描述
4、选择如下几个文件,partition.xml这个可能没有此文件,如你当前使用的是partition_ext.xml,拷贝重命名为partition.xml
cm6490-la-1-0_amss_standard_oem\common\config\ufs\partition.xml
qcm6490-la-1-0_amss_standard_oem\common\build\ufs\rawprogram1.xml
qcm6490-la-1-0_amss_standard_oem\common\build\ufs\rawprogram3.xml
在这里插入图片描述

5、设备开机,执行adb reboot edl,进9008模式下开始测试。一般我们测试先测试眼图,参数使用默认的参数,按步骤执行。
在这里插入图片描述
6、测试成功会生成一个表格,数据就可以绘制眼图的。从log也可以看到测试成功了:
在这里插入图片描述
在这里插入图片描述


DEBUG:

1.关于读写测试的参数:
Start Addr (uint64) – 起始地址(物理地址映射)。如果值为 0,则会自动将地址设为 DDR
内存区的开始处。
[默认值:0]
 End Addr (uint64) – 结束地址(物理地址映射)。如果值为 0,则会自动将地址设为 DDR
内存区的结尾处。
[默认值:0]
 Repeat Count (uint64) – 读取操作的重复次数。如果值为 0,则将不断重复。
[默认值:1]
 Write Flags (uint8) – 代表不同测试选项的位域。可设置下列位的任意组合。
[默认值:1]

在这里插入图片描述
Random Seed (uint32) – 生成随机数据需要使用的种子值。如果为 0,则将动态生成种子。
[默认值:0]
 Random Stride (uint64) – 要生成的随机数据的 64 位字数量。随后将重复复制该数据,以
填充已定义测试内存区之间的整个空间。
[默认值:0]
 Pattern – PC安装路径下有此xml,C:\Program Files (x86)\Qualcomm\QDUTT\data_pattern.xml

2.测试read或者read-write过程发现死机,使用默认参数或者设置为0x80000000 ~ 0x500000000(正常测试过程直接使用默认参数即可,工具及代码会自动获取DDR起始和结束地址的)。
此时改小 0x8000 0000- 0x9000 0000,单测read可以测过,注意工具里的值是十进制的,代码打印是16进制

死机log
D -     51057 - do_ddr_training, Delta
D -     58896 - sbl1_do_ddr_training
B -    904904 - DDI: Memory Test command
B -    908290 - initial test range: 0x80000000 ~ 0x500000000
B -    912011 -   test range: 0x80000000 ~ 0x500000000
B -    917562 -   random_stride: 0  random_seed: 0xb33e0870
B -    922564 -   repeat: 1  verify: 1  invert,0
B -    928237 -  Start Write test #1
B -  57656346 - Error code 9 at boot_error_handler.c Line 724
B -  57656376 - Call Stack:
B -  57661988 - func_addr  :   1482007C
B -  57664581 - func_addr  :   1481D3D8
B -  57668271 - ^^^^^^^^^^^^^^^^^^^^^
B -  57671931 - sbl_error_handler FAIL: DDR not initialized
B -  57675439 - sbl_crashdump_reset_with_dload: Ramdump not allowed. Go▒Format: Log Type - Time(microsec) - Message - Optional Info
Log Type: B - Since Boot(Power On Reset),  D - Delta,  S - Statistic
S - QC_IMAGE_VERSION_STRING=BOOT.MXF.1.0-00806-LAHAINA-1

产生该死机的原因是QCM6490平台只支持到2通道,所以测试代码这里有问题:

uint64* ddi_get_cs0_end()
{uint32 i;void* ret = (void*)ddr_shared_data->ddr_size_info.ddr_cs0_remapped_addr[0];for (i = 0; i < ddr_shared_data->num_channel; i++){ret += ddr_shared_data->ddr_size_info.ddr_cs0_mb[i] << 20;}return (uint64*)ret;
}uint64* ddi_get_cs1_end()
{uint32 i;void* ret = (void*)ddr_shared_data->ddr_size_info.ddr_cs1_remapped_addr[0];
//这里4改成2,四通道改成双通道;或者改成ddr_shared_data->num_channel也是可以的,修改后读写测试passfor (i = 0; i < 2; i++) {ret += ddr_shared_data->ddr_size_info.ddr_cs1_mb[0] << 20;}if (ret == 0) {return ddi_get_cs0_end();} else {return (uint64*)ret;}
}

通过打印:
f boot_images\boot\QcomPkg\SocPkg\Kodiak\Library\DDRTargetLib/ddr_target.c

void ddr_regions_remapper(void)
{
char ddr_log_string[50]; /*add*/
uint64 ddr_cs0_address=0, ddr_cs1_address=0;
...
...
/* Update HBB */
ddr_driver_struct->ddr_regions_info.highest_bank_bit = ddr_shared_data->device_params.highest_bank_bit;
/*add below logs at the end of function*/
snprintf(ddi_log_string, sizeof(ddi_log_string), "ddr_size: 0x%lx,0x%lx", ddr_cs0_size,ddr_cs1_size);
boot_log_message(ddi_log_string);snprintf(ddi_log_string, sizeof(ddi_log_string), "remapped_addr: 0x%lx,0x%lx", ddr_shared_data->ddr_size_info.ddr_cs0_remapped_addr[0],ddr_shared_data->ddr_size_info.ddr_cs1_remapped_addr[0]);
boot_log_message(ddi_log_string);
} /* ddr_regions_remapper */

boot_images\boot\QcomPkg\SocPkg\Kodiak\Library\DDITargetLib\ddi_test_cases.c

ddi_run_command_rdwr ()
{
....
/*add below log before calling get_start_end */
#if DDI_PRINT_ENABLE
snprintf(ddi_log_string, sizeof(ddi_log_string), "initial test range: 0x%lx ~ 0x%lx", start, end);
boot_log_message(ddi_log_string);
#endif
// Set minimum repeat count as 1
if(repeat_count < 1)
repeat_count =1;ret |= get_start_end((uint64*)&start, (uint64*)&end);#if DDI_PRINT_ENABLE
snprintf(ddi_log_string, sizeof(ddi_log_string), " test range: 0x%lx ~ 0x%lx", start, end);
boot_log
...
}

3.未修改代码前,如下是设置地址为0x80000000 ~ 0x380000000的log-OVERFLOW;设置0x80000000 ~ 0x370000000可以测试通过:
如果地址格式对的,但是超出DDR实际地址范围?
如果地址格式(比如8位的数据,你填写的数据不满足8位)不对,会打印?
实际还是和通道数量相关,修改通道后0x380000000可以测试通过。

S - Core 0 Frequency, 1516 MHz 
S - PBL Patch Ver: 0 
D - 6626 - pbl_apps_init_timestamp 
D - 327043 - bootable_media_detect_timestamp 
D - 193523647 - bl_elf_metadata_loading_timestamp 
D - 703 - bl_hash_seg_auth_timestamp 
D - 279518 - bl_elf_loadable_segment_loading_timestamp 
D - 5495 - bl_elf_segs_hash_verify_timestamp 
D - 17248 - bl_sec_hash_seg_auth_timestamp 
D - 821 - bl_sec_segs_hash_verify_timestamp 
D - 29 - pbl_populate_shared_data_and_exit_timestamp 
S - 194161130 - PBL, End 
B - OVERFLOW - SBL1, Start 
B - OVERFLOW - SBL1 BUILD @ 16:06:08 on Oct 21 2021 
D - OVERFLOW - sbl1_hw_init 
B - OVERFLOW - Entering DeviceProg lite 
B - OVERFLOW - usb: init start 
B - OVERFLOW - usb: qusb_dci_platform 
B - OVERFLOW - usb: enum_carried_from_pbl 
B - OVERFLOW - usb: HIGH , 0x900e 
B - OVERFLOW - usb: timer_start , 0x4c4b40 
B - OVERFLOW - usb: ENUM success 
B - OVERFLOW - usb: VBUS High! 
B - OVERFLOW - usb: host sends ZLP 
B - OVERFLOW - UFS INQUIRY ID: SAMSUNG KMJS9001RM-BG01 0200 
B - OVERFLOW - UFS Boot LUN: 1 
B - OVERFLOW - usb: host sends ZLP 
B - OVERFLOW - usb: host sends ZLP 
B - OVERFLOW - usb: host sends ZLP 
B - OVERFLOW - usb: host sends ZLP 
B - OVERFLOW - usb: host sends ZLP 
B - OVERFLOW - usb: bulk_shutdown 
B - OVERFLOW - usb: endxfer EP0 OUT 
Format: Log Type - Time(microsec) - Message - Optional Info 
Log Type: B - Since Boot(Power On Reset), D - Delta, S - Statistic 
S - QC_IMAGE_VERSION_STRING=BOOT.MXF.1.0-00806-LAHAINA-1

4.从如下log可以看出读写测试成功:
工具:

 Run command successfullynew ddr partition flashed to device

串口log:

B -    825787 - Manufacturer ID = 1, Device Type = 8
B -    829386 - Rank 0 size = 6144 MB, Rank 1 size = 6144 MB
D -     30683 - sbl1_ddr_init
D -       152 - boot_pre_ddi_entry
B -    842501 - do_ddr_training, Start
B -    883676 - DDR: Start of DDR Training Restore
B -    887367 - Current DDR Freq = 2096 MHz
B -    888343 - Max enabled DDR Freq = 2736 MHz
B -    892369 - DDR: End of DDR Training Restore
D -     51057 - do_ddr_training, Delta
D -     58896 - sbl1_do_ddr_training
B -    904813 - DDI: memory read command
B -    908198 -   test range: 0x80000000 ~ 0x380000000
B -    911950 -   repeat_count: 1
B -    917196 -  Start Read Test #1
B - 262748655 - ** PASS **
B - 262748685 - DDI: ddr write command
B - 262751217 -   test range: 0x80000000 ~ 0x380000000
B - 262754755 -   repeat_count: 1
B - 262759757 -   random_stride: 0, random_seed: 0xb33e0870
B - 262762898 -   invert_row: 0
B - 262768541 -  Start Write Test #1
B - 319511198 - ** PASS **
B - 3195Format: Log Type - Time(microsec) - Message - Optional Info
Log Type: B - Since Boot(Power On Reset),  D - Delta,  S - Statistic

附:如果DDR training后设置了最大频率导致无法开机,可以尝试通过QDUTT关闭最大频率看能否开机 80-nr058-6:
eDCT --> Open existing eCDT JSON file --> Override Type -->Disable Frequencies
实际上,我们当前json文件由于权限问题不能选择7325,所以这个可以先不用管

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
如此会重新编译生成xbl_config.elf下载进去即关闭最大频率


http://www.ppmy.cn/news/258151.html

相关文章

QCM6490 SSR 记述(一)

项目场景&#xff1a; modem 子系统crash导致系统crash&#xff0c;偶现。且SSR已经关闭。 如果disable_restart_work 设置为DISABLE_SSR&#xff0c;那么不管什么&#xff08;wlan adsp-audio/sensor modem etc&#xff09;触发了SSR&#xff0c;都不会重启 #define DISABL…

Qt延时函数跨天导致的死循环问题

问题描述 进程A给进程B发送数据&#xff0c;进程B收到数据后进行处理。但是奇怪的时跨天的情况下&#xff0c;会偶尔出现进程B收不到数据的情况&#xff0c;重启进程A和进程B后收数据正常&#xff08;进程B管理着进程A&#xff0c;会一起重启&#xff0c;因此不清楚具体那个软…

【CesiumJS入门】(3)ImageryLayer之图层卷帘

前言 上一篇博客简单得介绍了影像图层并成功在视图上加载出来了&#xff0c;而今天我们来实现一个简单的可视化效果&#xff0c;影像图层卷帘。 前置知识&#xff1a;Cesium 事件详解&#xff08;鼠标事件、相机事件、键盘事件、场景触发事件&#xff09;_cesium点击事件_GIS…

《C++高级编程》读书笔记(四:设计专业的C++程序)

1、参考引用 C高级编程&#xff08;第4版&#xff0c;C17标准&#xff09;马克葛瑞格尔 2、建议先看《21天学通C》 这本书入门&#xff0c;笔记链接如下 21天学通C读书笔记&#xff08;文章链接汇总&#xff09; 1. 程序设计概述 在启动新程序&#xff08;或已有程序的新功能&…

SpringBoot整合邮箱验证码实现用户注册

唠嗑部分 今天我们来分享一下在系统开发过程中&#xff0c;如何使用验证码来验证用户并完成用户注册 首先来看一下成品界面展示 说一下以上注册功能的设计&#xff1a; 用户手动输入用户名(全数据库唯一)、密码、确认密码、邮箱地址(单个邮箱最多可注册3个用户)、正确的邮箱…

触屏笔哪个牌子好用?高性价比的电容笔推荐

事实上&#xff0c;苹果原本的电容笔和普通的电容笔最大的区别就是重力压感&#xff0c;市面上还没有一款能像apple pencil这样拥有着独特重力压感的电容笔。但是因为苹果的pencil太贵&#xff0c;很多人都把注意力都放在平替电容笔一边&#xff0c;平替电容笔的性能也在不断提…

哪个牌子的电容笔好,电容笔牌子排行

电容笔作为现在当下热销的数码配件&#xff0c;由于原装的价格太高了&#xff0c;所以市面上出现许多品牌的平替&#xff0c;在无数品牌商加入其中&#xff0c;导致许多小伙伴购选时难度加大&#xff0c;而大部分的品牌都是大同小异&#xff0c;看得眼花缭乱&#xff0c;更不知…

哪个牌子集成灶好用,这款登上《消费主张》栏目的集成灶品牌火了

如今&#xff0c;随着集成灶行业的发展&#xff0c;集成灶品牌众多&#xff0c;产品也比较多样化。因此市场上也出现了十大集成灶排名等供广大消费者参考的权威榜单。那么在这些知名品牌中&#xff0c;哪个牌子集成灶好用&#xff1f;集成灶有哪些功能是值得重点关注的呢&#…