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
実際にこの処理をどこかで行っているハズ。
探したんだけど、、、
見つからない。(´・ω・`)

0 件のコメント:

コメントを投稿