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);