SSブログ

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

macOSからPi Picoをvendor specific classのデバイスとして接続するため当面libsubを使うことを決めた。本当はIOUSBHostを使いたかったんだけど、使い方を理解するための情報が完全とは言い難い。簡単なサンプルコードひとつあるだけでずいぶん違うはずなんだけど、それは存在しない。

どうもAppleのsample codeって開発者に親切にしよう、分かりやすくしよう、というよりは、新しい機能を開陳するためのものばかりになっているような気がする。古いframeworkはdeprecatedになってそれを使ったsample codeはどんどん削除されるのに、新しいframeworkに対応した、古いものに代わるsample codeはアップされない。

その結果シモジモにわかりやすいsample codeの数はじわじわ減ってる、と言う気がする。最底辺デベロッパへの対応力が余暇+αぐらいのlibusbに比べて、物量的には圧倒しているはずの世界的な超巨大企業Appleがなぜこんなにも劣るのか、というのが僕には全然理解できない。

なぜか、というと簡単には「やる気がない」ということだろうな。気を取り直してlibusbの続き...

17.3.1  初期化と終了

ライブラリの初期化と終了は
int   libusb_init(libusb_context **context);
void 	libusb_exit(libusb_context *ctx);
で、引数にNULLを渡すとデフォルトコンテクストを使う。libusb_contextへのポインタを渡した固有コンテクストとデフォルトコンテクストが両立できるかはよくわからない。初期化で0が返ると成功。

17.3.2  debug

デバグ用にログを書き出せる。この設定は当然初期化した後すぐすべきだろう。
typedef void(*libusb_log_cb)(libusb_context         *ctx,
                             enum libusb_log_level  level,
                             const char             *str);

void libusb_set_log_cb(libusb_context   *ctx,
                       libusb_log_cb    cb,
                       int             mode);
libusb_set_log_cb()関数にコールバックを渡しておくと、ログメッセージを引数にしてコールバックが呼ばれる。

引数のmodeは

LIBUSB_LOG_CB_GLOBAL 全部のメッセージ
LIBUSB_LOG_CB_CONTEXT コンテクストごと

で、コールバックに渡される引数levelは

LIBUSB_LOG_LEVEL_NONE ナシ
LIBUSB_LOG_LEVEL_ERROR エラー
LIBUSB_LOG_LEVEL_WARNING 警告
LIBUSB_LOG_LEVEL_INFO 情報
LIBUSB_LOG_LEVEL_DEBUG 全部

と言う分類になってる。しかしLIBUSB_LOG_LEVEL_DEBUGを指定しても正常な場合はあまり出力されないようである。

17.3.3  デバイス列挙

typedef struct  libusb_device   libusb_device;

ssize_t libusb_get_device_list(libusb_context   *ctx,
                            libusb_device       ***list);
                            
void    libusb_free_device_list(libusb_device   **list,
                                int             unref_devices);
libusb_get_device_list()で接続されているデバイスの情報がlistに入ってデバイス数が返る。デバイス情報はlibusb_deviceというopaqueな構造体になっている。この構造体はレファレンスカウンタ方式になっていて、libusb_get_device_list()から帰ってきた時点でレファレンスカウンタは1で、libusb_free_device_list()でリストされた構造体全部のレファレンスカウンタをunref_devicesだけ減らすようになっている。

個別にレファレンスカウンタを操作するには
libusb_device   *libusb_ref_device(libusb_device    *dev);
void            libusb_unref_device(libusb_device   *dev);
の関数を使う。
nice!(0)  コメント(0) 

nice! 0

コメント 0

コメントを書く

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

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