發表文章

在Gerrit新開一個issue

研究很久,才對repo比較孰悉一點 這次是遇到前一個issue merged上去後要新開一個issue 簡單說就是commit可能之前會累積很多個,要清除掉只剩一個最新的就好 基本上就適用repo sync把commit拉到最新 再把新的source code放上去就好 但因為要新開issue,commit需要包含的格式如下     AVer firmware updater for CAM520, CAM540, VB342 and CAM340     This CL adds AVer firmware updater to handle CAM520, CAM540, VB342     and CAM340 camera firmware update     Refer to CL: 1385964: aver-updater: Add aver-updater firmware ebuild     BUG=None     TEST=we test our device in developer mode on ASUS chromebox.     Main test is hotplug CAM520 CAM540, VB342 or CAM340 to chromebox,     and the firmware automatically download from google local mirror.     Then device update the firmware by aver-updater successfully.     Change-Id: I820920e538b14198e51aafec30b9b312e1da7a31 Cahnge-Id拿掉,才會產生新的issue,不然會繼續上傳到舊的issue去

Google Chrome OS ebuild上傳流程

圖片
還是經常會被ebuild上傳流程給打敗 這邊跟firmware-updater的方式不一樣 每次做都會遇到不一樣的狀況 最好的方式就是做個詳細的解說 當你使用git add或是其他git指令加完要上傳或是修改的檔案後輸入git commit -a 要先去參考一下git log 上面除了敘述之外還有三個欄位TEST、BUG、Change-Id。如果今天是想創建一個新的ebuild project,那就不用Change-Id。TEST與BUG其實填入你做了甚麼測試跟修了甚麼BUG。如果今天只是要修改ebuild後上傳,那就加入之前的Change-Id,Gerrit系統自然會分辨你要上傳的project是哪個。 然後改完之後使用"repo upload ."上傳,這代表上傳這個目錄下的東西就好。 如果通過應該會顯示下面的字眼 如果有問題會出現下面的狀況 老實說這每次都覺得很難搞 第一段是說要增加一個-r1的symlink或是改ebuild版號 第二段是要解決空白鍵的問題 但一直改不過 最後發現下"repo upload . --no-verify" 在這個選項再選NO,就可以建立出新的project Run hook scripts from https://chromium.googlesource.com/chromiumos/manifest.git (yes/always/NO)? NO 一點小經驗: 這次要改ebuild裡面的東西,似乎就需要進版號 說實在頗麻煩,我到現在還是不太懂他的規則 這邊可能還需要去詳讀一下ebuild的上傳規則 目前又遇到問題是新修改的ebuild要上傳被說有空白鍵要消除 如果使用"repo upload . --no-verify" 會跳出Squash the commits with the same Change-Id or ensure Change-Ids are unique for each commit) 這表示有不同的Change-Id在不同的branch裡面 結果再使用git re...

解決ccache: error: execv of /opt/toolchains/oecore-x86_64/sysroots/x86_64-oesdk-linux/usr/bin/aarch64-oe-linux/aarch64-oe-linux-gcc failed: No such file or directory

*為了解決ccache: error: execv of /opt/toolchains/oecore-x86_64/sysroots/x86_64-oesdk-linux/usr/bin/aarch64-oe-linux/aarch64-oe-linux-gcc failed: No such file or directory  有toolchains但是編譯一直失敗,想說直接執行gcc看看,但也失敗 可以使用下面的cmd去看看動態函式庫是否有少東西  https://stackoverflow.com/questions/43412649/cross-compilation-for-arm-error-no-such-file-or-directory-command-not-found  readelf -l /bin/ls | grep 'program interpreter'  bin/ls可置換成自己想要的執行檔  範例:  readelf -l /opt/toolchains/oecore-x86_64/sysroots/x86_64-oesdk-linux/usr/bin/aarch64-oe-linux/aarch64-oe-linux-gcc | grep 'program interpreter'  [Requesting program interpreter:  /usr/local/oecore-x86_64/sysroots/x86_64-oesdk-linux/lib/ld-linux-x86-64.so.2]

Google C++ coding style一點心得

最近開始跟google的工程師做code review 真的是被電得一蹋糊塗阿 對方看得非常仔細,而且提出了很多我程式邏輯不太通順的地方 雖然很多起因是我照之前sample code的邏輯硬是下去改 但的確後續我就沒有特別思考前後是否功能有重複或是多餘的部分 這邊被對方找出非常多問題出來 可以感覺google對沒有用的程式碼非常在意 當然也有可能是這個reviewer自己本身很討厭多餘的東西放在code裡面 除了註解要寫得盡量清楚之外 程式本身可以越精簡越好 我本身對C++並不是很熟悉,常會用C語言的方式硬幹 但是的確對用C++的人來說是很笨的做法 有幾個點特別被點出來,紀錄一下以免以後忘記 1.Google C++不使用#define,改用const 原因是似乎是要預先pre-compile,會多耗資源 2.傳引數使用call by reference而不使用call by value http://wp.mlab.tw/?p=176 原因是會浪費很多記憶體空間 尤其我笨笨的傳struct進去函數裡面,非常糟糕 call by reference就是變數的address跟value在上層跟下層函數都會是一樣的 就不會浪費多餘的空間去記憶 3.class裡private的變數後面要多加"_"做為區別 4.函數名稱使用大寫例如PerformUpdate() 5.區域變數使用小寫加"_",例如video_image_version 6.const前面要多加"k",後面用大寫,例如kDefaultVideoDeviceMountPoint 7.行尾空白鍵要去除

打通新板子上uboot & kernel的網路IC

這次新版子回來有遇到網路不太通的狀況 老闆在kernel做了一些rgmii phy clock delay的調整 主要是透過delay對clock做一些校正 讓icplus ip1001這顆IC的clock可以對準一點 另外uboot應該也是做了同樣的事 這樣網路才可以正常運作 這是一個好的經驗學習,下次要記得有這些東西可以調整

如何建立chromium firmware updater測試環境

圖片
最近都在搞chromium的firmware updater 雖然在https://www.chromium.org/chromium-os/developer-guide 算是寫得蠻詳盡的 但是實際上測試環境要搞起來還是花了一番功夫 chromeOS為了不讓人隨便埋一些code進去駭客 還是需要做一番設定才可以把你的source code丟到目標機台上 不像一般linux環境只要可以cross compile就可以把程式丟到目標版上去執行 1.下載depot_tools (裡面有bootstrap的設定要做,不然後面檢查檔案時會出現permission denied) 2.下載chromium OS(使用repo而非git,相關的套件可以透過apt-get取得) 3.export depot_tools,這樣才可以使用cros_sdk進入chormiumOS的compile環境 4.執行cros_sdk後可以看到~/trunk/src/script$,目的是確保每一份chromiumOS都是在相    同的環境下被compile出來 5.build image,一定要是test版本的,這樣後續才有SSH功能可以上傳檔案,會產生一個    chromiumos_test_image.bin    (做之前做好確定一下空間有4GB以上,而且需要兩三個小時的時間)    (參考https://www.chromium.org/chromium-os/developer-guide "Building    ChromiumOS"的順序一步一步來即可) 6.製作USB開機碟,在windows上可用chrome下載Chromebook Recovery Utility    將image給燒錄進去USB隨身碟 7.使用USB開機碟開機(chromiumOS主機需打開這個功能,須進入developer mode)     (default帳號是chronos,密碼是test0000) 8.package要cros_workon --board=${BOARD} start ${P...

在嵌入式linux系統中使用android adbd,PC可直接透過USB對console下指令

可以參考這一篇 http://www.cnblogs.com/zengjfgit/p/6289873.html /* ************************************************************************ * android-tools adb for ARM Linux * 说明: * 有时候还真是系统通过USB线直接连接到ARM主板,这样就不一定需要网络才 * 能传输文件,在做系统更新的时候,有时候也是不错的。 * * 2017-1-16 深圳 南山平山村 曾剑锋 *********************************************************************** */ 一、参考文档: 1 . [Buildroot] [PATCH v4] android-tools: add new package http: // lists.busybox.net/pipermail/buildroot/2015-November/145112.html 2 . Linux modules install http: // www.cnblogs.com/helloworldtoyou/p/6180404.html 二、内核配置: .config - Linux/arm 3.0 . 35 Kernel Configuration ────────────────────────────────────────────────────────────────────────────── ┌────────────────────────── USB Gadget Support ───────────────────────────┐ │ Arrow keys navigate the menu. <Enter> selects submenus ---> . │ │ Highlig...

bash:偵測程式pid消失後自動執行

測試小程式 當aplay pid消失後,程式會偵測到pid消失 然後再執行 pidof可以偵測程式的pid 無限while loop也可以這麼寫 #!/bin/sh aplay -D plughw:1 /mnt/shield/song.wav -v & arecord -D plughw:1 -r 48000 -c 2 -f s16_le  /mnt/shield/test.wav & while : do     pid1=$(pidof aplay)     pid2=$(pidof arecord)     echo aplay=$pid1 arecord=$pid2     if [ -z $pid1 ]; then           kill -9 $pid2         rm -fr /mnt/shield/test.wav         aplay -D plughw:1 /mnt/shield/song.wav -v &         arecord -D plughw:1 -r 48000 -c 2 -f s16_le  /mnt/shield/test.wav &     else         sleep 1     fi       done

lighttpd + fcgi + C language to do file upload & download

最近使用lighttpd當作http server 搭配fcgi來寫檔案上傳跟下載功能 比較討厭的是,html我完全不會寫啊~~~ 還有fcgi的範例也非常地缺乏 其他語言有很多相關API可以使用 C語言的話就得要自己寫 這邊就講一下是怎樣實現的 首先是下載的部分: 一開始得先要有個html給人下載 可以使用下面的範例             printf("Content-type: text/html\r\n"             printf("<hr />");             printf("<a href='/download/?message'>message</a>");             printf("<hr />"); 當有人點選"message"後會跳轉另一個網址 之後可以利用queryString = getenv("QUERY_STRING"); 去判別server跳轉進來的下載網址 此時需要提供另一個html告訴browser要下載東西             printf("Content-type:   application/octet-stream\r\n");                       printf("Content-Transfer-Encoding: Binary\r\n");             printf("Content-Length: %d\r\n", size);                     ...

在shell script執行某程式之後判斷是否成功

sh /etc/init.d/rcS if [ $? -ne 0 ]; then     /sbin/check 1; fi $?  is the exit status of the most recently-executed command; by convention, 0 means success and anything else indicates failure.

怎樣刪除文件的前N行?

在linux 下,删除文件file中的第1到第N行:  sed -i    '1,N d'    file PS: 上面是对原文件file做删除操作。 sed   '1,N d'    file  > newfile PS: 上面是保持原文件file不变,做删除操作后将结果另存为newfile。

buildroot可以先make想要的某些package

最近正在玩buildroot 打算用buildroot解決一些需要用到的pakcage 看看是否可以解決大部分相依性的問題 但發覺buildroot裡很多package會使用到libtool裡的aclocal.m4以及m4 folder 會出現version check error 原因是使用了舊的aclocal.m4及m4檔案夾內的script 解決方法是buildroot可以單獨編譯某個package 因此可以先make libtool後再執行make 這樣就可以將aclocal.m4等的檔案先編譯出來給其他package用

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 ...