QCM6490 QUDTT测试

前言:

基于最新版 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也是可以的,修改后读写测试pass
  for (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 successfully
 new 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下载进去即关闭最大频率

  • 25
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 12
    评论
QCM6490启动流程梳理: QCM6490是一种启动流程的处理器芯片,它具有一系列的启动流程。 首先,当电源被打开时,芯片进入到Reset状态,在这个状态下,芯片的所有寄存器、电路和功能都被重置为初始状态。接下来,芯片进入到Boot ROM的阶段,Boot ROM是一个存储器模块,其中包含了初始化引导程序的代码。引导程序的主要功能是加载操作系统和其他应用程序。 引导程序被加载完成后,芯片进入到初始化硬件的阶段。在这个阶段,芯片会对各种硬件组件进行初始化设置,例如外设接口、存储器控制器和时钟模块等。 接着,芯片进入到加载操作系统的阶段。操作系统通常存储在外部存储器中,如闪存或SD卡。在这个阶段,芯片会通过外设接口加载操作系统的代码和数据,并将控制权交给操作系统。 一旦操作系统加载完成,芯片进入到操作系统启动的阶段。在这个阶段,操作系统会初始化各种系统服务和设备驱动程序,为用户程序和应用程序提供运行环境。同时,操作系统也会监控芯片的各种状态和响应用户的指令。 最后,芯片进入到用户程序的运行阶段。在这个阶段,用户程序和应用程序可以与芯片进行交互,执行各种任务和功能。芯片的启动流程到此结束。 总体来说,QCM6490的启动流程包括重置芯片、加载引导程序、初始化硬件、加载操作系统和启动操作系统等几个关键步骤。这个流程确保了芯片在启动时的正常运行,并为用户提供一个良好的使用环境。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

墨染天姬

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值