KolibriOSでのUSBサポヌト内郚には䜕がありたすか パヌト4チャネルサポヌトレベル

ホストコントロヌラヌずのやり取りのレベルに関する話は2぀の 蚘事に分かれおいたすが、詳现に぀いおは舞台裏に残っおいたす 。興味のある読者は、 ゜ヌスから盎接確認できるこずを願っおいたす 。 チャネルのサポヌトレベルははるかに単玔で、䞻に、必芁なホストコントロヌラヌを䜿甚しお、ブロックを含むアクションの望たしいシヌケンスに、より高いレベルのAPI呌び出しを倉換するずいう事実によっお占められおいたす。



チャンネル開蚭



pipe.incコヌドでusb_open_pipeず呌ばれるAPIのUSBOpenPipe



関数は、指定されたチャネル特性ずデバむス特性が蚘録される「芪」チャネルによっお新しいチャネルを開きたす。 これを行うために、圌女は



最埌のアクションを䜿甚したコントロヌラヌ固有の初期化により、察応するリストに新しいチャネルが远加されたす。 制埡チャネルずデヌタ配列のチャネルの堎合、リストは1぀だけですが、割り蟌みチャネルの堎合は、いく぀かのオプションのいずれかを遞択する必芁がありたす。



これがscheduler.incの出番です。 圌は、割り蟌みチャネルのリストの1぀を遞択するだけでなく、新しいチャネルに「十分なスペヌスがある」こずを確認したす。 定期送信甚のFullSpeedバスのすべおのフレヌムで、90を超える時間を䜿甚するこずはできず、HighSpeedバスの各マむクロフレヌム-80を超える時間を䜿甚するこずはできたせん。



ここで、䜕らかの理由で状況に応じお動䜜するUSB​​実装を䜜成する堎合、スケゞュヌラを倧幅に節玄できるこずに泚意しおください。 このシリヌズの蚘事で説明されおいる他のすべおを䜕らかの方法で実装する必芁がありたすが、倧きな負荷がない堎合は、各フレヌム/マむクロフレヌムで凊理されるフルツリヌではなく、割り蟌みチャネルの1぀のリストだけで管理できたす。 実装をそれほど耇雑にしない、少し経枈的なスキヌムは、1、2、4、8、16、32フレヌムの各凊理間隔に察しお1぀のチャネルリストです。 ホストコントロヌラヌごずに倧量のトラフィックを持぀耇数のデバむスを同時に凊理する必芁はありたせんが、このアプロヌチは本栌的なスケゞュヌラヌに決しお劣りたせん。 FullSpeedデバむスの2぀以䞊のアむ゜クロナスチャネルたたはHighSpeedデバむスの3぀以䞊のアむ゜クロナスチャネルがある特定の構成では、単玔な回路が壊れたすが、そのような特定の条件で実装を実行する人はいないでしょうか



どこでも垞に動䜜するはずのUSB実装を䜜成しおいる堎合は、スケゞュヌラヌも䜜成する必芁がありたす。





トランザクション時間の芋積もり



決枈デヌタず内郚取匕構造
FullSpeed速床の1ビットは、通垞、フレヌムの1/12000郚分ごずに送信され、速床は12メガビット/秒になりたす。 ぀たり、ホストコントロヌラヌによっお枬定される1フレヌムの「サむズ」は12,000ビットです。 ホストずデバむスの䞡方が1/12000ミリ秒をカりントするタむマヌを刻みたす;タむマヌに埓っお、ホストたたはデバむスは次のビットの送信を開始したす。 ホストタむマヌの粟床芁件は非垞に厳栌であり、ホストタむマヌは蚈算で正確であるず芋なすこずができたす。 倖郚FullSpeedデバむスの堎合、仕様では、±0.25のタむマヌ゚ラヌが蚱可されおいたす。぀たり、デバむスからの400ビットの受信時間は、399〜401の「公称FSビット」に盞圓したす。 LowSpeed速床の1ビットは、FullSpeed速床の8倍の長さで送信され、1.5メガビット/秒の速床になりたす。 LowSpeedは、マりス/キヌボヌドなどの単玔なデバむスの芁件が緩和されたモヌドずしお考えられたした。LowSpeedデバむスのタむマヌ゚ラヌは±1.5以内である必芁がありたす。デバむスからの50ビットの受信時間は394〜406の「公称FSビット」に盞圓



HighSpeed速床の1ビットは、通垞マむクロフレヌムの1/60000で送信され、480メガビット/秒の速床を提䟛したす。 HighSpeedデバむスのタむマヌの粟床芁件は±0.05に匕き䞊げられたため、トランザクションを蚈画する際に、タむマヌの違いによる゚ラヌを無芖できたす。



トランザクションには独自の内郚構造がありたす。 分割されたトランザクションは脇に眮いおおきたしょう。 通垞のトランザクションは、トヌクントヌクンを含むパケット、デヌタデヌタを含むオプションのパケット、オプションのフィヌドバックパケットハンドシェむクなど、他のパケットず亀互に䜿甚せずにUSBバスに厳密に連続するいく぀かのパケットで構成されたす 。 ホストからLowSpeedデバむスに向けられたパケットの前には、特別なPREパケットがありたす。 バス䞊のハブがLowSpeedデバむスが接続されおいるポヌトのブロックを解陀できるように、PREパケットず、その埌に最䜎4぀の「公称FSビット」が必芁です。 通垞のFullSpeedトラフィックは、このようなポヌトには送信されたせん。



各パケットは、ロヌ/フルスピヌドで8ビット= 1バむト、ハむスピヌドで32ビット= 4バむトのSYNCクロックで始たりたす。 特別なPREパケットを陀く各パケットは、Low / Full Speedで3ビット、HighSpeedで8ビットのEOPパケットの終わりシヌケンスで終了したす。



トヌクンは、デヌタを送受信するデバむスのアクション、送信方向、アドレス、および゚ンドポむントを決定したす。 通垞のトランザクションでは、3぀のトヌクンが可胜です。それぞれ、デヌタの受信、送信、およびコントロヌル転送の最初の段階のためのIN、OUT、およびSETUPです。 トヌクン付きのパケットは、SYNC + EOPをカりントせずに3バむトを取りたすパケットのタむプに8ビット、デバむスアドレスに7ビット、゚ンドポむントに4ビット、CRCに5ビット、デバむスず゚ンドポむントのアドレスを送信するずきに゚ラヌがないこずを確認したす。



デヌタパケットには、デバむスから送受信された実際のデヌタず、SYNC + EOPをカりントしない3バむトが远加されたす。パケットのタむプは8ビット、CRCデヌタは16ビットです。



フィヌドバックパケットは1バむトで構成され、SYNC + EOPはカりントしたせん。パケットタむプは8ビットです。 パケットは、前のパケットずは逆方向に送信されたす。 ACKパケットは、すべおのデヌタが正垞に受信されたこずを意味したす。 INトランザクションでは、NAKパケットがデヌタパケットの代わりにデバむスによっお送信され、デヌタがただないこずを意味したす。 たずえば、コントロヌラヌが定期的にポヌリングしおいる間、マりスはこの方法で応答したすが、状態は最埌のポヌリング以降倉曎されおいたせん。 OUTトランザクションでは、NAKパケットはデヌタパケットの埌にデバむスによっお送信されたす。これは、デバむスが内郚の問題でビゞヌである間、ホストが埌で再詊行するこずを意味したす。 NAKは間違いではありたせん。 ゚ラヌを通知するために、デバむスはたったく応答しないか、無効なパケットで応答するか、STALLパケットで応答したす。 最初の2぀のケヌスでは、コントロヌラヌはこれをバス䞊のどこかの゚ラヌず芋なし、最倧3回再詊行したす。その埌、あきらめお゚ラヌを報告したす。 埌者の堎合、コントロヌラヌはすぐに゚ラヌを報告したす。

アむ゜クロナストランザクションでは、フィヌドバックパケットはありたせん。 割り蟌みトランザクションでは、フィヌドバックパケットが必芁です。



USB経由で送信されるデヌタでは、6単䜍ビットごずにれロビットが挿入されたす。 単䞀ビットは、バスの状態が単䞀ビットで倉化しないように゚ンコヌドされ、タむマヌを䜿甚しお個々のビットを遞択したす。 タむマヌの蚱容倀が問題を匕き起こさないように、れロビットが挿入されたす。 したがっお、最悪の堎合、荷物の配達時間に7/6を掛ける必芁がありたす。 乗数はSYNCおよびEOPには適甚されたせん。これらは特別な方法で゚ンコヌドされ、バスの状態に保蚌された倉曎を生成したす。



ホストコントロヌラヌが2぀のパケットを連続しお送信する堎合、FullSpeedずLowSpeedの堎合は2ビット、HighSpeedの堎合は88ビットに察応する短いパケット間遅延で十分です。 コントロヌラヌがパケットを受信し、応答パケットを送信する必芁がある堎合、䌑止はHighSpeedの堎合は8ビットに、FullSpeedずLowSpeedの堎合は同じ2ビットに削枛されたす。 ホストコントロヌラヌがパケットを送信しお応答パケットを埅機しおいる堎合、パケットをデバむスに枡す際の遅延ずデバむスからの応答パケットを考慮する必芁がありたすタヌンアラりンドタむム。 FullSpeedおよびLowSpeedバスの堎合、䌝送時間は察応する速床で18ビットであるため、仕様は䞡方向の信号通過ずデバむスの応答を含む最倧遅延を定矩したす。 HighSpeedの堎合、最倧遅延は736ビットの送信時間に盞圓したす。



ホストコントロヌラヌは、トランザクションのこれらすべおの詳现の実装を隠したす。これを蚈画するには、トランザクションにかかる時間を知るだけで十分です。 時間は、トランザクションのタむプ、トランザクションの方向、およびデバむスの速床によっお異なりたす。

スプリットトランザクションには、2぀のバス䞊の3぀のタむプの「基本」トランザクションが含たれたす。ホストずTT間の高速バスでの開始スプリットトランザクション、TTずデバむス間のFullSpeed / LowSpeedバスでの通垞トランザクション、ホストずTT間の高速バスでの完党スプリットトランザクションTT。 䞭間のトランザクション時間は、TTによっお導入され、TTを備えたハブのハンドルに蚘述されおいる远加の䞀時停止によっおのみ、TTのない同じトランザクションの時間ず異なりたす。 Start-SplitおよびComplete-Splitトランザクションは、SYNC + EOPをカりントせずに、特別な4バむトのSPLITパッケヌゞで始たりたす。



プランナヌ



1぀のフレヌムのFullSpeed / LowSpeedバスでは、1぀のチャネルに1぀のトランザクションしか存圚できたせん。耇数のトランザクションからの転送は耇数のフレヌムに分割されたす。 HighSpeedバスでは、マむクロフレヌムあたりのトランザクションの最倧数は3に達する可胜性があり、最倧トランザクションサむズずずもにチャネルの特性の1぀です。



チャネルが開かれるず、スケゞュヌラは、チャネルを䜿甚する最悪のケヌスに基づいお、チャネルの背埌のフレヌムの90/マむクロフレヌムの80の郚分を予玄する必芁がありたす-最長トランザクションの最倧数を想定したす。 トランザクション期間は前のセクションで説明されおいたす。 すべおが他のチャネルによっおすでに取埗されおいるずいう事実のためにチャネルの䞀郚を予玄できない堎合、スケゞュヌラぱラヌを返す必芁がありたす。 ドラむバヌが゚ラヌを怜出するず、たずえば、デバむスずのネゎシ゚ヌションを詊みお、䜕かによるトラフィックを枛らしたり、そのような状況では䜜業が䞍可胜であるこずを制埡プログラムを介しおナヌザヌに通知したりしたす。



分割トランザクションは耇雑さを増したす。 たず、2本のタむダの蚘録を予玄しお保管する必芁がありたす。 次に、マむクロフレヌムがFullSpeed / LowSpeedバスに衚瀺されたす。ホストからTTぞのStart-SplitトランザクションがマむクロフレヌムNに到着するず、TTはこのトランザクションをマむクロフレヌムN + 1でのみ開始し、その結果をトランザクションComplete-Splitで早めに返したすマむクロフレヌムN + 2。 第3に、最悪の堎合のすべおの定期トランザクションのフレヌムの最倧90が残っおいたすが、FS / LSバスの蚈画は、ビット挿入のための7/6乗数なしの楜芳的な掚定から行う必芁がありたす。スプリットトランザクションパむプラむン凊理ずバッファ管理は「この栌付けをベストケヌスバゞェット」ず呌びたす-これにより、1぀の定期トランザクションが蚈算されたトランザクションよりも早く完了し、次の定期トランザクションが開始されない可胜性があるため、FS / LSバスがアむドルになる可胜性が枛少次のマむクロフレヌムよりも早く、圌女のために、e Start-Splitトランザクションデヌタがただ到着しおおらず、珟圚のマむクロフレヌムの残りの郚分で次の非呚期的なトランザクションに十分な時間がありたせん。 最埌に、ホストはトランザクションがい぀終了するかを認識せず、結果を保存するためのTTバッファヌはゎムではないため、Complete-Splitトランザクションは、トランザクションを完了できるマむクロフレヌムに続く各マむクロフレヌムに1぀ず぀、数回スケゞュヌルする必芁がありたす。 特定の芁件は同じセクション11.18で衚明されたす割り蟌みトランザクションの䞀郚ずしお、マむクロフレヌムNで始たる予算、マむクロフレヌムN-1で1぀の開始分割トランザクション、マむクロフレヌムN + 1、N + 2で3぀の完党分割トランザクションをスケゞュヌルする必芁がありたす、N + 3。 アむ゜クロナス読み取りトランザクションは、予算内で耇数のマむクロフレヌムN、...、Lを占有できるずいう点でのみ異なりたす。そのため、N + 1からL + 3たでのマむクロフレヌムで完党分割トランザクションを蚈画する必芁がありたす。 アむ゜クロナストランザクションでは、Complete-Splitトランザクションは提䟛されたせんが、耇数のStart-Splitトランザクションが存圚する可胜性がありたす。FSバス䞊の1぀のマむクロフレヌムに収たる188バむト未満であり、さらにデヌタがある堎合、188の制限を持぀耇数のStart-Splitトランザクションに分割されたす1぀のトランザクションのバむト数。



KolibriOSスケゞュヌラヌは、「各フレヌム/マむクロフレヌムにX以䞊の空き時間がありたす」ずいうフレヌズで、数Xができるだけ倧きくなるように、異なるフレヌム/マむクロフレヌムで予玄された郚分の最も均等な分散を達成しようずしおいたす。 各フレヌム/マむクロフレヌムぞの泚意が必芁なチャネルが埌で衚瀺される堎合、予玄を成功させるには倧きなX倀が必芁です。 衚瀺されない堎合は、非呚期的な送信に時間が圹立ちたす。



最初に、スケゞュヌラヌは、ホストコントロヌラヌがチャネルをポヌリングする実際の間隔を遞択したす。 これはタスクの簡単な郚分です番号1、2、4、8、16、32から最倧倀を遞択し、指定された倀以䞋にしたす。 . USB1 8 . 8 : , 8k+0, ..., , 8k+7. 32 ; 8k+0 4 0,8,16,24, . , , , 24, , 32k+24, 16k+8, 8k+0, 4k+0, 2k+0, . 0,8,16,24, 8k+0. , , 8k+1, ..., 8k+7. — , , , , . , , 90% , .



HighSpeed- USB2 USB1 : 8 ; , , , .



USB2 , . , , . FS- . , . , HS-, Start-Split Complete-Split .





USBClosePipe



API, usb_close_pipe



pipe.inc, . , « », usb_close_pipe_nolock



, USB-, .



- usb_device_disconnected



, , , usb_close_pipe_nolock



, , , . USB- , , .



usb_close_pipe_nolock



:

- , , - usb_pipe_closed



, :



, USBNormalTransferAsync



API, usb_normal_transfer_async



pipe.inc, : , , , - usb_hardware_func.AllocTransfer



, , , usb_hardware_func.InsertTransfer



.





, , USBControlTransferAsync



API, usb_control_async



pipe.inc, USBNormalTransferAsync



.



- usb_hardware_func.AllocTransfer



, . . , — Toggle. USB « » , - . : Toggle=0, Toggle=1 . Toggle , .





1:

2: -

3: -

4:

5:

6:



All Articles