SSブログ

macOSからPi Picoを使う - その29 [Pi Pico]

前回の非同期転送の続き....

17.5.2  Filling

前回のlibusb_free_transfer()関数で確保された構造体は中身がからっぽ(デフォルト値が埋められているようである)で、自分で構造体のメンバを埋めるか、転送モードごとに
static void
libusb_fill_control_transfer(struct libusb_transfer *transfer,
                             libusb_device_handle   *dev_handle,
                             unsigned char          *buffer,
                             libusb_transfer_cb_fn  callback,
                             void                   *user_data,
                             unsigned int           timeout);

static void
libusb_fill_bulk_transfer(struct libusb_transfer *transfer,
                          libusb_device_handle  *dev_handle,
                          unsigned char         endpoint,
                          unsigned char         *buffer,
                          int                   length,
                          libusb_transfer_cb_fn callback,
                          void                  *user_data,
                          unsigned int          timeout);

static void
libusb_fill_bulk_stream_transfer(struct libusb_transfer *transfer,
                                 libusb_device_handle   *dev_handle,
                                 unsigned char          endpoint,
                                 uint32_t               stream_id,
                                 unsigned char          *buffer,
                                 int                    length,
                                 libusb_transfer_cb_fn  callback,
                                 void                   *user_data,
                                 unsigned int           timeout);

static void
libusb_fill_interrupt_transfer(struct libusb_transfer   *transfer,
                               libusb_device_handle     *dev_handle,
                               unsigned char            endpoint,
                               unsigned char            *buffer,
                               int                      length,
                               libusb_transfer_cb_fn    callback,
                               void                     *user_data,
                               unsigned int             timeout);


static void
libusb_fill_iso_transfer(struct libusb_transfer *transfer,
                         libusb_device_handle   *dev_handle,
                         unsigned char          endpoint,
                         unsigned char          *buffer,
                         int                    length,
                         int                    num_iso_packets,
                         libusb_transfer_cb_fn  callback,
                         void                   *user_data,
                         unsigned int           timeout);
を使えばいい。それほど難しくない。

17.5.3  Submission

転送を開始(正確には登録)するには
int libusb_submit_transfer(struct libusb_transfer *transfer);
を呼ぶ。この関数はすぐ返ってくる。

17.5.4  Completion handling

転送が終わるとコールバックが呼ばれる。statusを見て転送が成功したかどうかを判断する。

このコールバックはイベント処理ループから呼ばれることになる。従って割り込みルーチンほど厳しい制限はないけど、このコールバックの中に重い処理を書くべきではない。また当然このコールバックから直接次の転送を起動する、などということはできない。

このlibusbの「イベント処理ループ」がどうなっているか、はこんど説明する。

17.5.5  転送のキャンセル

アプリケーション側で何らかの問題があって転送をキャンセルしたい場合がある。そのときは
int libusb_cancel_transfer(struct libusb_transfer *transfer);
を呼ぶ。この関数もすぐ返ってきて、キャンセル処理が完了したあと、statusにその旨が設定されてコールバックが呼ばれる。

従って、キャンセル関数を呼んですぐ構造体を解放すると動作は未定義(普通はクラッシュするだろう)。

デバイスとの実際のやり取りでキャンセルする前にデータが部分的に転送されている可能性がある。場合によってはデバイスのリセットなどが必要になる。こういう場合の動作はデバイスがどうプログラムされているかに依存することになる。

17.5.6  Timeout

タイムアウトするとコールバックが呼ばれるので、その場合の処理も対応しておく必要がある。USBのタイムアウトってケーブルが抜けた、とか断線した、というハードウェア的な問題か、デバイスの内部処理が潜ってしまった、とか言う場合ぐらいしか起こらないような気がする。どの場合も致命的で、リトライとかあり得ないだろうな。

17.5.7  Control transfer固有の問題

Control tranferは転送の内容が構造化されている。bufferの内容もそれに従った構造をしていないといけない。USBプロトコルと直接対応するのでレファレンスを見てもらう方が早い。
nice!(0)  コメント(3) 

nice! 0

コメント 3

みけみけ

はじめまして
ブログを拝見させていただきました。
さて、数年前の記事を読ませていただいたのですが、セクシー女優のつぼみさんの3Dデータを使うものがあったのですが、
もし、まだデータが残っていましたらいただきたく思います…
実はこのデータを求めて四方を彷徨っている状況です…
何卒よろしくお願いしますm(_ _)m
by みけみけ (2021-09-01 22:45) 

decafish

このブログのネタは圧縮してずっとバックアップをとってあるので、中を漁ったのですが、テキストだけでデータ本体は見つかりませんでした。
たしかに、もし今あれば結構貴重だったかも知れません。
残念です。
by decafish (2021-09-02 19:10) 

みけみけ

わざわざ探していただいたようで、ありがとうごさいましたm(_ _)m
深謝!
by みけみけ (2021-09-02 19:36) 

コメントを書く

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

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