So-net無料ブログ作成
検索選択

仙台駅から電車に乗って~ [USB]このエントリーを含むはてなブックマーク#

08-03-28_13-13.jpg

きょう~わたぁしは~ 旅にでまぁす~

久々に新幹線に乗る用ができたので、車内でMC908JB16データシートのUSBの項を読みました。

SUSPENDとRESUME

SUSPENDとRESUMEについての解説を読みました。 バスがINACTIVEになった状態が3msec以上続いたら、SUSPEND状態に入ると書いてあります。 そのときには、SUSPNDビットをセットして、低消費電力状態にして、最大500uAの規格を満たせとも書いてありました。 500uAを達成するためには、マイコンはSTOP状態を使うしかなさそうです。

SUSPEND状態からは、hostがバスの状態を20msec以上反転してから、End-Of-Packet(EOP)状態(D+端子とD-端子の双方を2ビット時間LOWに引くこと)にすることで、各デバイスが目覚める(RESUME)のだそうです。 じゃあ、バスの状態を反転させただけだったら、デバイスは目覚めてはいけないのか? 反転状態が20msecの間継続しなかったら、デバイスは目覚めてはいけないのか?

この疑問に対しては、20msecの根拠が書いてあるので、ある程度推測することができます。 20msecという時間は、全てのデバイスが目覚めるために必要な時間であると書いてあります。 そのため、実際には、バスの状態が反転したときに、全てのデバイスがお目覚めシーケンスを開始して、20msec後に全てのデバイスが出揃うという事になるのでしょう。

hostは、EOP状態にしてから、3msec以内にパケットを送ります。 そうしないと、デバイスが再びSUSPEND状態に入ってしまうからです。 このため、デバイスは、最短20msecでSUSPEND状態から抜け出し、パケットを受信する準備を整えなくてはなりません。 PLLがロックする時間は、数十msecなので、これは厳しい値です。 本当に間に合うのかな?


今日は、乗車時間が短かったので、SUSPENDとRESUMEを読むのが精一杯でした。


nice!(0)  コメント(10)  トラックバック(0)  このエントリーを含むはてなブックマーク#

nice! 0

コメント 10

DAI

いつもながら思うのですが、紙ベースのデータシート、時々写真に写っていますね。これを持ってお出かけですね。
いいなあ、と思いながら、周囲を気にしながらポチッとなしてます。
まあ、結果は同じなんですけどね。

で、とりあえず作ってみました。

適当にためしながら学ぶ電子工作お勉強室
http://daisan.blog.so-net.ne.jp/

進捗速度は太平洋プレートより遅いかも。
何せ、クリアすべき障壁が多いですから。
by DAI (2008-03-28 23:07) 

noritan

さっそく、RSSをいただきました。

さすがに、JB16のフル・スペックは重いので、持ち歩き用には抜き刷りを作っています。最近のプリンタは、「booklet作成モード」なんてのもあるので、大変便利。これで、ますます、地球に厳しいプリントが増えるのでした。

ノートPCが、ノートの重さになれば、良いのですけどね。

by noritan (2008-03-28 23:32) 

Tsuneo

今日は電気な話をしたい気分です。

>低消費電力状態にして、最大500uAの規格を満たせとも書いてありました。

SUSPENDでの最大500uAというバスパワーデバイスの制約は、かなり厳しいものです。
というのは、この数字にはD+/D-プルアップ抵抗に流れる分も含まれます。
3.3V (Vreg) / (1.5k (ブルアップ) + 15k (プルダウン、ハブ側)) = 200 uA

また、オンチップ電圧レギュレータによる消費も決して無視できません。MC908JB16データシートのSTOPでの消費は大半オンチップ電圧レギュレータによるものでしょう。
20.6 DC Electrical Characteristics (p318)
VDD supply current: STOP: 100uA (max)

これだけで300uA までいっちゃいます。
つまり、半分以上裏方さんに持ってかれるわけです。
残り200uA でどないせいちゅうねん、とつっこみたくもなります。


> 500uAを達成するためには、マイコンはSTOP状態を使うしかなさそうです。

スタティックにはそうですね。
もう一つの方法は、間欠的にMCUを起こして、平均電流で規格を満たすというやり方があります。USBスペックもさるもので、そういった対処を想定した規格がちゃんとあります。

7.2.3 Power Control During Suspend/Resume (usb_20.pdf p176)
Figure 7-48. Typical Suspend Current Averaging Profile

USBバスからの消費電流は、最大1秒間の平均値として計算します。そしてピークは100mAまで許容されます。

MCUをフルに動かしたとき、10mA 喰うとしましょう。
200uA / 10mA x 100 = 2 (%)
つまり、2%の期間動かしては止めるというのを繰り返せばOKです。

え、なんで500uA で計算しないかって?
上記の裏方さんの300uA は通奏低音のようにMCUをSTOPにしても喰い続けるのですよ。
だったら、200uA / (10mA - 300uA) x 100 だろうって?
誤差の範囲です。


MCU本体は間欠駆動でどうにかなるとして、問題なのはそこそこパワーを喰う周辺回路が乗っているボードですね。この場合は、VDDにつないだPMOS-FET で周辺回路への電源を根こそぎ落としてしまいます。周辺回路につながっているMCUのポートをHi-Z にするのを忘れないように。この電源を落とした周辺回路がさらに外部の生きている信号につながっている時には、入出力のパーシャルパワーダウン耐性が問題になります。

"Ioff Input/Output Power Off Leakage Current" on TI.com
http://www-k.ext.ti.com/SRVS/Data/ti/KnowledgeBases/logic/document/tutorial/ioff.htm

周辺のチップのパーシャルパワーダウン耐性が判らないときは、74LVCなどパーシャルパワーダウン耐性が保証されたバッファをかませることになるでしょう。


USBがつながっている間はバスパワーで、サスペンドやUSBがはずれてる時はデバイスに乗せたバッテリで保たせたいんだけど、という仕様も当然有りでしょう。こういう時は
Micrel MIC2025/2075
Linear Tech LTC4413
などのパワースイッチチップがお役立ちです。


明日はUSBの本筋に戻って、PCにつないだときにSUSPENDとRESUMEは何時起きるの?、そして何が起きるの?という話をしましょう。おやすみなさい。

Tsuneo
by Tsuneo (2008-03-29 00:57) 

hamayan

それでいったい何処に行かれたのだろう?。
帰ってきて~~~
by hamayan (2008-03-29 07:49) 

Tsuneo

>VDDにつないだPMOS-FET
PMOS-FETって、あんた、歳がバレバレでんがな。PチャンネルMOSFETの間違いです。

Tsuneo
by Tsuneo (2008-03-30 00:48) 

Tsuneo

[ デバイス・ステートとSuspend/Resume イベント ]

もう一度しっかりデバイスステートの状態遷移図をながめてみましょう。

9.1.1 Visible Device States (usb_20.pdf p240)
Figure 9-1. Device State Diagram

この図にはSuspendedステートがたくさん書かれてますね。
- Attached以外のどのデバイスステートからもSuspendイベントでSuspendedステートに移行する。
- SuspendedステートからResume イベントでSuspendする前のデバイスステートに戻る。
- Suspendedステートでバスリセット・イベントを受けると、元のステートがDefault、Address、Configuredの時はDefaultステートに移る。

サスペンドが絡むとなかなか複雑です。
では、それぞれのステートでバスパワーデバイスはどの程度USBバスから電流を取ってよいか、見てみましょう。

1) Attached、Powered、Default、Addressステート

7.2.1 Classes of Devices (usb_20.pdf p171)
Devices must also ensure that the maximum operating current drawn by a device is one unit load, until configured.

"unit load" というのは、USB特有の言回しで100mAのことです。これを逆に読めば、Set_Configuration でconfiguredステートになるまでは、100mA までVBUS から吸出していても大丈夫ということです。
ただし、Attached以外のステートでは、SuspendイベントでSuspendedステートになることを思い出してください。手放しで100mAという訳ではないのです。

2) Configured ステート
configuredステートでは、コンフィギュレーション・デスクリプタのbMaxPowerフィールドで申告した電流まで許容されます。
bMaxPower
0x00 - 0x32 (0 - 100 mA):Low-power デバイス
0x33 - 0xFA (102 - 500mA):high-power デバイス
0xFB 以上:エラー

- bMaxPower に詳細な値を設定する必要は実はありません。そこまでホストは細かく見てません。100mA(Low-power デバイス)か 500mA(high-power デバイス)で充分です。
- high-power デバイスでは、必ずしもホストがこのbMaxPowerの申告受け入れるとは限りません。拒否されることもあり得ます。その場合はデバイスはエニュメレーションに失敗します。これに対し、100 mA以下のbMaxPower(Low-power デバイス)は常に保証されています。
- 許容電流は、Set_ConfigurationのSETUPステージの直後に切替わる、と考えて良いでしょう。

3) Suspendedステート
noritanさんが書いてらっしゃるように、バス上に何も信号が流れない状態(Idle)が3ms以上続いたら、Suspendedステートに移行し始め、10msまでに移行を完了します。つまり、Suspendイベントという特別なシグナルがあるのではないのです。Resumeイベントも同様に、デバイスがSuspendedステートのときに何か信号が送られてくれば、デバイスはResumeを始めます。原則としては何の信号でも良いのですが、通常、特別なResumeシグナルを使います。

このステートではhigh-power/Low-power にかかわらず、500 uAに制限されます。
ただし、high-powerでかつremote wakeupの機能があるデバイスのみ2.5 mAまで許容されます。

7.1.7.6 Suspending (usb_20.pdf p154)
7.1.7.7 Resume (usb_20.pdf p156)
7.2.3 Power Control During Suspend/Resume (usb_20.pdf p176)


[ バスパワーとセルフパワー ]
コンフィギュレーション・デスクリプタの bmAttributesのD6ビットと bMaxPowerでバスパワーとセルフパワーデバイスが設定されます。
バスパワー: bmAttributes(D6) = 0、bMaxPower = 0以外
セルフパワー: bmAttributes(D6) = 1、bMaxPower = 0
スイッチャブル:bmAttributes(D6) = 1、bMaxPower 0以外

スイッチャブルとは、電源をを切替えることができるデバイスです。例えば、電源アダプターを挿すとセルフパワーになり、はずすとバスパワーになるようなハブです。
現在バスパワーとセルフパワー、どちらの状態にあるのかは、Get_Status( Device )(bmRequestType = 10000000BであるGet_Statusリクエスト)で、リプライのD0 ビット(1: self-powerd, 0: bus-powered)でホストに報告されます。
これがまともに実装できているハブがどれほどあるかは...

9.6.3 Configuration (usb_20.pdf p266)
9.4.5 Get Status (usb_20.pdf p254)


[ Remote Wakeup ]
コンフィギュレーション・デスクリプタbmAttributesの D5ビットでRemote Wakeup機能の有無を報告します。
D5 = 1:Remote Wakeup 機能あり
D5 = 0:Remote Wakeup 機能なし

デバイスはホストの許可が無いとRemote Wakeupイベントを発行できません。
Default ステートでRemote Wakeupは不許可に設定します。
Set_Feature( DEVICE_REMOTE_WAKEUP )リクエストで許可に、
Clear_Feature( DEVICE_REMOTE_WAKEUP )リクエストで不許可になります。
Get_Status( Device )で、リプライのD1ビットに現在の状態を返します(1:許可、0:不許可)

9.6.3 Configuration (usb_20.pdf p266)
9.4.5 Get Status (usb_20.pdf p254)


背景の説明で終わってしまいました。

次回予告 [ PCのスタンバイとサスペンド ]
- Windows とMacでどう違う? Linuxは?
- Remote Wakeupデバイスとそうでないのではどう違う?
- Selective Suspend とは

Tsuneo
by Tsuneo (2008-03-30 00:55) 

ウミー

JB16でHIDキーボードのソースをダウンロードさせてもらってます。
500uAはさておき、SUSPENDビットを立てると、USB割り込みから抜けられないでいるようです。
(IRQ割り込みを意図的に掛けても、IRQがPendingされてることをMainLoopでLCDに出力させて確認)
そんでもって、SUSPENDからRESUME(RemoteWakeup)させることもできずにいます。
JB16でSUSPEND/RESUMEを考慮したフレームワークを探してますが、
ご存知ありませんでしょうか?
当方、定職についていないため不定期にしかコメントできませんがよろしくです。
by ウミー (2010-01-11 20:17) 

noritan

いらっしゃいませ.

「USB割り込みから抜けられない」という事ですが,「MainLoopでLCDに出力させて」という事から,「割り込みがかかり続けている」状態であると推測します.

また, USB 割り込みがかかり続ける理由は, "RESUMEF" フラグがクリアされていないからだろうと考えて,対策を考えます.このフラグは,明示的にクリアするまでは,セットされたままです.クリアの方法は,JB16のデータシート p.186 に書いてあります. "UIR2" レジスタ (p.188) の "RESUMEFR" に 1 を書き込むことです.つまり, UIR2=0x04; です.これで, "RESUMEF" フラグがクリアされるはずです.

このクリアシーケンスは,割り込みサービスルーチンの中で行う必要があります.また, p.183 には, "RESUMEF" フラグがセットされている内に "SUSPEND" ビットをクリアせよとも書いてあります.

このあたりのシーケンスがマイコンの想定外だったために "RESUMEF" フラグがクリアできていないのではないかと思います.

by noritan (2010-01-11 22:55) 

ウミー

noritanさま、ありがとうございます。
|このクリアシーケンスは,割り込みサービスルーチンの中で行う必要があります.また, p.183 には, "RESUMEF" フラグがセットされている内に "SUSPEND" ビットをクリアせよとも書いてあります.


こうしたシーケンスなど、データシートには明記されていなかったように思えます。
まだまだ未熟な私ですみませんが、よろしくお願いします。
今日は遅いので、また明日にでも実験してみます。
あと、データシートもちゃんと読まないと。。。
by ウミー (2010-01-11 23:11) 

ウミー

SUSPENDはなんとかできたものの(MainLoopのLCDで確認)、
Resume(RemoteWakeup)、通常のResumeだとうまくいかないー

SUSPND、RESUME、RESUMEFの3つのフラグと悪戦苦闘して、
いまいちよくわからん実装になったんだけど、だめぽ・・・・。

現状、SUSPENDに入って、RemoteWakeupしてSUSPNDフラグが
落とせるとこまでできましたが、その後キーボードが動かないです。
USBlyzerというToolでいろいろ目視確認したけど、どうやらUSBが動作してない
っぽいんです。テスターでD+とD-を当ててみると、USBのK状態を確認。
(正確にはロジアナを使わないとみれませんが、これは土日かな)
Noritanさんは、USBのJB16用のフレームワークに非常に詳しいようですが、
SUSPENDやRESUMEを含めた状態戦意、実装についてのノウハウがありましたら、ご教授お願いしまーす
by ウミー (2010-01-12 22:41) 

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0

この記事のトラックバックURL:
※言及リンクのないトラックバックは受信されません。

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。