顯示具有 AndroidBoard 標籤的文章。 顯示所有文章
顯示具有 AndroidBoard 標籤的文章。 顯示所有文章

2013年8月9日 星期五

Android 開發筆記 - 從 Android Service 發動 startActivity

若是只是單純從一個 Activity 發動另一個 Activity:

startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.google.com.tw")));

若是從 Service 發動 StartActivity 則需須指定 Intent.FLAG_ACTIVITY_NEW_TASK 方可正常運行:

Intent mIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.google.com.tw"));
mIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(mIntent);

2013年8月8日 星期四

Android 開發筆記 - 開機自動啓動 Android Service

開機自動啓動主要是指 Android service 的部分,整體上 Android 有非常豐富的事件管理,想要開機啓動就只需要去接收開機事件,收到後在執行 service 即可,架構:

  • 實作事件接收 public class MyEventsReceiver extends BroadcastReceiver
  • 設定 AndroidManifest.xml 監聽的事件,部分事件是需要額外權限的,安裝軟體時會顯示給使用者

BroadcastReceiver:

package org.changyy.study;
public class MyEventsReceiver extends BroadcastReceiver {

Intent MyService;
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
String action = intent.getAction();
if( action.compareTo("android.intent.action.BOOT_COMPLETED") == 0 ) {
MyService = new Intent(context, MyService.class);
   context.startService(MyService);
}
}
}


AndroidManifest.xml:

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>

<application
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >

    <service
        android:name="org.changyy.study.MyService"
        android:process=":MyService">
    </service>
    <receiver android:name="org.changyy.study.MyEventsReceiver">
        <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED"></action>
            <action android:name="android.intent.action.MEDIA_MOUNTED"/>
            <action android:name="android.intent.action.MEDIA_UNMOUNTED"/>
            <action android:name="android.intent.action.MEDIA_BAD_REMOVAL"/>
        </intent-filter>
    </receiver>
</application>


此例除了開機事件(android.intent.action.BOOT_COMPLETED)外,順便監聽了外部儲存媒體的插拔。簡單的說,如果要監聽一排的事件,就只要在 AndroidManifest.xml 填寫完後,在 MyEventsReceiver 裡的 onReceive 判斷,若每個事件都要做一樣的事則不用判斷去執行指定項目即可,若需要判斷可透過 intent.getAction() 處理。

2013年8月7日 星期三

Android 開發筆記 - 執行 script 筆記,特別是會處理 stdin 的 script 案例

最近在處理 LOA 開機啓動的設定,發現在 Android app 可以這樣就呼叫 sh 來執行 script 程式:

try {
Process mProcess = Runtime.getRuntime().exec("sh");
DataOutputStream mDataOutputStream = new DataOutputStream(mProcess.getOutputStream());
mDataOutputStream.writeBytes("sh /sdcard/test.sh > /sdcard/run.log \n");
mDataOutputStream.flush();
mDataOutputStream.close();
mProcess.waitFor();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}


而此例 /sdcard/test.sh 為:

# cat test.sh
echo "Begin"
date

read something
#while [ 1 ] ;
#do
#        echo -n "."
#done

echo "End"
date


上述在 Android app 執行後,可以看到 /sdcard/run.log 顯示:

Begin
Wed Aug  7 21:54:13 CST 2013
End
Wed Aug  7 21:54:13 CST 2013


發現跑起來後,又緊接著關掉,追了很久才發現是 mDataOutputStream.close() 的影響 Orz 比較安全的解法是把 mProcess 和 mDataOutputStream 拉倒 class variable 等級,可隨著物件(此例為 Activity)存在而不被釋放:

public class TestActivity extends Activity {
Process mProcess;
DataOutputStream mDataOutputStream;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
try {
mProcess = Runtime.getRuntime().exec("sh");
mDataOutputStream = new DataOutputStream(mProcess.getOutputStream());
mDataOutputStream.writeBytes("sh /sdcard/test.sh > /sdcard/run.log \n");
mDataOutputStream.flush();
//mDataOutputStream.close();
//mProcess.waitFor();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
// …
}


回到對 LOA 的問題,是在於執行 sh 後,再透過 chroot 後就交給一隻 /root/init.sh  處理,而它會等 stdin 的資料,而 mDataOutputStream.close() 的結果就像給予 exit/logout/EOF 的現象,使得 LOA 一直起來後馬上又關掉了。

Android 開發筆記 - 開發需要 root 權限的程式,解決 Superuser Prompt 不顯示的問題

最近跟一間硬體商配合,發現他們提供的 root 版 Android 環境有點怪,以前我用 SSHDroid (ssh server) 去開 port 22 時,因為小於 1024 所以會需要 root 權限,這時候就會預期他們家安裝的 Superuser 會彈跳視窗出來,但…什麼卻沒發生且失敗了 Orz 當然,只要把 Superuser 設定成 all pass 時,就沒問題。

而後測試幾百次,應該可以用這招來強制 Superuser 彈跳出詢問視窗:

Process mProcess;
try {
mProcess = Runtime.getRuntime().exec("sh");
DataOutputStream mDataOutputStream = new DataOutputStream(mProcess.getOutputStream());
mDataOutputStream.writeBytes("su;");
mDataOutputStream.flush();
mDataOutputStream.close();
mProcess.waitFor();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}


因此,若需要執行 root 權限,建議先用這招頂替一下 XD

2013年7月29日 星期一

nginx worker process exited on signal 7 @ ARM & LOA

嵌入式就是這麼奇妙!nginx 在 x86 可以穩穩跑、在 ARM-based 的 linux 也能穩穩跑,但是在 LOA 上頭就是會收到 signal 7 訊號而掛掉!

最後則是想要編 debug 訊息來用,意外發現 -O0 時就一切正常了!

故,最佳化這種事,還是小心為妙。

2013年7月22日 星期一

[LOA] Linux on Android @ Android 4.x


圖片來源:Complete Linux Installer

最近把玩 Linux on Android (LOA),這的確是個還不錯的架構:
Complete Linux Installer - https://play.google.com/store/apps/details?id=com.zpwebsites.linuxonandroid
簡單流程:

  • Android 裝置要先 root 過
  • 在 Android 裝置上跑 busybox 建制相關環境
  • 採用 chroot 切換到 linux image 運行
更多細節:
# cat /data/data/com.zpwebsites.linuxonandroid/files/bootscript.sh
其中運行最關鍵的是 busybox 這隻程式,安裝 Complete Linux Installer 有機會碰到 busybox 不能跑,需要自行把它編譯出來喔。看到 LOA 這等應用我才發現 busybox 還真的不是普通威啊! !

2012年6月14日 星期四

PandaBoard 教學筆記 - 調整 Android ICS Partition 大小

aosp-partition-resize


最近編完 AOSP 後,想要塞一堆資料進去,但明明一張記憶卡 8GB,但 Android ICS 裡頭任一個 Partition 最多才 500 多MB 耶,總空間很小,真是奇怪。但用 Ubuntu 的磁碟工具還是可以正常顯示出 7.2 GB 的 userdata,只是在 Ubuntu 系統上,透過讀卡機將資料搬進去,依舊看到檔案系統的大小限制。


磁碟公用程式-sdcard


實在找不出怎樣調整,於是就去追 AOSP 的 makefile 了,在 device/ti/panda/BoardConfig.mk 可以看到 /system、/userdata 的大小規畫:


aosp-partition-resize-mk


於是,把它調大後,接著砍掉 out/target/product/panda/system.img 和 out/target/product/panda/userdata.img 後,直接用 make 或分別用 make systemimage 和 make userdataimage,就能夠再生出新的 image 來,再透過 fastboot 燒進 SDCard 後,就能夠看到比較大的空間囉。


2012年2月11日 星期六

PandaBoard 教學筆記 - 安裝 Android 4.0 ICS via VirtualBox @ Ubuntu 10.04

Android ICS


玩了幾天 BeagleBoard-xM(Rev.C) 後,開始切換到 PandaBoard(Rev.B) 啦,從硬體規格來看,PandaBoard 好上許多,多了內建無線網卡外,CPU 是 Dual-core ARM® Cortex™-A9 MPCore™ with Symmetric Multiprocessing (SMP) at 1.2 GHz each,比 BeagleBoard-xM 的 ARM® Cortex™-A8 1.0GHz 好不少,跑 Android ICS 可以順多了!另外,最大的好處是安裝 Android 流程方便,編譯步驟在 AOSP 都有提到,也不需像 BeagleBoard 透過過於繁複的指令來處理 SD 卡,就像惡搞 Android 手機一樣,採用 fastboot 指令來處理,十分方便,缺點大概會讓入門者少學到 SD 卡處理的事情。


以下是操作環境:


OS:Ubuntu 10.04 64-Bit Desktop (主要是在 VirtualBox 裡,Guest OS 跟 Host OS 都一樣)
Target:Panda Board ES Rev. B1 + 4GB microSD


在 VirtualBox 環境碰到的問題:


板子偵測時有時無?


由於採用 VirtualBox 時,必須手動把 USB 裝置附加上去,因此需留意有那個項目可以使用,然而在 VirtualBox 的視窗上,一下可以看到板子,一下又找不到板子,這樣可好了,對我初學的我開始懷疑是線壞了還是板子壞了,在網路上搜尋的結果大多是說板子的power不夠,像是要用 Y 型 USB 接線,或是外接 5V 電源,但這兩樣我早就做好了,情況還是一樣,並可以在 /var/log/messages 看到 USB 一下接上,一下又斷掉。


$ tail -f /var/log/messages
...
kernel: [   21.750370] usb 1-1: new high speed USB device using ehci_hcd and address 8
kernel: [   21.952310] usb 1-1: configuration #1 chosen from 1 choice
kernel: [   24.440886] usb 1-1: USB disconnect, address 8
kernel: [   25.730824] usb 1-1: new high speed USB device using ehci_hcd and address 9
kernel: [   25.953153] usb 1-1: configuration #1 chosen from 1 choice
kernel: [   28.431670] usb 1-1: USB disconnect, address 9
...


可能現象及處理方式:


對非使用 VirtualBox 環境者,並不需要處理他,我猜是硬體的設計吧?讓此硬體處於可被偵測狀態,但不知為何理由要不斷斷線(省電?等待指令?),無論如何,對於 VirtualBox 使用者而言,需要小作處理,讓板子可以自動附加到 VM 中,不然一直靠手動就糗大了。首先在 VirtualBox 的 VM 開啟前先作設定 USB 相關設定,趁可以偵測到時,把他弄成自動附加即可。


PandaBoard@VirtualBox


Texas Instruments OMAP4440-USB 篩選器詳細資料


其他:


記得把目前得使用者加到 vboxusers group 裡喔 (/etc/group vboxusers:x:XXX:YourHostAccount)


主要流程:


編譯 Android ICS:


大致上流程如 AOSP 所提的環境及編法,只是在編譯前,要先安置好 PandaBoard 所需的硬體資訊,這對編過 AOSP for Android 手機的人來說應該不陌生(以 Nexus One 為例,早期需透過 extract-files.sh 取出),對於 PandaBoard 來說,請直接在 http://code.google.com/android/nexus/drivers.html#panda 下載


$ mkdir ~/bin ~/projects/android-ics
$ curl https://dl-ssl.google.com/dl/googlesource/git-repo/repo > ~/bin/repo
$ chmod 755 ~/bin/repo
$ export PATH=$PATH:~/bin/repo
$ cd ~/projects/android-ics
$ repo init -u https://android.googlesource.com/platform/manifest
$ repo sync
$ source build/envsetup.sh
$ lunch full_panda-eng
$ make fastboot
$ wget https://dl.google.com/dl/android/aosp/imgtec-panda-itl41d-dfebf249.tgz  (這是 Android 4.0.1 (ITL41D) 版本)
$ tar -xvf imgtec-panda-itl41d-dfebf249.tgz
wget https://dl.google.com/dl/android/aosp/imgtec-panda-iml74k-cfb7bdad.tgz  (這是 Android 4.0.3 (IML74K) 版本)
$ tar -xvf imgtec-panda-iml74k-cfb7bdad.tgz
$ wget https://dl.google.com/dl/android/aosp/imgtec-panda-imm76i-67545da7.tgz (這是 Android 4.0.4 (IMM761) 版本,建議上官網查看最新版)
$ tar -xvf imgtec-panda-imm76i-67545da7.tgz
$ ./extract-imgtec-panda.sh
輸入 I ACCEPT
$ make -j 2 (看自己是幾核心 CPU,我在 VM 配置 2 CPU)
依硬體狀況漫長等待後,沒意外就都有編好了


設置 PandaBoard:


Init


一開始把記憶卡拔掉,接上電源及 USB 線後,可以看到靠近 SD 卡插槽有一個燈在亮(對VirtualBox來說,USB裝置可以間斷地偵測到Texas Instruments OMAP4440設備),接著透過 usbboot 指令把 bootload 餵進去後,就可以看到另一個燈閃動(對VirtualBox來說,USB裝置可以穩定偵測到Texas Instruments panda設備,請記的手動附加一下)


$ cd ~/projects/android-ics
$ sudo device/ti/panda/usbboot device/ti/panda/bootloader.bin
using built-in 2ndstage.bin
reading ASIC ID
CHIP: 4440
IDEN: 0000000000000000000000000000000000000000
MPKH: 0000000000000000000000000000000000000000000000000000000000000000
CRC0: ########
CRC1: 00000000
sending 2ndstage to target... ########
waiting for 2ndstage response...
sending image to target...


檢查是否偵測到裝置(對VirtualBox使用者,需手動附加偵測到的 Texas Instruments panda 設備):


$ sudo out/host/linux-x86/bin/fastboot devices
################        fastboot


接上 SD 卡後:


$ sudo out/host/linux-x86/bin/fastboot oem format
...
OKAY [  0.420s]
finished. total time: 0.421s
$ sudo out/host/linux-x86/bin/fastboot flash xloader device/ti/panda/xloader.bin
sending 'xloader' (23 KB)...
OKAY [  0.024s]
writing 'xloader'...
OKAY [  0.248s]
finished. total time: 0.272s
$ sudo out/host/linux-x86/bin/fastboot flash bootloader device/ti/panda/bootloader.bin
sending 'bootloader' (157 KB)...
OKAY [  0.110s]
writing 'bootloader'...
OKAY [  0.303s]
finished. total time: 0.413s
$ sudo out/host/linux-x86/bin/fastboot erase cache
erasing 'cache'...
OKAY [102.520s]
finished. total time: 102.520s
$ sudo out/host/linux-x86/bin/fastboot -p panda flash userdata
sending 'userdata' (10504 KB)...
OKAY [  6.411s]
writing 'userdata'...
OKAY [  9.763s]
finished. total time: 16.174s
$ sudo out/host/linux-x86/bin/fastboot -p panda flashall
--------------------------------------------
Bootloader Version...: U-Boot 1.1.4-g157fe435
Baseband Version.....:
Serial Number........: ################
--------------------------------------------
checking product...
OKAY [  0.006s]
sending 'boot' (3750 KB)...
OKAY [  2.331s]
writing 'boot'...
OKAY [  2.381s]
sending 'system' (146598 KB)...
OKAY [ 89.414s]
writing 'system'...
OKAY [119.862s]
rebooting...

finished. total time: 215.212s 


接著正確寫入後系統會自行重開機,大概 15 分左右就好了!記得要插好 USB 滑鼠,因為 Android 初始化沒多久就會黑屏休息,需要用滑鼠移動一下讓他清醒


各指令對應的 ttyUSB0 的輸出:


卸下 SD 卡開機:


[ aboot second-stage loader ]

MSV=00000000
jumping to 0x82000000...

U-Boot 1.1.4-g157fe435 (Oct 21 2011 - 09:46:20)

Load address: 0x80e80000
DRAM:  1024 MB
Flash:  0 kB
Using default environment

In:    serial
Out:   serial
Err:   serial

efi partition table:
Read not permitted as Card on SLOT-0 not Initialized
efi partition table not found
Net:   KS8851SNL
Panda: GPIO_113 pressed: entering fastboot....
I2C read: I/O error
Device Serial Number: ################
Fastboot entered...


$ sudo out/host/linux-x86/bin/fastboot oem format


blocks 15661056

new partition table:
     256     128K xloader
     512     256K bootloader
    2048       8M recovery
   18432       8M boot
   34816     512M system
 1083392     256M cache
 1607680     512M userdata
 2656256    2254M media


$ sudo out/host/linux-x86/bin/fastboot flash xloader device/ti/panda/xloader.bin


Starting download of 23824 bytes

downloading of 23824 bytes finished
writing to partition 'xloader'
Initializing 'xloader'
Writing 'xloader'
Writing 'xloader' DONE!


$ sudo out/host/linux-x86/bin/fastboot flash bootloader device/ti/panda/bootloader.bin


Starting download of 161236 bytes
....
downloading of 161236 bytes finished
writing to partition 'bootloader'
Initializing 'bootloader'
Writing 'bootloader'
Writing 'bootloader' DONE!


$ sudo out/host/linux-x86/bin/fastboot erase cache


Initializing 'cache'
Erasing 'cache'
Erasing 'cache' DONE!


$ sudo out/host/linux-x86/bin/fastboot -p panda flash userdata


Starting download of 10756436 bytes
...
downloading of 10756436 bytes finished
writing to partition 'userdata'
Initializing 'userdata'
fastboot: userdata is in sparse format
sparse: write to mmc slot[0] @ 1607680

sparse: out-length-0x512 MB
Writing sparsed: 'userdata' DONE!


$ sudo out/host/linux-x86/bin/fastboot -p panda flashall


Starting download of 3840000 bytes
...
downloading of 3840000 bytes finished
writing to partition 'boot'
Initializing 'boot'
Writing 'boot'
Writing 'boot' DONE!
Starting download of 150116688 bytes
...
downloading of 150116688 bytes finished
writing to partition 'system'
Initializing 'system'
fastboot: system is in sparse format
sparse: write to mmc slot[0] @ 34816


其他:


第一次使用 8GB 記憶卡,但是在 fastboot -p panda flashall 指令時,看到卡在 system.img 的寫入,網路上也看不到解法?後來甚至把 flashall 改成一步步時,仍卡在 fastboot flash system system.img 的部分,最後則是乾脆換一張 4GB 記憶卡,沒錯,這樣就沒問題了!看來玩硬體就是容易把生命浪費在其他硬體身上 XD 重點那張 8GB microSD (+轉卡) 是新卡啊,還是那種要拆包裝的耶。


2012年2月5日 星期日

BeagleBoard-xM 教學筆記 - 安裝 Android 2.3 Gingerbread 和 Android 4.0 ICS @ Ubuntu 10.04

bbxm_ics-01 bbxm_g-03


在任何嵌入式開發板上安裝 Android 好像是近幾年的習俗慣例?!所以也就來試了一下,而今年的目標定的半年目標是在開發板上安裝 Android 和進行效能調適,再遠一點則是 Webkit 方面的事。只是當我了解更多了之後,發現 Android Porting 其實沒那麼簡單,另外,做完 porting 不代表能用。


最初想只拿 Android Open Source 跟板子相關檔案後,親自一步步調教,後來發現這些事就是國內外有名的 project 在搞得,看來一個人弄真的太累了 XD 除此之外,網路上絕大部分的 porting 筆記都只是把別人設定好的安裝方式跑一次就結束了 Orz 看到這讓我輕鬆(失落)了不少。


Android 4.0 ICS 使用 rowboat Prebuilt Images:


$ wget http://rowboat.googlecode.com/files/beagleboard-xm.tar.gz
$ md5sum beagleboard-xm.tar.gz
1255347a549530fc6653772d1711a305 beagleboard-xm.tar.gz (@2012-02-04)
$ tar -xvf beagleboard-xm.tar.gz
$ cd beagleboard-xm
$ sudo ./mkmmc-android.sh /dev/sdX


Assuming Default Locations for Prebuilt Images
All data on /dev/sdX now will be destroyed! Continue? [y/n]
y
[Unmounting all existing partitions on the device ]
umount: /dev/sdX: not mounted
umount: /dev/sdX1: not mounted
umount: /dev/sdX2: not mounted
umount: /dev/sdX3: not mounted
[Partitioning /dev/sdX...]
Disk /dev/sdb doesn't contain a valid partition table
DISK SIZE - 3951034368 bytes
CYLINDERS - 480
[Making filesystems...]
[Copying files...]
[Copying START_HERE floder to boot partition]
[Copying all clips to data partition]
[Done]


重新把 microSD 插入,修改 rootfs 權限部份,否則開機會看到 Kernel panic - not syncing: No init found. 訊息


$ sudo chmod 777 -R /media/rootfs/
$ sync
$ umount /dev/sdX*


bbxm_ics-04 bbxm_ics-03


之後安置好 beagleboard-xM 後,開機約 12 分鐘就可以看到 Android ICS 介面,可以透過滑鼠去操作,只是操作上滿卡的!還滿常出現 ANR (Application is Not Responding)。果真 porting 是一回事,能不能用又是另一回事了。


Android 2.3 Gingerbread 使用 TI Prebuilt Images:


$ wget http://software-dl.ti.com/dsps/dsps_public_sw/sdo_tii/TI_Android_DevKit/TI_Android_GingerBread_2_3_DevKit_1_0/exports/TI_Android_GingerBread_2_3_DevKit_1_0.tar.gz
$ md5sum TI_Android_GingerBread_2_3_DevKit_1_0.tar.gz
ff14ff771aa067dff5cc40106527d119 TI_Android_GingerBread_2_3_DevKit_1_0.tar.gz (@2012-02-03)
$ tar -xvf TI_Android_GingerBread_2_3_DevKit_1_0.tar.gz
$ cd TI_Android_GingerBread_2_3_DevKit_1_0/Prebuilt_Images/beagleboard-xm
$ sudo ./mkmmc-android.sh /dev/sdX


Assuming Default Locations for Prebuilt Images
All data on /dev/sdX now will be destroyed! Continue? [y/n]
y
[Unmounting all existing partitions on the device ]
umount: /dev/sdX: not mounted
umount: /dev/sdX1: not mounted
umount: /dev/sdX2: not mounted
umount: /dev/sdX3: not mounted
[Partitioning /dev/sdX...]
Disk /dev/sdb doesn't contain a valid partition table
DISK SIZE - 3951034368 bytes
CYLINDERS - 480
[Making filesystems...]
[Copying files...]
[Copying START_HERE floder to boot partition]
[Copying all clips to data partition]
[Done]


bbxm_g-01 bbxm_g-02


之後安置好 beagleboard-xM 後,開機約 23 分鐘就可以看到 Android Gingerbread 介面,但是USB滑鼠鍵盤沒被啟用,在加上我也沒觸控面板,所以測試就停在這邊。


至於手動編譯及安裝 Android 的流程,方向大概如下:



  1. get toolchain & AOSP & kernel & u-boot & x-load (有些 project 已內含不需額外再抓)

  2. build u-boot (x-boot)

  3. build x-load (MLO)

  4. build AOSP (uImage & tools)

  5. build android_rootfs (透過 AOSP 產出 /out/target/product/beagleboard 裡的 root 跟 system 來建立)

  6. build boot.scr

  7. export to microSD


以 TI-Android-GingerBread-2.3-DevKit-1.0_DeveloperGuide 為例:


取得 android source code (patched):


$ mkdir ~/rowboat-android && cd ~/rowboat-android
$ repo init -u git://gitorious.org/rowboat/manifest.git -m TI-Android-GingerBread-2.3-DevKit-1.0.xml
$ repo sync


取得 TI_Android_DevKit:


$ cd ~/
$ wget http://software-dl.ti.com/dsps/dsps_public_sw/sdo_tii/TI_Android_DevKit/TI_Android_GingerBread_2_3_DevKit_1_0/exports/TI_Android_GingerBread_2_3_DevKit_1_0.tar.gz
$ tar -xvf TI_Android_GingerBread_2_3_DevKit_1_0.tar.gz
$ ls -R TI_Android_GingerBread_2_3_DevKit_1_0/Tools/


TI_Android_GingerBread_2_3_DevKit_1_0/Tools/:
flashing-utility.tar.gz mk-bootscr mk-mmc pinmux-utility.tar.gz signGP


TI_Android_GingerBread_2_3_DevKit_1_0/Tools/mk-bootscr:
mkbootscr mkimage README


TI_Android_GingerBread_2_3_DevKit_1_0/Tools/mk-mmc:
mkmmc-android.sh README.txt


TI_Android_GingerBread_2_3_DevKit_1_0/Tools/signGP:
signGP signGP.c


環境準備:


$ mkdir ~/rowboat-android-build
$ vim ~/.bashrc
export USE_CCACHE=1
export PATH=/home/user/rowboat-android/prebuilt/linux-x86/toolchain/arm-eabi-4.3.1/bin:/home/user/bin:$PATH


建立 x-load:


$ cd ~/rowboat-android/x-load-omap3
$ make CROSS_COMPILE=arm-eabi- distclean
$ make CROSS_COMPILE=arm-eabi- omap3beagle_config
$ make CROSS_COMPILE=arm-eabi-
$ cp x-load.bin ~/rowboat-android-build/
$ cp ~/TI_Android_GingerBread_2_3_DevKit_1_0/Tools/signGP/signGP ~/rowboat-android-build/
$ cd ~/rowboat-android-build/
$ $ ./signGP ./x-load.bin
$ mv x-load.bin.ift MLO


建立 u-boot:


$ cd ~/rowboat-android/u-boot-omap3/
$ make CROSS_COMPILE=arm-eabi- distclean
$ make CROSS_COMPILE=arm-eabi- omap3_beagle_config
$ make CROSS_COMPILE=arm-eabi-
$ cp u-boot.bin ~/rowboat-android-build/
$ cp tools/mkimage ~/bin


建立 kernel:


$ cd ~/rowboat-android/kernel
$ make ARCH=arm CROSS_COMPILE=arm-eabi- distclean
$ make ARCH=arm CROSS_COMPILE=arm-eabi- omap3_beagle_android_defconfig
$ make ARCH=arm CROSS_COMPILE=arm-eabi- uImage
$ cp arch/arm/boot/uImage ~/rowboat-android-build/


建立 android rootfs:


$ cd ~/rowboat-android/
$ time make TARGET_PRODUCT=beagleboard OMAPES=5.x -j8
============================================
PLATFORM_VERSION_CODENAME=REL
PLATFORM_VERSION=2.3
TARGET_PRODUCT=omap3evm
TARGET_BUILD_VARIANT=eng
TARGET_SIMULATOR=
TARGET_BUILD_TYPE=release
TARGET_BUILD_APPS=
TARGET_ARCH=arm
HOST_ARCH=x86
HOST_OS=linux
HOST_BUILD_TYPE=release
BUILD_ID=GRH55
============================================
...
real 106m20.076s (依機器情況而定,此例是在 Virtualbox 中的 Ubuntu 10.04 desktop,而 Host CPU 是 AMD x4 945)
user 115m30.980s
sys 7m31.390s
$ cd out/target/product/beagleboard
$ mkdir android_rootfs
$ cp -r root/* android_rootfs
$ cp -r system android_rootfs
$ sudo ../../../../build/tools/mktarball.sh ../../../host/linux-x86/bin/fs_get_stats android_rootfs . rootfs rootfs.tar.bz2
$ cp rootfs.tar.bz2 ~/rowboat-android-build/


建立 boot.scr:


$ cp ~/TI_Android_GingerBread_2_3_DevKit_1_0/Tools/mk-bootscr/mkbootscr ~/rowboat-android-build/
$ cd ~/rowboat-android-build/
$ ./mk-bootscr


匯入 microSD:


$ cd ~/rowboat-android-build/
$ cp -r ~/TI_Android_GingerBread_2_3_DevKit_1_0/Prebuilt_Images/beagleboard-xm/Media_Clips/ ~/rowboat-android-build/
$ cp ~/TI_Android_GingerBread_2_3_DevKit_1_0/Prebuilt_Images/beagleboard-xm/mkmmc-android.sh ~/rowboat-android-build/
$ sudo ./mkmmc-android /dev/sdX MLO u-boot.bin uImage boot.scr rootfs.tar.bz2 Media_Clips
All data on /dev/sdX now will be destroyed! Continue? [y/n]
y
[Unmounting all existing partitions on the device ]
umount: /dev/sdX: not mounted
umount: /dev/sdX1: not mounted
umount: /dev/sdx2: not mounted
umount: /dev/sdX3: not mounted
[Partitioning /dev/sdX...]
Disk /dev/sdX doesn't contain a valid partition table
DISK SIZE - 3951034368 bytes
CYLINDERS - 480
[Making filesystems...]
[Copying files...]
[Copying START_HERE floder to boot partition]
[Copying all clips to data partition]
[Done]


參考資料:


http://code.google.com/p/rowboat/wiki/ICSonBeagleboard
http://processors.wiki.ti.com/index.php/TI-Android-GingerBread-2.3-DevKit-1.0_DeveloperGuide
http://androside.com/page_contents/page_android_beagleGingerPorting.html


2012年2月1日 星期三

BeagleBoard-xM 教學筆記 - 嘗試安裝 Ubuntu Natty Narwhal (11.04) @ Ubuntu 10.04

嘗試完把 microSD 恢復到原廠後,接著在 BeagleBaord xM 安裝 Ubuntu 看看。網路上可以找到不少文件和教學,但有些過程繁瑣老舊,就來試試看 Ubuntu 官網上提的步驟了:OmapNetbook。結果?可以看到系統裝起來,但缺乏 usb 跟網路的功能,不曉得是不是因為 BeagleBoard-xM Rev C 的關係?因此若真的需要把玩 Ubuntu 的,建議使用 http://elinux.org/BeagleBoardUbuntu#Demo_Image (Ubuntu 11.10) 即可,一個步驟安裝完,並且網路或 USB 鍵盤都 ok 啦。


對我而言,第一次接觸碰到幾個問題:


什麽是 OMAP?


OMAP是德州儀器(IT)提出的「 開放式多媒體應用平台」架構。在 BBxMSRM_latest.pdf 中可以查到這塊 BeagleBoard xM 板子的 CPU 是 DM3730,而 BeagleBoard 是 OMAP3530 的,然而 DM3730 是啥?在網路上找了一下,有人說這是 OMAP3630 的開發版,其中 DM 是開發版,OMAP是客戶版,但又有一說是 OMAP 是給 cell phone 的,剩下的是 AM/DM/davinci 等等,並且說在 BeagleBoard 上的 OMAP3630/DM3730 是對應到 cell phone 上的 OMAP3530 和 OMAP 3630等,總之故事好像不少,但我需要的只是確定 DM3730 也是指 OMAP 3系列的就好,有興趣的可以在 http://www.beagleboard.org/irclogs/index.php?date=2011-02-16搜尋 DM3730 關鍵字。


什麽是 Netbook?


查 wiki 的結果就是小筆電的意思,可以去看看 Ubuntu Netbook Edition - wiki 的介紹,其中有提到 Ubuntu Netbook 11.04 已經規劃納入 Desktop 版本,因此在 11.10 時,只會看到 OMAP3 preinstalled desktop image 版本,在這之前可以看到 Instruments OMAP3 preinstalled netbook image 等。


由於 DM3730 是 OMAP3630 for cell phone world 的關係,所以在此採用 OMAP3 系列。在 http://cdimage.ubuntu.com/releases/11.04/release/ 挑選 Texas Instruments OMAP3 preinstalled netbook image 和 Texas Instruments OMAP3 preinstalled headless image 來玩玩。


https://wiki.ubuntu.com/ARM/OmapNetbook 指示即可完工,在此列一些指令筆記:


$ sudo umount /media/* (或 umount /dev/sdX* )


$ sudo time sh -c 'zcat ./ubuntu-11.04-preinstalled-headless-armel+omap.img.gz | dd bs=4M of=/dev/sdc ; sync '
0+51047 records in
0+51047 records out
1675173888 bytes (1.7 GB) copied, 1961.25 s, 854 kB/s
64.90user 5.95system 32:41.61elapsed 3%CPU (0avgtext+0avgdata 5760maxresident)k
417368inputs+3271824outputs (2major+1417minor)pagefaults 0swaps

$ sudo cp ./uImage /media/PartitionBoot/
$ sudo cp ./vmlinuz-2.6.38-8-omap /media/PartitionRoot/boot


擺好 microSD 後就可以啟動 beagleboard-xM 啦,接好 RS232 to USB 後,可以透過 screen -U /dev/ttyUSB0 115200 來查看板子目前的設定狀況(建議先用 minicom 初始化後,關掉 minicom,再用 screen,可避免 screen 有時沒資料出來),通常大概 6 分鐘以內就能看到相關設定畫面,後來的流程就像安裝 Ubuntu 一樣的選單,而 microSD(此為一開始內建卡)的讀寫速度將影響啟動所耗費的時間。選好環境設定後,大概又要等 15 分鐘的安裝初始化。


只是無論是 desktop(netbook) 或 server(headless) 版,從 USB 接的鍵盤跟滑鼠都無用 XD 這樣對 desktop 版就無法進入的初始化設定啦,而 Server 版倒可以透過 /dev/ttyUSB0 來作設定,只是設定完還是無用。在網路上打滾了一會,看到的解法大概都是更新 uImage 和 boot.src,有的是取得 Angstrom Linux Demo 的檔案,有的就乾脆依照 elinux.org 的安裝方法了 BeagleBoardUbuntu#Demo_Image


所以,我就很懶的直接用 elinux.org - BeagleBoardUbuntu#Demo_Image,只需安裝相關軟體後,按一下指令就搞定了!經過測試,網路、鍵盤無痛搞定,並且因為檔案很小,只花不到 10 分鐘(上面都要30起跳)。


$ wget http://rcn-ee.net/deb/rootfs/oneiric/ubuntu-11.10-r3-minimal-armel.tar.xz
$ tar -xJf ubuntu-11.10-r3-minimal-armel.tar.xz (若不行記得安裝xz-utils)
$ cd ubuntu-11.10-r3-minimal-armel
$ sudo time ./setup_sdcard.sh --mmc /dev/sdX --uboot "beagle_xm" (/dev/sdX是 microSD 位置)
...
Are you 100% sure, on selecting [/dev/sdX] (y/n)? y
...
Downloading Device's Bootloader ...
Unmounting Partitions ...
Using fdisk to create BOOT Partition ...
Setting Boot Partition's Boot Flag ...
Creating rootfs ext4 Partition ...
Formating Boot Partition ...
Populating Boot Partition ...
Using mkimage to create uImage ...
Using mkimage to create uInitrd ...
Copying uEnv.txt based boot scripts to Boot Partition ...
Finished populating Boot Partition ...
Transfer of Base Rootfs Complete, syncing to disk ...
Finished populating rootfs Partition
-----------------------------
setup_sdcard.sh script complete
1.32user 2.52system 6:54.94elapsed 0%CPU (0avgtext+0avgdata 14848maxresident)k
2234inputs+1093280outputs (3major+55864minor)pagefaults 0swaps


收工,改天在找看看如何解決官方 Ubuntu 提供的 Image 問題。


2012年1月19日 星期四

BeagleBoard-xM 教學筆記 - 安裝(重灌) Angstrom Demo 及 microSD 格式化筆記 @ Ubuntu 10.04

Angstram_x11_1 Angstram_x11_2


最近不順心的事還不少,一玩 beagleboard,不小心在開機時把 microSD 卡退出,導致 microSD 內建的資料爛掉,除了整個板子重開機沒反應外,把 microSD 卡插到其他 OS 讀不到。當時一度讓我有點小緊張,總不會剛拿到板子就給玩壞了 XD 所幸遲疑一下,用 Windows 7 小筆電(周邊唯一有讀卡機的設備)讀 microSD 讀不到,開始猜測問題所在處。隨後又碰到 Windows 格式化的問題,最後的解法就是跟別人借 SDCard Reader 在 Ubuntu 10.04 操作囉。


解法:找一台 Unix 機器將 microSD 重新格式化 + 安裝開機所需的檔案。除此之外,記得說明書上也以提過 beagleboard 很多接頭其實沒做太多防護,像是插錯電壓會壞的,也有人提到不太適合熱插拔,容易傷到晶片等等,需要特別留意一下。回歸正題,以下次這次解決流程:


1.確認 microSD 位置


如果 df -h 和 dmesg | tail 無法判斷的話,可以透過 Ubuntu Desktop -> [設定] -> [管理] -> [磁碟公用程式] -> [USB 週邊裝置]: 由於原先 BeagleBoard-xM 內建一張 4GB mircoSD 卡,所以查看一下就會找到,此例為 /dev/sdc


磁碟公用程式


另外提一下,之後的動作若要把 microSD 卡安全移除的話,先分別點下方儲存區(此例已點選boot區,還有另一個是Angstrom),再點選 "卸載儲存區",最後在點選右上方的 "安全移除"。


2.執行格式化


elinux.org wiki 有提到透過 mkcard.txt 來執行,作法則是 sudo sh mkcard.txt /dev/sdc,過程需要 kpartx 指令,請先用 sudo apt-get install kpartx 安裝一下。另一個步驟比較多,就是傳統使用 fdisk 的過程,請參考 elinux.org wiki,在此以 mkcard.txt script 為例:


$ wget http://www.angstrom-distribution.org/demo/beagleboard/mkcard.txt
$ sudo sh mkcard.txt /dev/sdc


1024+0 records in
1024+0 records out
1048576 bytes (1.0 MB) copied, 0.221714 s, 4.7 MB/s
Disk /dev/sdc doesn't contain a valid partition table
DISK SIZE - 3951034368 bytes
CYLINDERS - 480
Checking that no-one is using this disk right now ...
BLKRRPART: Device or resource busy


This disk is currently in use - repartitioning is probably a bad idea.
Umount all file systems, and swapoff all swap partitions on this disk.
Use the --no-reread flag to suppress this check.
Use the --force flag to overrule all checks.
mkfs.vfat 3.0.7 (24 Dec 2009)
umount: /dev/sdc2: not mounted
mke2fs 1.41.11 (14-Mar-2010)
Filesystem label=Angstrom
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
215568 inodes, 861485 blocks
43074 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=884998144
27 block groups
32768 blocks per group, 32768 fragments per group
7984 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200


Writing inode tables: done
Creating journal (16384 blocks): done
Writing superblocks and filesystem accounting information: done


This filesystem will be automatically checked every 23 mounts or
180 days, whichever comes first. Use tune2fs -c or -i to override.


如此一來會切割出 boot 跟 Angstrom 兩個 partition 囉,只是很奇妙的重新把 microSD 插入主機,還是會找不到,所以,上面做完後,我馬上接著在做下面的:


$ sudo mkfs.msdos -F 32 /dev/sdc1 -n boot
$ sync


重新把 microSD 插入後,對 Ubuntu 10.04 來說,可在 /media/boot 和 /media/Angstrom 存取。


3.安裝所需檔案


在官網 wiki 上有提到,在 http://www.angstrom-distribution.org/demo/beagleboard/ 下載 4 個檔案,必須依序把 MLO、u-boot.bin 和 uImage 擺在 /media/boot 區,把 Angstrom-Beagleboard-demo-image-#######.tar.bz2 和 modules-#####-beagleboard.tgz 解壓縮在 /media/Angstrom 區。此以 wget 為例,建議可以先下載後,透過 cp 指令搬到 /media/boot 和 /media/Angstrom,其中要用 sudo 對 /media/Angstrom 動作。


$ mdkir ~/beagleboard
$ cd ~/beagleboard
$ wget http://www.angstrom-distribution.org/demo/beagleboard/MLO (13-Jan-2012 21:19, 42K)
$ wget http://www.angstrom-distribution.org/demo/beagleboard/uImage (13-Jan-2012 15:14, 3.2M)
$ wget http://www.angstrom-distribution.org/demo/beagleboard/u-boot.img (13-Jan-2012 21:19, 321K)
$ wget http://www.angstrom-distribution.org/demo/beagleboard/Angstrom-Beagleboard-demo-image-glibc-ipk-2011.1-beagleboard.rootfs.tar.bz2 (11-Jan-2011 11:18, 169M)
$ wget http://www.angstrom-distribution.org/demo/beagleboard/modules-3.0.17+-r115a-beagleboard.tgz (13-Jan-2012 15:14 8.9M)


$ sudo cp MLO /media/boot
$ sudo cp uImage /media/boot
$ sudo cp u-boot.img /media/boot
$ sudo tar -xv -C /media/Angstrom -f Angstrom-Beagleboard-demo-image-glibc-ipk-2011.1-beagleboard.rootfs.tar.bz2
$ sudo tar -xv -C /media/Angstrom -f modules-3.0.17+-r115a-beagleboard.tgz


其他系統微調:


為了解決系統開機時 can't create /tmp/uname: Read-only file system 等類似訊息,要更新 etc/default/udev 資料,將 DEVCACHE="/etc/dev.tar" 註解起來。


$ sudo vim /media/Angstrom/etc/default/udev
# Default for /etc/init.d/udev
# Comment this out to disable device cache
#DEVCACHE="/etc/dev.tar"


安全移除 microSD 卡


$ sync
$ sudo umount /media/boot
$ sudo umount /media/Angstrom


資料複製到 SDCard 完後,記得要卸載以及安全地移除 SDCard,因為使用 Ubuntu 10.04 的經驗告訴我,它都是卸載裝置時,才開始把資料寫進去,因此貿然抽出,就等於沒寫資料或資料不完整。


4.啟動 beagleboard-xM


先把 microSD 卡插好,再把接線接一下,準備好後,就可以開機,正常的情況時,過一會螢幕也會顯示 beagleboard logo 以及相關開機流程,最後就可以進入 OS 囉!至於要關機的話,目前若有 console 的話,我會連進去用 poweroff 關,沒 console 的部分,就得看滑鼠能不能動了 XD 此例我開機完滑鼠還未能正常工作,所以我只好直接拔電源了 XDD


beagleboard_sdcard_reading


正常啟動後,上方紅色框框處大概會不定期閃爍,類似 PC 那紅紅的讀硬碟的燈,而那兩盞燈大概是讀寫 microSD 卡,通常我用那兩個燈來判斷系統是否正常,例如有一開始沒閃燈,或是一直亮燈不動。


最後,如果需要更新板子跑其他的話,流程如下:



  1. 格式化記憶卡 ( sudo sh mkcard.txt /dev/sdX && sudo mkfs.msdos -F 32 /dev/sdX1 -n boot && sudo mkfs.ext3 /dev/sdX2 -L Angstrom )

  2. 卸除記憶卡 ( sync && unmount )

  3. 重新插入記憶卡

  4. 依序複製重要檔案到 /media/boot 和 /media/Angstrom 區

  5. 卸除記憶卡

  6. 將記憶卡插回板子,準備妥後開機即可


其他資訊:



  • 假設安裝的 OS 是 console 模式或有支援的,預設是走 RS232 115200 的,當接好線後,可以用 screen 指令開啟 terminal 來觀看


    • $ screen -U /dev/ttyUSB0 115200


  • 如果安裝 Angstrom Demo 並不順利的話,可以試試 http://narcissus.angstrom-distribution.org/ 邊,他可以依照你的設定建立好所需檔案喔


    • 純 Console 方式 (初始化要等一會,應該不用10分鐘吧)


      • machine: beagleboard

      • complexity: simple

      • environment: console

      • Additional packages:


        • Platform specific packages


          • 勾選 Bootloader Files (x-load/u-boot/scripts)




    • 走 X11 方式(視窗介面,測試結果初始化約 2.5 小時,往後開機約 2 分半鐘,關機一分鐘左右)


      • machine: beagleboard

      • complexity: simple

      • environment: X11

      • X11 Desktop: GNOME

      • Additional packages:


        • Platform specific packages


          • 勾選 Bootloader Files (x-load/u-boot/scripts)




    • 之後按 build me! 後,大概等一會兒就會看到下載連結,在把檔案下載回來處理一下即可 (此以 beagleboard-changyy.tar.gz 為例,別忘了先格式化 microSD 卡)


      • $ mkdir ~/test

      • $ cd ~/test

      • $ tar --wildcards beagleboard-changyy.tar.gz ./boot/*

      • $ cp boot/MLO-* /media/boot/MLO

      • $ cp boot/uImage-* /media/boot/uImage

      • $ cp boot/u-boot-*.bin /media/boot/u-boot.bin

      • $ sync

      • $ tar --wildcards -xvz -C /media/Angstrom -f beagleboard-changyy.tar.gz

      • $ sync




參考資料:


2012年1月18日 星期三

BeagleBoard-xM 教學筆記 - 認識週邊線材

xm-diagram


圖片來源:http://beagleboard.org/hardware-xM


第二次接觸這種硬體設備,第一次是碩班修的嵌入式課程,我記得好像也是 ARM 的 CPU。這規格還不差(CPU: ARM Cortex TM -A8, 1GHz/DSP: 800 MHz),價錢也不貴(有在工作的人都比較能負擔得起),一塊板子不用 200 塊美金,又有一堆玩 Open Source 的社群支持,覺得可以把以前一些惡搞念頭都套用上去了!更何況現在又有 Android 這火紅的 mobile os 可以利用利用。我想,定個短期目標,半年摸摸板子,搞懂如何做 Android 移植跟開機優化兩項工作好了,如果又玩得上癮,再來試試 Webkit Update 或是 OpenGL 的部分吧。


首先這只是塊板子,要與他互動還需要幾項東西:



  • 5V 2A 電源 (須留意插座孔大小, 另外也有看過 2個 USB 供電的方式)
    5V2A

  • DHMI 螢幕輸出 (可以使用 HDMI 2 DVI-D 轉接)
    HDMI2DVI-D

  • RS232 (COM Port) 轉 USB
    RS232(COM)2USB

  • USB鍵盤、滑鼠

  • microSD/SDCard 讀卡機 (以便處理記憶卡事宜)


這張板子共有 4 個 USB 孔,算是滿夠用的,不然則是可以再買一個 USB 擴充槽,記得要能夠外接電源的喔。


接著就可以看看官網提供的新手入門的文件: