chakokuのブログ(rev4)

テック・コミック・DTM・・・ごくまれにチャリ

RP2350 PiZeroボードにPSRAMを実装->RAM領域が8MBに増量

背景: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

*1:RP2040時代に力業でDVI出力するソリューションが話題になったそうだ。自分は知らなかった

*2:Adafruit Feather RP2350 with HSTX Port and 8MB PSRAM

*3:フラットケーブルでHDMI基板を接続する方式は、HSTXを汎用高速シリアルと位置付け、いろんなボードを取り換えることで、DVI以外の用途にも適用できるようするコンセプトだと理解しました

*4:カプトンテープが古いのか粘着力低し。気休め程度の働き