顯示具有 Non-X86 標籤的文章。 顯示所有文章
顯示具有 Non-X86 標籤的文章。 顯示所有文章

2017-04-14

Raspberry Pi 3 serial 通訊

Raspberry Pi 很多時候是靜靜躺在某個角落默默的做我們要它做的事
它不需要螢幕也不需要鍵盤,但偶而遇到網路不通時,這時如果還要
搬一台螢幕再接一台鍵盤才能操作,就太麻煩了。

如果可以透過serial port連進去,就可以隨便拿一台筆記型電腦來操作它了。

https://openclipart.org/download/264608/gpiopinsv2withpi.svg
從這個圖(這是RPi三代機)可以看出右側雙數腳6(接地),8(TX),10(RX)
可以用來做serial通訊。

由於三代Pi是用debian jessie, 隨著debian從sysvinit 改用systemd, 舊版Pi 的
修改/etc/inittab 的控制方式已經不適用, 必需用systemctl 來控制.
(有很多人討厭systemd, 但迫於情勢, 也不得不接受了)

我先是用dietpi-config 來啟用serial port, 但是無效, 後來手動修改
/boot/config.txt 以及/boot/cmdline.txt 裡面加上某些控制字串才能啟用。

config.txt: 加入以下
dtoverlay=pi3-disable-bt
enable_uart=1
這個config.txt 如果是在Raspberry系統執行中修改可能重開後會不見
所以改成把microSD 卡拿出來插到讀卡機裡, 用其它電腦editor來修改.

cmdline.txt: 插入以下
console=serial0,115200
這裡的"serial0"是一個sym link, 如果不通, 可以試試看ttyAMA0 或ttyS0

重開機後執行systemctl|grep serial 來確認一下serial 方面的service狀態.
當然在硬體方面你要準備一支USB to TTL的轉接器, 不管是FTDI或PL23xx 都可以,
TX 要接到RX 才能通訊, 總之不通的時候確認一下腳有沒接對.

2017-01-26

Firmata Serial直送PWM,Servo

除了將各pin做為digital out用可以送出
serial.write(chr(0xf4)+chr(PIN)+chr(1)) 來定義之外,這裡再補充一下
PWM及Servo

PWM:
serial.write(chr(0xf4)+chr(13)+chr(3)) 將13pin定義成PWM
(第13pin在Arduino板子上有內建的LED可以做測試)
(Arduino限定3, 5, 6, 9, 10, 11, 13才俱有PWM功能)
不過328P的13pin不能當PWM用,32U4才可以。

定義某一支pin做為PWM之後,可以送出
serial.write(chr(0xe0+PIN)+chr(N)+chr(0或1))
來控制PWM LED的亮度,例如:
serial.write(chr(0xe0+13)+chr(127)+chr(0))
控制第13pin,亮度127
亮度數值從0到254,當亮度大於127時,第三byte要為1,其於則為0
serial.write(chr(0xe0+13)+chr(150)+chr(1))

Servo:
serial.write(chr(0xf4)+chr(13)+chr(4)) 將13pin定義成Servo
定義某一支pin做為Servo之後,可以送出
serial.write(chr(0xe0+PIN)+chr(A)+chr(0或1))
來控制Servo推動的角度,例如:
serial.write(chr(0xe0+13)+chr(127)+chr(0))
控制第13pin,Servo轉到127度
Servo的角度從0到179,當角度大於127時,第三byte要為1,其於則為0
serial.write(chr(0xe0+13)+chr(150)+chr(1))

當pin小於或等於15時,用上列的控制算法

當pin大於15時,用以下方法

當角度小於或等於127時,用
serial.write( chr(0xf0)+chr(0x6f)+chr(PIN)+chr(A)+chr(0xf7) )
例如:
serial.write( chr(0xf0)+chr(0x6f)+chr(16)+chr(120)+chr(0xf7) )
如果角度大於127時,用
serial.write( chr(0xf0)+chr(0x6f)+chr(16)+chr(150)+chr(0x1)+chr(0xf7) )

不過一般來說,Servo實際推動的角度範圍還不到180度。

2016-11-28

FirmataPlus Serial 直送碼

之前一直都用 pyfirmata 來控制 Arduino, 但是 digital pin 的數量受制, 所以要改
Board.h 又要改 pyfirmata.py 所以使用上不是很方便, 最近改用 PyMata 它可以
讓 mega32u4 用到更多 digital pins, 以 Leonardo 來說可以用到 23 支, 小一點的
Micro 也能用到 22 支, 更小的 Pro Micro 也能有 18 支可用, 所以不管是控制 7seg
LED 或 8x8 matrix LED 也夠用.

原本都要依賴 pyfirmata 或 PyMata 的 module, 但它的啟動有點長, 加上如果是要
透過別的機器不一定能提供完整的 library 給 pyfirmata/PyMata 呼叫, 因此嚐試
改用 python serial 直送 firmata 控制碼.

這裡以 digital pin 為例, 說明一下如何直接傳送控制碼, 以及 pin 腳的接法以達到
「最少傳送」而且能讓多支腳工作的方式.

Arduino (Leonardo/Micro/ProMicro)是裝了 PyMata 的 FirmataPlus32u4
這一支, 然後控制端只要用到 python serial 即可. Arduino 的腳分成幾個 port:
port 0: pin 0 -- 7
port 1: pin 8 -- 15
port 2: pin 16 -- 23

Firmata 的控制碼:
port 碼 + pin 碼 + 尾pin碼
例如要給 0(或 8 或 16) pin 拉 High, 就是送出
 第0腳:  0x90 + 1 + 0 三碼
 第8腳:  0x91 + 1 + 0 三碼
 第16腳: 0x92 + 1 + 0 三碼

 第7腳:  0x90 + 0 + 1 三碼
 第15腳: 0x91 + 0 + 1 三碼
 第23腳: 0x92 + 0 + 1 三碼
 (以上三支腳比較特別, 中間那一碼就保持原有的值, 不必加減)

 第3腳: 0x90 + 8 + 0 三碼
 第11腳: 0x91 + 8 + 0 三碼
 第19腳: 0x92 + 8 + 0 三碼

 同時 3 及 7 腳: 0x90 + 8 + 1 三碼
 同時 11 及 15 腳: 0x91 + 8 + 1 三碼
 同時 19 及 23 腳: 0x92 + 8 + 1 三碼

 同時 3 及 4 及 7 腳: 0x90 + (8+16) + 1 也就是 0x90 24 1 三碼

腳的算法是這個 port 的第幾支腳就是 2 的幾次方,
第3腳是 2的3次方, 所以是8
第11腳是 port 1 的第 3腳(由0開始), 所以也是 2 的 3次方, 也是8

第 8 腳是 port 1 的 0 腳, 所以 2 的 0次方, 及 第11腳同時 high 就是 1+8=9
所以送出的三碼是 0x91 9 0, 用 python serial 就是
serial.write(chr(0x91)+chr(9)+chr(0))
所以如果把同一個 port 的 pin 接在像是 8x8 LED 上相續的 row (或 column)
這樣就可以只送出一次控制碼, 便能同時讓多支 digital pin High/Low.
serial.write(chr(0x91)+chr(9)+chr(1))
可以讓 pin 8,11,15 三支同時 High.

2016-08-20

寄生 Linux 系統到手機裡

最近一支舊手機螢幕壞了,要修也要花錢,所以就讓它退役下來做些不一樣的事好了。

由於手機有1G RAM,如果不做什麼事,其實可以「寄生」一套 Linux 在裡面,
「寄生」的Linux可以不具備 kernel 相關的東西,藉著 Android 的 kernel
就可以吃香喝辣,所以只要小小的體積就俱有不少功能。

希望能把系統控制在200MB以內,包含基本的sshd, sshfs, python, w3m, tmux....
等等就可以做不少事, 最後整包系統(刪除不必要的東西如 /usr/share 下, 以及
/var/ 下)大約在 220M左右, 還可以接受。

用 adb 進入手機內建立一個300M 的 RAM disk, 把這包系統解到 ramdisk 裡
再 chroot 進入就可以啟用這包沒有 kernel 的寄生 Linux 了.

為了要找一個合適的 Linux, 找來找去最後找到 http://dietpi.com 裡面有
很多專為各種單板電腦打造的版本,可以選用其中的 OrangePi PC 或 NanoPi Neo
的image 來當「寄生」的原型,特別說明一下,它是Debian Jessie base,
所以如果熟悉 Debian/Ubuntu 的話應該很容易上手.

這裡以 NanoPi NEO 的image 為例,下載後以 7z 解壓縮出原本大小約為 460M, 但是
它包含了一塊 vfat 及一塊 ext4 partition, vfat 是boot/kernel 相關, 用不到,
我們只要取出 ext4 也就是Linux 這一塊.

fdisk -l DietPi_v127_NanoPiNEO-armv7-(Jessie).img 可以看到

DietPi_v127_NanoPiNEO-armv7-(Jessie).img2          133120

這個 133120 就是它的起始位置,
133120 * 512(每 sector) = 68157440

來把它 mount 起來:
mkdir /media/dietpi
mount -o offset=68157440 -t ext4 DietPi_v127_NanoPiNEO-armv7-\(Jessie\).img /media/dietpi
cd /media/diatpi
cp -a * /PATH/my_dietpi/

然後 chroot 進入 /PATH/my_dietpi/ 底下進行改造, 再將改造出來的整個目錄打包,
就可以塞進手機裡「寄生」了!

2012-10-11

蘋果要倒了,網樂通改機

蘋果集團因為壹電視因為被NCC 官僚刁難很久,加上有線系統業界的各種利益
阻撓,燒了很多錢之後,黎光頭受不了,於是台灣這棵蘋果樹要倒了。

在可以預期的未來,滿街都是林益世!

蘋果媒體之所以能爆出林益世貪污案,不是這個媒體特別有能力,而是蘋果的
老闆黎智英是外國人。
如果蘋果的老闆是台灣人,像林益世這種案子一定被壓下來,不會報。

所有台灣現有的媒體都是有相當程度的政商關係,就算有人拿到像林益世這種
案子的證據,交到媒體,在老闆的考量下終必丟進馬桶沖掉。

蘋果倒了,第一高興的是那些貪官污吏!再也不會出事了!
(看來蘋果要倒了,2559 也會很高興,因為到時候沒人爆料,直接無罪釋放了)

蘋果倒了,第二高興的是手上有網樂通機上盒的人了!

原本網樂通規定你不可以亂玩這個盒子,不然到時候他們可能向你索賠3000元
,這個小盒子絕對值不到3000元,所以不要跟錢過不去,要玩去買支像是MK802
或Raspberry Pi 或beagleboard 什麼的。

現在蘋果要倒了,他們也寄出信函說這台小機機不用還,所以大家來給它開開機吧!

照著網路上的教學想改機,卻遇到問題,就是按住reset 再插power 後完全找
不到機子的IP 可以telnet 進去,所以這一步是行不通的。

看到教學說要自行接UART出來以debug的方式進行改機,這好像有點麻煩,其實
在拆開機盒後,把那一粒8G USB DOM拆下來,可以看見它有四支腳,而且都有
標示+5V, GND, DP(data plus), DM(data minus), 這四腳都是母孔位,只要接
線到麵包板再拉線到工作的電腦USB 插座,當一般USB 隨身碟處理就可以改裡面 
的內容了。

fdisk -l /dev/sdb 可以看到

Disk /dev/sdb: 8027 MB, 8027897856 bytes
160 heads, 19 sectors/track, 5157 cylinders, total 15679488 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000

   Device Boot      Start         End      Blocks   Id  System
   /dev/sdb1              19      617119      308550+  83  Linux
   /dev/sdb2          617120     1234239      308560   83  Linux
   /dev/sdb3         1234240    13819839     6292800   83  Linux
   /dev/sdb4        13819840    15622559      901360   83  Linux

mount 之後可以看到四個partitions 都是ext3 格式。

2012-10-01

用shell script 寫個輸入法

最近使用mk802 一開始是遇到microSD 速度的問題, 以致在量稍微大一點的寫入時,
會把系統檔案弄亂, 所以先不裝Xorg.

因為用debootstrap 做出來的初步系統不大, 要裝Xorg 的話會depend 很多檔案, 在
apt-get 進行安裝時會從幾十到上百MB, 這在Class 4 卡上面就會出亂子(屨試不爽).

另方面也是MK802 只能以framebuffer 方式跑 xserver-xorg-video-fbdev, 但是
framebuffer 之下的效率是不好的, 所以不如只用text mode 回到石器時代體驗
另一種人生 XD (要說我自虐也可以啦).

由於自己compile 的kernel 有支援fbcon, 因此只要跑fbterm 就可以顯示CJK,
這樣在沒有Xorg 環境的石器時代下, 己經可以有效閱讀漢字了, 就算只能用w3m 的
web-browser 也能夠收發gmail, 所以原始人在text mode 下也可以跟現代人通訊,
也能生存了, 只差最後一里路, 就是漢字的輸入法.

目前現成的漢字輸入法能用於UTF 環境的只有ucimf, 但是試了一下debian 裡的ucimf,
才打幾個字就crash 掉, 幾乎等同不能用, 這樣好像非裝Xorg 不可.

一開始想是不是可以從現有輸入法的table(xxxx.cin)裡, grep漢字的拆碼, 瀘出所要
的漢字出來再copy/paste, 不過這樣的人力耗費實在太多, 之後查閱tmux 的用法時,
發現它支援buffer copy/paste, 就是說可以利用tmux 來自動化.

tmux 幾乎可以說在text mode 下屬於必用的軟體, 這樣只要藉由tmux 的config 來
搭配grep 輸入法table 所產出的字串, 就可以自動把漢字copy/paste 到目的區,
這樣跟使用現成的漢字輸入法軟體幾乎相同.

開始試著寫一個shell script 來達到這個目的, 經過幾天慢慢修改, 終於完成與現有
Xorg 環境下輸入法主要功能相同的功能, 例如可以切換輸入法(注音table 還未完成)
以及可以打正出簡(只要用正體字的拆碼就可以打出簡體字).

S=輸入的一長串漢字的拆碼(英文字母中間有空白分隔,就像一般打倉頡那樣的打法)
  (例如:onf aj ym sbn ymy nn ene(你早上刷卡了沒))
for i in $S; do
   k=$(grep ^"$i " $CJKtable)
   if [ ${#k} -gt 0 ]; then # 這是有grep 出漢字
      j=$(echo -n $k|sed -e "s/$i //g" -e 's/ />/g')
      if [ ${#j} -gt 2 ]; then  # 如果grep 出超過一個以上的漢字
         再提示選字,再剪出所要的字
     echo -n $j; read J
     SELECT=$(echo -n $j|cut -d'>' -f $J)
     STR="${STR}$SELECT"
      else  # 只瀘出一個漢字的話
         就以grep 出來的漢字
   else
      如果沒有grep 出漢字, 那它就將原字串貼出(例如漢英混打)

最後將泣出的漢字整句推進buffer 裡
echo -n "$STR"|tmux loadb -
再藉由tmux 自動貼到目標區
tmux paste-buffer -t top-left

這裡其實還有稍微要施工的就是輸入法的table, 讓同碼字減少.

致於Ctrl-space 的切換鍵就由tmux config 來定義
bind-key -n C-Space select-pane -l

而tmux 工作區要切出像是一大塊跟一小塊
bind-key -n F1 run \
"tmux split-window -v -p 9 ; tmux split-window -h -p 40; tmux select-pane -U"
(右下側區塊留做其它用途)

這樣一個沒有Xorg 環境的Linux 幾乎像一部悍馬車, 可以在各種地型行駛,
如果用在server(大都沒裝Xorg 吧?) 也是很方便的.

其實在framebuffer 環境下(就是沒跑fbterm 的環境), 利用w3m-img 就可以顯示
網頁裡的圖片, 原始人過的生活也不是太原始啦!!

2012-09-17

MK802 之MicroSD 的速度問題

之前用過標準SD卡做Linux filesystem 插到Android 之下跑chroot 沒什麼問題
,沒想到這次在MK802 用MicroSD 跑native Linux竟然一直出問題,在猜是速
度限制造成的。

今天終於去買了一塊class 10的MicroSD來試,結果好太多了,也證實先前的
猜測是對的。

之前手上只有class 4, 一旦寫入多一些,例如install一些packages, 裝完之後整
個file system就亂掉,拔下來拿到別台電腦上fsck,會在 /lost+found 下面有
百個以上(或幾百個?)的檔案,這實要手動復原的話太累了,乾脆重新dd一次。

這樣的情況也導致根本沒辦法做debootstrap 的second stage, 因為每做必爛掉!

看過網路上一些比較數據,似乎class 4 也不會太差,但我遇到的情況卻是不
堪用,應該也不是品牌問題,手上class 4 的卡分別是Sandisk及Kingston 都
一樣會亂掉,今天買的class 10 雖然是不同牌的 Apacer,用起來穩穩的,但
我想應該品牌原因不高。

上篇文章裡提到已經做好kernel/uboot, 只要再跟root filesystem 組合就可以
在MK802 上面跑 native Linux, 網路上已有現成的for MK802 的linux, 但都是
Ubuntu based, 我想做一個Debian wheezy based, 前面幾天都卡在class 4 的
速度不夠以至 deboostrap 的second stage 無法完成,剛好看到小狗板那邊
有人做了一個很basic 的wheezy, 所以先拿來用,其實自己用debootstrap 做
出來也就是那樣子,它也是公開供人下載的,
http://elinux.org/BeagleBoardDebian 。

我make 的kernel 支援fbcon, 原來只要利用 fbterm 就可以在text console 下
顯示漢字,於是我也把自己修訂過的 Droid Sans Fallback 加進去,這樣用
w3m 也可以瀏覽各種CJK網頁,而且在 text console 下執行 fbterm 也可以
設定字體大小,指令像是:
    fbterm -n "Dejavu Sans Mono" -s 14
指定 Mono 在console 裡才不會字體重疊,當它遇到有CJK字時,就會去找
同樣是Sans 的 Droid Sans Fallback 來補位,這樣在閱讀漢字是沒問題,差
的只是不能打出漢字。

試用了一下之後發現用w3m 可以login gmail 讀取信件。

2012-09-14

MK802 desktop and kernel 3.0.42

從Raspbery Pi開頭之後,最近好玩的小玩具越來越多,也越來越多山寨,
MK802就是近來頗受歡迎的ARM pc, 它的體積大約是10x3x1 公分, 內建
Android ISC, 直接插到有HDMI 的電視就可以玩。

有關MK802 II 可以參考
http://www.rikomagic.co.uk/forum/viewtopic.php?f=2&t=305

這是中國生產的ARM device, 在youtube 上看過紀錄片似乎是一家很簡陋
類似家庭工廠所生產,或許這樣才能cost down 吧?在露天拍賣的售價
從1550 到兩千多(加其它週邊)都有人賣,它有分一代機、二代機,外觀
不同。

最近剛拿到二代機,一開始用就覺得它實在有些燙,所以乾脆把外殼拆
掉,再貼一塊散熱片在CPU上,但如果就這樣用,散熱片摸起來還是燙燙
的,所以最後就加一個小風扇吹它。



不過我買MK802主要不是跑Android, 而是想跑「正常」的linux 當desktop
,用了幾天的初步結論是實驗性大於實用性!

首先因為它的RAM是燒死的1GB, 不像x86架構可以由user自行加減,所以
當desktop用會有RAM 不足的情形,目前1GB的RAM最多只能用到大約830MB
(當server用的話最多可以用到899372 kB), 其餘被GPU還有不知道什麼
吃掉了,就算不載入mali 相關modules 或是在boot command 加上
"mem=1024M" 它還是無法完全用到1024MB。

其次是解析度,目前能用的就只有1280x720(720p) 或1920x1080(1080p)
兩種可選, 而且是透過boot.scr 來控制, 不是user 在進入linux 環境
後可以改變的,不像在x86 環境可以依螢幕實際解析度來調整。

再來是storage的速度,MK802 要跑「正常」linux的話就是插入一個裝
著「正常」linux的microSD, 目前手邊只有class 4, 在多次使用經驗
中filesystem 常常出現亂掉的問題,懷疑是class 4 速度太慢的原因,
不曉得用class 10會不會好很多?

目前網路上找得到的for MK802 的linux 就是linaro, miniand 以及改
自miniand 的rikomagic 等三個版本, 它們的kernel 對週邊設備支援
太少, 所以我自己clone kernel source 回來make, 換掉原本的舊kernel.

https://docs.google.com/open?id=0ByM1ckIZtYRMZVRZWWhNd0JBZ2M

它是經由 git clone 抓了一些 https://github.com/amery/ 之下相關的
東西回來自行 make, kernel 是 3.0.42. 內容包含 kernel, modules, firmware,
bootloader, 用來換掉那幾個版本裡原本的 3.0.36 kernel.

現在可以使用的包括USB ethernet, USB sound card, USB GPS, 也加上網路
最基本該有的netfilter(for iptables)支援,有興趣的朋友可以下載來替換。

目前我做的這個kernel 已知的問題(但原因不明)包括:
1. OTG 沒有如期生效, 我確定make 裡的選項有選了
2. USB webcam 未能生效, (也是選項有選)
3. RAM 看到(/proc/meminfo) 只有 801440 kB
  (相較於 miniand 3.0.36 kernel的 834036 kB 要少了三十幾 MB)

試了各種boot command, 最後得到 mem=928M 是黃金交叉點, 可以用到約800M RAM.

就算 boot command 告訴它 mem=1024M 的話, 開機後還是只能看到
899372 kB RAM, 但螢幕完全不能用, 不過可以當server 用, 由遠端login 操作.

注意:
使用本人包的kernel/uboot 替換之前,請先確認你做好備份, 本人
不負任何損害責任.

2012-07-31

Android root最後一里路, 以及 OTG

對於已經能經由 adb 連進手機並且有root權限的人,卻受困於從手機本身的terminal
無法執行 su, 就算系統裡都已經有 su 了, 它還是會告訴你 permission denied 或像是 
uid xxxxx is not allowed to su, 因此很多事不能做, 包括chroot, 真是令人不爽。

這最後一里路就差兩樣東西,我們可以到 http://androidsu.com/superuser/ 下載
Superuser-x.x.x-arm-signed.zip 回來解開只拿其中的 Superuser.apk 以及 su
, 分別把Superuser.apk 丟到 /system/app/ 以及把 su 丟到 /system/bin/
當然要先 remount /system/ 成可讀寫,然後 chmod 06755 /system/bin/su

如果系統裡已有別的 su 版本,也順便把它 rm 掉, 裝好後先關掉你原先開啟的 terminal
再重跑一次(不必重開機),這樣從手機本身開啟 terminal 或像是 irssi-connectBot
就可以執行su 然後做愛做的事了。個人是推薦 irssi-connectBot, 它俱有像是 Ctrl, Alt,
Esc 等等按鍵的功能。

這個 Superuser-xxxx 從 Froyo 到 ICS 都適用。那個網站還同時提供 x86 版本,如果
玩 x86 Android 有需要的話也可以抓來 su 一下。


關於 OTG 接頭

之前在光華商場一帶買了一支包裝上寫著 OTG USB 接頭(一頭microUSB 一頭標準USB,
NT$60)回來,結果不能用!

後來在露拍又買了一支(NT$30),終於可以用。差別在 microUSB 那一端的第四腳(ID)
跟第五腳(GND)有沒有短路,沒有短路的只能當 microUSB 轉標準USB 轉接頭(可以讓
adb工作沒問題),有短路的才能讓 OTG 當 host 用,可以連接鍵盤、老鼠、外接碟、
HUB 等等。

方便的話最好在購買的當場用三用電錶量一下,確認哪支腳是開路還是短路,但是
microUSB 腳很細,因此電錶的探針需要綁上像是大頭針之類的很細的金屬,標準
USB 那一端最好也插一片紙來絕緣它的外框,這樣才能順利量測。

2011-11-26

Android手機透過USB當無線基地台

Android手機可以當AP(基地台)用,但未必人人都有購買3G上網吃到飽,
所以在省錢才是王道的前題下,我們要用別的方法來讓手機當AP。

只是手機大概百分之九十九點九九九九沒有ethernet(有線網路),不過
Android手機卻可以將USB模擬成ethernet,因此我們便可以利用它來連
到桌上型或筆記型電腦來上 Internet。

首先將手機附的連接電線的一端插入PC的USB接口
接著將手機的USB啟用
設定==>無線與網路==>數據連線與可攜式無線基地台==>USB數據連線
(或者以指令來啟動:
adb shell 'echo -n 1 > /sys/devices/virtual/usb_composite/rndis/enable'
也可以)

這樣Linux會自動載入
mii, usbnet, cdc_ether, rndis_host 這四個kernel modules.

(請先讓你的手機可以有root使用身份,並殖入busybox到/system/bin/
進行方法不在本文討論範圍)

在手機的USB插入PC後,在PC執行ifconfig -a 可以看到usb0 的網路
介面出現。

執行adb shell 'busybox ifconfig'
看一下手機的usb0 是什麼IP, 例如192.168.123.10

在PC的Linux下,以root身份執行以下指令
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A POSTROUTING -s 192.168.123.0/24 -o eth0 -j MASQUERADE
ifconfig usb0 192.168.123.1
再來就是手機端
adb shell 'busybox route add default gw 192.168.123.1'
adb shell 'setprop net.dns1 168.95.1.1'

手機啟用AP功能
設定==>無線與網路==>數據連線與可攜式無線基地台==>可攜式Wi-Fi無線基地台
請記得設個密碼,除非你想當好鄰居

adb shell 'busybox route'
你會看到手機的routing有另一組 IP, 假設是192.168.124.0
adb shell 'iptables-1.4 -t nat -A POSTROUTING -s 192.168.124.0/24 -o usb0 -j MASQUERADE'
(或許你手機裡的 iptables 名稱不叫 iptables-1.4,你可以先adb shell
進去後打 busybox ash, 再打一下 iptable 不要按Enter 而按TAB鍵,讓它
自動補完,就知道完整名稱了)

如果不啟用手機AP模式,光是USB連線上之後,手機本身就可以上網了。

簡單整理一下要點:
1.手機啟用USB數據連線,並將連接線插到PC
2.PC上會出現usb0, 設定它的IP,並將usb0 Masquerade 到eth0 出去
3.手機啟用無線基地台模式
4.幫手機的 xxap0(以上面舉例也就是另一組IP 192.168.124.0) Masquerade 到
usb0 出去Internet.

讓手機透過PC USB上網還有一個好處就是可以做監控實驗,因為它所有封包都進
到PC 再從eth0 出去,所以可以用各種工具來觀察當你執行某個app 時,它到底是
連到哪些地方去,或者它透過網到底在幹什麼,都是很有趣的實驗。

這也有個好處,就是由USB供電,不必額外電源,另方面也能為手機保持100%滿電。

2011-04-17

fastboot 大吃記憶體

要把新的 image 塞進 Android device 可以用 "fastboot" 來寫入,
不過 fastboot 是吃RAM 的大怪獸,它在傳送之前會把 image 先載進
RAM, 所以假設你的 image 有 1GB 那麼你的電腦至少要有 1GB+OS所需
的RAM 才能動作,或者要依賴 swap(這樣的話整個電腦會慢下來)。

如果你想同時做兩個這樣的動作(寫入 1GB image 到兩台 Android devices),
就必須有 2GB+OS所需的RAM, 這對於有4G RAM的電腦是沒有問題的,但是
如果要同時寫入更多台手機,突破 4G RAM 限制,就要換用 PAE kernel 了
(OS 不必換,只換kernel 即可)。

至於各家手機要進入 fastboot mode 的「暗鍵」有所不同,總之都是搭配
某個鍵先按住不放,再按 power 開機, 如果找不到各家的「暗鍵」資料,
也可以自己排列組合的試試吧!總之要先讓 fastboot 能看得到 device。

網路上找得到現成 binary fastboot, 不過有些只支援 HTC(0x0bb4),
但是現在 Android 手機品牌越來越多,還包括一些 mobile devices, 因此
現成binary 可能抓不到你的 mobile device, 那麼就要找 source 自己 compile.

http://source-android.frandroid.com/system/core/fastboot/
這裡有 fastboot 相關的 source, 新版的已經加入各家的 vendor id,
其中沒寫 comment 的 0x0451 是 Texas Instrument, 0x0502 是 Acer

0x18d1 Google
0x0451 Texas Instrument
0x0502 Acer
0x0fce Sony Ericsson
0x05c6 Qualcomm
0x22b8 Motorola
0x0955 Nvidia
0x413c DELL
0x0bb4 HTC
如果你不知道你的 device id, 可以用 lsusb 先看一下.

在 Linux 環境使用 fastboot 是不必裝什麼 driver 的, Windows 才要。