zoukankan      html  css  js  c++  java
  • 【海思】Hi3516A 运行sample_venc的demo内核奔溃(DDR问题)

    作者:李春港
    出处:https://www.cnblogs.com/lcgbk/p/14514297.html

    一、前言

    由于项目需要,在3516a芯片上通过采集bt1120的视频数据实现H264编码。所以就直接在sdk中的mpp/sample/venc/sample_venc.c例程中修改代码进行vi->vpss->venc通路的测试,但是并没有那么顺利,发现一有视频源接进来到了vpss层,内核就出现了各种报错,有时候直接卡住没有任何信息打印,有时候又会打印一大堆看不懂的内核报错,如下:

    
    ================vpss 0 debug info=============
    ===debug info from 0000-0100===
    0000 : 040c000d 00000000 00000006 00000000
    0010 : 02cf04ff 00000000 00000000 00000000
    0020 : 87070300 87151300 05000500 80000000
    0030 : 8c667000 8c667010 8c667020 8c74f0a0
    0040 : 05000500 8c91f1c0 8c91f1c0 00000140
    0050 : 00000000 00000000 00000000 00000000
    0060 : 00000000 00000000 00000000 00000000
    0070 : 00000000 00000000 00000000 00000000
    0080 : 00000000 00000000 00000000 00000000
    0090 : 00000000 00000000 00000000 00000000
    00a0 : 00000000 00000000 00000000 00000000
    00b0 : 00000000 00000000 00000000 00000001
    00c0 : 8c7c30e0 8c7c30f0 8c7c3100 8c8ab180
    00d0 : 05000500 00000003 02cf04ff 8778d480
    00e0 : 87790180 87791800 87872800 05000500
    00f0 : 00000000 01df02cf 00000000 00000000
    ===debug info from 0100-0200===
    0100 : 8c41b000 8c46f600 02d002d0 00000000
    0110 : 1fff1fff 00000000 00000000 00000000
    0120 : 00000000 00000000 00000003 02cf04ff
    0130 : 87621100 87623e00 87625480 87706480
    0140 : 05000500 00000000 00000000 00000000
    0150 : 00000000 00000000 00000000 00000000
    0160 : 00000000 00000000 00000000 00000000
    0170 : 00000000 00000000 00000000 00000000
    0180 : 02cf04ff 00000000 00000000 00000000
    0190 : 00000000 00000000 00000000 00000000
    01a0 : 00000000 0fff0fff 00000000 0fff0fff
    01b0 : 00000000 0fff0fff 00000000 00000000
    01c0 : 00000000 00000000 00000000 00000000
    01d0 : 00000000 00000000 00000000 00000000
    01e0 : 00000000 00000000 00000000 00000000
    01f0 : 00000000 00000000 00000000 00000007
    ===debug info from 0200-0300===
    0200 : 86000200 86001b00 86001100 86002a00
    0210 : 86000700 86001f00 86000f00 86002800
    0220 : 00000000 00000000 00000000 00000000
    0230 : 00000000 00000000 00000000 00000000
    0240 : 8c941000 00000000 8c941600 00000000
    0250 : 00000000 8c940a00 00000000 00000000
    0260 : 00000000 00000000 00000000 00000000
    0270 : 00000000 00000000 00000000 00000000
    0280 : 00000000 00000000 00000000 00000000
    0290 : 00000000 00000000 00000000 00000000
    02a0 : 00000000 00000000 00000000 00000000
    02b0 : 00000000 00000000 00000000 00000000
    02c0 : 00000000 00000000 00000000 00000000
    02d0 : 00000000 00000000 00000000 00000000
    02e0 : 00000000 00000000 00000000 00000000
    02f0 : 00000000 00000000 00000000 00000000
    ===debug info from 0300-0320===
    0300 : 00000000 00000000 00000000 00000000
    0310 : 00000001 07006433 00000000 ffffffffKernel panic - not syncing:
    ASSERT failed at:File name: /home/pub/temp/platform_ipc/mpp/code/mkp/../arch/hi3516a/hal/vpss/vpss_drv.c
    Function : VPSS_DRV_IsWrongInt
    Line No. : 4180
    Condition: 0
    

    但是不运行sample_venc例程的时候,板子一切正常,没有任何的异常情况出现,一到运行sample_venc例程就出现各种报错,所以一开始就以为是代码出现了问题,就一直停留在sample_venc的代码中寻找问题,找了很久也没找到问题。这个时候就开始各种怀疑,怀疑FPGA给过来的bt1120数据有问题,怀疑硬件的DDR有问题。

    在FPGA工程师寻找无解的时候,我就决定对海思外围的两片DDR进行压力测试。

    二、使用memtester对ddr进行压力测试

    如何安装和使用memtester工具,上一个文章已经写了,这里就不多说了,网址:https://www.cnblogs.com/lcgbk/p/14497838.html

    使用memtester工具测试后发现每次测试到第二片ddr的时候,内核就会出现和运行sample_venc例程一样的内核异常。

    这个时候我肯定是怀疑是DDR硬件问题了,所以板子给到了硬件工程师重新焊接了DDR,最后发现还是不行,硬件工程师又说两片DDR的走线和硬件上面没什么差异,这不得不让我怀疑是我的软件层问题。后来发现还真的是软件层的问题,uboot的DDR位宽设置有误。

    三、修改uboot的DDR位宽

    在Windows打开下面这个文件,对DDR的位宽进行设置:Hi3516AV100R001C01SPC0501.softwareoardHi3516A_SDK_V1.0.5.0packageosdrvosdrv oolspcuboot_toolsHi3516A-DMEB-uboot-DDR250M-1GB-32bit-CPU600M-BUS198M.xls

    点击《mddrc_dmc1》页,发现DDR的位宽被改为了0x16也就是16bit的DDR位宽,但是我们板子使用的DDR是两片16bit的DDR,所以这里需要改为32bit的,否则就会有一块使用不了或者使用异常。将0x16改为0x26保存。

    点击《main》页,点击《Generate reg bin file》按钮,生成reg_info.bin文件。

    参考文档:

    • 00.hardwarechipdocument_cnHi3516A《Hi3516D 专业型HD IP Camera Soc用户指南.pdf》
    • 01.softwareoarddocument_cnHi3516A《Hi3516D U-boot 移植应用开发指南》
    • 02.Only for Reference3.hardwaredocuments_cnHi3516A《Hi3516D DDR配置指导说明.pdf》

    四、编译修改DDR位宽的uboot镜像

    • 进入boot源代码目录,将生成的u-boot.bin 复制到osdrv/tools/pc/uboot_tools/目录下
    • 运行./mkboot.sh reg_info.bin u-boot-ok.bin
    • 生成的u-boot-ok.bin即为可用的u-boot镜像
    • 将u-boot镜像烧录到板子上

    到此运行sample_venc正常了,使用memtester对ddr进行压力测试也正常了。

  • 相关阅读:
    Java 日志
    编写用例文档
    uml用例关系
    地址线和数据线
    Android总结
    DbUtil数据库连接
    PropertiesUtil
    log4j.properties配置
    自定义博客样式
    css给文字加下划线
  • 原文地址:https://www.cnblogs.com/lcgbk/p/14514297.html
Copyright © 2011-2022 走看看