あっきぃ日誌

ラズピッピブログのようなオタクブログのようななにか

Pimoroni HyperPixel2.1 RoundのRaspberry Pi OS カーネル6.12対応を自分でやってみた

うまいことネタができたっぽいので、Raspberry Pi Advent Calendar 2025の7日目です。

adventar.org

6日目は信濃眞伊さんのRaspberry Pi 3で遊ぶ記事でした。NetBSDのチョイスが渋いと言うか、使ってるカメラも絶対渋いやつだ……!今年のOSCで出会った若手なので、今後のさらなる活躍に期待しています。

zenn.dev

Pimoroni HyperPixel2.1 RoundのRaspberry Pi OS Kernel 6.12対応を自分でやってみた

OSC福岡の時にカメラデモの環境を再構築したらドライバー未対応にはめられて泣いた件の続きです。

akkiesoft.hatenablog.jp

Raspberry Pi OSがカーネル6.12に移行した際に、Upstreamのドライバーのコードと、RPi OSのカーネル6.6のドライバーにパッチとして当てられたHyperPixel2.1 Round対応のコミットがコンフリクトしてて、解消が見送られていたせいで動かなくなっていたのでした。

今回は、これを自分なりにコンフリクト解消できるのかの検証をした記録です。たぶん動いたので、コミットを上げて、まずはPRではなく先日立てたIssueに動かせましたわと報告しておきました。自信がないため。

github.com

カーネル6.6のパッチには、SPIサポート・RGBモードサポート・HyperPixel2 Roundサポートの3点が含まれていて、このうちカーネル6.12のアップストリームに追加されたSPIサポートがぶつかっていました。よって、アップストリームのお作法に従って、HyperPixel2 RoundのSPIサポートを追加し直せばイケるんじゃね?という感じで実装してみました。

st7701_spi_of_matchとst7701_spi_idsは、元のコードからほぼそのまま移植。どうせ名前だけでしね。

Support Pimoroni HyperPixel 2.1 Round for Linux 6.12 · Akkiesoft/linux@3f5d1e2 · GitHub

次にtxw210001b0_descとhyperpixel2r_descの定義。6.6でのSPI実装を使わないため、ここはあまり原型をとどめていないです。modeはそのままなのと、RGBモードのサポートのためにmediabus_formatが持ちこまれたくらい。init_sequenceのかわりにgip_sequenceを使うように変えた(ここは自信ないけどinit_sequenceは使えなくなってる?かも)というかんじ。アップストリームのお作法に従ってpv_gammaとnv_gammaを追加して、txw210001b0_init_sequenceに書かれていたパラメータを移植しましたが、これは本題じゃない気がします。

Support Pimoroni HyperPixel 2.1 Round for Linux 6.12 · Akkiesoft/linux@3f5d1e2 · GitHub

txw210001b0_modeはそのまま。

Support Pimoroni HyperPixel 2.1 Round for Linux 6.12 · Akkiesoft/linux@3f5d1e2 · GitHub

txw210001b0_init_sequence あらため txw210001b0_gip_sequenceは、pv_gammaとnv_gammaの分がいなくなったのと、SPI_WRITEをST7701_WRITEに変えたり、DSI_XXXの定数をST7701_XXXに変えたりしたくらい。あと、他のところもそうですが、たぶんRPi OSの実装ではSPIモードの時に0x100を論理和するようにしていたっぽくて、アップストリームではそうなっていなかったので全部無くしました。

Support Pimoroni HyperPixel 2.1 Round for Linux 6.12 · Akkiesoft/linux@3f5d1e2 · GitHub

そう言う意味では、6.6から持ってくる必要があった追加の定数も、0x100の考慮は無くしました。

Support Pimoroni HyperPixel 2.1 Round for Linux 6.12 · Akkiesoft/linux@3f5d1e2 · GitHub

RGBモードの追加。HyperPixel2.1 RoundのパネルにはMIPI版とRGB版とUART版(?)があるらしいのですが、どうもRGB版なのでRGBのサポートが必要らしいです。でもこれを書くのとinclude足すだけで済んだので良かったです。これを持ち込む前は色がぶっ壊れた状態で表示されていました。

Support Pimoroni HyperPixel 2.1 Round for Linux 6.12 · Akkiesoft/linux@3f5d1e2 · GitHub

ここは、このcommitの再現を入れましたが、うちではやらなくても動いてたので、必要なのかは不明ですが、あっても良さそうなので一応いれました。

Support Pimoroni HyperPixel 2.1 Round for Linux 6.12 · Akkiesoft/linux@3f5d1e2 · GitHub

ここが一番悩んだポイント。単に_optionalを見落としていただけなのですが、_optionalがない場合、DeviceTreeでreset-gpioが必須パラメータとして扱われるため、たぶんresetピンを持っていないHyperPixel2.1 Roundが、ドライバーロード時に失敗してしまうのでした。もしかすると、descあたりにリセットピンがないことを知らせるフラグを作ってあげて、それの有無で条件分岐しても良いのかもしれませんが、わからんので雑に_optional化です。

Support Pimoroni HyperPixel 2.1 Round for Linux 6.12 · Akkiesoft/linux@3f5d1e2 · GitHub

よかった

気になりすぎて沖縄に持っていっていじったろうかとも思っていたくらいなのですが(我慢した)、なんとかなって良かったです。私の雑実装をとっかかりに6.12対応が進めばいいですね。ただ、あっちの人たちって確か、ぼちぼち仕事納めじゃなかったっけな……?まあ、どちらにしてもすぐ見てもらえるとも限らないので、気長に。