背景:PIOを整理している中で、RP2350では高速にシリアル転送するためのHSTXという周辺回路が追加されているのを知った。HSTXは汎用シリアル出力回路らしいが、主な用途としてDVI出力を想定しているらしい*1。自分もRP2350でDVI信号を生成して、デジタルTVにグラフィックパターンを出してみたいと思うようになった。
課題:先日購入した、WaveshareのRP2350 PiZeroはHDMI端子が付いているものの、HSTXに接続されていないことが分かった。PiZeroボードでもDVI信号は出せるがPIO+OverClockによる荒業ソリューションである(RP2040アーキを前提としたソリューション)。せっかくのHSTXを活かせていない。Adafruit社のHDMI端子付きボード(Feather RP2350)*2を買おうかと思ったけど、DVI信号を出力するには、メイン基板にフラットケーブルでHDMI基板を接続する必要がある。フラットケーブルが不安だしちょっと大げさな感じがする*3。
取り組み:WareshareのRP2350 PiZeroを再利用する。HDMIブレークアウトボードを使って、HSTXにつながっているGPIOとHDMIを接続する。これにより少しの追加パーツでHSTXからDVI信号が出力可能になる。
結果:工夫なしに640x480を表示したいので、フレームバッファ用にPSRAM追加した。結果、RAMサイズ8MBにはなった。PSRAMを見えるようにするため、Adafruit Metro用のCircuitPythonをインストールした。次は、HDMIブレークアウトボードを買って、ボードに接続、DVI出力に対応したCircuitPythonでサンプルコードを書いて信号出力してみる。
詳細:
PSRAMが後付けできるRP2350 PiZero

追加のPSRAMのためのパターンは用意されているのでここにPSRAMをはんだ付けする

今回追加した8MBのPSRAM(Adafruiが販売する、Generic 64 Mbit Serial Pseudo SRAM - PSRAM - 3.3V 133 MHz)

なぜ品番が削られている。かすかにEspressif社のマークが見えるが。
シルク印刷とICのドットマーク(1番ピン)を確認、カプトンテープで仮止めしてからはんだ付けする*4。1番ピンだけハンダ付けして、微調整しながら対角の5番ピンをハンダづけする。片方のピンだけ溶かすと大きくずれることなく微調整しやすい。

ハンダ付けが終わったところ。ピンのピッチが広い方なので楽と言えば楽だが。。他のパーツも乗っていて混みあっている。

電源を入れてMicroPython側からRAM領域がどう見えるのかを確認する。
Waveshareがリリースしているファームの場合、PSRAMを貼り付けただけで認識されて、メモリは8MBまで拡張された。
MicroPython v1.29.0-preview.349.gaf38ee165f.dirty on 2026-06-09; Waveshare RP2350B Board with RP2350
>>> import gc
>>> gc.mem_free()
8680896
>>> gc.mem_free()/1024
8477.219
>>> gc.mem_free()/1024/1024
8.278336
MicroPythonの公式サイトで配布されているAdafruit Feather用ファームを焼いてみた。PSRAMは認識されていない。ハード構成が違うから?
MicroPython v1.29.0-preview.467.g964803ab74 on 2026-07-03; Adafruit Feather RP2350 with RP2350
Type "help()" for more information.
>>> import gc
>>> gc.mem_free()
473408
>>> gc.mem_free()/1024
462.09376
Feather用のCircuitPythonを入れてみる。やはりPSRAMは認識されず。
Adafruit CircuitPython 10.2.1 on 2026-05-13; Adafruit Feather RP2350 with rp2350a
>>> import gc
>>> gc.mem_free()
433008
>>> gc.mem_free()/1024
422.6407
Waveshare用にもポーティングされており、これを試してみる。認識されず。
Adafruit CircuitPython 10.2.1 on 2026-05-13; Waveshare RP2350-Plus with rp2350
>>> import gc
>>> gc.mem_free()
433280
AIに相談すると、PSRAMを認識するには、ソースで定義されたCSピンとボード上のPSRAM用CSピンが合っている必要があるとの回答。だから、回路図を見てどのピンがCSか、そのCSとCircuitPythonのソースの定義が合っているのかを確認する必要がある。
Waveshareの場合は、PSRAMのCSはGPIO47がPSRAMのCSに割り当てられている。

ちなみに、、AdafruitのFeather RP2350用ソースでは、GPIO8が割り当たっていた。普通に使ってしまいそうな若い番号なのだが。。
#define CIRCUITPY_PSRAM_CHIP_SELECT (&pin_GPIO8)
https://github.com/adafruit/circuitpython/blob/main/ports/raspberrypi/boards/adafruit_feather_rp2350/mpconfigboard.h
回路図を見ると、確かにGPIO8であった

https://learn.adafruit.com/assets/132211
各社ボード向けポーティングにおいて、PSRAM_CHIP_SELECTがどう設定されているかを調べるため、GitHub上のCircuitPythonリポジトリを落としてgrepした。基本的にGPIO8が使われているようだが、adafruitのmetro rp2350というボードと、PimoroniのPGA2350というボードはPSRAMのCSがGPIO47であった。
$ grep -i PSRAM_CHIP_SELECT *2350*/mpconfigboard.h
adafruit_feather_rp2350/mpconfigboard.h:#define CIRCUITPY_PSRAM_CHIP_SELECT (&pin_GPIO8)
adafruit_feather_rp2350_adalogger/mpconfigboard.h:#define CIRCUITPY_PSRAM_CHIP_SELECT (&pin_GPIO8)
adafruit_metro_rp2350/mpconfigboard.h:#define CIRCUITPY_PSRAM_CHIP_SELECT (&pin_GPIO47)
challenger_rp2350_bconnect/mpconfigboard.h:#define CIRCUITPY_PSRAM_CHIP_SELECT (&pin_GPIO0)
challenger_rp2350_wifi6_ble5/mpconfigboard.h:#define CIRCUITPY_PSRAM_CHIP_SELECT (&pin_GPIO0)
pimoroni_badger2350/mpconfigboard.h:#define CIRCUITPY_PSRAM_CHIP_SELECT (&pin_GPIO8)
pimoroni_pga2350/mpconfigboard.h:#define CIRCUITPY_PSRAM_CHIP_SELECT (&pin_GPIO47)
sparkfun_pro_micro_rp2350/mpconfigboard.h:#define CIRCUITPY_PSRAM_CHIP_SELECT (&pin_GPIO19)
sparkfun_thing_plus_rp2350/mpconfigboard.h:#define CIRCUITPY_PSRAM_CHIP_SELECT (&pin_GPIO8)
weact_studio_rp2350b_core/mpconfigboard.h:#define CIRCUITPY_PSRAM_CHIP_SELECT (&pin_GPIO0)
試しに、AdafruitのMetro RP2350用ファームを入れてみる。Metro用ファームを使うことでPSRAMが認識された。
Adafruit CircuitPython 10.2.1 on 2026-05-13; Adafruit Metro RP2350 with rp2350b
>>> import gc
>>> gc.mem_free()
8264896
>>> gc.mem_free()/1024/1024
7.881806
多分、picodviを使うことで、 HSTXからDVI信号が出ると思われる。当面は、Metroのふりして動かすか。。
>>> help('modules')
__future__ builtins math terminalio
__main__ busdisplay memorymap tilepalettemapper
_asyncio busio microcontroller time
_bleio codeop micropython touchio
_pixelmap collections msgpack traceback
adafruit_bus_device countio neopixel_write ulab
adafruit_bus_device.i2c_device digitalio nvm ulab.numpy
adafruit_bus_device.spi_device displayio onewireio ulab.numpy.fft
adafruit_pixelbuf epaperdisplay os ulab.numpy.linalg
aesio errno paralleldisplaybus ulab.scipy
analogbufio floppyio picodvi ulab.scipy.linalg
analogio fontio pulseio ulab.scipy.optimize
array fourwire pwmio ulab.scipy.signal
atexit framebufferio qrio ulab.scipy.special
audiobusio gc rainbowio ulab.utils
audiocore getpass random usb
audiodelays gifio re usb.core
audiofilters hashlib rgbmatrix usb.util
audiofreeverb i2cdisplaybus rotaryio usb_cdc
audiomixer i2cioexpander rp2pio usb_hid
audiomp3 i2ctarget rtc usb_host
audiopwmio imagecapture sdcardio usb_midi
audiospeed io select usb_video
binascii jpegio sharpdisplay vectorio
bitbangio json storage warnings
bitmapfilter keypad struct watchdog
bitmaptools keypad_demux supervisor zlib
bitops locale synthio
board lvfontio sys
Plus any modules on the filesystem
>>> import picodvi
>>> dir(picodvi)
['__class__', '__name__', 'Framebuffer', '__dict__']普段はMicroPython を使っていますが、CircuitPythonでは、新機能の充実ぶりが素晴らしい。。ソースが全て公開されているのもありがたい。機能多すぎてどう使うのか分からないモジュールがてんこ盛りになっている。
■参考URL
Adafruit Feather RP2350 with HSTX Port and 8MB PSRAM : Adafruit Industries, Unique & fun DIY electronics and kits
circuitpython.org
circuitpython.org
Overview | Using DVI Video in CircuitPython | Adafruit Learning System