SSブログ

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

と、ここまで書いたんだけど、書いてしまってからなんだかすごくダサい気がしてきた。典型的なWorkaroundで、しかし一旦これを使い始めると結局そのままになって、そしてある日突然互換性の問題で動かなかくなってあたふたと慌てる、というのが目に見えている。おお、僕には未来が見える、自分のやることに関してだけは。

どうせならやっぱりvendor specificなクラスでやろう、と思いなおした....

15  TinyUSB

そうするとPi Pico側はTinyUSBを理解しないといけないし、macOS側はI/O Kitがいずれユーザ空間から呼べなくなることを見越してIOUSBHostが使えるようにならないといけない。macOSはとりあえずずっと親切で簡単なlibusbでやり過ごすことができる。でもいずれlibusbの開発メンバがAppleに愛想をつかしてmacOSのサポートをやめてしまうような気もするので、未来永劫というわけにはいかないと思える。

まあ、とりあえずPi PicoにはTinyUSBしかないので、これを真面目に見ていこうと思う。

僕はPi PicoをUSBのhostとして使うことは考えていないので、これ以降はdeviceだけをみることにする。

15.1  pico-sdkのtinyusb

pico-sdkにTinyUSBは組み込まれていて、
${PICO_SDK_PATH}/lib/tinyusb
にまるごとgithubのリポジトリがクローンされる。TinyUSBのドキュメントはほとんどなくてgithubのREADME.mdに概要と、そのdoc/getting_started.mdぐらいしか情報がない。

概要はもういいとして、getting_started.mdにあるexampleをビルドしてみよう。

15.1.1  cdc_msc example

getting_started.mdにはサンプルコードをビルドするやりかたが書いてある。
tinyusb/examples/device/cdc_msc/
にあるcdc_mscをビルドしている。そもそもこのサンプルが何をするのかもこれだけではわからない。ソースを見るとどうやらCDC(Cmmunication device class)とMSC(Mass storage class)を同時に持つようなデバイスを記述しているようである。

まず、このディレクトリに行って
cd examples/device/cdc_msc
もうmakeすればいいらしい。makenの引数にBOARD変数を定義してやることで、そのベアメタル用のコードを吐くようになっている。ボード変数は
hw/msp
ディレクトリの中にあるプロダクト名か、あるいは同じプロダクトでも複数の定義に分かれている場合は、その中にあるboardsディレクトリの中のモデル名別になっているディレクトリの名前を指定する。例えば具体的にはPi Picoの場合のmake引数は
$ make BOARD=raspberry_pi_pico all
などとすると
$ ls _build/raspberry_pi_pico
CMakeCache.txt                  cdc_msc.elf.map
CMakeDoxyfile.in                cdc_msc.hex
CMakeDoxygenDefaults.cmake      cdc_msc.uf2
CMakeFiles                      cmake_install.cmake
Makefile                        elf2uf2
cdc_msc.bin                     generated
cdc_msc.dis                     pico-sdk
cdc_msc.elf
$
と言うディレクトリにお馴染みのファイルたちができている。

でもこれだけではどうすればTinyUSBをプログラムできるのか全然わからない。

15.2  TinyUSBのソース

というわけでソースを見るしかない。Doxygenのファイルもあるけど、ソースにはDoxygen形式のコメントはほとんどない。しかし少し見ればわかるように手動で非常に綺麗に成形されたソースになっていて、独特の言い回しの英語のコメントがついている。Doxygenは便利かもしれないけど、ソースを見る時には冗長でかえって読みづらくなってしまうが、このひとのはそのままで読みやすい。僕はこういうほうが好き。逆に言えばDoxygenあまり好きではない。どうしてもこれを使え、と言われればそうするけど。

15.2.1  TinyUSBのディレクトリツリー

まずソースファイルがどうなっているかを見る。

src
├── class
│   ├── audio
│   ├── bth
│   ├── cdc
│   ├── dfu
│   ├── hid
│   ├── midi
│   ├── msc
│   ├── net
│   ├── usbtmc
│   └── vendor
├── common
├── device
├── host
├── osal
└── portable
    ├── dialog
    │   └── da146xx
    │
    .
    .
├── tusb.c
├── tusb.h
└── tusb_option.h
で、あまり深くない。classディレクトリにはUSBのdevice classごとに分かれている。commonディレクトリには
tusb_common.h   tusb_error.h    tusb_timeout.h  tusb_verify.h
tusb_compiler.h tusb_fifo.h     tusb_types.h
がある。deviceとhostはそれぞれUSBのホストコントローラとデバイスのファイルになっている。deviceディレクトリには
dcd.h   usbd.c  usbd.h  usbd_control.c  usbd_pvt.h
などがある。

osalはOSがある場合の抽象化レイヤ用のファイルで、portableはボード固有の記述が入っている。
nice!(0)  コメント(0) 

nice! 0

コメント 0

コメントを書く

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

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