年末のこれの続き。
Pimoroni HyperPixel 2.1 Roundのドライバーを年末に直してみたら、コードがほぼそのままRaspberry Pi OSのドライバーとして採用されたわけですが、マージ後にリリースされたバージョンでディスプレイを動かしてみると、Pi 5では見なかったノイズが、PiZero 2WとかPi 3以前では発生していることに気が付きました(のちに、Pi 5でも若干ノイズがあることがわかりました)。
というわけで、「多分わたしがなんか見落としたんだと思うけど、ノイズっぽいのが出ちゃいまして……」というIssueを新規に立てて、放置していました。
PimoroniのPhilも「なんか見たことあるかも」とはコメントしてくれていたものの、Issueは放置が続いていました。が、最近になって、I have same issueな人が現れて、メンテナ氏も反応し始めたので、私も切り分けに乗っかっていくことにしました。しきりに「カーネル6.6では動いてたけど6.12では壊れてて!」ってコメントしてたんだけど、それね、5月にBookwormがカーネル6.12に移行してから、年末にわたしが直すまで、半年くらい「全く動かなかった」んだよね。でもなんかバグっててごめんね……。
さて、ノイズというのはこんなかんじのやつ。縦に線が入ったり、下のグラデーションにも波線があるようなやつです。これだったらまだ可愛いですが、この線が入っている箇所の本来の色が大量に使われる映像では、ものすごいノイズのある画面になって、使い物になりませんでした。

上はZero2Wですが、3A+だとさらにくっきりでした。

先述の通り、切り分けているうちに、Pi 5でもピンク色の部分でかすかにノイズがあることがわかりました。モデルによってバグってる色が違うのはダルい。

で、色々と原因の予想はしてもらっていたものの、改めて自分でも6.6系のコードと現在のコードを見比べてみた結果、普通に1つ移植漏れがあり、適用したらノイズが消え去りました。くっそ恥ずかしいね。
具体的には、DRM_BUS_FLAG_PIXDATA_DRIVE_NEGEDGEのbus_flagsを渡すコードの追加が一式漏れていました。Google検索で勝手に出てくるGemini曰く以下のとおり。たしかに、これがあれば特定の色だけなんか変(多分ピクセルシフト)がなくせそうです。
DRM_BUS_FLAG_PIXDATA_DRIVE_NEGEDGEは、LinuxのDRM(Direct Rendering Manager)サブシステムにおいて、ディスプレイパネルやブリッジへのピクセルデータ(RGBデータ)の駆動タイミングを定義するフラグです。
(中略)
このフラグは、グラフィックコントローラ(CRTC)と表示パネル間のタイミング合わせが正しく行われるようにし、画面のチラつきやデータ破損(ピクセルシフト)を防ぐ役割を果たします。
移植漏れ修正後のPiZero2Wのテスト画面がこちら。きれいに映るようになりました。

現在はコードのプルリクを送って、レビュー中です。そっちがええならもうええで!ってところまでは来たので、マージ待ちです。
最初に6.6の書き方を何も考えずにそのまま持って行ったら、何だここの(効率の悪い)コードは?って突っ込まれて、そう言われましても……?と思いながらAIに聞いたら、確かに意味のない0代入とかif文が合ったので、そこをなくしてスッキリさせられました。なるほどなあ。でもじゃあ6.6のコードは何だったんだよというモヤりはあります。
HyperPixel 2.1 Roundは、OSCの展示ブースで定番のデモになっている、円形ディスプレイデジカメに使用しているわけですが、こちらは現在はカーネル6.6系に戻して運用中です。今回分の修正がマージされてリリースされれば、やっと最新カーネルで運用できるようになりそうです。やっとだぜ……というか、結局全部自分が実装することになろうとは思わなんでしたよ。
I have same issueニキ駆動のおかげで見直せたので、ニキに感謝。そして、機械翻訳+アルファの拙い英語に付き合ってくれたメンテナ氏にも感謝です。