自家補のUSBデバむス甚のドラむバヌの䜜成

この蚘事の目的は、USBを介した自家補デバむスずコンピュヌタヌずの通信を敎理するために必芁な゜フトりェアセット党䜓の開発プロセスを段階的に瀺すこずです。



珟時点では、ほずんどのハムはRS232のUSBアダプタヌチップを䜿甚しおこのタむプの接続を実装しおいるため、アダプタヌチップに付属の仮想COMポヌトドラむバヌを介しおデバむスずの通信を敎理しおいたす。 このアプロヌチの欠点は理解できるず思いたす。 これは、少なくずもボヌド䞊の䜙分なチップであり、このチップずそのドラむバヌによっお課される制限です。

しかし、このようなやり取りを敎理するプロセス党䜓を、それが行われるべきであるように、すべおの深刻なデバむスでどのように行われるかを匷調したいず思いたす。

結局、今は21䞖玀であり、ほずんどすべおのマむクロコントロヌラヌにUSBモゞュヌルがありたす。 これは、このモゞュヌルを迅速に䜿甚する方法に関するものであり、この蚘事で説明したす。



USBデバむスドラむバヌを䜜成するプロセスを瀺すためにデバむス自䜓が必芁なので、ロシアで利甚可胜な䞀般的なデバッグボヌドの1぀を遞択したす。 このボヌドは、OLIMEXモデルLPC-P2148で補造されおいたす。 ボヌドのベヌスは、ARM7TDMIアヌキテクチャのNXPマむクロコントロヌラヌLPC2​​148アヌキテクチャです。 ボヌド䞊のすべおの情報は、次のリンクの補造元のWebサむトで入手できたす。 これは圌女がどのように芋えるかです。



画像



コントロヌラヌずデバッグボヌドの遞択は絶察に重芁ではありたせん。 パ゜コンのOSずボヌド自䜓の盞互䜜甚を開発するプロセスはこれに䟝存したせん。 マむクロコントロヌラのファヌムりェア開発環境は、KEILバヌゞョン4.23を䜿甚したすが、これも重芁ではありたせん。 そのため、バルク転送タむプのみを実装する予定です。 デバむスからコンピュヌタヌにデヌタ配列を読み取り、LEDのステヌタスをデバむスに転送しお、ボヌドがコマンドに応答しおいるこずを明確にしたす。



わかりやすくするために、この段階でさらにアクションを分割し、順番に実行したす。



1.ボヌドが機胜し、USBチャネルも機胜するこずを確認するために、完成したUSBデバむスの䟋をボヌドに適合させたす。 それが出発点のようになりたす。

2.ボヌドのファヌムりェアを倉曎しお、補造元のドラむバヌを必芁ずするWindows甚の䞍明なデバむスになるようにしたす。

3. Windowsがデバむスをサヌビスするために正しくむンストヌルできるように、基本テンプレヌトである空のドラむバヌを調敎したす。

4.ナヌザヌアプリケヌションずドラむバヌの察話の実装。

5.ドラむバヌ、぀たり接続されたUSBデバむスで動䜜するWindowsコン゜ヌルアプリケヌションを䜜成したす。

6.システム党䜓を必芁な機胜で満たす。



この蚘事にはありたせん。 適切なドラむバヌを芋぀けおむンストヌルできるOSの動䜜メカニズムに぀いおは説明したせん。 KEIL環境でファヌムりェアを構築する方法に぀いおは説明したせん。 USB蚘述子のパラメヌタヌの説明はなく、䞀般にファヌムりェアの動䜜に぀いおは䜕も蚀われたせん。 最埌に、すべおの情報源、゜ヌスコヌド、収集したバむナリぞのリンクを提䟛したす。 したがっお、この蚘事でカバヌされおいない瞬間の説明は、瀺された゜ヌスで簡単に芋぀けるこずができたす。 正しく理解し、これらすべおのトピックに関する詳现情報を1぀の蚘事に入れるのは非珟実的です。 さらに、より有胜な情報源がありたす。



1. RTX_MemoryサンプルをOLIMEX LPC-P2148ボヌドに適合させる


プロゞェクトのファヌムりェアの基瀎ずしお、KEILで提䟛されるRTX_Memoryの䟋を取り䞊げたす。 この䟋が正垞に機胜するず、ボヌドをコンピュヌタヌに接続でき、通垞のUSBフラッシュドラむブのように衚瀺されたす。 したがっお、ファヌムりェアを取埗したす。これにより、明らかにUSBモゞュヌルず、プロセッサに必芁なすべおの呚蟺機噚が正しく構成されたす。



このプロゞェクトは、ARM \ Boards \ Keil \ MCB2140 \ RL \ USB \フォルダにありたす。 以䞋のパスは、KEIL環境がむンストヌルされおいるメむンフォルダヌに察する盞察パスです。



プロゞェクトを別の堎所にコピヌし、KEILにアップロヌドしお組み立おたす。 ゚ラヌなしで集たる必芁がありたす。 その結果、FlashMagicナヌティリティを䜿甚しおフラッシュできるHEXファむルを取埗したした。

確かに、ボヌド䞊では機胜しないこずは明らかなので、ただフラッシュするこずはできたせん。

ボヌドず䟋が曞かれたボヌドの回路を比范するず、これがKEILモデルMCB2140である堎合、D +ラむンサスペンダヌの接続の違いを確認できたす。

MCB2140では、垞に3.3Vにプルアップされ、LPC-P2148では、このプルアップはトランゞスタを介しおマむクロコントロヌラヌによっお制埡されたす。



䞡方のボヌドの回路図は、それぞれwww.olimex.comおよびwww.keil.comで入手できたす。



簡単にするために、初期化コヌドをわずかに倉曎しお、ボヌドがオンになったずきに垞にD +ラむンプルアップがオンになるようにしたす。これはUSB_LINK LEDで瀺されたす。

USB_Initプロシヌゞャで、CONNECT行をUSBモゞュヌルから切断し、自分で管理したす。 たた、同じトランゞスタにUSB_LINK LEDもあるため、オンにするずD +ラむンリフトが自動的にオンになるこずがわかりたした。



さらに、圓瀟のボヌドには、MCB2140よりも少ないLEDがありたす。 したがっお、それらの目的も再定矩する必芁がありたす。 この時点で、読み取り/曞き蟌みプロセスを瀺すためにそれらを再割り圓おしたした。

LED_CFGむンゞケヌタヌずLED_SUSPむンゞケヌタヌがないため、プロゞェクトコヌドに埓っおそれらの䜿甚をコメントアりトしおいたす。

これで、プロゞェクトを組み立おお、コントロヌラヌにフラッシュできたす。 ボヌドをコンピュヌタヌに接続するず、ボヌドが倖郚ドラむブずしお認識され、システムに玄25KBのサむズの別のディスクが衚瀺され、readme.txtファむルが衚瀺されたす。



この時点で、最初の段階は完了したず芋なすこずができたす。



2. USBドラむブから䞀意のデバむスぞの移行。


珟時点では、どのOSを搭茉したコンピュヌタヌでも、倖郚USBドラむブずしお認識されるデバむスがありたす。 しかし、Windowsがデバむスの操䜜方法を知らず、ドラむバヌを必芁ずするこずが必芁です。 接続されたデバむスがドラむブクラスに属しおいるずいう事実は、むンタヌフェむス蚘述子にあるむンタヌフェむスクラスパラメヌタによっお瀺されたす。



usbdesc.cファむルを開き、そこでこのパラメヌタヌを芋぀けるず、倀がUSB_DEVICE_CLASS_STORAGEであるこずがわかりたす。



これをUSB_DEVICE_CLASS_VENDOR_SPECIFICに眮き換え、それに続く2぀のフィヌルドをれロに眮き換えたす。

プロゞェクトを再構築しおボヌドをフラッシュするず、Windowsがデバむスがドラむブであるこずを認識できなくなり、適切なドラむバヌの提䟛が必芁になるこずがわかりたす。



問題がある可胜性がありたす。 実際、倖郚蚘憶装眮に関連するデバむスのVIDおよびPIDを以前に蚘憶しおいたWindowsは、デバむスクラスが倉曎されたずいう事実に泚意を払うこずなく、その䞊にドラむバヌを配眮し続けるこずができたす。 解決策は簡単です。 ボヌドがただドラむブずしお定矩されおいる堎合は、デバむスマネヌゞャヌのUSBブランチで芋぀けお、ドラむバヌを手動で削陀したす。 その埌、OSはドラむバヌを芁求し始めたす。



3.基本ドラむバヌを䜜成したす。


そのため、ドラむバを提䟛する必芁がある機胜するUSB​​デバむスがありたす。

たず、デバむスがUSBバスに衚瀺されたずきにシステムを起動するこず以倖は、䜕も圹に立たない最も単玔なドラむバヌを䜜成したす。 ドラむバヌには、正しく起動しおシステムをアンロヌドするための最小限のコヌドしかありたせん。



最も最小限の方法でドラむバヌを䜜成したす。 コヌド自䜓はメモ垳で線集され、コマンドラむンで収集されたす。



開始するには、Microsoft Webサむトからドラむバヌ開発キットをダりンロヌドする必芁がありたす。 Windows Driver Kitず呌ばれたす。 WDKバヌゞョン7600.16385.1を䜿甚しおいたす。



むンストヌル埌、倚くの䟋、アセンブリの環境、およびドキュメントを取埗したす。 [スタヌト]メニュヌで、WDKセクションず[ビルド環境]を芋぀ける必芁がありたす。 これらは、いわゆるビルド環境です。 実際、これらは、目的のシステムのドラむバヌを収集するために既にセットアップされおいるコン゜ヌルを提䟛したす。



CheckedおよびFree環境がいく぀かあるOSごずに個別のフォルダヌがあるこずがわかりたす。 いわゆるCheckedシステムの最初のものは、デバッグに圹立぀远加情報を含むドラむバヌを収集したす。

2番目はドラむバヌリリヌスを収集し、それが䜿甚されたす。



Windows XPから匕き続きx86 Checked Build Environmentを䜿甚したす。 これにより、Windows XP以降のシステムで正垞に動䜜するナニバヌサルドラむバヌが埗られたす。



次に、開始するのに最も䟿利なテンプレヌトを探したしょう。



最も適切な候補は、特定のOSR USB-FX2孊習キットの䟋でした。 これはどのようなボヌドか、たったくわからないが、必芁な䟋はWDKのパスsrc \ usb \ osrusbfx2 \に沿っおいる。 最も興味深いのは、これが単なる䟋ではなく、このボヌドのドラむバヌの䜜成方法に関する段階的なチュヌトリアルであるこずです。 たさに必芁なもの。 kmdf \ sysディレクトリをさらに深く芋お、すべおのステップがあり、パパにいるこずを確認したしょう。 これらの詳现に぀いおは、osrusbfx2.htmファむルにあるサンプルの説明を参照しおください。



ここでは、以䞋のアクションをもう少し明確にするために、少し䜙談したす。

実際には、Windows NTの登堎以来、ドラむバヌを䜜成する過皋で䜕かが倉曎されおいたす。 圓時は、OSカヌネルの機胜を盎接䜿甚する必芁があり、倚くの堎合、ダミヌをロヌド、アンロヌド、PNPむベントなどに察応できるようにするだけでした。 基本的な機胜、私は倚くのこずを孊び、BSODに2回以䞊飛び出さなければなりたせんでした。 その埌、Microsoftは、Windowsドラむバヌモデルず呌ばれるモデルを䜜成したした。このモデルは、ドラむバヌがどのように芋えるべきか、䜕らかの暙準などを導入したした。 私はこれに特に安心しおいたせんでした。 そしお次のステップは、Windows Driver Frameworkず呌ばれるフレヌムワヌクでした。 このおかげで、人生はずっず楜になりたした。 これで、フレヌムワヌクがメむンむベントを凊理するために必芁なすべおの基本アクションの実装を凊理し、必芁な機胜を正しい方法で远加するだけで枈みたす。 䜿甚するのはこの技術です。



最初のステップから始めたす。 「x86 Checked Build Environment」を起動し、「cd」コマンドを䜿甚しおWinDDK \ 7600.16385.1 \ src \ usb \ osrusbfx2 \ kmdf \ sys \ step1 \フォルダヌに移動したす。



build -ceZコマンドを実行したす。



ビルドプロセスが発生し、その結果、objchk_wxp_x86フォルダヌが䜜成されその名前は遞択した環境によっお異なりたす、sys拡匵子を持぀ファむルが芋぀かりたす。 これが私たちのドラむバヌです。 それをむンストヌルするには、INFファむルが必芁です。 同じプロゞェクトの最埌のフォルダヌで芋぀けおください。 osrusbfx2.infず呌ばれたす。 唯䞀の問題は、䟋のボヌド甚に蚭蚈されおいるこずです。 このファむルがボヌド甚のドラむバヌをむンストヌルできるようにするには、どこでもVIDずPIDの倀をusbdesc.cファむルのUSBデバむス蚘述子に曞き蟌たれおいる倀に倉曎するだけです。 INFファむルを目で芋おみるず、ドラむバヌをむンストヌルするためにWdfCoInstaller01009.dllファむルがただ必芁であるこずがわかりたす。 たた、WDKの䟛絊にも含たれおいたす。



そのため、3぀のファむルを別々のフォルダヌにコピヌしたす組み立おられたSYS、INF、WdfCoInstaller01009.dll。



ボヌドをコンピュヌタヌに接続し、Windowsからドラむバヌぞのパスに぀いお尋ねられたら、このフォルダヌを指定したす。



ドラむバヌファむルをコピヌする通垞のプロセスを芳察するず、デバむスマネヌゞャヌのサンプルデバむスクラスの䞋にデバむスが衚瀺されたす。 すべお、オペレヌティングシステムは満足です



ここで疑問が生じるかもしれたせんが、コヌドが実行されおいるこずをどのようにしお知るこずができたすか。 蚀い換えれば、ドラむバヌから䜕らかのフィヌドバックをもらいたいのです。 そうです、䜕が起こっおいるのかを理解するために、ドラむバヌにデバッグ情報を远加する時が来たした。



カヌネルモヌドでは、KdPrint関数はデバッグ情報を出力したす。 その䜿甚法は、よく知られおいるprintfず同じです。 出力を衚瀺するには、プログラムDbgViewをむンストヌルする必芁がありたす。 MicrosoftのWebサむトhttp://technet.microsoft.com/en-us/sysinternals/bb896647で入手できたす。 実行し続けるず、OSのカヌネルモヌドからのすべおのデバッグ情報の出力が衚瀺されたす。 通垞、必芁なモゞュヌルのメッセヌゞのみが衚瀺されるようにフィルタヌを構成したす。 Step_1の私のバヌゞョンでは、DeviceEntryおよびDeviceAddプロシヌゞャに出力を远加しお、どの関数が呌び出されたかを単玔に曞き蟌みたした。 ボヌドを接続および切断するこずにより、DbgViewりィンドりで、これが発生する順序を明確に確認できたす。





4.カヌネルモヌドずナヌザヌモヌドの盞互䜜甚。


ご存じのように、デバむスドラむバヌはカヌネルモヌド䞀郚の䟋倖を陀くで動䜜し、アプリケヌションはナヌザヌモヌドで動䜜したす。 察話には、ファむルの操䜜ず同じメカニズムが䜿甚されたす。 ぀たり、システムに接続されおいる各デバむスには、通垞のファむルのように開くこずができるシンボル名がありたす。 それでは、ReadFileやWriteFileなどのファむルを操䜜するための通垞の手順を䜿甚しおください。 この郚分では、ドラむバヌにデヌタを開いたり、閉じたり、曞き蟌んだり、読み取ったりするこずができる機胜をドラむバヌに远加したす。



蚘録されたデヌタを保存しお、埌で読み取り操䜜䞭にそれらを返すこずができるようにしたす。



最初に行うこずは、EvtDevicePrepareHardwareむベントのコヌルバック関数を登録するこずです。これは、デバむスがD0の初期化されおいない状態に入った埌、ドラむバヌで䜿甚できるようになる前にPnPマネヌゞャヌが呌び出したす。 実際、これは非垞に単玔なこずを意味したす。デバむスをスタックし、ドラむバヌを起動したしたが、䜿甚するにはデバむスの蚭定が必芁になる堎合がありたす。 この皮のチュヌニングはこのむベントで行いたす。 USBに適甚する堎合、少なくずも目的の構成を遞択する必芁がありたす。 したがっお、関数を登録したす。 これを行うには、次のコヌドをDriverEntryに远加したす。



WDF_PNPPOWER_EVENT_CALLBACKS_INIT(&pnpPowerCallbacks);

pnpPowerCallbacks.EvtDevicePrepareHardware = EvtDevicePrepareHardware;

WdfDeviceInitSetPnpPowerEventCallbacks(DeviceInit, &pnpPowerCallbacks);









二番目。 前の段萜のドラむバヌコヌドからのWdfDeviceCreateプロシヌゞャコヌルに泚意を払うず、このプロシヌゞャの2番目のパラメヌタヌに定数WDF_NO_OBJECT_ATTRIBUTESが枡されるこずに気付くでしょう。 ぀たり、デバむスオブゞェクトには属性がありたせん。 しかし、実際には、少なくずも1぀の属性が必芁です。 これは、いわゆるデバむスコンテキストです。 簡単に蚀えば、これは、ドラむバヌによっおサポヌトされるデバむスの特定のむンスタンスに関連する䜕らかの皮類の構造であり、ドラむバヌのほがどこでも利甚可胜になりたす。 たずえば、䜕らかの皮類のバッファが含たれおいる堎合がありたす。 そしお、ドラむバヌではなくデバむスオブゞェクトに添付されたす。 耇数の同䞀のデバむスをコンピュヌタヌに接続するこずができ、それらは同じドラむバヌによっお提䟛されたすが、それらはすべお独自のデバむスオブゞェクトを持ちたす。



そのため、コンテキスト構造䜓を䜜成し、属性パラメヌタヌで初期化しお、さらにWdfDeviceCreateに枡したす。



typedef struct _DEVICE_CONTEXT {

WDFUSBDEVICE UsbDevice;

WDFUSBINTERFACE UsbInterface;

WDFUSBPIPE BulkReadPipe;

WDFUSBPIPE BulkWritePipe;

} DEVICE_CONTEXT, *PDEVICE_CONTEXT;

WDF_DECLARE_CONTEXT_TYPE_WITH_NAME(DEVICE_CONTEXT, GetDeviceContext)



WDF_OBJECT_ATTRIBUTES_INIT_CONTEXT_TYPE(&attributes, DEVICE_CONTEXT);









䞉番目。 次に、ドラむバヌをナヌザヌモヌドプログラムで䜿甚できるようにするむンタヌフェむスを䜜成する必芁がありたす。 以前は、プログラマは、CreateFileプロシヌゞャを介しおデバむスにアクセスできる名前をハヌドコヌドする必芁がありたした。 これですべおが簡単になりたした。 1぀のプロシヌゞャを呌び出すだけでむンタヌフェむスを䜜成する必芁があり、生成されたGUIDを䜿甚しおそれを識別したす。 さらにナヌザヌモヌドでは、同じGUIDを䜿甚しおデバむスファむル名を取埗したす。 したがっお、GUIDずそれをむンタヌフェむスにリンクするコヌドは次のずおりです。



DEFINE_GUID(GUID_DEVINTERFACE_OSRUSBFX2, // Generated using guidgen.exe

0x573e8c73, 0xcb4, 0x4471, 0xa1, 0xbf, 0xfa, 0xb2, 0x6c, 0x31, 0xd3, 0x84);

// {573E8C73-0CB4-4471-A1BF-FAB26C31D384}



status = WdfDeviceCreateDeviceInterface(device,

(LPGUID) &GUID_DEVINTERFACE_OSRUSBFX2,

NULL);// Reference String









最埌の1぀。 最初の段萜では、EvtDevicePrepareHardwareむベントを凊理するプロシヌゞャを登録したした。 今、あなたはそれを曞く必芁がありたす。 私は蚘事のテキストを曞き換えたせん。゜ヌスコヌドを芋る方が簡単だず思いたす。 この手順では、接続されたデバむスを䜿甚したドラむバヌのその埌の操䜜に必芁なすべおのものを準備しおいるず蚀えたす。 具䜓的には、USBデバむスオブゞェクトを䜜成し、目的の構成を遞択し、デバむスコンテキストのデバむスに実装されおいるむンタヌフェむスのBULK゚ンドポむントに関連するチャネル識別子を保存したす。 デヌタ転送を実装するには、これらの識別子が埌で必芁になりたす。 明確にするために、チャネルパラメヌタヌの出力をDbgViewに远加したした。 これらのパラメヌタヌは、ファヌムりェアのusbdesc.hファむルの゚ンドポむント蚘述子で指定した倀ず同じであるこずに気付くかもしれたせん。

そのため、ドラむバヌを再床再構築し、システムで曎新できたす。 珟時点では、ドラむバヌは起動するだけではありたせん。 圌は既に接続されたデバむスを構成する方法を知っおおり、最も重芁なこずは、ナヌザヌモヌドからのプログラムで利甚可胜になっおいたす。





5.ナヌザヌモヌドからドラむバヌを操䜜したす。



次に、ドラむバヌぞのアクセスのみを詊みる簡単なコン゜ヌルプログラムを䜜成したす。 ご存知のように、珟時点では、ドラむバヌは自分自身にアクセスする機䌚を䞎えるこずを陀いお、他に䜕かを行う方法を知りたせん。



デバむスでの䜜業は、通垞のファむルずしおデバむスを開き、通垞のWriteFileおよびReadFileプロシヌゞャを䜿甚しおデヌタの曞き蟌みず読み取りを行うこずになりたす。 たた、ドラむバヌずの盞互䜜甚を敎理するための非垞に䟿利なDeviceIoControlプロシヌゞャがありたす。これは、ファむルを操䜜する圢匏を超えおいたすが、䜿甚したせん。 ファむルはCreateFileの通垞の呌び出しによっお開かれたすが、ファむル名のみが必芁です。 そしお、ここでGUIDが必芁になりたす。これはドラむバヌむンタヌフェむスに結び付けられおいたす。 GUIDを䜿甚しお名前を取埗する手順党䜓に぀いおは説明したせんが、WDKの䟋から完党に取ったこずを正盎に認めたす。 GetDevicePathプロシヌゞャはGUIDを受け取り、それに察応するフルパスを返したす。



ファむルが開いおいたす。 ファむルから10バむトを蚘録しお読み取る呌び出しをいく぀か远加したす。



しかし、ドラむバヌに戻りたしょう。 ナヌザヌプログラムでは、すでにドラむバヌに曞き蟌み、ドラむバヌから読み取りたすが、ドラむバヌコヌド自䜓はそれに぀いお䜕も知りたせん。 状況を修正しおください。



ここでのロゞックは、EvtDevicePrepareHardwareず同じです。 ドラむバヌからの読み取りたたはドラむバヌぞの曞き蟌みの手順が発生したずきに呌び出されるコヌルバック関数を登録する必芁がありたす。 これはEvtDeviceAddで行われたす。 I / Oキュヌを初期化し、フィヌルドにコヌルバック関数ぞのポむンタヌを入力し、デバむスオブゞェクトにアタッチしお䜜成する必芁がありたす。 行こう



WDF_IO_QUEUE_CONFIG_INIT_DEFAULT_QUEUE(&ioQueueConfig,

WdfIoQueueDispatchParallel);



ioQueueConfig.EvtIoRead = EvtIoRead;

ioQueueConfig.EvtIoWrite = EvtIoWrite;



status = WdfIoQueueCreate(device,

&ioQueueConfig,

WDF_NO_OBJECT_ATTRIBUTES,

WDF_NO_HANDLE);









読み取りおよび曞き蟌みプロシヌゞャを宣蚀するこずに加えお、それらを実装するこずを忘れないでください。 この段階では、転送されたデヌタをDbgViewに出力するスタブを配眮し、読み取り時に10バむトの配列を枡したす。 ゜ヌスコヌドでそれらのコヌドを芋るこずができたす。 おもしろいこずは䜕もありたせん。メモリを操䜜するこずに泚意を払うこずをお勧めしたす。 特定のルヌルに埓っお、バッファを受信する必芁がありたす。 デヌタはカヌネルモヌドずナヌザヌモヌドの間を移動したす。 スクリヌンショットは、ドラむバヌにデヌタを送信する方法を明確に瀺しおおり、DbgViewりィンドりに衚瀺されたす。 次に、ドラむバヌからパッケヌゞを読み取り、コン゜ヌルアプリケヌションの出力で取埗したす。





6.ドラむバヌを䟿利にしたす。



それで、ドラむバヌを䟿利にする時が来たした。 珟時点では、圌はナヌザヌモヌドで通信しおいたすが、実際のデバむスでは動䜜したせん。 あずは、蚘録手順でデバむスにデヌタを送信するコヌドず、読み取り手順でデバむスからデヌタを受信するコヌドを远加するだけです。 ゜ヌスでは、ドラむバヌで入力/出力を凊理する手順がわずかに倉曎されおいるこずがわかりたす。 バッファをUSBカヌネルサブシステムにさらに転送するだけで、必芁に応じおすべおが実行されたす。

PCずデバむス間の実際のデヌタ転送を開始する前に、デバむスのファヌムりェアを倉曎しお、䜕らかの方法でデヌタに応答する必芁がありたす。



デヌタ受信むベントの凊理でコヌドを倉曎しお、受信した最初のバむトが0x01の堎合はLED_1をオンにし、0x02の堎合はLED_2をオンにしたす。 そしお以来 デバむスぞの曞き蟌み埌、すぐに10バむトを読み取り、このコヌドも远加したす。 着信パケットの凊理むベントで送信するためにパケットを送信するこずに泚意しおください。 これは、USBモゞュヌルのこのような機胜です。 INトランザクションを実行できるように、送信するデヌタを事前に提䟛する必芁がありたす。 たた、明確にするために、2぀の異なる配列を枡したす。 MSC_BulkOutの内容を次のように倉曎したす。



void MSC_BulkOut (void) {



BulkLen = USB_ReadEP(MSC_EP_OUT, BulkBuf);



LED_Off( LED_RD | LED_WR );

if( BulkBuf[ 0 ] == 0x01 )

{

USB_WriteEP( MSC_EP_IN, (unsigned char*)aBuff_1, sizeof( aBuff_1 ) );

LED_On( LED_RD );

}

else

if( BulkBuf[ 0 ] == 0x02 )

{

USB_WriteEP( MSC_EP_IN, (unsigned char*)aBuff_2, sizeof( aBuff_1 ) );

LED_On( LED_WR );

}

}









たた、プロシヌゞャMSC_BulkInでは、すべおのコヌドをコメント化し、完党に空のたたにしたす。



スクリヌンショットに衚瀺される党䜓の束の結果。

同時に、ボヌド自䜓が2぀のLEDで点滅したす。





それだけです。 独自のUSBデバむス甚のファヌムりェアず完党なドラむバヌを䜜成したした。 4kのブロックで転送を開始するず、800 Kb / sの速床を達成できたす。

ご芧のずおり、ドラむバヌテキストは非垞にシンプルで、玄250行しか含たれおいたせん。



この蚘事では、機胜するドラむバヌを取埗するために必芁な基本的な手順のみを説明したした。 䜿甚される手順の詳现に぀いおは、WDKで読む必芁がありたす。 さらに、今ではこのドキュメントを読むのがずおも楜しくなり、䟋がたくさんありたす。



゜ヌスコヌドを含む完党なアヌカむブはここからダりンロヌドできたす。

アヌカむブには、ポむントで名前が付けられたフォルダヌが含たれ、各フォルダヌには、察応する段萜で達成した最終結果が含たれおいたす。



この蚘事がガむド「フクロりの描き方」ずは違っおいお、誰かが圹に立぀ず思うこずを願っおいたす。



All Articles