2013年2月7日 星期四

海康NVR 與 AM ONVIF 溝通過久的議題 (補2/5)

2/1
客戶反映他們使用NVR 連接AM系列產品時,需要花費15分鐘NVR才會出現影像。
=> 2/4 早上到客戶那實地測試。
2/4
到客戶端實地測試結果:
  • 問題一:
當NVR發出ONVIF指令溝通時,每道指令都要花費2~3秒的時間,且回傳的封包會被分割成數十段小封包(封包大小不一,有時還會出現長度為"0"的封包)。但是A-MTK的產品每道指令卻花費不到0.5秒的時間,且封包大小都是維持為"1448"。
方案:目前還找不出原因。
  • 問題二:
當NVR連線設備RTSP(UDP)影像後,當網路出現斷線後,設備端無法在短時間之內中斷。
方案:
1. 設定RTCP socket recv timeout => 沒用,因為雖然RTCP recv thread 結束,但卻不會更改RTSP相關狀態。
2. 在polling 的地方,當ETH0 狀態變更且為斷線時,重新啟動RTSP stream.
3. 另外,將RTSP session timeout 由60秒縮短為15杪。
  • 提供新板FW給客戶驗證。
客戶測試後,新增設備到影像出現,仍然需要一分10秒左右,客戶希望我們能直接現場解決,不然可能就會改單。
2/5
客戶端實測與比較A-MTK與我們設備的ONVIF 溝通的回傳值得差異。發現一些相異的地方。

  • 相同處:
A-MTK與我們的設備都有六個video profile

  • 相異處:
A-MTK: 在getProfiles 只回應一組,切換解析度是以setEncoderParamater來改變對應的profile。
AM系列:getProfiles回應六組profiles,切換解析度就是直接對應profile。缺點:NVR必須花費更多CMD來讀取個profile 的設定值。

  • 初步改善方案: 

在getProfiles CMD只回復第一組profile 以爭取最少的CMD 數完成ONVIF 的溝通。修改後,NVR與設備溝通時間明顯縮短,由原先一分多縮短為20~25秒。
客戶初步能夠接受,但還是希望我們能再縮短時間,希望能夠縮短到10~15杪。
 
 
 


2013年2月6日 星期三

build uClibc toolchains using Buildroot for GM812x (續一) (補2/4)

參考來源:



  • http://communities.mentor.com/community/cs/archives/arm-gnu/msg01673.html
  • http://communities.mentor.com/community/cs/archives/arm-gnu/msg02332.html


問題解決:


  • 在產生nsboot.bin (gm8126_mp) 發生以下錯誤:
output/host/usr/lib/gcc/arm-buildroot-linux-uclibcgnueabi/4.6.3/libgcc.a(_dvmd_lnx.o): In function `__aeabi_ldiv0':
output/toolchain/gcc-4.6.3/libgcc/../gcc/config/arm/lib1funcs.asm:1266: undefined reference to `raise'
make: *** [nsboot] Error 1

網路上有幾篇文章有相關類似的說明,大致上應該是boot 通常都是 non GNU/Linux application,而ARM EABI" toolchains 卻是 GNU/Linux,所以導致相衝的問題。
解決方案:

  1. 直接修改原始檔,將 raise() 直接回傳 zero. (只是不清楚要改哪,所以跳過)
  2. 直接使用原廠提供的glibc 產生的 nsboot.bin檔。不再產生uClibc 的nsboot.bin。 

 

build uClibc toolchains using Buildroot for GM812x (補2/1)

參考來源:

  • uClibc Web site : http://uclibc.org/toolchains.html
  • http://linux.derkeiler.com/Mailing-Lists/Kernel/2009-03/msg04460.html
  • http://www.crifan.com/make_uimage_error_conflicting_types_for_getline_stdio_h_previously_declaration_was_here/
  • https://bugzilla.redhat.com/show_bug.cgi?id=493941


步驟:
1. 在uClibc官網中(http://uclibc.org/toolchains.html)有簡易的說明如何此用 Buildroot 來產生 uClibc 的 toolchains.
2. 下載 Buildroot,然後修改設定檔:(run 'make menuconfig')

  • Target Architecture (ARM (little endian))
  • Target Architecture Variant (arm926t)
  • Target ABI (EABI)
  • Toolchain  --->
    • Kernel Headers (Linux 2.6 (manually specified version))
    • (2.6.28) linux version 
  • Filesystem images ==> 全部取消
3. run 'make'

問題修正:

  • 當在build 到 output/toolchain/linux-2.6.28 kernal時會出現以下的錯誤。


   scripts/unifdef.c:209: error: conflicting types for 'getline'
   /usr/include/stdio.h:653: note: previous declaration of 'getline' was here
   make[2]: *** [scripts/unifdef] Error 1
   make[1]: *** [__headers] Error 2
   make[1]: Leaving directory `/home/ken/WrkSrc/test1/Grain/grain/test_tmp/buildroot-      2012.11.1/output/toolchain/linux-2.6.28'
  make: *** [/home/ken/WrkSrc/test1/Grain/grain/test_tmp/buildroot-2012.11.1/output/toolchain/linux/.configured] Error 2

        在網路上搜尋到有兩種解決方式(請看參考來源),一種是直接修改 "scripts/unifdef.c",將"getline"函式直接修改成其他的名字(例:parseline);另外一種是在 CFLAGS 中加入 "-D_POSIX_C_SOURCE=200112L"。
※ 若是採用第一種方式,每次當 buildroot run 'make clean' 後,就必須再修改一次。(至於第二種不知道加在哪,所以沒試)
        此外網路上也有說明這問題已經在2009/04已經修正。


  • 安裝額外的lib (prec)時,發生需要支援 large file support.
    => 修改 buuild 設定檔。
    • Toolchain  --->
      •  [*] Enable large file (files > 2 GB) support