USBX
には、ホスト側用とデバイス側用のDPUMP
クラスが含まれています。このクラスは、それ自 体が標準クラスではありませんが、2つのバルクパイプを使用し、これらのパイプ上でデータのやりと りをすることで、単純なデバイスを作成する方法を例示するものとなっています。DPUMP
クラスを使 用すると、カスタムクラスやレガシーRS232デバイスを起動するなどが可能です。USB DPUMP
のフローチャートホストアプリケーション DPUMPホストクラス USBホストスタック USBデバイススタック
パケットを書く
_ux_host_class_dpump_write
_ux_host_stack_transfer_request
転送完了を待機 転送完了を待機
転送ステータスと 送信データ長を受信
パケットを受信
_ux_host_class_dpump_read
_ux_host_stack_transfer_request
転送完了を待機
送信ステータス、
データパケット、
受信データ長を受信
転送完了を待機
_ux_device_stack_transfer_request バルクアウト上で転送完了を待機
DPUMPデバイスクラススレッド
パケットを待機
転送完了を待機
パケットを書く
転送完了を待機 _ux_device_stack_transfer_request
バルクアウト上でインパケットを待機
USBX DPUMP ホストクラス
DPUMP
クラスのホスト側は、データの送信用、データの受信用の、2 つのファンクションを備えています。
ux_host_class_dpump_write ux_host_class_dpump_read
どちらのファンクションも、DPUMP アプリケーションの簡易化のためにブロッキングファンクションと なっています。
IN
パイプとOUT
パイプを同時に実行させておく必要がある場合は、またアプリケー ション側で送信スレッドと受信スレッドを作成する必要があります。書き込み関数のプロトタイプは次の通りです。
UINT ux_host_class_dpump_write(UX_HOST_CLASS_DPUMP *dpump, UCHAR * data_pointer,
ULONG requested_length, ULONG *actual_length)
ここで、
dpump
は、クラスのインスタンスdata_pointer
は、送信対象のバッファへのポインタrequested_length
は、送信する長さactual_length
は、転送が(正常にまたは部分的に)完了した後に送信される長さ受信ファンクションのプロトタイプは次の通りです。
UINT host_class_dpump_read(UX_HOST_CLASS_DPUMP *dpump,
UCHAR *data_pointer, ULONG requested_length, ULONG *actual_length)
ホスト
DPUMP
クラスの一例を次に示します。ここでは、アプリケーションがデバイス側へのパケットを書き、同じパケットを受信側で受信します。
/* We start with a 'A' in buffer. */
current_char = 'A';
while(1) {
/* Initialize the write buffer.*/
ux_utility_memory_set(out_buffer, current_char,
UX_HOST_CLASS_DPUMP_PACKET_SIZE);
/* Increment the character in buffer. */
current_char++;
/* Check for upper alphabet limit. */
if (current_char > 'Z') current_char = 'A';
/* Write to the Data Pump Bulk out endpoint. */
status = ux_host_class_dpump_write (dpump, out_buffer,
UX_HOST_CLASS_DPUMP_PACKET_SIZE,
&actual_length);
/* Verify that the status and the amount of data is correct. */
if ((status == UX_SUCCESS) && actual_length ==
UX_HOST_CLASS_DPUMP_PACKET_SIZE)
{
/* Read to the Data Pump Bulk out endpoint. */
status = ux_host_class_dpump_read (dpump, in_buffer,
UX_HOST_CLASS_DPUMP_PACKET_SIZE, &actual_length);
}
USBX DPUMP デバイスクラス
デバイス
DPUMP
クラスでは、USBホストとの接続後に起動されるスレットを使用します。このスレッドは、バルクアウト・エンドポイントに着信するパケットを待機します。パケットを受信するとスレッドは、
その内容をバルクイン・エンドポイント・バッファにコピーし、このエンドポイントにトランザクションをポ ストします。この状態で、このエンドポイントからの読み取りの要求をホストが発行するまで待機しま す。こうして、バルクアウト・エンドポイントとバルクイン・エンドポイントの間にループバックメカニズム が形成されます。