【海思】Hi3516A 執行sample_venc的demo核心奔潰(DDR問題)

李春港發表於2021-03-10

作者:李春港
出處: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的位寬進行設定:Hi3516AV100R001C01SPC050\01.software\board\Hi3516A_SDK_V1.0.5.0\package\osdrv\osdrv\tools\pc\uboot_tools\Hi3516A-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.hardware\chip\document_cn\Hi3516A\《Hi3516D 專業型HD IP Camera Soc使用者指南.pdf》
  • 01.software\board\document_cn\Hi3516A\《Hi3516D U-boot 移植應用開發指南》
  • 02.Only for Reference\03.hardware\documents_cn\Hi3516A\《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進行壓力測試也正常了。

相關文章