2014年4月23日 星期三

Ubuntu上cross compile DM813x qt binary

假設已經下載回ezsdk


  1. 執行{EZSDK}目錄下的./setup.sh,這是為了設定環境
  2. 在程式目錄下(ex. ~/Workspace/demo)執行qmake -project,產生.pro檔案
  3. 執行qmake,產生make檔
  4. 執行make

memo用~~

2013年12月10日 星期二

在Ubuntu上cross compile Chromium然後放到Pandaboard上執行

最近接到個任務,需要在embedded system上面跑HTML5的程式。目前對HTML5支援最高的非Google的Chrome莫屬,只不過Google沒有提供arm架構的Chrome,所以如果有需要的話只能自己build。

Chrome有個雙胞胎弟弟叫做Chromium,可以視為Chrome的beta版本。Google提供Chromium的原始碼以及編譯工具,有需要的人可以自己下載回來編譯。

這篇文章會一步一步的介紹編譯的過程,到最後把Chromium的程式放到embedded system上跑起來為止。

我的環境是透過Mac上面的VM跑Ubuntu 12.04,然後所有的編譯動作都在Ubuntu上執行。因此首先需要安裝Ubuntu 12.04,詳細的過程在此就不多做介紹。

特別需要注意的是,抓回來的原始碼檔案大概有8G,加上編譯的時候需要的空間會佔掉許多,個人建議不要小於20G的空間。

編譯Chromium


Google為Chrome的編譯準備了許多的工具,包含了下載原始檔的script、設定工具、cross compile等等,這些工具可以透過git來抓取,但是在這之前必須要先把git升級到1.7.5以上:

ㄧ、下載(更新)git
$ apt-get install git

安裝好之後,接下來就可以準備下載工具了。為了之後管理方便,我另外掛了一個虛擬硬碟上去,把所有跟Chrome有關的檔案都放在裡面,目錄是/media/Chromium,後面都會預設裝載這個資料夾下。

二、下載depot_tools
$ git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git 

執行結束之後會在當前目錄下產生一個目錄depot_tools,裡面放著許多之後會用到的小工具。

工具抓完之後記得把depot_tools加入PATH下,比較方便。除此之外,方便起見也可以順便寫到自己的.bashrc裡面。
$ export PATH="$PATH":`pwd`/depot_tools 

完成之後接下來就可以利用depot_tools裡面的fetch來下載原始碼了。

三、 下載chrome
$ fetch chrome --nosvn=True

由於我不會貢獻程式碼,所以在後面加入參數 --nosvn=True。相關的參數設定很多,有需要的請參照這裡

通常下載程式碼需要好幾個小時以上(我自己是花了大概6hr),所以這時候可以去打茫一下。

下載結束之後,會看到/media/Chromium下面多了個 src 資料夾,所有抓回來的程式都在這資料夾下面


進入/media/Chromium/src裡面看看抓回來的東西


好了,東西抓回來之後可以開始build code了。由於我之後是要將chromium放到Pandaboard上面,Pandaboard是個 ARM 架構的嵌入式系統,所以必須透過 cross compiler來編譯chromium。幸運的是depot_tools裡面已經提供了相關的工具,我們只要設定好環境參數,再執行相關的script就可以完成。

四、 下載ARM架構的相關tool chain
$ cd src
$ ./build/install-build-deps.sh --arm

五、 設定tool chain路徑以及相關參數
export GYP_DEFINES="target_arch=arm arm_float_abi=hard"
export CC=arm-linux-gnueabihf-gcc
export CXX=arm-linux-gnueabihf-g++
export AR=arm-linux-gnueabihf-ar
export CC_host=gcc
export CXX_host=g++

建議上面這些參數也可以寫到自己的.bashrc裡面,省得以後還要重打。如果想要知道更多的資訊可以參考這裡


在編譯之前先執行以下指令,目的是為了要準備好編譯的環境
$ gclient runhooks

最後就可以執行編譯了
$ ninja -C out/Release chrome

上面的指令會在src目錄下新增一個out/Release 目錄,所有編譯出來的東西都放在這裡面。chromium的編譯分為Debug版本以及Release版本,這例子編譯的是Release版本,如果要編譯Debug版本只要把Release改為Debug就可以了
$ ninja -C out/Debug chrome

chromium的執行需要一個sandbox的binary,在編譯的時候也可以一起產生,命令如下:
$ ninja -C out/Release chrome chrome_sandbox

這樣就會在編譯完後在Release目錄下產生chrome_sandbox檔案


Deploy到Pandaboard上

程式碼build完之後,接下來把Release裡面所有的資料copy到Pandaboard的file system上,我是放在~/Chrome/Release裡面方便管理。

第一次在執行程式的時候,很有可能會遇到library找不到的問題,像我就遇到了一個
$ ./chrome
libxss.so.1 cannot open shared object file, no such file or directory

解決的方法就是把找到對應的檔案,並且安裝好。Linux上面有一個工具apt-file可以幫我們找到檔案對應的套件是哪個,知道之後再利用apt-get install來安裝這個套件


ㄧ、 首先先安裝apt-file,由於apt-get版本好像太舊的關係,所以要先更新apt-get再利用apt-get來安裝apt-file
$ apt-get update
$ apt-get upgrade

apt-upgrade會更新所有的程式,個人覺得應該不必要

二、 安裝apt-file
$ apt-get install apt-file

三、 找到缺少的lib
$ apt-file search libxss.so.1

上面這行訊息回給我libxss1,所以這下就知道要安裝這個套件
$ apt-get install libxss1

再次執行chromium,出現"Running without the SUID sandbox!"錯誤訊息,這問題先取消使用sandbox來work around
$ chrome --no-sandbox

這樣就可以執行起來了

暫時寫到這邊,剩下的等到有空再寫






2013年12月9日 星期一

在Pandaboard上面安裝Chromium


  1. 把cross compile完的chrome放到PandaBoard上
  2. 執行時系統出現 libxss.so.1 cannot open shared object file no such file or directory
  3. 安裝apt-file,在這之前要先更新apt-get
  4. 執行apt-get update
  5. 執行apt-get upgrade
  6. 執行apt-get install apt-file
  7. 執行ldd /usr/bin/chrome來找出缺少的lib,找到缺少libXss.so.1
  8. 執行apt-file search libXss.so來找出這個lib存在哪個檔案,找到libxss1
  9. 透過apt-get install libxss1來安裝相關lib
  10. 再次執行chrome,出現running without the suid sandbox


reference:
  1. http://askubuntu.com/questions/59703/skype-error-while-loading-shared-libraries-libxss-so-1-cannot-open-shared-obj
  2. http://www.360doc.com/content/11/0420/16/11586_111051270.shtml
  3. http://blog.sina.com.cn/s/blog_49b2f03a0100o6qa.html
  4. http://cysec.org/blog/2012/03/19/missing-libraries-for-skype-on-ubuntu-12-04-lts-precise-pangolin/
  5. http://mayecn.com/blog/2013/04/25/ubuntu-64-robocup/

2013年11月15日 星期五

在Mac上面設定透過rs232擷取serial資料

1. 先上網買條rs232轉usb的線


2. 到系統資訊看型號

3. 下載Driver,我的製造商是Prolific,在http://www.prolific.com.tw/US/ShowProduct.aspx?p_id=229&pcid=41 可以找到Driver

4. 安裝Driver

5. 在系統/dev下面找到類似usbserial的tty

6. 透過Mac的screen來連terminal : screen /dev/tty.usbserial 115200

結束




2013年10月28日 星期一

2012年3月1日 星期四

Windows 7 + Git + ssh

之前團隊需要一個SCM來管理程式,簡單study了一下,最後決定用Git來管理團隊的程式(其實也沒有study多少,主要原因還是因為Git功能強大,而且好像很好玩 XD)

公司裡面沒有Linux base的Server,倒是新買了一台Window7的主機,又不想灌VM,因此就直接在Windows7上面架Git Server囉。

簡單的拜了一下Google大神,目前大家普遍使用的環境是msysgit + Copssh,其中msysgit是提供Windows環境下的Git Repository,由於是要架Server給其他Client來使用,因此需要搭配一個protocol來作傳輸,Copssh就是擔任這個角色。由於ssh會先將資料壓縮後加密,就傳輸上來說比較有效率。

msysgit以及Copssh目前在網路上都可以下載,只是Copssh現在已經不是免費的了(有心的話還是可以找到的)

另外由於團隊大部份人使用eclipse來開發,因此最後也要做到能夠直接從EGit(eclipse上的git plugin)來存取git Server

先簡單將重點outline在下面:
    • msysgit提供Windows上的git repository
    • Copssh提供Windows上的ssh連線
    • Copssh的使用者必須從Windows上面的使用者來加入
    • Copssh提供產生金鑰的功能,每個使用者都可以產生各自的私鑰
    • 因為不明原因,eclipse裡面用的private key如果有加上passphrase會出現問題,所以我用Copssh在產生私鑰的時候,就不設定passphrase
    關於msysgit以及Copssh的安裝,網路上已經有很多的資料,其中我最推薦這篇,照著做的話應該沒問題,我這裡只介紹一些重點

    接下來就一步一步來進行
    如果要讓其他人可以透過ssh來存取Server端的git repo
    1. 在Server端Windows系統必須替每個使用者新增帳號
    2. 在Copssh中,將Windows帳號加入,並且為每個帳號產生一個private key
    3. 將private key交給該使用者
    在Copssh裡面加入一個帳號,按下右邊的"ADD"按鈕

    "Forward"

    選擇要加入Copssh的使用者,下拉式選單讓你可以從目前Windows使用者來選取

    設定這個使用者的一些屬性

    完成

    接下來要替剛加入的帳號產生一個private key

    "Forward"

    選擇加密的類型以及長度,按下"Forward"

    如同之前所講的,這裡產生的private key是要給eclipse的EGit用的,如果設定Passphrase會出現不明的問題,因此在這裡將Empty passphrase勾選起來,不設定其值

    完成

    在Copssh該使用者的目錄下會看到剛產生的private key


    接下來要在eclipse裡面利用ssh連結git repo

    Window -> Preferences -> General -> Network Connections -> SSH2,在General tab裡面按下"Add Private Key"按鈕,選擇從Server拿到的private key


    在eclipse裡面切換到GIT Perspective,在GIT Repositor的Tab裡面按下"Clone a Git Repo.."按鈕

    輸入Server端的URI資訊

    選擇要匯入的branch

    選擇本端(client)的資料夾,按下"Finish"完成

    在Git Repostories 可以看到剛才加入的Repostory

    所有程序到此完成結束


    由於我們ssh使用的是RSA加密演算法,所以這裡簡單介紹一下概念:

    RSA有兩種用法
    1. 加密:公鑰用來加密,私鑰用來解密
    2. 簽章:私鑰加密,公鑰解密,也說是憑證

    加密:
    公鑰和私鑰是成對出現的。公鑰用來加密,私鑰用來解密。公鑰加密的訊息只有同對的私鑰可以解密。公鑰可以傳給其他人,私鑰只可以自己擁有。當其他人拿到用公鑰加密過的訊息,由於沒有私鑰,所以無法讀取訊息內容。

    簽章:
    公鑰和私鑰是成對出現的。公鑰用來解密,私鑰用來加密。如果公鑰解出來的訊息是正確的,帶表這訊息是由私鑰擁有者所傳送出來,藉此達成所謂簽章的效果。

    reference :
    Step by Step Setup Git Server on Windows with CopSSH + msysGit and Integrate Git with Visual Studio
    Public-key cryptography
    鳥哥

    2012年2月3日 星期五

    在Eclipse中加入android framework的source

    以下皆以gingerbread平台(level 10)為例子,其他平台做法相同
    1. 將Android source code下載回來,參考 http://source.android.com/source/downloading.html
    2. 在Android sdk的目錄下/platforms/android-10/目錄下,新增一個sources子目錄
    3. 到下載回來的Android source code裡面,找到
      /gingerbread/frameworks/base/core/java/android/ .
      /gingerbread/frameworks/base/core/java/com/ .
      /gingerbread/dalvik/libcore/dalvik/src/main/java/dalvik/ .
      /gingerbread/dalvik/libcore/luni-kernel/src/main/java/java/ .
      /gingerbread/dalvik/libcore/luni-kernel/src/main/java/org/ .
    4. 將上面資料複製到sources目錄下
    5. 完成