2008/11/27

Neo FreeRunner 新手手冊 (4) 建立 FreeRunner 對外網路連線 - Bluetooth


Neng-Yu Tu (Tony Tu)

Bluetooth 和 GPRS 裝置和 FreeRunner (以下簡稱 FR) 上的 USB 連線或 Wi-Fi 連線不一樣, 在使用前, 需要額外透過 command 先將這些裝置開啟, 然後才能執行. 先針對 Bluetooth 裝置說明. 詳細的內容可以參考 wiki 上的 http://wiki.openmoko.org/wiki/Manually_using_Bluetooth 網頁的說明. 此外 FR 上面的 Bluetooth 是 Delta 的模組, chipset 是 CSR 的 Bluetooth 2.0.

FR 使用的 Bluetooth stack 是 Marcel 的 BlueZ, 但是 BlueZ 能提供的功能, 在 FR 上都可以達到. 但 FR 並沒有提供完整的 profile 操作介面供連線/功能操作使用.

直接使用 BlueZ 的公用程式, 確實可以進行常見的 GAP, FTP, HID, PAN 的 "功能", 唯一的問題是: 必須手動完成大部分的功能及 handshake 驗證, 或是需要修改 /etc/Bluetooth/hcid.conf 的設定.

FR 上的 Bluetooth 是透過 USB 介面連接到 CPU, 預設的狀態是關閉的. 所以使用前必須先開啟 Bluetooth. 開啟的方式很簡單, 只要透過 command 就可以直接開關 Bluetooth 裝置.

同時, 由於 etc/network/interfaces 裡面的 Bluetooth 設定, 預設是 iface bnep0

inet dhcp. 建議先用 # disable 掉這個功能.

<Step 1> 開啟 FR 上的 Bluetooth device

root@om-gta02:~# echo 1 > /sys/bus/platform/devices/neo1973-pm-bt.0/power_on
root@om-gta02:~# echo 0 > /sys/bus/platform/devices/neo1973-pm-bt.0/reset

<Step 2> 執行 hciconfig, 透過這個命令我們可以確認 Bluetooth 是否正常執行, 以及取得目前 FR Bluetooth 的位址.

root@om-gta02:~# hciconfig
hci0: Type: USB
BD Address: 00:06:6E:16:DE:BD ACL MTU: 384:8 SCO MTU: 64:8
UP RUNNING PSCAN ISCAN
RX bytes:949 acl:0 sco:0 events:23 errors:0
TX bytes:342 acl:0 sco:0 commands:23 errors:0

如果沒有得到上述訊息, 可以用 hciconfig hci0 up 強迫啟動, 或是重複 Step 1 到 2.

<Step 3>

此時連線步驟要先切回 Host (ubuntu) 端, 請先開啟 Host 端的 Bluetooth, 執行以下命令.
root@ubuntu:~# modprobe bnep
root@ubuntu:~# pand --listen --role NAP

<Step 4> 在 FR 執行以下命令, 00:11:22:AA:BB:CC 處請填上 Host 端的 Bluetooth MAC 位址.
root@om-gta02:~# pand -c 00:11:22:AA:BB:CC --service NAP --autozap
root@om-gta02:~# ip a add 10.0.0.2/24 dev bnep0
root@om-gta02:~# ip r del default
root@om-gta02:~# ip r add default via 10.0.0.1

你可以從這邊下載完整的 script
http://t0ny.net/openmoko/samples/script/bt_net.sh

有時建立連線會失敗, 或 bnep0 沒啟動, 請執行下面這一行指令.

root@om-gta02:~# ip l set bnep0 up

<Step 5> 然後回到 PC 端, 設定 Bluetooth network 及 IP forwarding 的規則

FR 建立連線後, 可先用:

root@ubuntu:~# pand --show --list -l
應該會看到:
Bnep0 00:06:6E:XX:XX:XX NAP
看到這個訊息代表 FR 真的連上線了, 然後執行:
root@ubuntu:~# ip a add 10.0.0.1/24 dev bnep0
root@ubuntu:~# ip l set bnep0 up

接著可以從 Host 端, 及 FR 端分別 ping 10.0.0.210.0.0.1 看看是否可以雙向連上線.

root@ubuntu:~# ping 10.0.0.2
PING 10.0.0.2 (10.0.0.2) 56(84) bytes of data.
64 bytes from 10.0.0.2: icmp_seq=1 ttl=64 time=47.2 ms
64 bytes from 10.0.0.2: icmp_seq=2 ttl=64 time=22.0 ms
64 bytes from 10.0.0.2: icmp_seq=3 ttl=64 time=24.0 ms
64 bytes from 10.0.0.2: icmp_seq=4 ttl=64 time=17.0 ms

或是從 ifconfig 中看到.
root@om-gta02:~# ifconfig
bnep0 Link encap:Ethernet HWaddr 00:06:6E:16:DE:BD
inet addr:10.0.0.2 Bcast:0.0.0.0 Mask:255.255.255.0
inet6 addr: fe80::206:6eff:fe16:debd/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:268 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:284 (284.0 B) TX bytes:11737 (11.4 KiB)

<Step 6>

如果需要, 請在 Host 端, 和 USB 連線一樣, 再加入 packet forward 的功能.

2008/11/26

Neo FreeRunner 新手手冊 (3) 建立 FreeRunner 對外網路連線 - USB/Wi-Fi


Neng-Yu Tu (Tony Tu)


FreeRunner 分別可以透過無線 (Bluetooth, Wi-Fi, GPM(GPRS) 以及有線 (USB) 的方式. 但是從使用者介面上可以完成部分 Wi-Fi 連線功能外, 其他的連線方式可能需要進到命令模式, 然後透過手動下 script 的方式完成.

不同的 Distribution 可以用的 script (例如 FSO 有提供許多的 python binding service) 也不一樣, 當然最原始的方式就是直接下 bash script. 以下提供了 Host (PC) 端及 FreeRunner 端的連線 command 方式. 接下來以 ubuntu 為例, 分別設定以下幾種連線.

[USB 連線]

FreeRunner 的 USB port 預設在 USB 1.1 slave 的模式, 可以透過 Host 端電腦的 NAT 和外部的網路建立雙向連線. 下面分別是 Host PC/Neo 端分別需要下的命令.

更詳細的資料可以參考: http://wiki.openmoko.org/wiki/USB_Networking

* Host (ubuntu) 端
Host 端分成兩個步驟, 第一段是建立 SSH 的連線, 第二段是建立 packet forwarding 規則.

<Step 1>

sudo ifconfig usb0 192.168.0.200 netmask 255.255.255.0

ssh root@192.168.0.200

<Step 2>

Sudo iptables -A POSTROUTING -t nat -j MASQUERADE -s 192.168.0.0/24
Sudo sysctl -w net.ipv4.ip_forward=1

不同的 distribution/version 會有不同的指令設定, 不同防火牆也可能會有不同的結果. 可以直接參考 http://wiki.openmoko.org/wiki/USB_Networking

* FreeRunner 端:

Host PC 端跟 FreeRunner 連線後, FreeRunner 的預設 image 需要 "額外" 的一項設定, 需要加入 DNS nameserver 的名稱解釋服務.
echo nameserver 208.67.222.222 > /etc/resolv.conf
echo nameserver 208.67.220.220 >> /etc/resolv.conf

當然, 你可以熟悉 FreeRunner 的設定後, 套用到 FreeRunner 的

/etc/network/interfaces 裡面.

[Android Cupcake 0.1.1 and after]
PC side:

iptables -A POSTROUTING -t nat -j MASQUERADE -s 192.168.0.0/24
sysctl -w net.ipv4.ip_forward=1

FR side:
route add default gw 192.168.0.200 dev usb0
setprop net.dns1 168.95.1.1

[Wi-Fi 連線]

目前 FreeRunner 的 Wi-Fi Atheros AR6001 module 是透過 SDIO 介面連接 (所以如果你需要 Samsung 的 SDIO host controller code 可以參考 OM 的 implement, OM 的 implement 基本上是 based on OpenHand 的 Samuel 的 implement), 所以並不需要做 power on/off 的動作就可以使用模組. Wi-Fi 連線設定的關鍵, 主要在兩種連線加密模式 WEP 跟 WPA 的設定.

更多的資料可以參考: http://wiki.openmoko.org/wiki/Neo_FreeRunner_Wifi

* WEP

<Step 1>

登入 GTA02 後, 先看附近有哪些無線 AP

iwlist eth0 scan

<Step 2>

Key 欄位填入連接網路 AP 的 key
Essid 填入網路的 AP 名字 (essid)

iwconfig eth0 key 1234567890 essid myAP
ifdown eth0 && ifup eth0
udhcpc

最後一行指令是利用 udhcpc 動態取得 DHCP 的位址

* WPA

<Step 1> 建立 WPA 設定檔
利用 vi 或其他文字編輯程式, 建立如下設定檔

-----------
ctrl_interface=/var/run/wpa_supplicant
ctrl_interface_group=0
eapol_version=1
ap_scan=1
fast_reauth=1

# WPA2:

network={
ssid="WPA2_AP_Name"
scan_ssid=1
proto=RSN
key_mgmt=WPA-PSK
pairwise=CCMP TKIP
group=TKIP CCMP
psk="YourPSK"
priority=50
}

# WPA:
network={
ssid="WPA_AP_Name"
proto=WPA
key_mgmt=WPA-PSK
pairwise=TKIP
group=TKIP
scan_ssid=1
psk="YourSPK"
priority=10
}

# WEP:
network={
ssid="WEP_AP_Name"
scan_ssid=1
key_mgmt=NONE
wep_tx_keyidx=0
wep_key0="your WEP key"
priority=8
}
# Open:
network={
ssid=""
key_mgmt=NONE
priority=5
}
-------
<Step 2> 套用 WPA 設定檔, 重新啟動

wpa_supplicant -i eth0 -c /home/root/wpa_supplicant.conf -B
ifup eth0

如果無法連上, 可以試試 ifdown eth0 再試試.
連上後, 可以 ping http://www.hinet.net/ 或是 168.95.1.1 看看是否 DNS 跟網路的連線都 ok 了.

2008/11/25

Neo FreeRunner 新手手冊 (2) 登入 FreeRunner 終端機及安裝/更新套件


Neng-Yu Tu (Tony Tu)

FreeRunner 基本上有兩種終端機 (Terminal) 模式, 分別是 u-boot 時的 UART 終端機模式以及開機完成後, 可以透過 FreeRunner 預設的 SSH server 連進 FreeRunner. 基本上直接用 Linux (或是 vmware 上的 Linux) 的系統做這些連線比較簡單, 只要直接連上就可以直接從 /dev/ttyACM0 或是 ifconfig 看到 USB0. Windows 則需要裝另外的 RNDIS gadget 驅動程式 .inf 檔案. 接下來會針對這幾種方式說明.

Neo 還有一個 debug board (上面還有一顆蠻神奇的 FTDI 晶片), 可以透過主板上的 debug port (UART/JTAG) 對 Neo 做低階除錯動作. 在此先略過.

[U-Boot 終端機]

U-Boot 的終端機是典型的 UART terminal, NOR flash 跟 NAND flash 裡面的 u-boot 預設的輸出導向都是 USB tty. U-boot 終端機可以用來做一些低階的 register 開關或設定動作. 或是像是重設開機環境變數之類. 相關的資料可以從:

http://wiki.openmoko.org/wiki/U-boot 找到. 以 NOR u-boot 來說, 開機時按下 Aux 鍵, 再按下開機鈕, 畫面會停在 u-boot 上. 此時連接 FreeRunner 及手機上的 USB 接頭, 應該可以在 /dev 下看到 ttyACM0.

然後可以挑一個習慣的 COM port 公用程式, 像是 minicom 或是圖形的 cutecom. 或是個人常用的 neocon/cu . neocon 可以從http://svn.openmoko.org/developers/werner/neocon/ 找到.

連接參數為 115200, N, 8, 1, no hardware flow control

[用 SSH 連到 Neo]

FreeRunner 預設的 image 都有 SSH server/client (dropbear), 可以透過 SSH 進到 FreeRunner , 同時可以用 SCP 做一些檔案傳輸的工作. FreeRunner USB 埠預設的

IP address 是 192.168.0.202, netmask 是 255.255.255.0 這些設定都可以在FreeRunner /etc/network/interfaces 下修改.

所以當開機完成後, 連接電腦及 FreeRunner, 然後用 root 帳號登入 192.168.0.202 (使用 sudo or login as root), 密碼是空白:

root@ubuntu:~# ifconfig usb0 192.168.0.200 netmask 255.255.255.0
root@ubuntu:~# ssh root@192.168.0.202
root@192.168.0.202's password:
root@om-gta02:~#

然後接下來你就可以下一般的 linux command 及使用 script 了.

[安裝及更新套件]

Openmoko 使用源自 ipkg 的 opkg 套件管理系統, 改名的原因有很多, 但是重點是: 基本架構 opkg 跟 ipkg 是很類似的. 如果使用過 yum 或是 apt-get, opkg 的用法也是差不多的. 所以安裝套件有 3 種方式, 一種是將套件檔 xxx.ipk 或 xxx.opk 從網路上下載, 然後手動進終端機畫面後安裝. 第 2 種, 是利用 Neo 本身的 USB/Wi-Fi/Bluetooth 網路功能, 連線後透過終端機進行套件的安裝工作. 或是第 3 種, 網路連線後, 透過 2008.x 上面的 Installer 來進行安裝.

由於 Openmoko 本身非常具有 "community development" 的特性 ;) 所以套件的相關位址和狀態一直在變化. 最早隨 FreeRunner 出貨的 200804 GTK (有時也被稱為 2007.x 版) 版本, 是無法直接用 opkg update 或是 opkg upgrade 到最新的 Om2008. 9 or later . 建議直接參考其他資料先進行 FreeRunner 更新 image 的動作. 同時 2008.x 也有 release/un-stable/testing 的幾個不同的 tracking. 不同 Tracking 的差別會稍後說明.

FreeRunner 相關的 opkg feed 設定, 可以在 etc/opkg/ 的 .conf 檔案中找到. opkg 套件管理程式主要的 maintainer 是 tick.

* 手動安裝
Step 1: 搜尋一下哪裡有提供 neo package 的位址, 或可以從 http://t0ny.net/openmoko/opkg/samples/ 下載 orrery_2.0_arm_2008.8.ipk 然後繼續下面的步驟.

Step 2: 透過下面的命令連線:
root@tony-ubuntu:~# ifconfig usb0 192.168.0.200 netmask 255.255.255.0
root@tony-ubuntu:~# ssh root@192.168.0.202
root@192.168.0.202's password:
root@om-gta02:~# scp root@192.168.0.200:~/Desktop/opk/orrery_2.0_arm_2008.8.
ipk root@192.168.0.202:~
WARNING: Ignoring unknown argument '-x'
WARNING: Ignoring unknown argument '-oClearAllForwardings yes'
WARNING: Ignoring unknown argument '-n'
root@192.168.0.200's password:
root@om-gta02:~# ls

Step 3: 直接利用 opkg install orrery_2.0_arm_2008.8.ipk 安裝套件. 有時套件系統會因為某一些系統行為停掉, 此時你必須使用killall packagekitd 來停掉 opkg 服務再重新進行安裝程序.

* 透過網路安裝
透過網路連線需要幾個額外的步驟, 建立 USB/wi-fi/Bluetooth 網路連線及設定 Neo 的 DNS 設定. 設定完後, 就可以直接透過 opkg install 安裝.

root@om-gta02:~#opkg install packagename.opk

* 透過 UI 上的 Installer 安裝
必須先建立網路連線, 才能透過 Installer 安裝相關的 package. 你必須先到 2008.x 的主畫面中, 選擇 Settings, 然後啟動 wi-fi 並輸入 WPA 密碼. 螢幕小鍵盤的使用方式很 tricky, 你必須在鍵盤右側的黑框上, 上下移動選擇數字或其他特殊符號. 由於 2008.x 的 wi-fi 設定程式有些 bug, 建議參考其他方式確認網路連線後, 再透過 Installer 安裝.

[移除 package]
移除 package 可以使用 opkg remove package_name , 相關的命令可以用 opkg --help 找到

Neo FreeRunner 新手手冊 (1) 認識 Distribution 及更新 image


Neng-Yu Tu (Tony Tu)


[認識 Openmoko 的相關 Distribution]

通常拿到 Neo 第一件是要學會的就是如何更新手機裡面的image. 目前 Neo 有以下的 image 可供選擇.

* Om2007.2: 由 Open Hand 主導的使用者介面設計 (work for Intel Moblin now) , 建立在 GTK 的基礎上, image 可以從以下網址找到:
Image: http://t0ny.net/openmoko/images/200804/






















* Om2008.x : 這是目前 (2008 年) 還在維護的版本, 基本上是由 open source 版的 QT/X11 加上 raster 的 illum ETK. ETK 提供了自己的圖形介面 API, 還有自己的 python binding.
Image: http://t0ny.net/openmoko/images/200809/
























* Android: 根據 Google釋出的原始碼, 由 Sean McNeil 維護的 Neo Android 版本, Beta 4 (RC1) / Cupcake 之前的版本在 FR 上需要一張額外的 uSD 記憶卡 (128 MB 以上).
說明: http://wiki.openmoko.org/wiki/Android
Image: http://t0ny.net/openmoko/images/android/























* QT extended: Trolltech(a Nokia company now)/Qtopia 維護的版本, 目前到 4.4.x
http://wiki.openmoko.org/wiki/Qtopia_/_Qt_Extended_on_FreeRunner

image: http://www.qtopia.net/modules/mydownloads/index.php






















* Debian: Debian 社群開發並維護的版本.
* FSO: Mickey 跟 2009 年 openmoko framework 可能方向, 基本上 FSO 是建立在 D-Bus 上的應用程式架構, 透過 python binding 的 toolkit (如 GTK/ETK) 來呈現使用者介面的畫面.
http://wiki.openmoko.org/wiki/OpenmokoFramework























* SHR 及 FDOM: 基本上是社群上的人自己維護的 image, SHR 主要重點在提供 illum/enlightment 標準介面/畫面以及 tangoGPS 程式. FDOM 目的是解決官方版釋出的 image 裡面的套件不足以供一般的開發需要. 同時省掉需要 opkg install/upgrade 的麻煩. 詳細差別可以參考以下網址:
http://wiki.openmoko.org/wiki/SHR

[SHR] http://shr.bearstech.com/























[FDOM] http://www.tuxbrain.com/fdom_en.html




















[更新 FreeRunner image 的方法]

更新 FreeRunner 的 image 有兩種辦法:
<方法 1>
一個是透過 FreeRunner 上面的 USB, 透過 DFU (Device firmware update) 協定及 dfu-util 程式, 然後利用開機進到 kernel 前的 u-boot, 更新 image. 此外, 目前只有 linux 的電腦才能做 DFU update 的工作. 當然如果你用 vmware 之類的 emulator 上跑的 linux 也是可以的, 不過記得連接 FreeRunner 時的程式 focus (視窗) 要是 vmware 的 Linux 才行.

FreeRunner 的 DFU 是由 Werner 維護開發的, 相關的原始碼在 http://svn.openmoko.org/trunk/src/host/dfu-util/ . 更多的資料可以查
http://wiki.openmoko.org/wiki/Dfu-util.


<方法 2>
如果你有 micro SD card, 最快的方法是直接把 image copy 到 micro SD card, 然後從 micro SD card 執行 script. 你可以參考以下 script 來做更新 FreeRunner 裡面的 image.
http://t0ny.net/openmoko/samples/script/dl_finalimg

[更新 FreeRunner image 的步驟]

< Step 1>
從上面的連結中下載 dfu-util 的原始碼自行編譯或是 download 已編譯好的套件

< Step 2>
http://downloads.openmoko.org/releases/ 下載最新的 images, 或從前面的連結中, 找到相關的檔案, 下載到本機上.

< Step 3>
如果是啟動 NOR boot (先按 Aux 鍵, 再按開機紐), 開機畫面就會停住. 同時此時你可以透過 USB 將 FreeRunner 跟你的 Linux 連起來. 然後就可以用 sudo 或是 root 權限執行 dfu-util 進行升級的動作.

<Step 4>

* 更新 rootfs:
./dfu-util -a rootfs -R -D /path/to/openmoko-devel-image.jffs2
OR
./dfu-util -a 6 -R -D /path/to/openmoko-devel-image.jffs2

* 更新 kernel:
./ dfu-util -a kernel -R -D /path/to/uImage
OR
./ dfu-util -a 3 -R -D /path/to/uImage

* 更新 bootloader
./dfu-util -a u-boot -R -D /path/to/u-boot.bin
OR
./dfu-util -a 1 -R -D /path/to/u-boot.bin

* 更新開機 splash image
./dfu-util -a splash -R -D /path/to/splash.gz
OR
./dfu-util -a 4 -R -D /path/to/splash.gz

* 更新開機參數 (environment variable)
./dfu-util -a u-boot_env -R -D /path/to/env_new
OR
./dfu-util -a 2 -R -D /path/to/env_new

<Step 5>

記得檢查 DFU 的結束的訊息, 當進度條結束並不代表更新一定成功. 如果 DFU 一直中斷, 記得檢查 DFU 的參數是不是下錯, 或是 USB cable 是不是沒接好. 如果你是從一般 u-boot (不是從 NOR 的 u-boot) 更新, 可能更新 NAND 裡面的 u-boot 也是一個 方法.

2008/11/14

memorial

2008 Nov 14, really a sad day. 2007 Nov 14, a happy day.
 
Creative Commons License
著作 係採用創用 CC 姓名標示-非商業性-相同方式分享 3.0 台灣 授權條款授權.