Open1
pio_gpio_init() という関数名は不適切
RasPi Picoで使われているRP2040/RP2350にはPIO (Programmable IO)というペリフェラルがあり、それに関連してpio_gpio_init()という APIが用意されている。
static inline void pio_gpio_init(PIO pio, uint pin)
この名前が悪いという話。
RasPi Pico SDKにはべつにgpio_init()というAPIがあり、このAPIはすべてのGPIO関連呼び出しに先立って呼ばなければならない。ところが、公開されているサンプルプログラムを見ると、上の関数は以下のような呼ばれ方をする。
pio_sm_set_consecutive_pindirs(pio, sm, pin, 1, false);
pio_gpio_init(pio, pin);
gpio_pull_up(pin);
これはものすごく気持ちが悪い。GPIOのピンの方向を決めた後にpio_gpio_init()が呼ばれている。pio_gpio_はgpio_ではないという事だろうが、白馬非馬みたいな立場で関数名をつけてもユーザーが混乱するだけである。
pio_gpio_initは大雑把に言うと内部でGPIOをPIO用に割り当てているだけであり、RasPi Pico SDKの他のAPIの命名に倣うならば、
static inline void pio_gpio_set_function(PIO pio, uint pin)
とすべきだった。そうすれば先のサンプルも気分よく読めるようになる。
pio_sm_set_consecutive_pindirs(pio, sm, pin, 1, false);
pio_gpio_set_function(pio, pin);
gpio_pull_up(pin);