2010年6月30日水曜日

NMEAを読む

とりあえず、GPSレシーバーが届いた。

コレ。
GR-300
やや太目のUSBメモリ(笑)
でも、GPSレシーバーも小さくなったなぁ~。

一般的なGPSレシーバーは、PCから見ればシリアルポート(いわゆるCOMポート)に接続され、衛星からの情報を元に位置情報をつぶやいてくれる装置だ。
USBのGPSも同じく内部にシリアルコンバータを持っているのでシリアルポートとして見える。
ひとまず、GPSレシーバーからの情報が取得できるか試してみた。

とりあえず、USBポートに刺す。
で、コンソールから、suになって、
# dmesg | grep pl2303

pl2303 1-1.4:1.0: pl2303 converter detected
usb 1-1.4: pl2303 converter now attached to ttyUSB0
/dev/ttyUSB0 にGPSレシーバーが接続されている。
pl2303はシリアル-USBコンバータチップ。
ファーム1.7.4のカーネルはpl2303をサポートしてるので同じチップのGPSレシーバーならいけるはず。

んで、GPS初期化
# stty -F /dev/ttyUSB0 4800
初期化に必要な情報はGPSの説明書に書いてあるハズ。
通信速度とかパリティビットとか、必要な項目を設定する。
あぁ懐かしいアナログモデム(´・ω・`)

これで、GPSレシーバーからのつぶやきが聞こえるはず。
20行ほど読んでみる。
# head -n 20 /dev/ttyUSB0

$GPGGA,.............hoghog.............

$GPGSA,.............foobar.............
と、意味不明の文字列が表示されればおk。
当たり前だけど、出るよー出るよー( ・ω・)

なーんか昔、
某GPSレシーバーを使ってNTPサーバー組んだなぁ~って思い出した罠。

んで、
ハードウェア的には問題なく認識できてるんだけど、肝心のAndroid側での接続がよくわからない。。。。
GPS関係の設定項目を出すにはどうするのだ?
あとたぶん、仮想マシン側でデバイスを接続しないといけないような気がする。
で、その方法が分からん。。。。(゜-゜)
Android1.6でGPS動いてる他のガジェットはどんな処理になってるんだろ?

いかーん、つまづいた~。

アテンション

このサイトで、

ファーム ver 1.7.4 用

と銘打って公開してるものは、
ECOTOX ver 1.1.1 では適用できません!!
\(^o^)/

だって、ECO1.1.1は1.7.2ベースなんだも~ん(´∀`)

死んでもしらん(´・ω・`)

2010年6月29日火曜日

環境変数変更用scriptcmd

scriptcmd適用するたびにファームをアップデートしてしまうのはとっても無駄。
Wifiの設定や解析用アプリを入れなおすだけでも時間の無駄なので、scriptcmdの環境変数初期化部分だけ抜き出して適用することにした。

今のところ、、、、問題ないみたい。
おkw
これで自由に切り替えられる(^^)

と言うわけで、置いときます。

※何が起こっても知りません(・∀・)

scriptcmd.env.bt.wifi.cam.1.7.4
bluetooth_ui, camera_ui, Wifiキレテナーイ適用

scriptcmd.env.bt.wifi.hw.cam.1.7.4
bluetooth_ui, camera_ui, enable_hw_scal, Wifiキレテナーイ適用

scriptcmd.env.wifi.all_ui.1.7.4
色んなUI, enable_hw_scal, Wifiキレテナーイ適用
※数分放置で勝手にリブートしちゃう。とっても不安定。

使い方は、
SDカードにscriptフォルダ掘る。
その中にお好みのスクリプトを scriptcmd にリネームしていれる。
M001に刺す。
電源ON。
環境変数だけアップデート実行(数秒)
画面にメッセージが出たらSDカードを抜いて再起動。

以上。


ところで、enable_hw_scalって何?
/system/lib/libwmtmedia.so
内で初期化されているパラメータ。
WM特有のライブラリなので、WM CPU専用と思われる。
中を少し見ると、MJPEGハードウェアデコーダで使用されるパラメータらしい。
変数名から察すると、ハードウェアスケーラーを有効化するものか?
よくわからんけど、面白い事ができればいいなぁ。

2010年6月28日月曜日

例えばこんなUI

いろんなUIを出してみた。

設定トップ


Ethernet


Pppoe settings


3G network setting


Hibernate



肝心のGPSセッティングが出せない(´・ω・`)

2010年6月26日土曜日

できたことまとめ

○USB Hub埋め込んだ
○USBメモリを埋め込んだ。
○swap常時稼動。
○WebCamの動作を確認した。
○USBキーボード&マウスで遊んだ。
○Bluetoothを有効化した。
○BTヘッドセットをつないだ。


昨日、何を血迷ったのかUSB-GPSをポチッた(笑)

次はGPS(゜∀゜)

Bluetoothヘッドセット

とりあえず、ヘッドセット借りてきた(^_^;
えーっと、、、

多摩電子工業 S4100
BTヘッドセットって使ったこと無いので使い勝手がよくわからん。
とりあえず、テスト用と言うことで。


認識は手順どおりやれば問題なくペアリングする。
一度、接続はしてるけど音声を送ってこない状態になったけど、M001でBluetoothのOFF/ONすれば直った。

M001側の音声は、通話とメディア音声を送ってくるようだ。
実際には操作音(メニュー操作のシュッ!とか)も送られてくる。


ビデオとMP3を再生させて見ると、ちゃんと音声を送ってきた。
をぉ、なんかデカいメディアプレーヤーww

録音もヘッドセット側のマイクを拾って録音してくる。
付属のレコーダーソフトがイマイチだからマケで拾ってきたボイレコ使った。

ソフト側にちゃんと音声を流せてるから、Skypeとかでボイチャできるかも。
使い方によってはいい感じ。



しかーし、問題点が無いわけではない。

一番困るのが、音楽再生でよく死ぬ

BT経由で音楽を聴いている最中に、音声が切れてそのままフリーズと言うことがよくある。
フリーズは音声だけ送られてこなくなるのではなく、再生ソフト自体も固まる(ていうか全部固まる)
音楽を鳴らさず、普通に操作している時にフリーズしたことは無いので、ソフトの負荷も関係ありそう。
もっと軽量のプレーヤー試してみようっと(´・ω・`)

それと、BTを常に使ってるとバッテリーの消耗が早い。
もうちっとなんとかならんか。。。。(ーー;

やっぱ、思った。
貧弱CPUに加えて、この大雑把な中華クオリティは偉大だ。

2010年6月25日金曜日

Bluetooth UI

なんか、、、、、できた(`・ω・´)
ドライバを読んでるのは分かってたので、無理やりON/OFFして遊んでたけど、設定UIを出す方法が分かったので公開。

今回利用したUSB Bluetoothのドングルはこの2個。
PCI BT-MicroEDR2X
corega CG-BT2USB02C
どっちも動いた。中身は同じっぽい。


で、作り方。

ここの記事と同じようにscriptcmdを改造する。

テキスト記述したscriptcmdファイルを作り、
scriptcmd内の環境変数に、
setenv bluetooth_ui yes
を、追加する。

修正した内容で、Linux上で mkimage して scriptcmd を作り直した。

んで、アップデータ内のファイルを置き換えて再インスコ。

個人的にmakeしたのを置いとく(・ω・)

scriptcmd (bluetooth_ui) M001ファームver1.7.4用

scriptcmd (wifi_powerdown & bluetooth_ui) M001ファームver1.7.4用

当然、責任は持ちませんよ、、、と、( ..)φメモメモ

これで、設定メニューが使用できるようになる。設定->ワイヤレス設定に項目が増える。


設定は、Bluetoothの設定から端末名を入れて、「検出可能」をチェックすると他の端末から見えるようになる。


Win7なPCから見たらこんな感じ。


ペアリングコードの入力などを済ませるとペアリングできる。


さて、

見ての通り、PC側がヘッドセットとして認識されて音声通話で接続されてる。

で、、、、具体的にテストはできなかったw
どうやってテストすりゃいいの?w
M001から音声を流す方法がわからん(てか、電話じゃないからムリ)
とりあえず、Bluetoothヘッドセットはつながるっぽい。

他のプロファイルについても調べないと使えるかどうか分からない部分が多い。
個人的にはファイル転送と、マウス、キーボードが使えると嬉しいかなと。

ちなみに、Bloetoothファイル転送アプリを試した見たら、
ライブラリが足りんか。。。どうするべか(´・ω・`)

とりあえず、動くことは証明できたので後は誰かハックして!
と、相変わらず他力本願。


日々進化するM001。
やっぱ、この手のガジェットは手を入れてなんぼ。
いじり倒すのが目的になりつつある今日この頃。

ま、いっか(笑)

2010年6月24日木曜日

1.7.4用scriptcmd他

Original Firmware 1.7.4用のscriptcmdを置いときます。

(´・ω・`)つ旦 どぞ


ちなみに、ファームバージョン違いのscriptcmdを使用してはいけない。
文鎮になるかもよ(つД`)



さて、
1.7.4をいじってみて、一通り楽しんだ。
色々追加されてて進化してるのがわかる。
scriptcmdの中に謎のUIフラグがあったりなかったり。
有線LANのUIはちゃんと生きてるようで、設定もできるっぽい。


で、root化してswapも動く。



ところで、Marketが変だ。
サインインして最初、ダウンロードができたけど、しばらくすると見覚えの無いダウンロード通知が来て何が何だかさっぱりw
そして、なぜかダウンロードできなくなる有様。
(・ω・?

フォーラムを見てみると、なにやら他人のダウンロードが飛んできてるような感じがする。。。。
Marketの認証情報、世界中で共有ですか??w

ちっともダウンロードできない。

変な実装しやがって。
(つД`)ばかちーん!

Original Firmware 1.7.4

 ざくっと見た結果。
おいら、ワクワクしてきたぞww

■ソフト的な主な変更

・Marketが動く。
起動、検索からダウンロード開始までは問題なくできる。
が、Starting Download... で停止する現象が多数報告されてる。

・Gmail, Gtalkが入ってる。

・相変わらず中華アプリてんこ盛り。
いらねー




カスタムファームに期待ですな(`・ω・´)


■ハード的な主な変更

・MTDパーティションが変更になってる。
これは内部的なものだから表面的には何にも変わってない。

・これナニ?
USB Serial support registered for GSM modem (1-port)
usbcore: registered new interface driver option
option: v0.7.2:USB Driver for GSM modems
usbcore: registered new interface driver VIAUSBModem
LinuxVIAUSBD1.0.4:VIA USB CDMA Modem<6>
USB-3Gアダプタ?w

・これナニ?その2
USB Serial support registered for pl2303
usbcore: registered new interface driver pl2303
pl2303: Prolific PL2303 USB to serial adaptor driver
シリアルドライバきたー!w


・これナニ?その3
Bluetooth: Generic Bluetooth USB driver ver 0.5

Bluetooth: L2CAP ver 2.13
Bluetooth: L2CAP socket layer initialized
Bluetooth: SCO (Voice Link) ver 0.6
Bluetooth: SCO socket layer initialized
Trying to free already-free IRQ 4
Bluetooth: RFCOMM socket layer initialized
rfcomm_init_ttys: Can't register RFCOMM TTY driver
Bluetooth: RFCOMM ver 1.11
Bluetooth: BNEP (Ethernet Emulation) ver 1.3
Bluetooth: BNEP filters: protocol multicast
Bluetooth: HIDP (Human Interface Emulation) ver 1.2
きたー!(・∀・)


と言うわけで、swap対応しなきゃね(´・ω・`)

埋め込みストレージにswap

ECOのswap実装をみて、、、
ちゅーと半端な実装なら、いっそ外部ツールに任せてswapは実装しない方向でいいと思うけど。
と、思った。(´・ω・`)

それはさておき。
まずは前口上から。

以下、基本的な知識があるという前提で書く。
ハッキリ言って、Linuxコマンドラインや、Androidのadbシェルが理解できない人、下記手順が何をしているのか分からない人はやらないほうがいい。


と、とりあえず警告だけはしとく
(・∀・)


さて、前回までにおおかたの準備ができた。
無理やり埋め込んだUSBメモリは元気に動いてるっぽい。
で、今回はそこに swap領域を作って動かすのと、残りをUSBストレージとして利用するための準備をする。

ベースはECOTOX ROM ver1.0
オリジナルファーム 1.7.2でも同じだと思う。
やってることは大したことではないので、他のROMでも手を入れれば動くはず。

まずはadbシェルを使ってM001内での作業。
DOS窓からログインしてsu。adb shellする方法なんかはググって頂戴。
adb shell

$ su
さて、埋め込んだUSBメモリが/dev/block/sda として認識されたとする(コレを知る方法はdmesgを読むべし)

まずはデバイスの初期化。
fdiskでパーティションを切りなおす。
# fdisk /dev/block/sda
fdiskでの作業は、
既存のパーティションを削除。
第1パーティションをLinux swap領域として確保(例えば256M)
残り全部、第2パーティションをFAT32-LBAとして確保。
パーティションテーブルを書き込んでおしまい。

こんな感じ。
Disk /dev/block/sda: 3959 MB, 3959422976 bytes
126 heads, 61 sectors/track, 1006 cylinders
Units = cylinders of 7686 * 512 = 3935232 bytes

         Device Boot      Start         End      Blocks  Id System
/dev/block/sda1               1          66      253607+ 82 Linux swap
/dev/block/sda2              67        1000     3589362   c Win95 FAT32 (LBA)
次にswap領域のフォーマット
# mkswap /dev/block/sda1
これで、swap領域が確保された。
で、残りの領域をvfatでフォーマットしたいところなんだけど、ファームに付いてる mkfs.vfat では2G以上の領域をフォーマットできないっぽい。
エラーになってダメ。
仕方ないのでフォーマットは後回しにする。

もし、swapだけできればいいと言う場合はこれで作業はおしまい。
後はSwapper系ツールで、/dev/block/sda1 をスワップパーティションとして指定してやればいい。

でも、それでは面白くないので、
swapon他の処理をブートシーケンスに完全に組み込んでしまうことにする。

処理を行うスクリプトは下記のような内容。
ファイル名を etcinit.sh とする。
#!/system/bin/sh

# swapon to sda1
count=10
until [ $count -eq 0 ];
do
  if [ -b /dev/block/sda1 ] ; then
    swapon /dev/block/sda1
    echo 30 > /proc/sys/vm/swappiness
    sysctl -w vm.swappiness=30

    break
  fi

  sleep 3
  count=`expr $count - 1`
done

# mount sda2
if [ -b /dev/block/sda2 ] ; then
  mkdir /ExtDisk
  /system/bin/mount -o dirsync,nosuid,nodev,noexec,utf8,uid=1000,gid=1015,fmask=702,dmask=702,shortname=mixed -t vfat dev/block/sda2 /ExtDisk
fi
やってることは、swaponとdev/block/sda2 を /ExtDisk ディレクトリに mount している。
何度かテストした結果、init.rcの実行よりsdaの認識が微妙に遅れる場合があるので、ループとsleepで時間稼ぎをしながらsdaの存在をチェックしている。
ちなみに、スクリプトファイルをWindowsで作る時、改行コードに注意して保存すること。

お次はスクリプトの転送。
まず、adbシェルを抜けて、etcinit.sh を、/ に adb pushする。
ファイルパスは適当に読みかえるべし。
adb push e:\etcinit.sh /
で、再び、adb shellでの作業。
adb shell

$ su
# chown 0:0 etcinit.sh
# chmod +x etcinit.sh

最後の仕上げ。
init.rcの改造。

init.rcをエディタで開いて、スクリプトの最後の方、usbgadget.shを呼び出す手前に、次の2行を入れる。
#service usrinit /usrinit.sh
#    oneshot
service etcinit /etcinit.sh
    oneshot
service usbgadget /usbgadget.sh
    oneshot

ついでに、ECOのスクリプトはコメントアウト。
init.rcを保存して完了。

上記の改造を施した init.rcをWindowsで作っておいて、adb pushしてadb shellからchown & chmodする方法でもおk。
私は面倒だったから、M001上のConnectBotで直接viで編集したけど。


さて、再起動!!
うぃんうぃんうぃん・・・(・∀・)きたー!
# free
              total         used         free       shared      buffers
  Mem:       101472        99620         1852            0            4
 Swap:       253596         4804       248792
Total:       355068       104424       250644


# cat /proc/swaps
Filename                             Type            Size    Used    Priority
/dev/block/sda1                      partition       253596  4872    -1

# df
Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/root               150528     71696     78832  48% /
tmpfs                    50736        16     50720   0% /dev
tmpfs                     4096         0      4096   0% /sqlite_stmt_journals
/dev/block/mtdblock8    153600     45144    108456  29% /data
/dev/block/mtdblock9    102400      4616     97784   5% /cache
/dev/block/mtdblock11  1678336     14488   1663848   1% /UserSpace
/dev/block/sda2        3581168         0   3581168   0% /ExtDisk
/dev/block/loop0       1507540      4828   1502712   0% /LocalDisk
/dev/block//vold/179:1 3858432    823520   3034912  21% /sdcard


以上、

/dev/block/sda1 は swap
/dev/block/sda2 は /ExtDisk に mountされている。

これで、電源オンで内蔵ストレージにサクッとswapon♪
SDカード抜き差しの心配もいらない(´∀`)

うむ、ずばり自己満足だけだなw

で、
ひとまず、長くなったのでおしまい。

埋め込みメモリの残り物をUSBストレージとして認識するのはまた次回。

2010年6月22日火曜日

USBメモリを移植

思いつきでやってみる。
と言うわけで、埋め込み~

ここのUSBメモリを使う予定だったけど、知り合いに奪われたので、急遽、ジャンク箱をあさって出てきたこれで代替。
ストラップになるちっこい microSDアダプタ。カーネルから見ればUSBメモリと同じに見える。
で、ちょっと奮発してclass6 4GのmicroSDを入れてみた。(写真はclass2 1Gだけどw)
単にデジカメ用で買ってたのが一枚余ってただけなんだけどね。
ま、主な狙いはswap領域確保だから、余ったら内蔵メモリとして使っちゃおう。


サクッと解体。
ニッパーで慎重に殻割りすればおk。
USB端子側のシールドはヤスリやニッパーで切り取ってもいい。
とりあえず、端子が見える程度に切り取った。


で、USBコネクタ端子から埋め込んでるHub基板へ直接配線する。
埋める場所は、Hubが入ってる場所を強引に空けて入れてみた。


Hub基板がマザボに3分の1重なるくらい空けないと入らないかも。
絶縁処理はちゃんとしようネ。

以上。

いやぁ~。簡単、簡単。


さて、このままでは単にUSBメモリが埋まっただけのM001でなんら変わりない。
しかも、な~んにも手続きしてないから、ブートしても内蔵USBメモリは見えない。
つーか、mountも何もしてないんだから当たり前。

目標は、
swap領域を確保してブート時に勝手にswapon。
残ったメモリ領域はM001をPCにUSB接続したときに、ディスクドライブとして認識して利用できるようになったらいいかも。

で、そのあたりの処理をしていくんだけど、それはまた後で。

2010年6月21日月曜日

ECOTOX ver1.0

なぜかここでバージョン番号リセット。
ECOTOX氏のカスタムROMを試した。

Frameworkが変更になってるせいか、全体的に軽くなってる気がする(・∀・)
プラシーボかもしれんけど。。。

で、目玉はswapon。
SDカードの第2パーティションにswap領域を作っておけば、ブート時にswaponになるようにスクリプトが組まれてる。
具体的には、init.rcから呼ばれてるusrinit.sh

ところで、
SDカードにswapする問題点としては1つだけ。

カードの抜き差し時にswapoffしないと、swap見失ってご臨終(-m-)ちーん

で、ECOのROMには簡単にswapoffにする手段が用意されて無い。。。
(´・ω・`)困るがな。

結局、Swapper系ツールは必要ってことかい!プンスカ。


まぁよしとして。
個人的にMarket対応希望。あくまでも他力本願。


ちなみに、只今、USBメモリを埋め込む作業中。
はんだ付けは楽しいなぁ(・∀・)~♪


-- 2010/06/22 0:20 追記
usrinit.sh なんか間違えてないか?w
usrinit..sh なんてのもあるけど、コレなに?
usbgadget.shにも書かれてたり、えらいやっつけ仕事だなぁ。
-- 2010/06/22 0:20 追記終

2010年6月20日日曜日

scriptcmd.wifi_powerdown

置いときますね、
( ・∀・)つ旦 どぞ

意味が分かる方だけお使いください。
ちなみに、これを使用してナニが起こっても責任もてません。
ご利用は自己責任&覚悟の上で。

ちなみに、ECOTOX v3.6.7.3.6.2 のみで確認してます。
多分、オリジナルファームもおk。
使い方はアップデーターのscriptcmdに上書きしてファームアップデートする。

要するに、これ

2010年6月18日金曜日

一番手っ取り早いswap

Swapper2などで、swapファイルの指定を
/LocalDisk/swapfile.swp
みたいにすればOK。

SDカードも不要。


以下、メモ。-------------------

M001をいじるのにファイルシステムを調べてみた。
で、
実際の状況はこんな感じ。
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/root 150528 73960 76568 49% /
tmpfs 50736 16 50720 0% /dev
tmpfs 4096 0 4096 0% /sqlite_stmt_journals
/dev/block/mtdblock8 153600 45268 108332 29% /data
/dev/block/mtdblock9 102400 4616 97784 5% /cache
/dev/block/mtdblock11 1678336 9664 1668672 1% /UserSpace
/dev/block/loop0 1507540 16 1507524 0% /LocalDisk
/dev/block//vold/179:1 3858432 1409696 2448736 37% /sdcard
mtdblockホニャララが内蔵のフラッシュメモリ領域になる。
dmesgを抜き出すとこんな感じで確保されている。
Creating 6 MTD partitions on "mtdsf device":
mtdblock0 0x000000000000-0x000000d00000 : "filesystem-SF"
mtdblock1 0x000000d00000-0x000000f80000 : "kernel-SF"
mtdblock2 0x000000f80000-0x000000fd0000 : "u-boot-SF"
mtdblock3 0x000000fd0000-0x000000fe0000 : "u-boot env. cfg. 1-SF"
mtdblock4 0x000000fe0000-0x000000ff0000 : "u-boot env. cfg. 2-SF"
mtdblock5 0x000000ff0000-0x000001000000 : "w-load-SF"
Creating 6 MTD partitions on "SAMSUNG_K9XXG08UXM":
mtdblock6 0x000000000000-0x000000600000 : "kernel-NAND"
mtdblock7 0x000000600000-0x000009900000 : "filesystem-NAND"
mtdblock8 0x000009900000-0x000012f00000 : "filesystem-data"
mtdblock9 0x000012f00000-0x000019300000 : "filesystem-cache"
mtdblock10 0x000019300000-0x000019900000 : "logo-NAND"
mtdblock11 0x000019900000-0x000080000000 : "user-data-NAND"
ちなみに、scriptcmdでsaveenvした変数は、u-boot env. cfg. 1-SF と 2-SF に格納されている。
ddコマンドなんかでダンプすれば見る事ができたりする。

さて、それぞれの領域にはシステムの大事なものが入っていて、自由に使えないんだけど、唯一、mtdblock11はユーザーに開放している。

M001を付属のUSBケーブルでPCとつなげると、2つのリモートドライブとして認識される。
ひとつはSDカード、もうひとつは /LocalDisk 領域。
どちらも読み書きできるので、PCとのデータのやり取りに使用できるが、このLocalDisk領域がmtdblock11のloopbackデバイスに割り当てられている。

ちなみに、mtdblock11自体も /UserSpace としてmountされている。
さて、mtdblock11のファイルシステムはyaffs2なので、loopbackデバイスを介してvfatで/LocalDiskにmountしているようだ。
で、
loopbackデバイスの実体は/UserSpace/UserFile
このファイルはファームアップデート処理時にコッソリ生成されている。

せっかく内蔵の自由に使える場所があるのだから、手っ取り早く済ませるなら、これを使わない手はない。

しかし、問題が無いわけじゃない。
通常のswapファイルに比べて、loopbackデバイス上のファイルシステムを介するので処理速度的に劣る。
それだけ我慢すれば、お手軽にswapをはじめられる。

ま、我慢するっても、貧弱CPUを我慢することに比べりゃぁねw

2010年6月16日水曜日

Wifi offでもキレテナーイ

おもちゃ(M001)にウィジットのカレンダーやらメモやら張ってたらどんどん重くなって、昨日、なぜか戻るボタンが利かなくなった。
やりすぎたか・・・(´∀`;
仕方ないので、ファームを一から入れなおしてるときに気が付いた。
scriptcmd
中を覗くと、
setenv wifi_powerdown D8110064|0x4,D811008C|0x4,D81100B4&~0x4
setenv wifi_powerup D8110064|0x4,D811008C|0x4,D81100B4|0x4
<略>
saveenv
( ゜д゜)・・・おまえかっ!!

こんなところにデバイスon/offの隠しコマンドが入ってた。
そういや、玄箱いじってたときに同じようにu-Bootでカーネルパラメータ渡してたなぁ~と、いまさら気付いたわ。

てか、その他の環境変数を眺めてみると、ぞろぞろとデバイスコントロールの変数が格納されているようだ。
こいつらは、ファームのアップデート処理の段階でsetenvされた後、saveenv、つまりM001内蔵のフラッシュメモリに格納され保存される。
ファームのアップデート処理が終わり、普段どおりu-Bootからカーネルが起動していくと、格納されているものが読み込まれる。って按配。

で、書いてある通り、
GPIO : 0xD81100B4 の 0x4 ビットを立てると内部USBが活性化。
0x4ビットを寝かせるとUSBが切れる。

あとは簡単。
wifi_powerdown のときでも0x4ビットを立てっぱなしにすればいい。
setenv wifi_powerdown D8110064|0x4,D811008C|0x4,D81100B4|0x4
で、、、、
環境変数領域を直接読み書きする方法が分からなかったので、scriptcmdを作り直してアップデータを利用する。

修正した内容でテキスト記述したコマンドファイルを作り、
Linux上で mkimage して scriptcmd を作り直した。
SlateDroidの記事を参考にmake。
mkimage -A arm -O linux -T script -C none -a 0 -e 0 -n 'wifi never off' -d scriptcmd.txt scriptcmd
たまたま、VMwareなubuntuを入れてたのでサクッと。
Win用のmkimageがあればそれでもいいと思う。

で、、、
ファームを再インストールww
めんどくせー(笑)

でも、、、、、

ばっちりww

wifi offでもUSB切れませーん\(^o^)/
でも、wifiへの電源供給は続くって事なのでバッテリを食う。
実際には、ネットワーク自体は繋がってないからいいんだけど。


ログの様子。
wifi power up:D8110064|0x4,D811008C|0x4,D81100B4|0x4
gpio op: 0xD8110064 | 0x4
gpio op: 0xD811008C | 0x4
gpio op: 0xD81100B4 | 0x4

wifi power down:D8110064|0x4,D811008C|0x4,D81100B4|0x4
gpio op: 0xD8110064 | 0x4
gpio op: 0xD811008C | 0x4
gpio op: 0xD81100B4 | 0x4

え?フライトモード??

フライトモードなんてただの飾りです。
偉い人にはそれがわからんのです。キリッ。

これで、USBメモリもキーボードも切れる事が無くなった。
今なんかこんな感じ(^_^;




ところで、
setenv hibernation_ui no
これナニ?

2010年6月15日火曜日

Wifi offでUSBが使えない件

ハードウェアやOSの動きを調べるのに、カーネルが吐き出すdmesgログを読むと色々分かったりする。
M001のdmesgにも色々吐き出されてておもしろい。

バイブレータドライバをロードしてたり、有線のGigabit Ethernetドライバが動いてたり、PS/2ポートが生きてたり、initでいらんコマンド動かしてたり。
手がかりを探すにはもってこいの資料だったりする。

で、Wifiをon/offしたときのログ。
wifi power up:D8110064|0x4,D811008C|0x4,D81100B4|0x4
gpio op: 0xD8110064 | 0x4
gpio op: 0xD811008C | 0x4
gpio op: 0xD81100B4 | 0x4
usbcore: registered new interface driver rt2870
usb 1-1: new high speed USB device using ehci_hcd and address 2
usb 1-1: configuration #1 chosen from 1 choice
hub 1-1:1.0: USB hub found
hub 1-1:1.0: 4 ports detected
usb 1-1.3: new high speed USB device using ehci_hcd and address 3
usb 1-1.3: configuration #1 chosen from 1 choice
usb 1-1.4: new high speed USB device using ehci_hcd and address 4
usb 1-1.4: configuration #1 chosen from 1 choice
一部省略してる。
Wifi onにすると、gpioを使ってCPU内部のコントローラ状態が変更される。
それが2~4行目。
んで、rt2870用のドライバ(rt3070だけどね)が登録され使用できるようになる。
と、同時にUSB機器が認識され始める。

このときの、USB機器の接続状態はこんな感じ
WM8505内蔵コントローラ
+----> 埋め込みHub
+----> rt3070(Wifi)
+----> USBメモリ
最初に、埋め込みHubが address 2 として見つけられ、USB hub found. 4 ports detected されている。
次に、その先に繋がってるデバイス address 3 と 4 が見つけられているのが分かる(WifiとUSBメモリ)

次に、Wifi off のときのログ
wifi power down:D8110064|0x4,D811008C|0x4,D81100B4&~0x4
gpio op: 0xD8110064 | 0x4
gpio op: 0xD811008C | 0x4
gpio op: 0xD81100B4 & 0xFFFFFFFB
- rtusb exit
usb 1-1: USB disconnect, address 2
usb 1-1.3: USB disconnect, address 3
usb 1-1.4: USB disconnect, address 4
同じく、gpioを使ってコントローラの状態を変更している。
すると、勝手に address 2 (埋め込みHub)が disconnect になり、自動的にその先にぶら下がっているデバイス、address 3, 4 も disconnectになる。

これが、Wifi offにするとHubにぶら下がってる他のデバイスが使えなくなる原因。

on/offのシーケンスを考えるに、
事前に実行される gpioのコントローラ状態変更がキーになってるっぽい。
あるビットをマスクすることで、内部のUSBコントローラをスリープにしてしまうのかもしれない。

うーん、、、困ったな。
wifi power up:D8110064|0x4,D811008C|0x4,D81100B4|0x4

wifi power down:D8110064|0x4,D811008C|0x4,D81100B4&~0x4
実際にこの処理をどこかで行っているハズ。
探したんだけど、、、
見つからない。(´・ω・`)

2010年6月14日月曜日

swapはどの程度有効なのか?

swap onができるM001くん。
Swapper2で試しても、前の記事と同じように動作しているのが確認できた。

で、具体的にswapによってどの程度の効果があるのか。

M001を使っていて、こんなことはないだろうか?

・重いアプリのMENUを出した時、MENUの表示がつまずく。
・アプリからHOMEに戻った時にしばらくブラックアウトする。
・エラー"ホーム操作(プロセス:android.process.acore)は応答していません。"

M001の決定的な貧弱さはCPUにあるんだけど、それに輪をかけて足を引っ張っているのがメモリの少なさ。
Androidが立ち上がって、各種バックグラウンド処理が走り、アプリが起動して行くとあっという間にメモリ残が少なくなってくる。
で、それでもがんばってけなげにアプリを動かしているんだけど、足りなくなってくるとどうするのか?
それは、使い古しのメモリ領域を開放するようにカーネル(や多分Java)が作業を始めてしまう。いわゆるガベージコレクション。
そうなると、メモリ領域が確保できるまで表の処理は固まったように止まってしまい(あるいはノロノロと動き)非常にストレスになる。

"応答していません。"エラーは典型的な処理待ち状態のエラー。と言えるだろう。

で、結局原因は、狭いメモリ空間に縛られるからこうなるわけで、swapによって少しでも広げれば重いガベージ処理が走らなくて済むはずだ。

問題は、ガベージ処理時間 > ページスワップ処理 である状況にしなければ、swapが頻発して足を引っ張れば意味を成さない。

しかし、幸いに、と言うか、不幸にと言うか、CPUがしょぼいおかげで、ガベージに高いCPUコストを払うより、ページスワップした方が効率が良さそうなのだ。
必要なときに掃除しなきゃならないのはコスト高。
必要なときにすぐに仮想メモリ空間が使えた方がストレスがない。
ま、理にかなってますわな。

よく誤解されるのが、
「swap onにすれば、サクサクだよ」
ってこと。

swapはより広いメモリ空間を取れるようにする仕組みで、決してマシンを高速化するものではない。
しかも、swapが多発すると逆に負荷が掛かり遅くなる。

でも、実際にはトータルでのメモリ利用効率の改善があり、体感でストレスが減っていると感じられると言うこと。

なのでしょうな。

ところで、swapパラメータに、"swappiness" と言うのがある。
これを上げるべきか下げるべきかは、どんな風に利用するかによると思う。

小さな値にすると、できるだけオンメモリ処理するように、swapしにくくなるけど、アプリによってはメモリを確保しようとガベージ処理が走る可能性がある。
大きな値にすると、頻繁にswapしてガベージ処理の発生を押えるけど、swap先のメモリ参照が多く発生すると、余計なswapが増えてしまう可能性がある。

ちなみに、私は今のところswappiness = 40で動かしている。

"応答していません。"エラーが頻発するようなら数値を上げる方向で調整するのがいいのかも。

2010年6月12日土曜日

WebCamを動かしてみる

カーネルの吐き出すdmesgを読んでると、UVC系のカメラドライバやキャプチャドライバがロードされてるのが分かる。
で、実際にWebCamをつないで色々試してたんだけど、どうにも絵が出ない。
画面が固まってアプリ死亡(-m-)ちーん
WM8505はMJPEGのハードウェアデコーダを内蔵してるから処理できると思ったのになぁ~。
デバイスの認識も上手く行ってるので、処理できないのはしょぼいスペックのせいだな。

と、思ってたら、SlateDroidのフォーラムでWebCamを動かしてる動画があった。
む、、、結構、スムーズに動いてる。
やっぱ動くじゃないか。

と言うわけで、知り合いに借りたWebCamで試してみることにした。

Microsoft LifeCam VX-500
最大640x480出力。

とりあえず、M001に刺す。
認識された様子はこんな感じ。
uvcvideo: Probing generic UVC device 1.4
uvcvideo: Found format YUV 4:2:2 (YUYV).
uvcvideo: - 640x480 (30.0 fps)
uvcvideo: - 352x288 (30.0 fps)
uvcvideo: - 320x240 (30.0 fps)
uvcvideo: - 176x144 (30.0 fps)
uvcvideo: - 160x120 (30.0 fps)
uvcvideo: Found a Status endpoint (addr 83).
uvcvideo: Found UVC 1.00 device Microsoft LifeCam (045e:074a)
uvcvideo: Added control 00000000-0000-0000-0000-000000000101/2 to device 1.4 entity 3
uvcvideo: Added control 00000000-0000-0000-0000-000000000101/3 to device 1.4 entity 3
uvcvideo: Added control 00000000-0000-0000-0000-000000000101/6 to device 1.4 entity 3
uvcvideo: Added control 00000000-0000-0000-0000-000000000101/7 to device 1.4 entity 3
uvcvideo: Added control 00000000-0000-0000-0000-000000000101/8 to device 1.4 entity 3
uvcvideo: Added control 00000000-0000-0000-0000-000000000101/9 to device 1.4 entity 3
uvcvideo: Added control 00000000-0000-0000-0000-000000000101/1 to device 1.4 entity 3
uvcvideo: Added control 00000000-0000-0000-0000-000000000101/5 to device 1.4 entity 3
uvcvideo: Scanning UVC chain: OT 2 <- XU 5 <- XU 4 <- PU 3 <- IT 1 uvcvideo: Found a valid video chain (1 -> 2).
input: Microsoft LifeCam as /devices/pci0000:00/0000:00:04.0/usb1/1-1/1-1.4/1-1.4:1.0/input/input4
uvcvideo: UVC device initialized.
特に問題ないっぽい。

で、アプリで激写!
今回使ったのは ToyCam と言う軽量アプリ。複雑なことはできないけど、写すだけならこれでOK。

こんな感じで、、、、



あ、映った。( ・ω・)
(動画の音声は切ってます)

でも、タイミングによってはアプリが固まる。。。。
安定性は正直、いまいち。

で、ご覧の通り、結構スムーズに映ったりして。
このしょぼスペックにおいて、このヌルヌル具合。
ハードウェアデコーダの威力恐るべし。

手持ちのカメラ(300万画素)が動かなかったのは、単に初期解像度が高すぎてストリームがパンクしてたっぽい。
低解像度のUVCカメラならいけそう。

ちなみに、ToyCamでシャッター切ると、なぜか画面一面緑色の画像が撮れた。
なぞが多いぞ、カメラ周り。

2010年6月11日金曜日

USBメモリスティックにswap

duponmidさんの記事と若干かぶってしまって申し訳ないですm(__)m

さて、

昨日、swapが有効になってるカーネルのことをぼんやり考えてた。
busyboxにswap関係のコマンドがビルドインされてるのも知ってたので、手動でswap onできるだろうと踏んで作業してみた。
以下、root化必須です。

で、swapパーティションを切るんだけど、SDカードに入れるのもネタがかぶるので、USBメモリスティックに頑張ってもらうことにした。

まず、USBメモリを刺す。
今回は Buffalo RUF2-PS4G-BKが獲物w
小さい、これなら内蔵可能( ̄ー ̄)ニヤリ
でも、I/O速度がいまいち。

おもむろに、M001上でコンソール(ConnectBot)を起動。
コンソールから、su


USBメモリを最初に刺したときは、/udisk に自動的にmountされるのでumountする。
mountされてなかったら、以下の作業はいらん。
# umount /udisk
一応、freeでメモリ状況を見ておく
# free
total used free shared buffers
Mem: 101472 99216 2256 0 192
Swap: 0 0 0
Total: 101472 99216 2256
swapはゼロだね。

USBメモリにパーティションを切る。
うちの環境では、USBメモリが /dev/block/sda にストレージとして認識されていた。
他の環境(例えばM001以外のデバイスとか)は違うプリフィクスになる可能性があるのでちゃんと調べたほうがいい。

具体的には、USBメモリを刺したときの dmesg を見ておく。
# dmesg
<略>
usb-storage: device found at 5
usb-storage: waiting for device to settle before scanning
scsi 0:0:0:0: Direct-Access USB 2.0 Flash Disk 2.00 PQ: 0 ANSI: 2
sd 0:0:0:0: [sda] 2062846 512-byte hardware sectors: (1.05 GB/1007 MiB)
sd 0:0:0:0: [sda] Write Protect is off
sd 0:0:0:0: [sda] Mode Sense: 0b 00 00 08
sd 0:0:0:0: [sda] Assuming drive cache: write through
sd 0:0:0:0: [sda] 2062846 512-byte hardware sectors: (1.05 GB/1007 MiB)
sd 0:0:0:0: [sda] Write Protect is off
sd 0:0:0:0: [sda] Mode Sense: 0b 00 00 08
sd 0:0:0:0: [sda] Assuming drive cache: write through
sda: sda1 ←コレコレ
sd 0:0:0:0: [sda] Attached SCSI removable disk
sd 0:0:0:0: Attached scsi generic sg0 type 0
usb-storage: device scan complete
<略>
こんな感じの出力があるハズ。
流れる文字列の中から、USBメモリがデバイス認識された箇所を探し出すこと。

さて、fdisk
# fdisk /dev/block/sda
以下、fdiskでの作業は省略。
要するに、現状のパーティションは全削除、Linux swap のパーティションを1つ切れば十分。とりあえず、128MBだけswapに割り当て。
残りのメモリはお好きなように。
今回の場合swapパーティションは /dev/block/sda1 となった。

パーティションテブールを書き込んでディスクがフラッシュされたところで、
#mkswap /dev/block/sda1
Setting up swapspace version 1, size = 133762560 bytes
UUID=hogehoge-hogehoe
これで、swap領域の完成。

さて、いよいよ swap on。
# swapon /dev/block/sda1
これだけw

本当にonになったか、freeで確認。
# free
total used free shared buffers
Mem: 101472 97176 4296 0 16
Swap: 130620 0 130620
Total: 232092 97176 134916
を、swap 増えてる増えてるw

しばらく、他のアプリなんかを動かしてみる。
USBのLEDがチカチカ光ってアクセスしに行ってるのがわかる。
swapしてる感じ。

再び free
# free
total used free shared buffers
Mem: 101472 97176 4296 0 16
Swap: 130620 2104 128516
Total: 232092 100668 131424
ほほw
swapしてるねー

体感ですが、ややスムーズになるかな?って感じです。
ブックリーダー試してないので(^^ゞ

そんなわけで、手動でswap有効化は可能って事ですね。

ちなみに、swap off は
# swapoff /dev/block/sda1
以上。

要するに、Swapper系のアプリは手動で行った設定をGUIでやってくれる便利なラッパーツールって事です。
もちろん、他に細やかなチューニングもしてくれるものもあるので、やっぱアプリ使ったほうが楽かも。

個人的には、このちっこいUSBメモリを内蔵して、swap領域固定でブート時にスクリプト叩いてswap onにすることを目論んでみたりします(笑)

あ!Wifi offのときは一緒にスリープされるんだった!!
これを何とかせねば・・・・(´・ω・`)

swap on手順は、他のマシンでも応用できるかもしれない。
M001以外の他のマシンでも頑張ってみてください。
\(^o^)/

2010年6月10日木曜日

WM8505 Android Kernelソース

SlateDroidの下記のスレッドで、カスタムROMの作者ECOTOX氏がWM8505用のAndroid-Kernelソースを見つけた記事を書いている。

http://www.slatedroid.com/index.php?topic=888.0

確かに、WM8505用のAndroid-Kernelコードのようだw
これが本物なら、カーネルの軽量化もできる\(^o^)/
あ、Androidバージョンがわからん。。。。

取り合えず、wm8505_kconfig.txtを読んでみる。
ARM関係のフラグが立ってるのはもちろん、WonderMediaや搭載チップのドライバがビルドされるようになってる。

CONFIG_TOUCHSCREEN_BATT_WM9715=m
CONFIG_SERIO_I8042_WM8510=y
CONFIG_WMT_VT1613=y

ほほー。本物っぽい。
G-sensorとキーパッドのモジュールはどれだろう?入って無い??

CONFIG_SWAP=y

swap対応してるなぁ。。。。

# CD-ROM/DVD Filesystems
# CONFIG_ISO9660_FS is not set
# CONFIG_UDF_FS is not set

なるほど、対応してないわけだ。

CONFIG_SMB_FS=y

を?Samba対応してるんだ。

ECOTOXカスタムROMにES File Explorerが入ってたなー
ES File ExplorerのViewをLocalからLANに変えて、Menu->新しい->サーバー で、Sambaホストを指定(Windowsの共有でもいいと思う)


バッチリ認識。
PCで落としたapk共有が楽になったw

。。。。。(゜-゜)うーん

ネタとしていまいち。



とりあえず、ECOTOX氏の動向を見ながら、カーネルソースをいじってみよう。

2010年6月9日水曜日

M001にUSBハブ埋め込み

獲物はコレ

http://www2.elecom.co.jp/cable/usb-hub/u2h-tm400b/index.asp

安売りで1000円程度。
USBスティック部にHub基板が入ってるから躊躇なく割腹して取りだす。
USBホストコネクタは後で使う。

SDカードとの比較。ちっちゃーい。
個人的にコレを使っていろんな埋め込みしてるので重宝。
基板の裏表2個ずつ、計4つのホスト端子がある。
ただし、バスパワーは当てにしないように。

もう一つの部品はコレ。
PC用の内部USB延長ケーブル。400円くらいだったかな。
この、4P端子のオスメスを使う。



まず、埋め込み。


こんな感じで隙間にすっぽり収まる。配線は慎重に。
外部端子へのラインとマザボとつないでる線はUSBデータ仕様に基づいたカラー結線。
Wifiカードのコードはカラーがめちゃくちゃなので、ちゃんと結線調べてね(はぁと
Hub基板背面は絶縁処理(テープ張り)しないとだめ。

外部端子。
先ほどの4P端子のメスを埋め込んでしまう。
SDスロットの下辺りにナイスな空間がある。
ケースを切り欠き、端子が見えるようにして、瞬間接着剤とホットボンドで固定。



後はコードが絡まないようにケースに収めてしまえば、パッと見、何も変わらない。



次。
外部端子のUSBホスト変換ケーブル。

Hubを解体した時に余ったUSBホスト側のコネクタと4P端子のオスと結合させる。

こんな感じのUSB用ケーブルを作ればOK。



サクッと刺せばUSBが使える。



★注意★
外部端子から引き出したUSBは WifiがOffの状態では使用できない。
WifiのOn/Offでバスパワーを切ってる感じなので、外付けの機器もOffになってしまう。
もちろん、埋め込んだHubも切られる。
電力食うけど、Wifi Onで(笑)