もう誰も使っていないだろうし、こういう情報が要る方は皆無だとは思うが、折角いろいろやったので、今までに分かったことをまとめる。最新版のハード(PQI Air Card II)とファーム(V303)が対象である。

  • 使い方に関して
    • PC(Linux)からAir Cardのファイルにアクセスするなら、dropbearを入れてsshfsなどを使うよりcurlftpfsを使う方が手軽。
      • Air Cardの内蔵のftpサーバのままでマウントできる(設定・改造不要)。
      • curlftpfsでの転送速度が速いか遅いかは不明(筆者の環境では500KB/sくらい出ていた)。
    • autorun.shを作って子機モードで使う時にAPに繋がるまでに30秒くらい掛かるのは、通常のAPモード(w3コマンド)と子機モード(w2コマンド)の初期化に時間が掛かっているため。w3を起動させずに直接子機モードにすれば少し速くなるはず。
      • そうするにはinitramfsを作り直す必要がある。
      • /etc/init.d/S12_mod_wifi startでAPモードにしている。
      • ただし、APモードになれないと動作確認が困難になる欠点があるので切り替えられるようにした方がいい。
    • 子機モードの時は、kcard_appやkcard_cmdやkcard_startupは全く不要。kcard_appを停めても問題ない。
      • kcard_appでデジカメで画像を削除したらWi-Fiをonにするなどの処理を行っている。
    • ファーム更新に失敗した時などに設定が壊れてWi-FiのSSIDがおかしく(例: "h)")なったりして、ファームを書き直しても直らない場合は(まだ「回復不能になった」と諦める必要はないw)、/mnt/mtd/configがディレクトリでなく通常ファイルになっていることがあるので、ログインできるならそうしてコマンドを実行して直すか、autorun.shにコマンドを書いて作り直すといい。
    • Air Card内のLinuxと外部からのmicro SDへのアクセスが競合すると、micro SDが(論理的に)壊れる可能性がある。
      • Linuxからrefresh_sdコマンドを実行するとその時のmicro SDの状態がLinuxに反映でき、syncコマンドでその逆(Linuxでの変更がmicro SDに反映される)になるようだ。
      • それでも同時アクセス(例: Linuxで変更後、外部でmicro SDが変更され、その後Linuxでsyncした場合)で壊れる可能性はある。
      • だから、Linuxからmicro SDに書き込むのはなるべく控える方がいい。
  • 消費電力関係
    • 「スリープモード」は無効。kcard_cmd -s 0 (または1)は効かない。してもしなくても一緒で、スリープしない。
      • 昔は動いていたけどファーム更新でなくなったのか、子機モードで使っていたせいかも知れない(そうでなくても無効だった気がするが、定かでない)。
      • kcard_appに入っているが公開されていないioctl、KCARD_GO_SLEEPも効かない。
    • 消費電力を減らすには、wlコマンドでWi-Fiモジュールの省電力設定を変えるのがいい。
      • 例: wl PM 1 (または wl PM 2)
        • wl PM 0で解除される。
      • 消費電力が27%くらい減る(例: 800mW → 500mW)。
    • ifconfigコマンドでWi-Fiを停めてもWi-Fiが使えなくなるだけで、消費電力は減らない。
    • Wi-Fiの送信電力を下げても消費電力は減らない。通信速度が落ちるので無意味。
    • Wi-Fiモジュールの省電力機能以外で消費電力を減らすことはほぼ不可能。
      •  システムをスタンバイさせたり電源をoffにする機能はなさそう。
        • 第三者が公開しているbusyboxのpoweroffコマンドの動作はshutdownと同様。
      • スリープはビジーループなので、消費電力削減には全く効かない。
      • micro SDをアンマウントしても消費電力は減らない。
      • カーネルにはクロックを変更したりスリープモードになると思われる機能があるが、使えるのか(本当に機能するのか)は不明。
      • Linuxを起動させなくても消費電力は減らない(u-bootのスリープがビジーループになっているせいか)。
      • CPUにはスタンバイなどの機能はあるが、システム制御レジスタの仕様が分からなので使えない。
      • 仮に、電源スイッチを付けてAir Card全体の電源を切ったとしたら、外部からSDとしてアクセスできなくなってしまう。
        • micro SDの制御にはLinuxやCPUは関わっていないが、SOCが制御しているようなので。
    • microSDを挿さないとAir Card全体が起動しないようで、消費電力は低い。
  • 更に細かい話
    • Air Cardの元はKeyASICのMCARDのようだ。
      • TranscendのWi-Fi SD CardやFlucardも同様と思われる。
      • SOC: SPG101 (CPU: ARM926EJS)
      • Wi-Fi: Fortune AF-N-31GL (Atheros AR6005)
      • Linuxカーネル: 2.6
    • ファーム更新用プログラム: program.binについて
      • ファーム更新ファイルの内容(推定)
        • program.bin: ファームウェア更新プログラム
        • mtd_jffs2.bin: /mnt/mtdのファイルシステムの内容
        • Image3: Linuxカーネル (Imageの場合もある)
        • initramfs3.gz: Linuxのルートファイルシステム(/)の内容 (initramfs.gzの場合もある)
        • autoload.tbl: (ない場合もある)不明。読み込むファイル一覧?
      •  更新に必要なファイルが正しくないと通常の起動になる。
        • 先頭のデータで更新ファイルの正当性を確認しているようなので、最初だけコピーしておけば誤魔化せる。
      • program.binの中に書かれたu-bootのコマンド(スクリプト)で、micro SDの更新ファイルを読んで内部フラッシュに書き込んでいる。
      • program.binはu-bootのサブセット+改造と思われ、使える(動く)コマンド・機能は少ないし、動作がおかしいものがある。
        • if, &&などやclk setコマンドは使えない。
        • sleepコマンドの単位は秒でなく、かなり小さい(約1/416秒?)。
      • ファームの更新成功後、program.binはLinuxの起動時に削除される(他の更新ファイルはどこで削除されているのか不明)。
    • [既知の情報] ファーム内のinitramfs3.gzの先頭8バイトを除去しないと、gunzipできない。
      • 例: dd if=initramfs3.gz bs=8 skip=1 | gunzip > initramfs3
      • ファイルの展開にはcpioを使う。
        • 例: cpio -ivd < initramfs3
    • [既知の情報] busyboxをコンパイルするには、arm-none-linux-gnueabiのgccが要る(→ ダウンロードの例)。Linuxのクロスgcc(arm-none-eabiなど)では駄目。
      • u-bootやLinuxカーネル(GPLなので、昔ソースが公開されていたようだ)はそれでなくてもビルドできるが、ちゃんと動かすための設定が難しい(u-bootは起動はするものの、今ひとつうまく動かない。Linuxカーネルはビルドできたが、動かなかった)。
      • LinuxカーネルはmkimageコマンドでuImageにする。なぜか作られなかったので、u-bootのものを使った。
    • Air Cardのブートの流れは以下のように推測している。
      1. 電源on後、内部フラッシュのu-bootが読まれて起動される。
      2. u-bootはmicro SDにprogram.binがあれば読んで実行する。
      3. u-bootは内部フラッシュのLinuxを起動する。(内部フラッシュからRAMへの展開をどこでやっているのか不明: おそらくu-bootがやっている)

 

(4/3 8:09 refresh_sdに補足)

  •   1
  •   0

コメントを書く

名前    

メール 

URL