2011年3月25日 星期五

在 devkit8000 上安裝 android froyo (rowboat)

本文在 2011/03/25 23:35 發表於 Yahoo!奇摩部落格
因Yahoo!奇摩部落格將於2013年12月26日終止服務故遷移至此


工作了幾個月, 由於需要一個參考實作來開發產品以及解決問題
所以買了這玩意兒 : Devkit8000
在我還在唸書的時候就在拍賣看到這東西
當時看到非常驚訝
這東西這麼強, 價錢卻沒有破萬
打破以往對高檔實驗板的印象
尤其以前看過那些可以跑影片的都貴到爆
這還可以 3D, 真是厲害
不過學生嘛, 就是窮, 就算便宜也是要 6 張小朋友 (現在降到 4 張多)
所以只有等有收入時才買



這張板子和老美做的 beagleboard 是相似的東西
整個線路把它抄過來, 然後加個網路卡晶片 dm9000, 就這樣
官方說可以跑 android 和 Angstrom
實際上是可以跑沒錯, 可是並沒有任何 support
只給你映像檔, 讓你看執行起來的樣子
原始碼要你自己去找該網站要
編譯除錯? 當然也是自己想辦法
網路上放的 demo 圖片仔細看才發現是把螢幕截圖貼到照片上
由於是完全複製 beagleboard 線路
beagleboard 第一版的缺陷 : usb host 不工作也完美的繼承了
只能用 usb-otg 來當 usb host, 而且 ehci 模式限定
然後頁面上也不寫, 還畫個示意圖說可以接 usb hub
一整個就是山寨銷售模式 : 隱藏缺陷, 售後不理
售後不理就算了, 隱藏缺陷是最要不得的
老美的缺陷 beagleboard 到出了 3, 4 版本後已經改掉這問題
而市面上的 Devkit8000 還是和 C1 一樣
我在購買前曾經比較過這兩張板子, 售價並沒有差太多
當時是看上它的 LCD 接頭是排線, 想說可以直接接 LCD
而 beagleboard 的 dip 可能比較麻煩
結果買來看線路發現根本不行
因為那 50-pin LCD 還加了一些週邊擴充
LCD 就 LCD 嘛, 幹麻混雜週邊啊
這樣一來反而是 devkit8000 比較難使用
因為我得先買到排線和接頭, 然後再轉接
除此之外, 輸出是 OMAP 直接拉線出來, 1.8V 準位
市面上常見 3.3V 準位 LCD 也無法使用, 需要準位轉換
一整個鳥設計
算了, 都買了, 不爽也沒用, 當作訓練吧 ! XD


於是我開始火爆的燒腦袋想辦法讓它工作
一試就是三個月
一開始用的是 0xdroid
結果只開機一次, 之後就一直不開機了
然後重試多次, 這 flash 居然就壞了
每次寫 CRC 都不過, 寫入次數連 50 次都不到, 真是有夠爛
由於不能寫入 flash, 0xdroid 的全自動安裝也沒法用了
只好通通用 SD 卡
SD 卡一開始是用板子附贈的 512MB
結果用了兩個月後開始, 只要重開機, 有時就會出現 ext3 無效檔案節點
連送的 SD 卡都是爛貨, 製造問題讓我更難除錯, 非常靠北
如果說這玩具是便宜很多, 我可能還不會介意
然而價錢幾乎相同, 這就讓我很不能接受了
如果想玩 OMAP3, 建議買 beagleboard, 除非你想鍛鍊技術能力XD

經過一番折騰, 雖然還沒有全功能完成
但至少關鍵的都有了, 就記一下供參考
可以的話最好還是不要買這張爛板子
我買的是 256MB 版本, 128MB 版本不保證能用 !
目前時間 2011-03-25, 之後再下載的原始碼一定會改變, 也不保證能用 ! XD

開始, 先下載原始碼

rowboat Android for Texas Instruments Devices (Sitara, Davinci and Integra)
http://code.google.com/p/rowboat/

分支建議選最新的 rowboat-froyo-dsp
如果不知道何謂分支或不知道如何選請立刻停手
這表示基礎知識嚴重不足, 繼續做只會被氣死XD

下載後總共 2 GB 多, 還沒完喔XD
由於是 dsp 分支, 需要官方的 sdk
先到下載目錄 rowboat/external/ti-dsp/md5sum.list 看看
它會列出當前這版 android 需要哪一版 dsp sdk
接著用檔名去 google
以我當前的版本為例, 我的是 dvsdk_omap3530-evm_4_01_00_09_setuplinux
你會需要開一個 ti 的帳戶才能下載
下載後約 1.5 GB, 丟到同一目錄, 也就是 rowboat/external/ti-dsp/ 即可

繪圖加速也是一樣的
不過我下載的版本是已經附上了
它會被放在 rowboat/external/ti-dsp/md5_SDK.txt
我需要的版本是 OMAP35x_Android_Graphics_SDK_setuplinux_3_01_00_03.bin
一樣丟到目錄下 rowboat/external/ti_android_sgx_sdk/
接著編譯, 到 rowboat/ 下輸入

make TARGET_PRODUCT=beagleboard TARGET_BUILD_VARIANT=user -j8 OMAPES=3.x

各參數的說明在這裡:
http://code.google.com/p/rowboat/wiki/ConfigureAndBuild

由於 toolchain, kernel 都已內建
除非有少工具, 不然通常是一定會過
整個編譯過程以四核心主機全速運轉約需要 30-40 分鐘
需佔用近 17 GB 的硬碟空間
非常精采, 慢慢等唄~XD
由於參數下了 -j8
在連結 framework 時有一定的機率會掛掉
它會吃掉 3G 多的記憶體
如果是出現 Error: Killed 錯誤這樣掛掉, 再把指令重新輸入一次就可以了
如果還是掛掉就要縮小並行 thread 數, 表示你的記憶體不夠用
如果到了 -j1 還是一樣掛, 請增加記憶體吧XD

經過一陣奮戰搞定了以後就可以繼續往下做
但別高興, 痛苦才剛開始XD
由於我的版子 flash 已經被寫爆了
所以我採用 SD 卡開機
其實就算沒爆最好也用這樣開發
這樣才能直接用電腦檢視內部檔案狀態
並且不需要 console 來修改
因為當你把 init script 寫上後結果一直 kernel panic 的話
你將無法還原, 一定要洗掉重寫, 那很麻煩, 並且浪費 flash 壽命
若是用 SD 卡還可以拿到電腦上把問題指令註解

SD 卡要分割成兩分割區
一個拿來放開機的 kernel 映像檔
另一個拿來當 root filesystem
root filesystem 只要給他 200 MB 左右就可以了
其他的格式化成 vfat
除了可以拿來開機外, 還可以放測試檔案
android 開啟後當 root filesystem 那槽就沒法掛載成 SD 卡了
如果要丟測試用音樂影像檔丟 vfat 比較方便
我分割的結果:


第一分割區為 vfat, 佔用大部分的空間
第二分割區為 ext3, 佔用 200 多 MB
第一分割區設定成 W95 並且可 boot 的目的是當 u-boot 都不小心寫壞了還可以用按鈕還原
接著把 kernel (rowboat/kernel/arch/arm/boot/uImage) 複製到第一分割區
把 android 複製到第二分割區

rowboat/out/target/product/beagleboard/root/* → sd/
rowboat/out/target/product/beagleboard/system → sd/

接著修改 asound.conf, 在 sd/system/etc/asound.conf
檔案內容在本文最末端
alsa library 會用這檔案中的標籤去認該開哪個裝置
例如 :

ctl.AndroidPlayback {
        type hw
        card 0
}

AndroidPlayback 就會被當作識別的標籤
當發現錯誤訊息中有 snd_ctl cannot open XXX 時就是找不到這個
隨著版本改進, 它會一直變化
至少我就看過三種 : AndroidIn AndroidRecord AndroidCapture
這都是用過的錄音介面
這裡如果掛了, android 就不開機了

接著設定開機參數

setenv bootargs mem=107M@0x80000000 mem=128M@0x88000000 console=ttyS2,115200n8 root=/dev/mmcblk0p2 rw rootwait init=/init omap_vout.vid1_static_vrfb_alloc=y video=omapfb omapfb.mode=dvi:640x480MR-16

mem=107M@0x80000000 mem=128M@0x88000000 的意思是
從 0x8000000 開始算起 107MB, 以及 0x88000000 開始算 128MB
把這兩個空間當作記憶體
中間的空洞是給 dsp 用的
要求 kernel 完全不要去理它
中間這空洞將由 dvsdk 的 cmem 這 kernel module 去料理它

omap_vout.vid1_static_vrfb_alloc=y 是設定 framebuffer 的配置方式
採靜態配置, 不要動態去配
動態配置在畫 video 時會出包

omapfb.mode=dvi:640x480MR-16 則是設定為 DVI 輸出
若有液晶螢幕的用戶要換設定值

如果和我一樣是買無液晶螢幕版本的勇者(?)
沒有觸控螢幕就要自己做一條 usb 線來接鍵盤滑鼠
因為 usb host 無法工作, 需靠 usb otg 那裡來當 host
像這樣 :


線路:


Micro USB 接腳定義可參考 wiki
把 id 接腳接地, 並且 vbus 不要依賴實驗版, 另外弄個變壓器給它
版載只能輸出 100mA, 很快就不行了
接出來的線不可直接接 USB-EHCI 以外的裝置
所以要弄個純正 usb 2 的 hub 來用
買回來可以先用電腦測試一下
hub 接上電腦, 插上 usb 2.0 隨身碟
若出現 "這個裝置可以運轉得更快若插入 usb2.0 埠..." 的訊息就表示這是假的 usb 2 hub
對岸來的貨常玩這套, header cracking
只有裝置名稱改成 USB HUB 2.0, 實際上是 usb 1.1 的 hub
確定是 usb 2 的 hub 後就可接上
開機接上後就不可移除, 拔起再插入就不認得了
不認得後重開機無效, 一定要關閉電源再重開才行
只有 hub 有這限制, 接在 hub 上的裝置則無此限

接著開機進系統
若第一次成功看到畫面千萬別興奮XD
一定要重開機幾次, 每次都能開啟進系統才算
第一次開機有些錯誤會被忽略
第二次以後就不會了

如果你真的他X的運氣好超強, 真的都過關了
可以繼續往下做

devkit8000 採用的擴充晶片組為 TPS65930
和 beagleboard 的 TPS65950 不同
音效路徑要改
用這幾條指令將音效路徑修正回來

alsa_amixer cset numid=1 1
alsa_amixer cset numid=13 2,2
alsa_amixer cset numid=56 on
alsa_amixer cset numid=52 on

alsa_amixer 這執行檔不會自動被安裝到 system/bin 下
需要自行 copy, 路徑為:
rowboat/out/target/product/beagleboard/obj/EXECUTABLES
alsa_amixer, alsa_aplay, alsa_ctl 都在各目錄下

接著播看看影片, 通常會無法播放
原始的 init.rc 未配置 pool 給 dsp 使用
手動加上才能動
我實驗後用 try-error 的方式找到這設定值
改這樣 : (在 init.rc 中)

insmod /system/ti-dsp/cmemk.ko "phys_start=0x86400000 phys_end=0x87200000 allowOverlap=1 useHeapIfPoolUnavailable=1 pools=4x500000,8x614500,2x618800,1x1500000"

開機參數改為

setenv bootargs mem=100M@0x80000000 mem=128M@0x88000000 console=ttyS2,115200n8 root=/dev/mmcblk0p2 rw rootwait init=/init omap_vout.vid1_static_vrfb_alloc=y video=omapfb omapfb.mode=dvi:1280x720MR-16

增大共享空間, 並配置 pool
由於原來的 android 並無檔案瀏覽器
可上網找這 AndExplorer.apk
這瀏覽器不錯用
這樣就能播 MPEG-4 的影片了
目前我只有辦法讓 MPEG-4 格式動
其他官方說有支援的還不會動...=.=

MPEG-4 支援的是 Simple@L1 profile
可以用 avidemux 轉換

sudo apt-get install avidemux

安裝後用這樣去壓縮


壓縮 library 選 lavc, 聲音選 aac, 輸出格式 mp4
目前實測最多 640x320 (會有點 lag)
再上去, 640x480 就開不了了
畢竟 devkit8000 採用的是最低時脈, 最早期版本的 OMAP3530
500MHz + 360MHz DSP
最新版的是 720MHz + 520MHz DSP

demo :

全部的樣子

像手機一樣要解鎖才行XD
用滑鼠的可以按一下右鍵再去拉
右鍵被設定為 back

實驗板本體


電源

共有三個裝置需要 5V 電源
每個都一個變壓器太麻煩了, 而且也不需要
所以我就拿一個 5V 2A 電源並聯拉出三個接頭
通通都是 2.1 的 DC 頭
這樣就可以讓整個系統包括 usb hub 工作

HDMI 轉 D-Sub 轉換盒

我的螢幕沒有 HDMI, 只好這樣囉
另外, 也想這樣做的用戶請不要購買 DVI-DSub 轉接頭
數位介面不可能直接靠接線轉類比
我一開始不懂買了一堆, 怎麼試都不行, 被騙得很慘
(其實也不全是騙, 因為有些顯示卡是這樣設計的, 但我認為至少要標示特殊顯卡用, 有些店都沒標示)
轉換盒上網買可以買到便宜貨
找店家...4k 起跳...

解鎖後畫面

Android 2.2 官方版的畫面就是這樣

應用程式 :

超大計算機XD


不能動的瀏覽器XD

Devkit8000 的網路晶片是自己加上的
rowboat 內附 kernel 不支援

AndExplorer


Astro

這檔案瀏覽器畫面相當不錯
不過功能多, 副檔名也看不到
所以測試時我會比較習慣用 AndExplorer

音樂播放


影片, 480x360


影片, 640x320


完畢 !

沒錯, 照著做, 通常是...不會動XD
有問題千萬不要問我XD
這顆處理器是我第一次接觸 dsp
很多東西我連概念都沒有
能做出來是看了不少文件, 也追了不少 code

下篇 : android froyo (rowboat) DSP 簡易故障排除


附錄: asound.conf

# Android ALSA configuration file for OMAP2430SDP using the MXC audio.
##
## Mixer Devices
##

ctl.AndroidPlayback {
        type hw
        card 0
}

ctl.AndroidCapture {
        type hw
        card 0
}

##
## Playback Devices
##

pcm.AndroidPlayback_Speaker {
        type hooks
        slave.pcm {
                type hw
                card 0
                device 0        # Must be of type "digital audio playback"
        }
        hooks.0 {
                type ctl_elems
                hook_args [
                        # Enable audio output from the DSP
                        {
                                name "T2 Master codec configure Switch"
                                lock false
                                preserve true
                                optional false
                                value true
                        }
                        {
                                name "T2 Master codec Sample Rate"
                                lock false
                                preserve true
                                optional true
                                value 48000
                        }
                        {
                                name "Playback Source"
                                lock false
                                preserve true
                                optional false
                                # Values are:
                                #  0 - 'Stereo Headset'
                                #  1 - 'Hands-free (Speakers)'
                                #  2 - 'Mono Handset'
                                #  3 'USB CarKit'
                                value 'Hands-free (Speakers)'
                        }
                ]
        }
}

pcm.AndroidPlayback_Headset {
        type hooks
        slave.pcm {
                type hw
                card 0
                device 0        # Must be of type "digital audio playback"
        }
        hooks.0 {
                type ctl_elems
                hook_args [
                        # Enable audio output from the DSP
                        {
                                name "T2 Master codec configure Switch"
                                value true
                        }
                        {
                                name "T2 Master codec Sample Rate"
                                value 48000
                        }
                        {
                                name "Playback Source"
                                value 'Stereo Headset'
                        }
                ]
        }
}

pcm.AndroidPlayback_Earpiece {
        type hooks
        slave.pcm {
                type hw
                card 0
                device 0        # Must be of type "digital audio playback"
        }
        hooks.0 {
                type ctl_elems
                hook_args [
                        # Enable audio output from the DSP
                        {
                                name "T2 Master codec configure Switch"
                                value true
                        }
                        {
                                name "T2 Master codec Sample Rate"
                                value 48000
                        }
                        {
                                name "Playback Source"
                                value 'Mono Handset'
                        }
                ]
        }
}

# No bluetooth available.  Send output to the bit bucket.
pcm.AndroidPlayback_Bluetooth {
        type null
}

##
## Recording device
##

pcm.AndroidRecord_Microphone {
        type hooks
        slave.pcm {
                type hw
                card 0
                device 0        # Must be of type "digital audio capture"
        }
        hooks.0 {
                type ctl_elems
                hook_args [
                {
                        # MXC values for capture source:
                        #  0 - 'Headset Mic'
                        #  1 - 'Main Mic  Sub Mic'
                        #  2 - 'Aux/FM'
                        #  3 - 'USB CarKit'
                        name "Capture Source"
                        lock false
                        preserve true
                        optional false
                        value 'Main Mic  Sub Mic'
                }
                {
                        # Enable capture, range [0..100]
                        name "Mic Headset Capture Volume"
                        value [100 100]
                }
                {
                        name "Mic Headset Capture Switch"
                        value true
                }
                {
                        # MXC Capture volume, range [0..100]
                        name "Master Capture Volume"
                        value [60 60]
                }
                ]
        }
}

5 則留言:

  1. 您好,
    我發現您的這篇文章對我有很大的幫助
    不過我在下載
    dvsdk_omap3530-evm_4_01_00_09_setuplinux
    這個檔案時遇到了困難
    Ti 目前已經把這個檔案鎖住了 需要取得他們的授權才能下載
    不知道您是否留有這個檔案? 能否跟您索取

    謝謝

    回覆刪除
    回覆
    1. 申請 my Ti 登入帳號即可, 我記得申請是免費的
      那個檔案蠻大的, 好像一片 CD 的容量, 這幾天外出手邊沒檔案
      如果是為了搞 Android 我會建議換平台, 因為現在有超便宜的 Android 4.2 開發板
      開放 DSP 的也有 (例: raspberry pi), 用這個並不是聰明的選擇, 除非是要相容舊設計

      刪除
  2. 網誌管理員已經移除這則留言。

    回覆刪除
    回覆
    1. 好吧, 既然是規格那就沒辦法了
      試試這個吧:
      https://mega.co.nz/#!wYUS0bBS!8CqJD_QHSwSHTvrTIhLKzIjybCgVwgp6D3CN5a_Ba-w
      下載後加可執行權限後直接執行, 這是個需要輸入同意協議的自解檔
      下完能解後回覆一下, 我把上面那篇有你 mail 的留言刪除以防 spam
      至於這檔能不能用我就不清楚了XD 庫存檔案直接上傳沒有測

      刪除
  3. 下載完了
    非常感謝您的幫忙

    回覆刪除

注意:只有此網誌的成員可以留言。