Bluetooth CF到着

注文していたBluetooth CFが先日届きました。Socket社のBL4535-634です。待ってたぞー!ということでいそいそと箱から出し、あらかじめPC用のBluetooth USBアダプタでLinuxでの設定は把握していたので、早速Zaurusにつけて動作確認しようと意気込んでいたのですが、…動かない。この商品に動作報告があることは事前に確認してあったのに!ということで、今回はこのCFに関する顛末記です。

ちなみに右が同時に購入したPC用Bluetooth USBアダプタ。一見スマートで良さげに見えるのですが、PCに差してしまうと極めて取り外しづらいという問題が。まぁ、それ以外の使い勝手はなかなか良い感じです。しかし、USBの上の黒い部分が本体なのでしょうが、これが1400円で買えるのにCFになると何故16000円になってしまうのでしょうか。謎です。

まぁ何はともあれ、ドライバとツール群のインストールです。今回はこちらのbluez-zaurus_2.3-2.4.18d_arm.ipkを利用させて頂きました。

# cardctl ident
Socket 0:
  product info: "Socket", "CF+ Bluetooth Card CIS Rev 2.5"
  manfid: 0x0104, 0x0096
  function: 2 (serial)
# hcitool dev
Devices:

ふむ、とりあえずカードの認識はされているようですが、Bluetoothとしては認識されていません。というか、ドライバのロードすらされていないようです。確かに/etc/pcmcia/bluetooth.confを確認しても対応したエントリはありませんでしたが、

card "Socket Bluetooth Card"
  version "Socket", "CF+ Personal Network Card"
  bind "dtl1_cs"

とそれっぽいものはありましたので、定石通りこれを参考に型番だけ変更した設定を追加してみました。そして、カードを差した瞬間、ハング。

さすがに焦って調べていると、型番に2.5とあるものはリビジョンGかそれ以降であり、入っているチップもNokiaのものからCSRになっていることが判明。確かに仕様にはチップがCSR BC04-EXTであると書いてありますが、こんなとこ見るか!暗雲が立ち込め始めたものの、とりあえずドライバを変更して

card "Socket Bluetooth Card"
  version "Socket", "CF+ Bluetooth Card CIS Rev 2.5"
  bind "serial_cs"

に。これで動作するかと思いきや、

# hciattach ttyS3 bcsp 230400 noflow
BCSP initialization timed out
# hciattach ttyS3 any
# hciconfig
hci0:   Type: UART
        BD Address: 00:00:00:00:00:00 ACL MTU: 0:0  SCO MTU: 0:0
        DOWN INIT RUNNING
        RX bytes:0 acl:0 sco:0 events:0 errors:0
        TX bytes:4 acl:0 sco:0 commands:1 errors:0
# hciconfig hci0 up
Can't init device hci0. Connection timed out(110)

…もう流石に無理かと思いつつ、諦め悪く手を変え品を変えて調べ回っていると、ここにごくごくあっさりとしたコメントを発見。曰く、cardctl resume 0したら動いた。いやいや、cardmgrからは見えてるし関係ないだろそれとか思いつつ、藁にもすがる思いで試してみると…

# modprobe hci_uart
# cardctl resume 0
# hciattach ttyS3 bcsp 230400 noflow
# hciconfig hci0 up

動きました!ここまで来るのにえらい時間がかかったので、感動もひとしおです。

とまぁ動作させられるようになるまでをだらだらと書いてきましたが、実は裏ではkernel 2.4.36.7のドライバをバックポートするなど他にもいろいろやってます。教訓としては、ものによってはcardctl resume 0すると動くこともあるという事でしょうかね。同様の症状に悩まされている方は参考にでもしてやって下さい。

59 Responses to “Bluetooth CF到着”

  1. kanon Says:

    >teraさま

    だいぶ苦労してたんですね。

    私はSocket社のBL4508-309(G以降みたい)ですが、スペカと同じバージョン(v18j)のkarne modules (v18g) ,bluez-libs_2.23_arm.ipk,bluez-utils_2.23_arm.ipkの3つのファイルをインストールしただけでOKでした。

    ただノートパソコン以外にbluetooth機能を持った物を所有しておらず宝?の持ち腐れかも(^^;)

  2. kanon Says:

    >teraさま

    あっkarne modules (v18g) はkarne modules (v18j)の間違いです(^^;)

  3. sugarware Says:

    本題とは関係ないですが、USB BTアダプタに関してです。

    > PCに差してしまうと極めて取り外しづらいという問題が。

    私が買ったcorega製のちっちゃいやつ(BT2USB02C)は黒い部分に帽子を被っていてPCから外し易くなってます。

    > USBの上の黒い部分が本体なのでしょうが、

    上記のcoregaのちっちゃいやつを3つも購入、内2個を分解、内1個を昇天させてしまいました。
    その分解で判ったのですが、黒い部分は矩形波の配線パターンで構成されたアンテナだけでした。BT LSIや電源、水晶、CAP, REG等の本体部品は、なんとUSB端子の裏側に実装されています。なので基板は凄く薄くコネクタ部分の基板は意外とやわな感じでした。

    分解して内部の基板のみをザウルスに内蔵化しようとしたのですが、USB OTGのホスト・デバイスを切り替えたり、電源を切ったりする為必要なスイッチを取り付けるのに本体に下手な穴あけ等をしないスマートなアイデアが浮かばず、頓挫したままです。なお、W-ZERO3[es]にはW-SIMスロットを利用した内蔵化に成功しました。

  4. tera Says:

    > kanonさま
    うーむ、うらやましい…。
    今回行き当たった問題はスクリプト次第で対処できるものだったので、そちらのパッケージでは既に対処済みだったのでしょう。
    まぁ、これはこれでいい経験になったので良しとしましょう。
    しておいて下さい…。

    > sugarwareさま
    あ、奇遇ですね。
    実はcoregaの同じ物をデスクトップ用に先日買ったのですよ。
    前回のと同じのがなかったためですが、取り回しが楽で助かってます。
    手元ので確認してみたのですが、確かに本体っぽいのが端子の所に入ってますね。
    や、分解した訳ではないし、多分ですが。

    あと、W-ZERO3のBluetooth内蔵化、おめでとうございます!
    sugarwareさまのサイトと思しきところを拝見しておりましたが、素晴らしいですね!
    しかし、こういった電子工作できる方が本当に羨ましい。
    回路の動作原理くらいは把握しているので何となく想像はつくのですが、そこから先がちょっと…。
    ZEAL-C01みたいなのを用意すれば3桁機でも内蔵化できる気はするんですけどね。

  5. kanon Says:

    >teraさま

    USBのBluetoothを利用してSL-C3000に内蔵した先人にはぴろさんがいらっしゃいますね。
    ぴろさんが使用したのより今回の物の方が小型ですからスペース的には敷居が低くなるけど半田付けの難易度が上がるかもしれませんね

  6. tera Says:

    > kanonさま
    あぁ、私もぴろさまの記事は拝見したことがあります。
    あとはxabreさまのところでしょうかね。
    いずれにしろ3桁機にはUSBホスト機能が無いので、同様の方法ではちょっと無理そうですが。
    それにしてもsugarwareさまといい、皆さまレベル高すぎです…。

  7. sugarware Says:

    > teraさま

    わたしもぴろさんのページは見たのですが、Zaurusの筐体に穴を開ける工作で失敗しそうなので、穴を開けずにスイッチを付ける方法はないかと考えてみました。
    中に置いたスイッチを外から磁力でスライドさせられないかとか、内部にホール素子とアナログスイッチで構成した切断スイッチを構成し外部から磁界で制御できないか、等々考えたのですが、実行するには至っておりません。
    W-ZERO3の方はW-SIMスロット内にUSBソケットを実装したので、Blutoothの電源を切りたい時はUSBソケットから抜けば良いだけで、電源スイッチは不要でした。あと、W-ZERO3はPC接続の必要を感じないので、OTGスイッチも不要でした。
    Bluetooth内蔵化が出来てないZaurusですが、 ミニUSBコネクタタイプのIMUB-01を使うことで結構快適なBluetooth環境となっています。

    > それにしてもsugarwareさまといい、皆さまレベル高すぎです…。

    いえいえ、私に言わせればLinux、ファイルシステム、ソフトウエア開発の知識の豊富なteraさま達の方こそ、レベル高過ぎと感じてます。

    ところで、CFタイプのBTカードが16000円もしたのでしたら、ヤフオクで中古SL-C1000(最近の落札価格は12000円から15000円程度)を買う手もありましたね。

  8. tera Says:

    > sugarwareさま
    お使いのZaurusはSL-C1000だったかと思いますが、こちらのページのSL-C1000 -specific notesにありますGPIO93/GPIO106を使うというのはいかがでしょう?
    というかページを書かれた方もまんまBluetoothの制御に利用されているようですが。
    私はカーネルモジュールに余り詳しくないのですが、ソフト側からの制御もlinux/gpio.hのgpio_get_valueやgpio_set_valueでいける気がします。
    もし興味がおありでしたら、私の勉強も兼ねてモジュールを書いてみるのもやぶさかではないのですが、いかがでしょう。
    実際の工作前にGPIOの電圧変化の確認をテスタ等でされるというのも可です。
    もちろんsugarwareさまが自分で書かれるということであれば、私は必要ありませんが。

    あと、SL-C1000の購入も考えたのですが、やはり厚さがネックでした。
    現在SL-C760を薄型バッテリーで運用しているのですが、機種変更すると約6.4mm増になってしまうもので…。

  9. sugarware Says:

    > teraさま

    海外にもZaurusの改造ネタは沢山ありそうですね。リンクのページの情報も相当に濃い内容ですね。USB Port1は使われていないのに基板上に配線されているとは知りませんでした。
    SL-C1000はHDDが無い分内部空間とGPIO信号が余裕があり、付加機能を追加するのに向いた機種みたいですね。

    > GPIO93/GPIO106を使うというのはいかがでしょう?

    GPIOを2ポート使えば、1つをUSB D_,D+端子を接続するアナログスイッチの制御(High/Low)に、もう1つをUSB OTGのID信号の制御(Low/Hi-Z)に使えそうです。
    検索したところ、USBポートの切り替えに使える2回路アナログスイッチとしてMAX4717/4718が見つかりました。
    上記アナログスイッチを2個使えばID信号もまとめて制御できるので、GPIOは1ポートで足ります。

    > 私の勉強も兼ねてモジュールを書いてみるのもやぶさかではないのですが
    > 工作前にGPIOの電圧変化の確認をテスタ等でされるというのも可です

    面白そうですね。実際に改造するかはまだ判りませんが、可能性を探る実験をやってみるのは面白そうです。
    GPIOを操作するモジュールですが、カーネル置き換えが必要なのでしょうか。それともipkパッケージによる簡単インストールが可能なのでしょうか?

  10. tera Says:

    > sugarwareさま
    正直出来るかどうかは分かりませんが…。
    いずれにしてもカーネル置き換えは不要、実験にはipkすら不要です。

    とりあえず、確認にはモジュールロードでGPIO on、アンロードでoffなもので構わないと思います。
    # insmod ./sample.o (GPIO on)
    # rmmod sample (GPIO off)
    こんな感じで。

    最終的には
    # echo 1 > /proc/usb (GPIO on)
    # echo 0 > /proc/usb (GPIO off)
    のように…出来るといいですね。

    もし興味がおありでしたら、コメントをお願いします。
    お時間が無いようでしたらこのままスルーされても構いません。

    ———-

    追記:訂正。ただの実行ファイルでいいようです。
    # emb_usb on (GPIO on)
    # emb_usb off (GPIO off)
    こんな感じです。

  11. sugarware Says:

    > teraさま

    そんな簡単に使えるのですか。驚きです。
    echo で設定する方法は、スペカでタッチスクリーンが不安定な場合の調整や/procファイルシステムで使っていますが、あんな感じですね。

  12. tera Says:

    > sugarwareさま
    これは興味がおありということで宜しいんでしょうか…?

    とりあえず、モジュールからGPIOを操作しようという試みはあっさりと挫折しました。
    どうもGPIO関係のAPIが整備されたのがkernel 2.6以降らしく、Zaurusのカーネルソースにはlinux/gpio.hの影も形もありませんでした。
    ではそれ無しでとも考えたのですが、やはり生半可な知識では直にHWをいじるのは難しいらしく、全く歯が立ちません。

    が、先日のページでGPIOを操作しているpowerctlコマンドのソースがありがたいことに公開されておりましたので、それを参考に実行ファイルを作ってみました。
    こちらがソースバイナリです。
    使い方は
    # ./emb_usb on (GPIO on)
    # ./emb_usb off (GPIO off)
    で、GPIO93が操作できるはずです。

    以上、お時間のあるときにでもお試し下さい。

  13. sugarware Says:

    > teraさま

    GPIO操作プログラムが昨日の今日で出来るとは思ってもいませんでした。
    直ぐに確認するのは難しいので、お言葉に甘えて今週末にでもZaurusの蓋を開け、GPIO93の電圧が変化するかチェックしてみます。
    ありがとうございました。

    1つお願いがあるのですが、ポートの出力値として”0″,”1″に加え”Z”を設定することは可能でしょうか?”Z”とはHigh-Zの事で、出力禁止または入力として設定できればOKです。
    入力設定の場合に値を読み出す事も出来れば更に応用が拡がりそうです。

    以上、宜しくお願いします。

  14. tera Says:

    > sugarwareさま
    了解しました。
    楽しみにはしていますが、sugarwareさまの都合のいい時にお試し下されば幸いです。

    ところで、Z、ですか?
    余りHWに詳しい訳では無いのですが、GPIOは1bit、onかoffかしか取らないのではと思いますが…。
    2bitはGPIOを2ポート使えば表現できると思いますが、
    off: 0, 0
    on: 1, 0
    Z: 1, 1
    のような感じで良いのでしょうか。

    また、High-Z、出力禁止、入力として設定の意味が良く分かりません…。
    私のような初心者にも理解できるようもう少し噛み砕いて説明していただけると助かります…。

    あと、値の読み出しも活用されるということなので、現状でも引数無しで実行するとon/offが分かるようになっていますが、返り値でも値が分かるようにしておきます。

    どうぞ宜しくお願い致します。

  15. bucchi Says:

    teraさま、sugarwareさま

    横から割り込み失礼します。
    お、なんか面白そうな話になっていますね ^^
    teraさまご紹介のページを見ましたが、うーん、すごいですねぇ。
    今の USB-無線LAN やUSB-Bluetooth ドングルはさらに小さくなっているので
    内蔵化はこの記事よりは楽にできるのかもしれませんね。
    壊すのが怖くて私はちょっと実行には移せませんが・・・。
    その点 sugarware さまはすごいですねぇ。

    emb_usb.c を読ませていただきましたが、ユーザ空間から直接 GPIO が操作できるのですか!
    むむむ。ちょっと興味深いですね・・・。
    sugaware さまの結果が気になります。

    横から割り込みで厚かましいですが・・・
    GPIO の多くは、外部へ0/1を出力するピンとしてだけでなく、外から0/1を入力するピンとしても使えるようにできています。
    入力と出力は同時になり得ないので、どこかのレジスタで各ピンの入力/出力を設定できるようになっています。
    データシートを見たわけでは無いのですが、emb_usb.c では GPDR がそれに当たると思います。(Direction は入出力の向きという意味です)
    ソースを見るかぎりでは、GPDRの該当ビットを1にすると出力になるようです。

    で、sugarware さまのおっしゃる “Z” 状態(High-Zも同じ)というのは、”0″,”1″ 以外のもう1つの状態の、”何も出力しない”という状態です。
    ・”0″ を 「出力」
    ・”1″ を 「出力」
    ・”Z” 何も「出力しない」
    GPDRを入力に設定すれば出力しなくなるため、GPDRの該当ビットを0にすれば、”Z”状態にすることができます。

    tera様、sugaware様にはいつもお世話になっているので、少しでもお役に立てれば・・・

  16. tera Says:

    > bucchiさま
    おぉ、わざわざお教え頂きありがとうございます。
    なるほど、GPIOは内からも外からも好き放題変えられるというものでは無いのですね。
    よくよく考えれば、GPIOピンの電圧を保持する側がチップかUSBなのかをはっきりさせないとただの綱引きになってしまいますからね。
    出力禁止、入力として設定、なるほどなるほど。
    大変勉強になりました。

    ということは…こういうことでしょうか?
    もう全く自信が無く、もし間違っていたら大惨事っぽいので一応ご確認頂けると大変有難いです…。
    要は、
     output: GPDR(USB_GPIO) |= GPIO_BIT(USB_GPIO);
     input: GPDR(USB_GPIO) &= ~GPIO_BIT(USB_GPIO);
    ということだと思うのですが、いかがでしょう。

    なお、今回引数は
     on, 1: GPIO on
     off, 0: GPIO off
     z: High-Z
     無し: GPIOの状態チェック
    返り値は
     1: GPIO on
     0: GPIO off
     -1: エラー
    としました。

  17. sugarware Says:

    > teraさま、bucchiさま

    私がPXA27xの資料を調べている間に話が進んでいますね。
    bucchiさま、ありがとうございます。

    やっとPXA27xシリーズの仕様書をネットから探し出せました。
    http://int.xscale-freak.com/XSDoc/PXA27X/2800002.pdf

    これを見た感じでは、GPIO93を制御するレジスタは以下の4つです。
    ・ GPDR2[29] : 出力制御、許可[1]/禁止[0]
    ・ GPSR2[29] : 出力許可の場合のセット制御、High[1]/変更せず[0]
    ・ GPCR2[29] : 出力許可の場合のクリア制御、Low[1]/変更せず[0]
    ・ GPLR2[bit29] : 入力値の読み出し、High[1]/Low[0]
    他にもGAFR,GEDRがGPIO93に関係しますが、今回の用途では使用しないと思います。

    コマンド引数はteraさまの最新版でOKです。
    返り値に関してはコマンド実行の前後の値を返していただけると有りがたいです。
    仕様書のブロック図を見た限り、出力の許可・禁止に関係なく入力機能は働いているようです。もっとも出力許可時の入力値は出力値と同じの筈ですが、外部からのドライブが強力だと出力値が負けてしまう場合もあります。
    コマンドが前後の値を表示すればその辺りの状況も把握できるかと思います。

    0 : 0 変化なし
    1 : 0 -> 1 の変化あり
    2 : 1 -> 0 の変化あり
    3 : 1 変化なし

    引数毎の処理内容をまとめると以下の様な感じでしょうか。

    on|1
    BefVal <= GPLR2[29]
    GPSR2[29] <= 1 // 出力値設定
    GPDR2[29] <= 1 // 出力許可
    AftVal <= GPLR2[29]
       print BefVal*2 + AftVal

    off|0
    BefVal <= GPLR2[29]
    GPCR2[29] <= 1 // 出力値設定
    GPDR2[29] <= 1 // 出力許可
    AftVal <= GPLR2[29]
       print BefVal*2 + AftVal

    z
    BefVal <= GPLR2[29]
    GPDR2[29] <= 0 // 出力禁止
    AftVal <= GPLR2[29]
       print BefVal*2 + AftVal

    無し
    BefVal <= GPLR2[29]
    AftVal <= GPLR2[29]
       print BefVal*2 + AftVal

  18. bucchi Says:

    teraさま

    たぶん合ってると思います!
    データシートも確認してみましたが、レジスタのアドレスも合っていそうなので
    これでいけるのではないかと。

    データシート
    http://int.xscale-freak.com/XSDoc/PXA27X/2800002.pdf

    あ、一点だけ。
    gpio_ctl()の最後の return の GPLR() が munmap 後なので正しい値が取れないかもしれませんね。
    後は大丈夫だと思いますよ!

  19. tera Says:

    > bucchiさま
    なんだか一から十までご確認頂いてしまったようで、恐縮です…。

    ほうほう、これがかの有名なデータシートですか。
    CPUには本当にあらゆる機能が集約されているんですねぇ。
    流石Central Processing Unitというだけはあります。
    レジスタについては私はカーネルパッチの方から当たったのですが、24.6章のアドレス一覧で一応裏付けも取れたようで、一安心です。

    あとGPLRについては明らかにミスってますね、お恥ずかしい。
    事前にご指摘頂いて助かりました…sugarwareさまのZaurusが。
    まぁ読み出しだけだったので大丈夫だったとは思いますけど。
    なんにせよ、ご指摘有難うございました。

    ということで、私などよりずっと詳しいbucchiさまのお墨付きも頂けましたので、こちらの修正版できっとうまく行くものと思います。
    ではsugarwareさま、どうぞいつでもお試し下さいませ。

    ただ、これで何か問題が起こってしまっても保証は致しかねますので、悪しからず…。

  20. tera Says:

    > sugarwareさま
    コメントありがとうございます。
    理由は分かりませんが、せっかく頂きましたコメントがスパムかどうか微妙と判断されてしまったようで、承認待ちになってしまっておりました。
    先ほど修正致しましたが、おかしなことになってしまい申し訳ありませんでした。

    さてさて、sugarwareさまも色々調べて頂いていたようで大変感謝。
    返り値の変更は了解です。
    on/off時の処理はpowerctlに倣って
    GPCR -> GPDR -> GPSR
    になっておりますが、こちらの方が動作した前例があるようですので安心ではないかと。

    という訳で、修正版がこちらです。
    どうぞお試し下さいませ。

  21. sugarware Says:

    > teraさま、bucchiさま

    プログラムの方はお二人の協力の下あっと言う間に完成した感じですね。
    web検索で/dev/memを調べてみたのですが、linuxではroot権限だとデバイスドライバを書かずとも簡単にIOへアクセスできるのですね。知りませんでした。

    > コメントがスパムかどうか微妙と判断されてしまったようで

    投稿の際に見たことの無いawaiting なんとかとの表示がありました。あれはそういう意味だったのですか。何が問題だったのでしょう?

    また例の海外サイトを見ていたのですが、内蔵基板はコネクタに接続されたUSB2ではなくUSB1に接続(写真)しているのですが、特にUSBポートの変更に対しソフト的な考慮は書かれていないようです。
    そうであれば私もBluetoothをUSB1に接続し、D+,D-信号の切り離しを不必要にできます。残る改造は、Vbus/GNDをBleutoothのVDD/GNDへ接続、Vbusに電源を供給させる為にID信号にGPIO93を接続、だけで済みそうです。これならアナログスイッチ等の追加部品も不要ですね。
    この場合の注意点はGPIO93を”0″にしてBluetoothに電源を供給している最中に、PC(USBホスト)と接続するとVbusが衝突してしまう事です。でもこれは使う側の問題で、そのような同時利用を避ければ良い事です。私の場合、ZaurusをPCに接続する必要も有りません。PC接続に関しては例の海外サイトの人も同じ事言ってますね。
    あと、Vbusの容量(改造無しだと200mA)が許せばBluetooth(USB1)とUSBメモリ(USB2)の同時使用は可能になります。

    それでは、頂いたプログラムを使っての実験が完了しましたらまらご報告致します。
    テスタを当てるGPIO93の場所が小さい事、蓋を開けた状態で動作させる事、がこの実験の難関ですね。

  22. tera Says:

    > sugarwareさま
    ご報告ありがとうございます。

    コメントが保留されてしまった件ですが、こちらではそういった判断をAkismetというプラグインに丸投げしているので、ちょっと原因までは判りかねます。
    多分外部へのリンクを張った上記号っぽい文字列が多かったのが何かのルールに引っかかったのではと思いますが…。

    さて、いろいろと懇切丁寧に説明して頂いており大変ありがとうございます。
    が…悲しいことに、ほとんど理解できておりません!
    bucchiさまなどはきっちり着いていかれているのでしょうが…。
    とまぁ言っていてもしょうがないので、せっかくの機会ですし勉強半分、興味半分でちょっと調べてみました。

    まず、基本から。
    どうやらUSBは通常4本のピン、D+、D-の信号線とVBus、GNDの電源ペアで動作するようですね。
    そしてPCをホスト、周辺機器をターゲットとして接続し、通信関係の面倒な部分は全てホスト側が担当すると。

    そのうち周辺機器同士の接続への需要が生まれ、USB On-The-Goという規格が制定された。
    このOTG機能は追加された5本目のピン、IDで制御され、USBの親子関係を接続された機器同士で決めることができる。
    これがZaurus 4桁機がUSBのホストにもターゲットにもなれるタネだったのですね。
    が、よくよく考えるとPC側のピンは4本、Zaurus側は5本。
    なら、Zaurus側のIDの線はどこに繋がって、どう親子関係を決定しているのでしょうか…謎だ。

    で、これらを踏まえてsugarwareさまに頂いたコメントを読み直してみました。
    まず、そもそもの問題はUSB OTG機能のホスト切り替えと電源のon/offに必要なスイッチをつけるのに物理的な手段しかなく、スマートではなかったことだったのですね。
    次のGPIOを2つ使う案では、USB Port2を中間地点で横取りし、D+、D-、IDだけスイッチで切り替える予定だったと。
    が、USB Port1がフリーっぽいのでそちらを使うことにし、Port1はD+、D-しか無いのでVbus、GNDに関してはPort2と共有とする、と。
    電源のon/offに関してはID信号で制御するようですね。

    あぁ、こうやって読み返してみると、ちょっと難易度は高いものの本当に丁寧に書いて下さっていたのですね。
    重ね重ね、ありがとうございます。
    では、ご成功をお祈りしております!

    ———-

    追記:

    ダメだ…自分の考えは矛盾だらけで、明らかに理解出来ていないようです。
    何点かお教え願いたいのですが、宜しいでしょうか。
    また、何か参考になる文書等お教え頂ければ大変有難いです…。

  23. sugarware Says:

    > teraさま、

    殆ど理解できていると思いますよ。

    > が、よくよく考えるとPC側のピンは4本、Zaurus側は5本。
    > なら、Zaurus側のIDの線はどこに繋がって、どう親子関係を決定しているのでしょう> か…謎だ。

    ID信号はZaurus内部で弱くHighにドライブされています。

    PCとID信号は接続されませんので、ZaurusからはID=Highとして認識され、その結果Zaurus=デバイス、PC=ホスト、となります。この場合Vbusへの電源供給はホストであるPCが行っていますので、ZaurusはVbusへの電源供給を行いません。

    Zaurusをホストにする際に使うUSBホストケーブルは、ケーブル内部でID信号がGNDと接続されています。
    USBホストケーブルをZaurusに接続すると、Zaurus内部で弱くHighドライブされていたID信号は強いGNDに負けてID=Lowとなります。ZaurusはこのID=Lowを認識することでZaurus=ホストとしての動作になり、Vbusへの電源供給も行います。
    こんな感じです。

    これ以外はteraさんの認識の通りです。

  24. tera Says:

    > sugarwareさま
    なるほど!
    素晴らしい、そういうテクニックもあるのですね。
    ZaurusをUSBホストとして動作させる場合は専用のケーブルが必要だとは考えもしませんでした。
    そういった目で改めて読み直してみるとまさに目から鱗、突然視界が開けていくようです!
    おかげさまで疑問のいくつかは納得できましたが、もし宜しければあと何点かお教え頂きたいのですが…。

    えーと、まず物理的なスイッチをつける案ですが、
    1. IDスイッチで電源のon/offを切り替え
    2. Vbusスイッチで電圧をかける側の内と外を切り替え
    3. D+とD-の電圧のかかっていない方は無反応なので、電気的に無視される
    という理解で宜しいのでしょうか。

    また、次のGPIOを2つ使う案ですが、
    1. IDスイッチで電源のon/offを切り替え
    2. D+とD-をスイッチで切り替え
    3. Vbusは内と外で共有
    となるのでしょうが、どちらにも機器が繋がっている場合共に給電しつづけることになるので無駄が多くなってしまうのでは…。

    あと、最終案では
    1. 例のサイトによると何故かOTGに5V電圧がかかっているようだが、そんなところに繋いでGPIOは大丈夫なのか
    などの疑問が。

    以上、宜しければお教え頂けると、もしくは何か参考になる文書等お教え頂ければ大変有難いです…。

  25. bucchi Says:

    teraさま、sugarwareさま

    返事が遅くなってすいません。
    いや、私もあまりついていけてないですよ。
    USB On The Go は今回初めて知りました。
    ハードは浅く狭く ^^; しか知らないので・・・。

    teraさまの 10/25 18:12 の投稿を読んで私もフムフムなるほどと思った次第です。
    間違ってるかもしれませんが、恥ずかしながら個人的な考えを書いてみます。

    > えーと、まず物理的なスイッチをつける案ですが、
    > (省略)
    > という理解で宜しいのでしょうか。
    ぴろさんのページが見れなかったので良く分からないですが、
    全部の信号をスイッチで切り替えたほうがいい気がしますね。
    D+ と D- を外部機器と内蔵機器で共通化すると、USB1.1機器と USB2.0機器を
    混ぜるとおかしなことになりそうです。
    確か、D+, D- のプルアップ/プルダウン(弱くH/L状態にする)で、USB1.1と2.0を
    区別していたと思うので、たとえ他方の機器に通電していなくても影響してしまいそうです。

    > どちらにも機器が繋がっている場合共に給電しつづけることになるので無駄が多くなってしまうのでは…。
    たしかに内蔵機器は外せないので、常に通電状態ですね。
    Vbusもトランジスタかアナログスイッチで切り替えたほうがいいかもしれないですね。
    あまり電流も流せないので。

    > あと、最終案では
    > 1. 例のサイトによると何故かOTGに5V電圧がかかっているようだが、そんなところに繋いでGPIOは大丈夫なのか
    英語が非常に苦手なため、tera さまのおっしゃる部分がどこか分からなかったのですが、
    5Vの電圧は抵抗を介してOTGに繋げてありませんか?
    この抵抗がそれなりに大きくて、0V出力時にGPIOの最大入力電流を越えていなければ大丈夫だとおもいます。

    例えば 10kΩ を介してあれば、0V を出力していても、オームの法則より 5V/10kΩ = 0.5mA しかGPIOのピンには流れ込まないので大丈夫・・・とか。

    うーん。私もあまり自身が無いので、変なこと言っていたら sugarwareさまにご指摘頂きたいです ^^;

  26. kanon Says:

    >bucchiさま

    ぴろさんのページはhttp://piro.sytes.net/~piro/pukiwiki/pukiwiki.phpに引っ越されていますね

  27. sugarware Says:

    teraさま、bucchiさま、

    私もよく判ってないところもありますが、取りあえず判る範囲で書いてみます。

    > えーと、まず物理的なスイッチをつける案ですが、
    これはbucchiさまの指摘どおり、4つの信号を切り替えるのが理想ですね。
    D+,D-とVbusはUSBデバイスの同名端子間、IDはGNDとの間にスイッチを置き接続/切断します。
    ホスト(PC)との接続を行う際には、bucchiさん指摘のUSB1.1とUSB2.0の判別の問題もありますね。
    ホストへの接続をしないのであれば、ZaurusはUSB2.0をサポートしないので判別問題は無視できると思います。

    > また、次のGPIOを2つ使う案ですが、

    データ(D+,D-)が切れた状態で電源だけを供給した場合、USBデバイスはリセット直後の状態だと思いますので、消費電力もそれほど大きくだろうと期待してます。加えて、電源をOnするのは外部とUSB接続する場合だけなので、無駄に電力消費するのは短時間だろうと言う推測もあります。

    bucchiさんのおっしゃる様にVbusも切り替えるのが理想ですが、外部部品が増えのと改造が面倒になるのが難点ですね。
    なお、信号用のアナログスイッチではON抵抗が大き過ぎて使えません。例えば以前紹介したMAX4117では、Highの際のON抵抗値の最大値が25Ωです。これに100mA流れるUSBデバイスを接続した場合、100mA*25Ω=2.5Vもの電圧降下が発生し電源電圧が2.5Vまで低下します。これではUSBデバイスが正常に動作できないでしょう。
    そのため電源専用のアナログスイッチというのもあります。例えばMAX1931を使えばON抵抗値の最大値は0.15Ωですから、上記条件での電圧低下は100mA*0.15=0.015Vとなり問題ないレベルです。

    > あと、最終案では

    ID信号はホストケーブルが接続されない状態ではHigh(5V)となっていますが、これは電源に直接接続されているのではなくて大きな抵抗を通して接続されています。そうでなければホストケーブルを接続してID信号がGNDに接続された瞬間、電源とGNDがショートしてしまいます。
    信号電圧をHighにするための抵抗(Pullup抵抗と言います)の値が幾らかは判りませんが、十分に大きな値だと思います。
    ID信号を強制的にLowにドライブするのに必要な電流は、bucchiさん指摘の様にGPIOでも可能な程度に小さい電流だろうと思います。

    > もしくは何か参考になる文書等お教え頂ければ大変有難いです…。

    CQ出版の「USBターゲット機器開発のすべて」と言う書籍の第1章「これだけは知っておきたいUSBの基礎知識」が内容見本として公開されています。On Th Goに関してはあまり記載されていませんが、USBの基礎はこれで十分かもしれません。

    http://www.cqpub.co.jp/hanbai/books/33/33381.htm
    http://www.cqpub.co.jp/hanbai/books/33/33381/33381.pdf

    On The Goに関して以下が参考になりました。

    http://pc.watch.impress.co.jp/docs/2004/1115/pda38.htm
    http://pc.watch.impress.co.jp/docs/2004/1122/pda39.htm
    http://www.nazo-fjt.com/ptcep/w-zero3/es_usb.html

    これらの中に以下の記述があります。

    > この端子とグランド(GND、5番ピン)の間の抵抗値が10Ω以下の場合には
    > ミニAと判断されホスト動作を行ない、100kΩ以上の場合には、ミニBで
    > あると判断しクライアント動作を行なう。

    これからID信号のpullup抵抗値をRとする境界条件は以下になります。

    ・電源3V時(CMOSの電源電圧-10%)に100kΩでもHighと認識(2.0V以上)できる
    3.0(100k(100k+R)) >= 2.0
    ・電源5V時(TTLの電源電圧+10%)に10ΩでLowと認識(0.8V以下)できる
    5.5(10(10+R)) =< 0.8

    これから、Rすなわちpullup抵抗の値は59Ω~50kΩの間に絞られました。
    小さいと無駄に電流を流しますし、大きいとHighを認識するマージンが小さくなりますので、10kΩ、22kΩ、33kΩあたりと推測できます。

    さて、肝心のGPIO実験ですが、日曜は早朝から夜まで水戸方面の山へ芝刈りに行っていたため、全く進んでおりません。m(_ _)m
    期待しないでお待ち願います。

  28. sugarware Says:

    > reraさま

    先ほどの投稿にまたしても

    > sugarware Says: Your comment is awaiting moderation.

    と言う警告メッセージが出てしまいました。
    リンクの貼り付けが問題なんでしょうかね?

  29. tera Says:

    > bucchiさま、sugarwareさま
    ふむふむ、さすがはお二人、大変勉強になります。
    詳細なご説明、大変感謝でございます。
    また、参考文献も私なりに全て目を通させて頂きました。
    kanonさまも補足ありがとうございます。

    おかげさまで当初の疑問は解決、sugarwareさまの構想が掴めてきたように思います。
    結果、私が考えるまでもなくどの案もよく練られた計画であると判っただけでしたが…。
    これは、大変面白そうというか、なかなかに期待が膨らみますね!

    あと、またしてもコメントが保留されてしまった件ですが、今度は外部へのリンクと頂きましたコメントの長さがルールに引っかかったのではないでしょうか…。
    こちらも断言はしかねますが。
    私も極力チェックして保留は解除するようにしておりますが、さすがに外部へのリンクさえなければ誤判断されることも無いでしょうし、URLのhttp://の先頭のhを削るなどして頂ければ確実かと思われます。

    ではでは、結果をかなり楽しみに、かつまったりとお待ちしております。

  30. sugarware Says:

    > teraさま

    昨日の投稿で「reraさま」とtypoしていました。チェックもせずに送信してしまい申し訳有りませんでした。

    > これは、大変面白そうというか、なかなかに期待が膨らみますね!

    USBポート1が使えそうと言う事で、私も非常に楽しみです。
    ここに来ての一番の難問は、細かな半田付け作業だろうと思っています。

    実験もしていないのにちょっと気が早いのですが、本日4つ目になるcorega BT2USB02CをZaurus内蔵用に買ってきました。
    ところで、GPIO93のサスペンド対応は簡単に出来ますでしょうか?

    > 外部へのリンクと頂きましたコメントの長さがルールに引っかかったのではないでしょうか…。

    私が最初に警告されたコメントが55行、teraさまの長めのコメントが51行、bucchiさまの長めのコメントが47行でしたから、45行を越えない程度にすれば大丈夫そうですね。
    リンクに関しては、私とbucchiさんで同じPXA20x資料へのリンクを貼っても私だけが警告されたようですので、リンクは無関係かもしれませんが、今後はttp://で記述してみます。

  31. tera Says:

    > sugarwareさま
    コメントありがとうございます。
    半田付け…確かに。
    相当に細かそうですからねぇ。

    さて、サスペンド対策ですか?
    とりあえず気になるのは2点、GPIOに関してとUSBに関してでしょうか。

    まず、GPIOに関しては大丈夫ではないでしょうか。
    サスペンドしてもCPUのレジスタは保持されていると思いますし、むしろそうでなかったらいささか問題がある気が…。
    や、仕組みが完全に判っている訳では無いので多分、ですが。

    USBに関しては、HW的にもPort2と同様の扱いになると思われますので、Port2で大丈夫ならPort1でも恐らく大丈夫でしょう。
    そうでなくてもsuspend/resume時の扱いはhotplugdの管轄となりますので、その対策は如何様にでもなるでしょう。

    こんなところでしょうか。

  32. bucchi Says:

    > kanon さま
    返事が遅くなってすいません。
    おぉ、引っ越しされていたのですね。
    ググった時はサーバに繋がらなかったので、一時的なダウンかと思っていました。

    ふむふむ、ぴろさんは ID と Vbus のみを切り替えているんですね。

    > sugarware さま、tera さま
    USB 1.1、2.0 混在について、掘り返してしまって申し訳ないですが、
    PCとの接続を考えずに、デバイスのみ接続としても影響がありませんか??

    USB 2.0 に対応していないので 2.0 として使えないのはもちろんなのですが、
    USB 1.1/2.0 両方対応の機器を USB 1.1 互換として使う時に影響しそうな気が・・・。

    USB 1.1 と 2.0 の識別について適当にググったところ、

    > ロー・スピード機器が接続された場合、ターゲットはD−を1.5kΩ±5%でプルアップし、信号レベルを「H」とする。
    > フル・スピード機器またはハイ・スピード機器が接続された場合、ターゲットはD+を1.5kΩ±5%でプルアップし、信号レベルを「H」とする。

    とありましたが、内蔵と外付けで 1.1 機器, 2.0/1.1 機器を混在させると D-, D+ どちらもプルアップされてしまい、
    うまく認識できずに動作しないとか・・・。

    いまどき 1.1 のみの機器なんてほとんど無いと思うので、2.0/1.1 機器のみと
    割り切ってしまうのもアリですが ^^;

    あと、サスペンドの時は、私も GPIO の信号は保持されると思うので、
    suspend 時には電源が供給されないように GPIO を制御した方がいいかもしれませんね。

    これは tera 様がおっしゃるように hotplug のスクリプトでコマンドを実行するだけなので、
    多少の試行錯誤は必要かもしれませんが、比較的簡単に実装できると思います。

    うーん。だんだん現実味を帯びてきてワクワクしますね (^^)
    ご報告まったりとお待ちしております。 > sugarware さま

  33. bucchi Says:

    > kanon さま
    読み返したらお礼を書いてないことに気づきました ^^;
    失礼いたしました。
    また、ぴろさんのページを教えていただきありがとうございました。

  34. sugarware Says:

    > bucchiさま

    速度判定ですが、良く調べたらUSB1.1の機器だけでもLow Speed/Full Speedでプルアップ対象がD_/D+と異なっています。
    これだとD_/D+をスイッチ等で切り離さない方式の場合、Zaurusの様なUSB1.1にのみ対応したホストでも速度判別は必須ですので、仕様上は問題あるかもしれません。
    一番低速のデバイスを優先する判定方式なら動作する可能性はありますが…

    今回の改造案は、内蔵デバイス=Port_1、外付けデバイス=Port_2、とデータ信号が別々になっていますので、速度判定問題は該当しません。

  35. bucchi Says:

    > sugarware さま
    あ、なるほど。今回は Port が個別なので問題ないんですね。
    ぴろさんのページの印象が残っていて、共有する物と思いこんでいました ^^;
    失礼しました。

  36. sugarware Says:

    やっと実験出来ました。
    emb_usbコマンドでGPIO93は想定通りに動作出来ています。

    実験は外部に10kΩの抵抗を2個つかったテスト回路(下図)を用い、GPIO93をemb_usbで操作しながらVbus、GPIO93の電圧を測定すると言うものです。

    Vbus ——R(10k) —–GPIO93—–R(10k)—–GND

    Vbusに電源が供給されていない場合、
    emb_usb high –> V(Vbus) = 1.64V, V(GPO93) = 3.29V
    emb_usb low –> V(Vbus) = 0V, V(GPO93) = 0V
    emb_usb z –> V(Vbus) = 0V, V(GPO93) = 0V

    以上からhigh,lowで3.3Vと0Vが出力されているのが確認出来ました。

    Vbusに電源が供給されている場合、
    emb_usb high –> V(Vbus) = 4.98V, V(GPO93) = 3.29V
    emb_usb low –> V(Vbus) = 4.98V, V(GPO93) = 0V
    emb_usb z –> V(Vbus) = 4.98V, V(GPO93) = 2.44V

    以上からhigh,lowで3.3Vと0Vが出力されている事に加え、zで出力が禁止されている事も確認出来ました。

    なお、emb_usbで操作する前のGPIO93は”1″出力となっていました。

    emb_usbの動作確認が出来ましたので、いよいよBluetoothの内蔵化です。

  37. sugarware Says:

    実は内蔵化も既に試しました。
    予想以上に時間がかかり、実験を含めると土曜の夜から延べ16時間ほどの作業でした。やはり細かなハンダ付けはキツイですね~

    気になる結果ですが、残念ながら目標は達成出来ていません。

    GPIO93によるID信号の制御は出来ている様です。
    GPIO93をlowにするとUSBホスト機能が働き、GPIO93がHighとzの場合にはホスト機能が働きません。
    これはlsusbコマンドの下記結果で確認しました。
    なお、GPIO93=z状態でUSBホストケーブルを接続した場合のlsusbの結果は、GPIO=Lowの場合と同じになりました。

    GPIO93=High, z
    > lsusb
    > Cannot open /proc/bus/usb, No such file or directory (2)

    GPIO93=Low
    > lsusb
    > Bus 001 Device 001: ID 0000:0000

    Host/Device切り替えは上記の通り出来ているのですが、USB Port1に接続したBluetoothドングルは認識されませんでした。

    Bluetoothドングルへの接続は何度も確認したのですが…
    何かを間違えているのかもしれませんが、今回は非常に疲れたので一旦切り上げました。

  38. bucchi Says:

    > sugarware さま
    おぉ! GPIOはうまく制御できたんですね!
    でも、認識されないのですか・・・。
    port1 の USB Host 機能が無効になってるんでしょうかね・・・。
    例のページではそのへん何も書いてないんですけどね。
    と思って、例のページの usb-ohci-pxa27x.c とノーマルカーネルのドライバを見てみたところ、
    なんかノーマルカーネルのドライバとは大分違いますね・・・。
    port1 対応されたドライバなのかもしれません。
    このドライバコンパイルしてみましょうかね。

  39. sugarware Says:

    > bucchi さま

    > port1 対応されたドライバなのかもしれません。

    port1を有効にする為とかの記述が見当たらなかったので、接続さえすれば普通に認識されるだろうと思ってました。甘かったですかね。

    > このドライバコンパイルしてみましょうかね。

    お手数をお掛けしますが、お願いします。
    デバイスモードには対応してないとの事ですが、私の用途では問題ありません。

  40. bucchi Says:

    > sugarware さま
    例のページにあったドライバをコンパイルしてみました。
    http://www.petit-noise.net/files/usb_ohci_pxa27x.o
    動作確認はしていないので、通常動作すらするか分かりませんが、
    勇気があればお試しください ^^;

    実機の /lib/modules/2.4.20/kernel/drivers/usb/usb_ohci_pxa27x.o と差し替えて、
    念のため再起動してから試してみてください。

    動作することを願って・・・。

  41. sugarware Says:

    > bucchi さま

    USBドライバのコンパイルありがとうございます。
    まだ試していないのですが、例のページを読み返したところ

    > Also control over the 5V OTG power domain is now separated from the driver and is implemented as a userland utility available here.

    との記述があり、このドライバはOTGの電源制御をしておらず、電源管理はpowerctlで行う必要があるみたいです。よって、このドライバだけだとGPIO93でID信号を制御してもVbus端子に電源供給できない可能性があります。
    powerctlは新たに追加したwifiやbtの電源制御だけでなくOTGの電源制御も行っていますので、

    powerctl otg [on/off/check]

    で無改造ZaurusのOTG電源制御に使えるかもしれません。
    と言うことで、申し訳ありませんが、powerctl.cのコンパイルもお願いできませんでしょうか?

    powerctl.cを見たら、以下の宣言がありました。

    #define USB_CONNECT_GPIO 41
    #define USBD_VBUS_GPIO_DEVICE 35
    #define USBD_VBUS_GPIO_HOST 37

    OTGの電源はgpio37で行っているようです。gpio35は改造したとの記述が見当たらなかったので、オリジナルの接続のままではないかと予想しました。
    gpio41,gpio35はpowerctl.cでは使っていませんが、シャープのUSBドライバでOTG電源制御に使われていたとの記述がありますので、
    gpio41でUSBコネクタへの接続の有無をチェックし、
    gpio35でID信号の値をチェックしているのかもしれませんね。

    以上、宜しくお願い致します。

  42. sugarware Says:

    すみません、先ほどのコメントにtypoがありました。
    下から7行目です。

    誤: gpio35は改造したとの記述が
    正: gpio37は改造したとの記述が

    先ほどの続きですが、
    USBデバイスの接続の有無、USBホストケーブルの接続の有無、の各条件でgpio35とgpio41を読み出す事で、これらのgpioの接続先か判るかもしれませんね。

  43. sugarware Says:

    何度もすみませんが、また続きです。

    例のページの最後の方にある以下の文と対応する写真から判断すると、ID信号に
    接続されているのはgpio41のようです。

    > Here’s some GPIO pins used by Sharp’s OTG implementation. In order to re-purpose GPIO41, R1 resistor needs to be removed to disconnect the line from the OTG connector.

    さらに写真の基板パターンをよく見ると、以下の様な接続と思われます。

    3.3V —-R(PullUp)—-(A)—-R—- ID信号(USBコネクタ)
    (A) —-R1(切断用?)—-GPIO41

  44. sugarware Says:

    > bucchi さま

    USBドライバを例のモノに置き換えてみました。
    残念ながら電源が供給されないらしく、lsusbの結果は
    Cannot open /proc/bus/usb, No such file or directory (2)
    でした。ホストケーブルを接続しても変化なしでした。

    そこでlsmodでロードされているモジュールを確認したとろ、usb_ohci_pxa27xが見当たりません。ロードされてない!
    以前のドライバに戻してもみましたが、やはりドライバは読み込まれず動作もしませんでした。

    ドライバをロードさせる為に何か忘れている事があるのでしょうか?

  45. bucchi Says:

    > sugarware さま
    なるほど powerctl も必要なのですね。英語が苦手で読めていませんでした ^^;
    コンパイルしたものを以下に置いておきます。
    http://petit-noise.net/files/powerctl
    デバッグ用に GPIO 35,37,41 の GPLR、GPDR を表示するようにしたバージョンも作ってみました。
    http://petit-noise.net/files/powerctl-debug

    usb_ohci_pxa27x は私の SL-C1000 では、ホストケーブルを差し込むとロードされるようでした。
    このドライバがロードされると lsusb が正しい表示をするようになるので、
    (正確にはこのドライバがUSBの仮想的なファイルシステムをマウントしていて、そのデータを lsusb が表示しています)
    おそらくですが、lsusb でエラー無く結果が表示される状況ではロードされていると思います。
    あ、もしかすると、ドライバを差し替えた後、root 権限で depmod を実行するとロードされるようになるかもしれません。

  46. sugarware Says:

    > bucchi さん

    powerctlとpowrctl-debug、ありがとうございます。
    powerctl otg [on|off|check]
    で電源制御出来ました。
    オリジナルのドライバは、USBコネクタにデバイスやホストケーブルを挿した状態でレジュームしたらロードされたようです。OTGチェック機能がドライバ内にあるため、何らかのトリガで一度そのチェックコードを実行しないとデバイスが挿された事すら認識できないのかもしれません。ニワトリと卵の関係ですかね。

    さて核心の新ドライバですが、

    ・電源をon/off切り替えてもlsusb、lsmod共に反応なし
    ・USBコネクタに挿したBTドングルにも反応せず
    ・例のページに「新ドライバとusb-mintorは同時に走らせるな」との記述がありますので、usb-monitor.oをリネームしてロードされない様にもしてみましたが、改善無し

    でした。

    うーむ、あとは何をチェックすればいいのか?
    これも一種のパズルだと思えば、まだ楽しみが残っていると言う事ですかね。

  47. sugarware Says:

    > bucchi さま

    powerctl-debugに関して教えて下さい。
    まず、実行結果は以下の通りでした。

    “>powerctl-debug otg check”
    “41 GPDR: [0x40019010]=0xFCFFBD21″
    “35 GPDR: [0x40019010]=0xFCFFBD21″
    “37 GPDR: [0x40019010]=0xFCFFBD21″

    GPIO 35,37,41 の GPLR、GPDR を表示するとの事ですが、結果はどのように見るのでしょうか?
    また、otg on/offで電源を切り替えても、USBコネクタへデバイスを抜き差ししても、右に表示される2つの数字には変化が無く、常に同じ値のようです。

    以上、宜しくお願いします。

  48. tera Says:

    > sugarwareさま
    コメントありがとうございます。
    返信が遅くなってしまい、大変申し訳ありません。
    bucchiさまも毎度有難いフォロー、大変感謝。

    おぉ、来ましたね!ご報告お待ちしておりました!
    16時間もの大作業(飲まず食わずのぶっ続け?)、大変お疲れ様でした。

    とりあえずemb_usbは動作したということで一安心です。
    これでひとまず方針は間違っていないことが確認できたことになりますね。

    が、肝心の内蔵化がなかなかに難航しているご様子で。
    Bluetoothが認識されないというのは何故なんでしょうね…。
    HW的には同じはずなので、Port2で認識できてPort1でできないことは無さそうなのですが…。
    ドライバの件は私も時間のある時にでも調べてみるつもりです。

    ちなみに、カーネルモジュールは
    # insmod /path/to/module.o
    # rmmod module
    で強制的にロード/アンロードできます。
    とっくにご存知でしたら申し訳ないですが…。

    また、一応カーネルのログは
    1. /etc/syslog.confに “kern.* /tmp/messages” という行を追加
    2. /etc/rc.d/init.d/syslog start でログ開始
    3. tail -f /tmp/messages でログを監視
    4. /etc/rc.d/init.d/syslog stop でログ終了
    5. rm -f /tmp/messages でログを削除
    で確認できますので、こちらを利用するのも手だと思います。

    では、続報を楽しみに、またお試しになるのをお待ちしております!

  49. sugarware Says:

    > bucchi さま、tera さま

    tera さま、ドライバのロード、アンロードのコマンドを教えて頂きましてありがとうございました。insmod,コマンドも実行したりはしていましたが、曖昧な理解で使用していまいた。明確に教えて頂けまして助かりました。

    新ドライバに置き換えた際には、port1にみならずport2も認識されないのでドライバのロードに失敗している可能性が高く、確認の為にドライバ強制ロードのinsmodやmodprobeを実行すると、以下のエラーメッセージと思われる出力がされます。
    ロードの際に下記シンボルのリンクに失敗しているものと思われます。

    /lib/ 中略 /usb/usb_ohci_pxa27x.o: unresolved symbol hc_add_ohci
    /lib/ 中略 /usb/usb_ohci_pxa27x.o: unresolved symbol hc_reset
    /lib/ 中略 /usb/usb_ohci_pxa27x.o: unresolved symbol hc_remove_ohci
    /lib/ 中略 /usb/usb_ohci_pxa27x.o: unresolved symbol pci_pool_destroyi
    /lib/ 中略 /usb/usb_ohci_pxa27x.o: unresolved symbol pci_pol_create
    /lib/ 中略 /usb/usb_ohci_pxa27x.o: unresolved symbol hc_start

    以上から、何か次の一手が見えて来ますでしょうか?

  50. bucchi Says:

    > sugarware さま
    あ、モジュールが足りないようですね。
    失礼しました。
    これらのシンボルを含むモジュールもコンパイルします。

    あと、powerctl-debug は GPLR も出していたつもりですが、表示されていなかったようです。
    もう一度作り直したものを同じファイル名で以下に置いておきます。
    http://petit-noise.net/files/powerctl-debug

    こんな感じの結果が表示されるようにしました。

    41 GPDR: [0x40019010]=0xfcffbd21 & 0×200 = 0
    41 GPLR: [0x40019004]=0xffffc208 & 0×200 = 1
    35 GPDR: [0x40019010]=0xfcffbd21 & 0×8 = 0
    35 GPLR: [0x40019004]=0xffffc208 & 0×8 = 1
    37 GPDR: [0x40019010]=0xfcffbd21 & 0×20 = 1
    37 GPLR: [0x40019004]=0xffffc208 & 0×20 = 0

    最後に対応したビットの 0/1 を表示するようにしてみました。

    > teraさま
    ちょっと思ったのですが、このままここのコメントでこの話を続けてしまっていいでしょうか?
    別の掲示板か何かに移った方がいいのであれば、私の方で掲示板用意するのも可能ですけども。
    いや、なんとなく、ここのコメントもだいぶ多くなっていて、コメントの頻度も高いので、記事の返信という形のこの形式からは外れてきているかなと思いまして。

  51. bucchi Says:

    > sugarware さま
    シンボルが足りないのは私のミスでした。
    足りないシンボルのモジュールもリンクしたドライバを以下に置きました。
    http://www.petit-noise.net/files/usb_ohci_pxa27x.o
    これで動く・・・といいなぁ

  52. tera Says:

    > sugarwareさま、bucchiさま
    なるほど、仰る通りモジュールのロードに失敗しているようですね。
    そしてbucchiさま、素早いフォロー大変ありがとうございます。

    usb_ohci_pxa27x、私も少し読んでみました。
    確かにオリジナルとは全然違いますね。
    しかし、少し前には何が書いてあるのか全く理解できなかったでしょうが、まがりなりにも理解できるようになっていてちょっと感動しました。
    それもこれもsugarwareさまとbucchiさま、お二人のお陰でございます。
    大変感謝!

    そしてよく見てみると、オリジナルには無い
    UHCHR &= ~UHCHR_SSEP0; /* enable power to port 1 */
    との行が…!
    どうやらこのドライバでPort1を有効にしているようですね。
    よくよく考えると、Port1が有効になっているのならばlsusbは
    Bus 001 Device 001: ID 0000:0000
    Bus 002 Device 001: ID 0000:0000
    と2行になっているはずですし、このモジュールはパズルのかなり大きなピースのようです。
    これに目を向けられたbucchiさま、お見事!

    あと、掲示板の件ですが、別にこのままでも構わないのではないでしょうか?
    別に私はコメント欄に何を書かれても構いませんし、ここならRSSがあるので巡回も楽でしょうし、まぁ今更、という面もありますし。
    いかがでしょう。

  53. sugarware Says:

    ドライバとデバッグツールの修正ありがとうございます。
    さっそく試してみました。

    powerctl-debugでGPIO41とGPIO37のGPLRの変化が確認できました。
    GPIO41はUSBコネクタにIMUB-01を接続すると”0″になりましたので、予想通りID信号に接続されていると思われます。
    GPIO37はpowerctlでotgをon/offすると”1″/”0″と変化しますので、OTGの電源制御に使われているのが確認出来ました。

    USBドライバの方ですが、ロードは出来たのですが期待通りの動作には至りませんでした。
    下表はドライバを切り替え、Zaurus再起動後の各チェックポイントでのlsusb,lsmodの応答と、Port2に接続したIMUB-01のLED表示です。
    新ドライバは内蔵HUBしか認識していないようです。

    bucchiさま、teraさま、次の手は見えますでしょうか?

    [新ドライバ]
    lsusb lsmod LED
    再起動直後 cant open no list NA
    port2接続後 Device 001 unused off
    powerctl on後 Device 001 unused on
    powerctl off後 Device 001 unused off
    port2開放後 cant open no list NA
    port2接続後 Device 001 unused off
    powerctl on後 Device 001 unused on
    port2開放後 no msg deleted NA
    port2接続後 Device 001 unused on

    [オリジナルドライバ]
    lsusb lsmod LED
    再起動直後 cant open no list NA
    port2接続後 Device 002 unused on
    powerctl off後 Device 001 unused of
    port2開放後 cant open no list NA
    port2接続後 Device 002 unused on
    port2開放後 cant open no list NA

    表中の略号は以下を意味します。
    no msg : メッセージ無し
    cant open : cannot open /proc/bus/usb, No such file or directory (2)
    Device 001: Bus 001 Device 001: ID 0000:0000
    Device 002: Bus 001 Device 001: ID 0000:0000
    Bus 001 Device 002: ID 9a12;0001 Cambridge Sillicon Radio, Ltd
    no list : ドライバ表示されず
    unused : usb_ohci_pxa27x 23328 0 (unused)
    deleted : usb_ohci_pxa27x 0 0 (deleted)

  54. bucchi Says:

    > teraさま、sugarware さま
    返信が遅くなってごめんなさい。

    掲示板の件了解です。確かに今更ですね ^^; > teraさま
    tera 様がOKなら何の問題もありませんので、このままいきましょう!

    うーん。新ドライバでもダメでしたか・・・。
    ID信号の制御と、電源制御は問題ないようですね。
    ひとまず一歩ずつ進んではいますね。
    あとは Port1 を生かすだけ・・・。

    あらためて例のページのソースを見ていると、kernel.diff で、
    usbh_interrupt_init();
    を殺してますね。

    USBホスト用の割り込み関連の初期化処理と思われますが、これを消してるということは、
    この内容を usb-ohci-pxa27x.c に持っていったのかもしれません。
    ということは、ノーマルカーネル+新ドライバではこの処理が2つあってかち合ってるとか??

    あと、usb-ohci-pxa27x.c で、hc_add_ohci で ohci ドライバに登録しているのが Port1 のみのように
    見えるのも気になります。
    なるほど、だから sugarware さんの結果でも新ドライバでは Port2 が見えていない幹事だったのかもしれませんね。

    ということは、port1, port2 を両方 ohci に登録してあげれば両方使えるようになるかも。。
    でも、現状でも新ドライバで port1 のデバイスは認識されてもいいな・・・。

    ちょっと長くなってしまったので、簡単に問題点をまとめると、

    1. 新ドライバでも Port1 のデバイスが認識されない
    2. 新ドライバでは Port2 が使えない。(両方使えるようにしたい)

    の2つの問題があるということですね。
    もうちょっと調べてみます。

  55. sugarware Says:

    > bucchi さま

    解析ありがとうございます。
    私も以前気になってカーネルのdiffファイルをちょっと見たのですが、殆ど判りませんでした ^^;
    カーネルにUSBの割り込み初期化を禁止する変更があるのならば、この変更も適用させる必要があるのですかね。そうであれば結構厄介な事になって来たような…

    > ID信号の制御と、電源制御は問題ないようですね。

    純正USBドライバはGPIO41を通してID=0を検出すると、ホストモードへ移行しOTG電源をONする制御を行っているのに対し、ホストモードしかサポートしない新USBドライバはこのID信号の状態を利用していない様ですね。

    > ohci ドライバに登録しているのが Port1 のみのように見えるのも気になります。

    powerctlがわざわざPort2用のOTG電源も制御しているのですから、新ドライバがPort2をサポートしないと言うのはちぐはぐな感じですね。

    > 1. 新ドライバでも Port1 のデバイスが認識されない
    > 2. 新ドライバでは Port2 が使えない。(両方使えるようにしたい)

    はい、その通りです。
    但し、私のPort1接続に改造ミスがある可能性もありますので、SL-C1000を分解して配線接続を再確認してみます。
    もし私の改造にミスがあった場合、それに起因してPort1のみならずPort2も認識できない、と言うシナリオも考えられない事もないですね。

    > もうちょっと調べてみます。

    急ぐ必要は全く有りませんので、お時間の取れる時に興味本位で進めて頂ければと思います。

  56. プリマ Says:

    こんにちは。GM_LITE使わせていただきます。ただいまDLしているところです。
    CFのBLUETOOTHは高いというのを見て、USBでないものか?と思い検索してみました。
    そしたらこんなものhttp://www.pdakobo.com/exec.exe?html=product.htm&key=120IBS10000400&BackUrl=%2fexec.exe?html%3dBluetooth.htm%26BackUrl%3dshoptop.shtmlを見つけました。
    これってザウルスでも動くんでしょうか?ザウルスでつないでいるところがあるのはこちらです。
    http://d.hatena.ne.jp/magcup/20071105

  57. http://www.singingmenoftyler.org Says:

    Now, let me work http://www.challahcrumbs.org over this afresh http://www.entrepreneursrock.org They met among

  58. ITで勝つ儲ける生き残る方法 Says:

    俺実は困っていてネット上で2時間以上, 調べても調べても出てこなかったけどやっとあなたの所で見つけました。 これって わたしにとっての感動です。 私のほんのちょっとのことですが 管理者さんにありがとうです。

  59. Preston Lehn Says:

    Healthcare Proof

Leave a Reply