💻

Raspberry Piで出力解像度を無理やり固定する最短手順

に公開

はじめに

Raspberry Pi を HDMI でモニターに接続したのに 1024×768 など低解像度になってしまい、設定にも 1920×1080 が出てこないことがあります。
Raspberry Pi OS Bookworm 以降は表示系が KMS(Kernel Mode Setting)で統一され、/boot/firmware/cmdline.txtvideo= 指定が非常に強力に働きます。これを使って EDID が不安定でも 1080p を確実に強制する手順をまとめます。

備考: Bookworm 以降の実体ファイルは /boot/firmware/config.txt/boot/config.txt は案内用ダミーです。


TL;DR(最短3ステップ)

  1. どの HDMI ポートが接続中か確認

    for f in /sys/class/drm/card*-HDMI-A-*; do echo $f; cat $f/status; done
    

    ...HDMI-A-1connectedHDMI-A-1...HDMI-A-2connectedHDMI-A-2

  2. /boot/firmware/cmdline.txt の末尾に video=... を追記(※1行ファイル)

    # バックアップ(不安であれば一応)
    sudo cp /boot/firmware/cmdline.txt /boot/firmware/cmdline.txt.bak
    
    # 例: HDMI-A-1 に挿している場合(末尾に 半角スペース+追記)
    sudo sed -i 's/$/ video=HDMI-A-1:1920x1080@60/' /boot/firmware/cmdline.txt
    
    # HDMI-A-2 に挿しているなら A-2 に置換
    sudo reboot
    
  3. 反映確認(GUI不要)

    # 利用可能モードに 1920x1080 があるか
    cat /sys/class/drm/*-HDMI-A-1/modes   # A-2 の場合は A-2
    
    # 実効解像度("1920,1080" ならOK)
    sudo cat /sys/class/graphics/fb0/virtual_size
    

仕組み(なぜ効く?)

  • EDID はモニターの自己申告。壊れていたりケーブル相性が悪いと Pi が低解像度にフォールバック。
  • KMS 環境では カーネル引数 video= が最優先で、EDID を無視して解像度を決め打ちできる。
  • 旧来の config.txthdmi_group / hdmi_mode)は KMS では優先度が低い/無視されることがある

手順詳細

1. 接続ポートの同定

for f in /sys/class/drm/card*-HDMI-A-*; do echo $f; cat $f/status; done
  • ...HDMI-A-1connectedvideo=HDMI-A-1:1920x1080@60
  • ...HDMI-A-2connectedvideo=HDMI-A-2:1920x1080@60

2. cmdline.txtvideo= を追記

**/boot/firmware/cmdline.txt は 1 行のみ。必ず「末尾に半角スペース+追記」**します。

sudo cp /boot/firmware/cmdline.txt /boot/firmware/cmdline.txt.bak
sudo sed -i 's/$/ video=HDMI-A-1:1920x1080@60/' /boot/firmware/cmdline.txt
sudo reboot

よくあるミス

  • 改行を入れて複数行にしてしまう
  • HDMI のスペルミス(HDMl など)
  • 実際は A-2 に挿しているのに A-1 を指定

編集例(概念図): 行末に video=... が付く形

console=serial0,115200 ... rootwait quiet splash video=HDMI-A-1:1920x1080@60

3. 反映確認

# 候補モード(EDIDが読めていれば一覧が出る)
cat /sys/class/drm/*-HDMI-A-1/modes

# 実効フレームバッファサイズ("1920,1080" を期待)
sudo cat /sys/class/graphics/fb0/virtual_size

# ついでに EDID サイズ確認(0 バイトなら取得失敗)
sudo cat /sys/class/drm/*-HDMI-A-1/edid | wc -c

GUIでの確認・調整(必要に応じて)

Bookworm の既定は Wayland。X11 前提の xrandr は基本使えません。代わりに wlr-randr を使うと便利(Pi 本体のターミナルで実行推奨)。

sudo apt update
sudo apt install wlr-randr
wlr-randr

X11 セッションなら xrandr が使えますが、SSH 経由では DISPLAY=:0 などの指定が必要です。


参考:config.txt を使う旧来のやり方(KMSでは非推奨)

KMS 環境では 優先度が低い/無視されることがありますが、念のため PC モニター向け設定を載せます。

# /boot/firmware/config.txt(最下部へ)
hdmi_force_hotplug=1      # EDIDがダメでもHDMIを強制
hdmi_group=2              # DMT(PCモニター向け)
hdmi_mode=82              # 1920x1080 @ 60Hz

テレビ向けは hdmi_group=1 / hdmi_mode=16(1080p60)。
ただし 今回の主役は cmdline.txtvideo= です。


トラブルシューティング

  • 何も映らない/modes に 1920×1080 が無い

    • HDMI ケーブルを交換(ハイスピード以上推奨)
    • もう一方のポートに挿し替え → video=HDMI-A-2:1920x1080@60 に変更
    • モニターの入力を「自動検出/PC向け」に
    • カーネルログ:
      dmesg | grep -i -e hdmi -e drm
      
  • EDID が 0 バイト

    • 物理層(ケーブル/変換アダプタ/延長アダプタ)問題が濃厚。できるだけ直結で。
  • 75Hz など別リフレッシュを使いたい

    video=HDMI-A-1:1920x1080@75
    

    (モニターが対応していれば可)

  • マルチディスプレイで個別指定

    video=HDMI-A-1:1920x1080@60 video=HDMI-A-2:1280x1024@60
    

元に戻す(自動認識へ)

# バックアップから戻す
sudo cp /boot/firmware/cmdline.txt.bak /boot/firmware/cmdline.txt

# もしくは 1行末尾の " video=HDMI-A-1:1920x1080@60" を削除
sudo nano /boot/firmware/cmdline.txt
sudo reboot

config.txthdmi_group/mode を残していた場合は、混乱回避のため削除しておくのが無難です。


まとめ

  • Bookworm/KMS 時代の最短解は cmdline.txtvideo= 指定
  • /sys/class/drm/.../status で接続ポートを確認 → video=ポート:1920x1080@60 を追記 → 再起動 → 反映確認
  • これで EDID が不安定でも FHD を確実に固定できます。

Discussion