做者:李春港
出處:https://www.cnblogs.com/lcgbk/p/14514297.htmlhtml
因爲項目須要,在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工具,上一個文章已經寫了,這裏就很少說了,網址:http://www.javashuo.com/article/p-qmcgywiu-vg.htmldebug
使用memtester工具測試後發現每次測試到第二片ddr的時候,內核就會出現和運行sample_venc例程同樣的內核異常。code
這個時候我確定是懷疑是DDR硬件問題了,因此板子給到了硬件工程師從新焊接了DDR,最後發現仍是不行,硬件工程師又說兩片DDR的走線和硬件上面沒什麼差別,這不得不讓我懷疑是個人軟件層問題。後來發現還真的是軟件層的問題,uboot的DDR位寬設置有誤。orm
在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保存。
htm
點擊《main》頁,點擊《Generate reg bin file》按鈕,生成reg_info.bin文件。blog
參考文檔:
到此運行sample_venc正常了,使用memtester對ddr進行壓力測試也正常了。