發表文章

目前顯示的是 2015的文章

bash script 範例: 陣列中取字串

#!bin/bash modules=( "ipnc/release;ti814x" "osd/release;Venus" ) function test() {     for module in ${modules[@]}; do         mary=(${module//;/ })         echo ${mary[0]}         echo ${mary[1]}           done } test 執行結果: ipnc/release ti814x osd/release Venus 主要是在modules[@]的@是幹嘛的 以及mary=(${module//;/ })為何可以將字串分成兩個 目前還是有點不懂

UVC 1.5於linux gadget實作(2)

做了一陣子UVC1.5在Windows 8.1上的開發 感覺Microsoft似乎沒有把UVC1.5真的給實作完成 目前號稱有支援UVC1.5的Logitech connect cam 拿來用Cam Diagnostics來分析 看到的都是support UVC1.0...Orz... 實際上Logitech在Windows 8.1上 在Composite Device與Image Device各加了一個自己的driver 通通移除掉後發現變成只支援YUV&MJPG的裝置 原先的H.264 pin也消失 我猜driver一部分功能就是將configuration分成兩個來設定 UVC 1.5 spec提到的multiple configurations,MS所提供的host軟體並沒有能力可以選擇 Logitech應該是利用driver去解決UVC1.1與UVC1.5兩個streaming interface個數不同的問題 另外,從抓到的USB packet看來 Logitech是真的傳送UVC 1.5的packet格式沒錯 但是Cam Diagostics卻認為Logitech connect是UVC 1.0的裝置 只能猜測driver是否扮演了translator的角色 將device傳過來的UVC 1.5 packet翻譯成UVC 1.0(或是UVC 1.1)的packet格式後 再傳給host端去使用 而host端送過來的UVC 1.1 packet又翻譯成UVC 1.5的格式再送過去給device 這比較能解釋為何Logitech捨棄通用的UVC spec不用,改用自己的driver 所以要自己寫driver做這樣的事嗎??? Orz...

UVC 1.5於linux gadget實作(1)

目的主要是要實踐H.264 encoding在USB cam上的實作來支援skype以及lync 2013 主要可以參考microsoft-proposed-extensions-usb-video-class-h264.docx這一份文件 這份文件最重要的部分是 Appendix B  Technical Decisions 以及UVC 1.5 H.264 Implementation Example Appendix B  Technical Decisions裡面的3.Why 2-pin solution?解釋了一個很重要的問題 大概也是很多人從UVC 1.1要改成UVC 1.5最大的卡關之處 就是lync跟skype其實要分成兩個pin 一個是preview pin,專門給lync跟skype preview用 (似乎一定要用640x360的解析度) 另一個pin則是輸出H.264用 那要如何實作才能分成兩個pin呢? 1.encoding unit要實踐 2.output terminal要分成兩個 3.external unit for H.264最好是保留住,才可以向下相容 4.創作兩個streaming interface,將YUV、MJPG寫在其中一個    H.264自己寫成另一個 5.descriptor內的數據先照抄UVC 1.5 H.264 Implementation Example,先騙過UVC host再說 至於gadget內部要怎麼改就看自己內部是怎麼寫了 目前我自己可以實作到lync跟skype都可以抓到裝置且看到preview畫面 但是怎麼讓lync來要H.264 bitstream還是不太清楚 如果有高手知道希望可以不吝指導一下 目前計畫是用Hardware Certification Kit(HCK)來幫忙驗證Webcam H.264 不然好像也無法刻意呼叫H.264能力來使用

記憶體溢位的問題

這兩天發生差點就完蛋的bug 主要是因為記憶體溢位導致重要變數被改寫 因此造成系統無法開機的現象 其實這是之前就存在的程式裡的bug 但是剛好記憶體沒有覆蓋到其他重要的部分 這次修改開機程式時就不幸地(也可以說很幸運地)壓到某個重要變數 還好測試單位有試出來 解決方法主要是參考這篇 http://sholfen.pixnet.net/blog/post/43440068-%E7%AC%AC%E4%B8%80%E6%AC%A1%E7%8E%A9%E7%B7%A9%E8%A1%9D%E5%8D%80%E6%BA%A2%E4%BD%8D%E5%B0%B1%E4%B8%8A%E6%89%8B 回頭我再檢視自己宣告的陣列長度時 果然發現我的char array在承接string時 少考慮了結束字元的長度 因此將原先array長度+1便解決了這個bug 這也是個很好的學習機會 記憶體溢位問題有時不好抓,尤其在沒辦法單步執行與觀察記憶體變化的機器上 還好這次很快地找到問題點 下次要特別注意陣列長度,免得再次發生記憶體溢位的問題

linux fuse-exfat於嵌入式系統的設定

要讓linux支援exfat格式是頗麻煩的一件事 一開始先試用nofuse-exfat 但裡面所支援的readdir function在某些版本的linux kernel無法正常作業 導致其他程式要讀取隨身碟裡的檔案時無法顯示 因為我們也沒辦法隨便換kernel版本,所以就放棄使用nofuse-exfat 不能使用nofuse-exfat,那只好使用fuse-exfat 但是fuse-exfat比較複雜 需要至少兩包東西: 1.fuse-2.9.3 2.fuse-exfat-1.1.0 3.exfat-utils-1.1.1(這個應該不一定需要,但我還是放進去了) 於是乎就開始compile這三包東西了 1.fuse-2.9.3 這個算是比較簡單的了 只要將cross compile環境設定好應該就OK了 我自己寫了一個簡單的script來跑 ./configure --prefix=$PWD/release --host=`/opt/toolchains/armv7-marvell-linux-gnueabi-softfp_i686/bin/arm-marvell-linux-gnueabi-gcc -dumpmachine` --enable-lib --enable-util --enable-example --exec-prefix=$PWD/release make clean make mkdir release mkdir release/lib cp lib/.libs/libfuse* release/lib 因為我是在marvell 78460上跑,所以使用的gcc是marvell版本的 請自行代換 compile之後在fuse-2.9.3/lib/.libs裡會出現libfuse.so.2.9.3以及相關的link檔 這就表示成功啦~ 到時fuse-exfat會需要reference這個lib以及include檔案夾內的東西 2.fuse-exfat-1.1.0 這個東西頗麻煩的 因為它是使用scons來compile的,而非一般常用的Makefile 所以請先下載scons 接下來要修改不少東西 (...

busybox bootchartd使用方法

花了一點工夫才知道要怎樣使用busybox底下的bootchartd 這是一個評估開機流程的圖形化工具 可以幫助最佳化開機的好幫手 1.首先,要看自己的linux system是利用甚麼機制開機的    可參考 http://www.bootchart.org/docs.html    我們自己的system可設定在/etc/init/rcS的開頭加上一行/sbin/bootchartd start 2.完成後的bootlog.tgz就可以拿到linux的機器上轉換成PNG檔    不過事情沒這麼簡單    使用bootchart bootlog.tgz轉換後,出現這樣的error訊息: File "/usr/lib/pymodules/python2.7/pybootchartgui/draw.py", line 340, in draw_header     txt = headertitle + ': ' + mangle(headers.get(headerkey)) TypeError: cannot concatenate 'str' and 'NoneType' objects    此時有搜尋到一個解決方法: https://books.google.com.tw/books?id=WuktAgAAQBAJ&pg=PT109&lpg=PT109&dq=busybox+bootchartd&source=bl&ots=FGwBHsCpty&sig=E6x1JH5vLzhEzq41uBHYbfiU-_w&hl=zh-TW&sa=X&ei=2W6jVNWIM4Xp8AXf04HQBA&ved=0CFsQ6AEwCA#v=onepage&q=busybox%20bootchartd&f=false   大意就是把某幾行程式給mark註解掉 3.事情還沒完,改完後再跑依然出現: File "/usr/lib/pymodules/python2.6/pybootchartgui/draw.py", line ...