2015年03月17日

[Yocto] QEMUのディスプレイ解像度を変える方法

01/16の記事以降、Yocto LinuxのSato Mobile Desktop GUI画面のスクリーンショットをいくつも掲載してきましたが、これらスクリーンショットはいずれもQEMU x86-64ターゲットのディスプレイ解像度を1024x768に設定した状態で取得したものです。Yocto Linuxでは、QEMUターゲットの標準状態のデイスプレイ解像度は640x480になっています。一体どういう方法を使って、デイスプレイの解像度を変えたのか知りたい人がいるじゃないかと思います。

小ネタのTips情報になりますが、Yocto LinuxのQEMUターゲットのデイスプレイ解像度を変更する方法について紹介しましょう。

結論を先に書いてしまうと、じつは、X11の設定ファイルの内容をいじることでQEMUターゲットのディスプレイの解像度を変えています。QEMUターゲット上でX11が動いている場合、そのディスプレイの表示画面は最終的にX11によって制御されます。X11にはxorg.conf(Yocto Linuxのターゲットでは、このファイルは/etc/X11/xorg.confに配置されます)という設定ファイルが存在しており、このファイルの中にX11が管理するモニタの設定値が記述されています。

Yocto Linux(Poky Daisy 1.6.2)ビルド環境の、X11(xorg-xserver)のレシピが格納されているディレクトリのファイル構成は以下のようになっています。

  meta
`-- recipes-graphics
`-- xorg-xserver
|-- xserver-xf86-config
| |-- qemarm
| | `-- xorg.conf
| |-- qemmips
| | `-- xorg.conf
| |-- qemmips64
| | `-- xorg.conf
| |-- qemuppc
| | `-- xorg.conf
| |-- qemush4
| | `-- xorg.conf
| |-- qemux86
| | `-- xorg.conf
| |-- qemux86-64
| | `-- xorg.conf
| `-- xorg.conf
|-- xserver-xorg
| |-- aarch64.patch
| |-- crosscompile.patch
| |-- ix_open_max_preprocessor_error.patch
| |-- macro_tweak.patch
| |-- mips64-crosscompiler.patch
| `-- xorg-CVE-2013-6424.patch
|-- xserver-xf86-config_0.1.bb
|-- xserver-xorg_1.15.0.bb
`-- xserver-xorg.inc

上記のmeta/recipes-graphics/xorg-xserver/xserver-xf86-config/qemu*ディレクトリに格納されているファイルが各QEMUターゲットで使われるxorg.confで、これらはすべて同じ内容になっています。以下にその内容を示します。
Section "Files"
EndSection

Section "InputDevice"
Identifier "Generic Keyboard"
Driver "evdev"
Option "CoreKeyboard"
Option "Device" "/dev/input/by-path/platform-i8042-serio-0-event-kbd"
Option "XkbRules" "xorg"
Option "XkbModel" "evdev"
Option "XkbLayout" "us"
EndSection

Section "InputDevice"
Identifier "Configured Mouse"
Driver "vmmouse"
Option "CorePointer"
Option "Device" "/dev/input/mice"
Option "Protocol" "ImPS/2"
Option "ZAxisMapping" "4 5"
Option "Emulate3Buttons" "true"
EndSection

Section "InputDevice"
Identifier "Qemu Tablet"
Driver "evdev"
Option "CorePointer"
Option "Device" "/dev/input/touchscreen0"
Option "USB" "on"
EndSection

Section "Device"
Identifier "Graphics Controller"
Driver "vmware"
EndSection

Section "Monitor"
Identifier "Generic Monitor"
Option "DPMS"
# 1024x600 59.85 Hz (CVT) hsync: 37.35 kHz; pclk: 49.00 MHz
Modeline "1024x600_60.00" 49.00 1024 1072 1168 1312 600 603 613 624 -hsync +vsync
# 640x480 @ 60Hz (Industry standard) hsync: 31.5kHz
ModeLine "640x480" 25.2 640 656 752 800 480 490 492 525 -hsync -vsync
# 640x480 @ 72Hz (VESA) hsync: 37.9kHz
ModeLine "640x480" 31.5 640 664 704 832 480 489 491 520 -hsync -vsync
# 640x480 @ 75Hz (VESA) hsync: 37.5kHz
ModeLine "640x480" 31.5 640 656 720 840 480 481 484 500 -hsync -vsync
# 640x480 @ 85Hz (VESA) hsync: 43.3kHz
ModeLine "640x480" 36.0 640 696 752 832 480 481 484 509 -hsync -vsync
EndSection

Section "Screen"
Identifier "Default Screen"
Device "Graphics Controller"
Monitor "Generic Monitor"
SubSection "Display"
Modes "640x480"
EndSubSection
EndSection

Section "ServerLayout"
Identifier "Default Layout"
Screen "Default Screen"
InputDevice "Generic Keyboard"
# InputDevice "Configured Mouse"
InputDevice "QEMU Tablet"
Option "AllowEmptyInput" "no"
EndSection

このxorg.confの中にはキーボード、マウス、モニタの設定項目が存在しますが、上記のハイライトの部分がX11の起動時に使われるモニタの種類と表示モードを定義しています。この定義のDisplayサブセクションのModesプロパティの設定値を変更してやれば、X11のディスプレイ解像度を変えることができます。

私がQEMUx86-64ターゲット用に作成したxorg.confと、このファイルを格納したxserver-xf86-configパッケージを作成するためのレシピファイル(meta/recipes-graphics/xorg-xserver/xserver-xf86-config_0.1.bbをカスタマイズするためのレシピ)を以下に公開します。
FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:"

Section "Files"
EndSection

Section "InputDevice"
Identifier "Generic Keyboard"
Driver "evdev"
Option "CoreKeyboard"
Option "Device" "/dev/input/by-path/platform-i8042-serio-0-event-kbd"
Option "XkbRules" "xorg"
Option "XkbModel" "evdev"
Option "XkbLayout" "us"
EndSection

Section "InputDevice"
Identifier "Configured Mouse"
Driver "vmmouse"
Option "CorePointer"
Option "Device" "/dev/input/mice"
Option "Protocol" "ImPS/2"
Option "ZAxisMapping" "4 5"
Option "Emulate3Buttons" "true"
EndSection

Section "InputDevice"
Identifier "Qemu Tablet"
Driver "evdev"
Option "CorePointer"
Option "Device" "/dev/input/touchscreen0"
Option "USB" "on"
EndSection

Section "Device"
Identifier "Graphics Controller"
Driver "vmware"
EndSection

Section "Monitor"
Identifier "Generic Monitor"
Option "DPMS"
# 1024x768i @ 43Hz (industry standard) hsync: 35.5kHz
ModeLine "1024x768" 44.9 1024 1032 1208 1264 768 768 776 817 +hsync +vsync Interlace
# 1024x768 @ 60Hz (VESA) hsync: 48.4kHz
ModeLine "1024x768" 65.0 1024 1048 1184 1344 768 771 777 806 -hsync -vsync
# 1024x768 @ 70Hz (VESA) hsync: 56.5kHz
ModeLine "1024x768" 75.0 1024 1048 1184 1328 768 771 777 806 -hsync -vsync
# 1024x768 @ 75Hz (VESA) hsync: 60.0kHz
ModeLine "1024x768" 78.8 1024 1040 1136 1312 768 769 772 800 +hsync +vsync
# 1024x768 @ 85Hz (VESA) hsync: 68.7kHz
ModeLine "1024x768" 94.5 1024 1072 1168 1376 768 769 772 808 +hsync +vsync
# 1024x768 @ 89Hz (non-standard) hsync: 72.0kHz
ModeLine "1024x768" 100 1024 1108 1280 1408 768 768 780 796 +hsync +vsync
# 1024x600 59.85 Hz (CVT) hsync: 37.35 kHz; pclk: 49.00 MHz
Modeline "1024x600_60.00" 49.00 1024 1072 1168 1312 600 603 613 624 -hsync +vsync
# 800x600 @ 56Hz (VESA) hsync: 35.2kHz
ModeLine "800x600" 36.0 800 824 896 1024 600 601 603 625 +hsync +vsync
# 800x600 @ 60Hz (VESA) hsync: 37.9kHz
ModeLine "800x600" 40.0 800 840 968 1056 600 601 605 628 +hsync +vsync
# 800x600 @ 72Hz (VESA) hsync: 48.1kHz
ModeLine "800x600" 50.0 800 856 976 1040 600 637 643 666 +hsync +vsync
# 800x600 @ 75Hz (VESA) hsync: 46.9kHz
ModeLine "800x600" 49.5 800 816 896 1056 600 601 604 625 +hsync +vsync
# 800x600 @ 85Hz (VESA) hsync: 53.7kHz
ModeLine "800x600" 56.3 800 832 896 1048 600 601 604 631 +hsync +vsync
# 640x480 @ 60Hz (Industry standard) hsync: 31.5kHz
ModeLine "640x480" 25.2 640 656 752 800 480 490 492 525 -hsync -vsync
# 640x480 @ 72Hz (VESA) hsync: 37.9kHz
ModeLine "640x480" 31.5 640 664 704 832 480 489 491 520 -hsync -vsync
# 640x480 @ 75Hz (VESA) hsync: 37.5kHz
ModeLine "640x480" 31.5 640 656 720 840 480 481 484 500 -hsync -vsync
# 640x480 @ 85Hz (VESA) hsync: 43.3kHz
ModeLine "640x480" 36.0 640 696 752 832 480 481 484 509 -hsync -vsync
EndSection

Section "Screen"
Identifier "Default Screen"
Device "Graphics Controller"
Monitor "Generic Monitor"
SubSection "Display"
Modes "1024x768"
EndSubSection
EndSection

Section "ServerLayout"
Identifier "Default Layout"
Screen "Default Screen"
InputDevice "Generic Keyboard"
# InputDevice "Configured Mouse"
InputDevice "QEMU Tablet"
Option "AllowEmptyInput" "no"
EndSection

オリジナルのxorg.confのMonitorセクションには640x480と1024x600の表示モードのエントリしか存在しなかったので、800x600と1024x768のエントリを追加しています。これらの表示モード・エントリの設定値は、X11のソースパッケージに収納されている以下のファイルから取得しました。
//
// Default modes distilled from
// "VESA and Industry Standards and Guide for Computer Display Monitor
// Timing", version 1.0, revision 0.8, adopted September 17, 1998.
//
// $XFree86: xc/programs/Xserver/hw/xfree86/etc/vesamodes,v 1.3 1999/11/16 03:28:03 tsi Exp $


# 640x350 @ 85Hz (VESA) hsync: 37.9kHz
ModeLine "640x350" 31.5 640 672 736 832 350 382 385 445 +hsync -vsync

# 640x400 @ 85Hz (VESA) hsync: 37.9kHz
ModeLine "640x400" 31.5 640 672 736 832 400 401 404 445 -hsync +vsync

# 720x400 @ 85Hz (VESA) hsync: 37.9kHz
ModeLine "720x400" 35.5 720 756 828 936 400 401 404 446 -hsync +vsync

# 640x480 @ 60Hz (Industry standard) hsync: 31.5kHz
ModeLine "640x480" 25.175 640 656 752 800 480 490 492 525 -hsync -vsync

# 640x480 @ 72Hz (VESA) hsync: 37.9kHz
ModeLine "640x480" 31.5 640 664 704 832 480 489 492 520 -hsync -vsync

# 640x480 @ 75Hz (VESA) hsync: 37.5kHz
ModeLine "640x480" 31.5 640 656 720 840 480 481 484 500 -hsync -vsync

# 640x480 @ 85Hz (VESA) hsync: 43.3kHz
ModeLine "640x480" 36.0 640 696 752 832 480 481 484 509 -hsync -vsync

# 800x600 @ 56Hz (VESA) hsync: 35.2kHz
ModeLine "800x600" 36.0 800 824 896 1024 600 601 603 625 +hsync +vsync

# 800x600 @ 60Hz (VESA) hsync: 37.9kHz
ModeLine "800x600" 40.0 800 840 968 1056 600 601 605 628 +hsync +vsync

# 800x600 @ 72Hz (VESA) hsync: 48.1kHz
ModeLine "800x600" 50.0 800 856 976 1040 600 637 643 666 +hsync +vsync

# 800x600 @ 75Hz (VESA) hsync: 46.9kHz
ModeLine "800x600" 49.5 800 816 896 1056 600 601 604 625 +hsync +vsync

# 800x600 @ 85Hz (VESA) hsync: 53.7kHz
ModeLine "800x600" 56.3 800 832 896 1048 600 601 604 631 +hsync +vsync

# 1024x768i @ 43Hz (industry standard) hsync: 35.5kHz
ModeLine "1024x768" 44.9 1024 1032 1208 1264 768 768 776 817 +hsync +vsync Interlace

# 1024x768 @ 60Hz (VESA) hsync: 48.4kHz
ModeLine "1024x768" 65.0 1024 1048 1184 1344 768 771 777 806 -hsync -vsync

# 1024x768 @ 70Hz (VESA) hsync: 56.5kHz
ModeLine "1024x768" 75.0 1024 1048 1184 1328 768 771 777 806 -hsync -vsync

# 1024x768 @ 75Hz (VESA) hsync: 60.0kHz
ModeLine "1024x768" 78.75 1024 1040 1136 1312 768 769 772 800 +hsync +vsync

# 1024x768 @ 85Hz (VESA) hsync: 68.7kHz
ModeLine "1024x768" 94.5 1024 1072 1168 1376 768 769 772 808 +hsync +vsync

# 1152x864 @ 75Hz (VESA) hsync: 67.5kHz
ModeLine "1152x864" 108.0 1152 1216 1344 1600 864 865 868 900 +hsync +vsync

# 1280x960 @ 60Hz (VESA) hsync: 60.0kHz
ModeLine "1280x960" 108.0 1280 1376 1488 1800 960 961 964 1000 +hsync +vsync

# 1280x960 @ 85Hz (VESA) hsync: 85.9kHz
ModeLine "1280x960" 148.5 1280 1344 1504 1728 960 961 964 1011 +hsync +vsync

# 1280x1024 @ 60Hz (VESA) hsync: 64.0kHz
ModeLine "1280x1024" 108.0 1280 1328 1440 1688 1024 1025 1028 1066 +hsync +vsync

# 1280x1024 @ 75Hz (VESA) hsync: 80.0kHz
ModeLine "1280x1024" 135.0 1280 1296 1440 1688 1024 1025 1028 1066 +hsync +vsync

# 1280x1024 @ 85Hz (VESA) hsync: 91.1kHz
ModeLine "1280x1024" 157.5 1280 1344 1504 1728 1024 1025 1028 1072 +hsync +vsync

# 1600x1200 @ 60Hz (VESA) hsync: 75.0kHz
ModeLine "1600x1200" 162.0 1600 1664 1856 2160 1200 1201 1204 1250 +hsync +vsync

# 1600x1200 @ 65Hz (VESA) hsync: 81.3kHz
ModeLine "1600x1200" 175.5 1600 1664 1856 2160 1200 1201 1204 1250 +hsync +vsync

# 1600x1200 @ 70Hz (VESA) hsync: 87.5kHz
ModeLine "1600x1200" 189.0 1600 1664 1856 2160 1200 1201 1204 1250 +hsync +vsync

# 1600x1200 @ 75Hz (VESA) hsync: 93.8kHz
ModeLine "1600x1200" 202.5 1600 1664 1856 2160 1200 1201 1204 1250 +hsync +vsync

# 1600x1200 @ 85Hz (VESA) hsync: 106.3kHz
ModeLine "1600x1200" 229.5 1600 1664 1856 2160 1200 1201 1204 1250 +hsync +vsync

# 1792x1344 @ 60Hz (VESA) hsync: 83.6kHz
ModeLine "1792x1344" 204.8 1792 1920 2120 2448 1344 1345 1348 1394 -hsync +vsync

# 1792x1344 @ 75Hz (VESA) hsync: 106.3kHz
ModeLine "1792x1344" 261.0 1792 1888 2104 2456 1344 1345 1348 1417 -hsync +vsync

# 1856x1392 @ 60Hz (VESA) hsync: 86.3kHz
ModeLine "1856x1392" 218.3 1856 1952 2176 2528 1392 1393 1396 1439 -hsync +vsync

# 1856x1392 @ 75Hz (VESA) hsync: 112.5kHz
ModeLine "1856x1392" 288.0 1856 1984 2208 2560 1392 1393 1396 1500 -hsync +vsync

# 1920x1440 @ 60Hz (VESA) hsync: 90.0kHz
ModeLine "1920x1440" 234.0 1920 2048 2256 2600 1440 1441 1444 1500 -hsync +vsync

# 1920x1440 @ 75Hz (VESA) hsync: 112.5kHz
ModeLine "1920x1440" 297.0 1920 2064 2288 2640 1440 1441 1444 1500 -hsync +vsync


Yocto Linuxでcore-image-satoのようなX11の機能を含むイメージをビルドすると、ターゲットイメージのビルド処理の過程でX11のソースパッケージがダウンロードされて展開されますが、上記はその展開先に存在するファイルを示しています。

xorg.conf内のMonitorセクションに1024x768より高い解像度の表示モード・エントリを追加した上で、それ使うようにDisplayサブセクションを定義しても、設定どおりのディスプレイ解像度で動作することも確認しました。上記のxorg.confの内容は物理的なモニタには依存していないので、どのQEMUターゲットでも使えるはずです。

ただし、Yocto Linuxの開発ホスト機としてVMwareの仮想マシンを利用している場合は注意が必要です。この場合、仮想マシン(QEMUから観たホスト側)のディスプレイはVMwareによって管理されており、その物理画面(仮想マシンのディスプレイ画面)はVMwareのディスプレイドライバによって制御されています。VMware仮想マシン上でQEMUが動いている場合、VMware側のディスプレイドライバのバージョンが古いと、xorg.confのDisplayサブセクションの設定値がQEMUのウィンドウ(モニタ)へ反映されないことがあります。このような環境では、VMwareとVMware Toolsはできるだけ最新バージョンのものを使った方で良いようです。

このアドバイスは実体験に基づいています。私の場合Mac上のVMware Fusionを利用しており、仮想マシンのUbuntu 12.04.1上にYocto Linuxビルド環境を構築しています。最近VMware Fusionのバージョンを5から7にアップグレードしたのですが、VMware Fusionをアップグレードする前の仮想マシンでは、上記とおりにxorg.confを変更しても、ディスプレイ解像度が640x480でQEMU x86-64ターゲットのウィンドウが開いてしまう現象が頻発していました。なぜこのような現象が起きるのかずっと原因が判らなかったのですが、VMware Fusion 7にアップグレートしたらこの現象がまったく起きなくなりました。VMware Fusion 7では、xorg.confの設定内容が反映されて常に1024x768の解像度でQEMUのウィンドウが開いています。VMware Fusionのアップグレードによって明確な差が生まれているので、QEMUとVMwareのディスプレイドライバの間に何からの因果関係が存在するとしか考えられません。

最後に、Sato GUIの表示画面にどれくらい差があるのか確認するために、QEMU x86-64ターゲットのディスプレイ解像度を変えながらスクリーンショットを撮ってみました。
UBShot_20150317_171230-Yocto_Modifying_QEM_X11-DisplayResolution-642x509
UBShot_20150317_171532-Yocto_Modifying_QEM_X11-DisplayResolution-802x629
UBShot_20150317_171820-Yocto_Modifying_QEM_X11-DisplayResolution-1026x629
UBShot_20150317_172054-Yocto_Modifying_QEM_X11-DisplayResolution-1026x797
一番上から、640x480、800x600、1024x600、1024x768に設定しています(上に掲載しているのは縮小サイズ版ですが、各スクリーンショットの画像に実サイズ版のリンクを貼ってあります)。やはりディスプレイ解像度による差は大きいことが一目瞭然ですね。

X11の設定ファイルを変更するだけのTipsですが、上のスクリーンショットが示しているとおり、その効果は絶大です。Yocto Linuxを使って組込みLinuxシステムの開発をやっている人にとって、本記事の内容が役に立てば幸いです。

【2015/03/21 追記】

本記事ではYocto LinuxのX11ベースのGUIイメージのディスプレイ解像度を変更する方法について説明しましたが、コンソール・ベースのCLIイメージのディスプレイ解像度を変える方法についても説明しておかないと片手落ちかと思います。GUIイメージと比較して需要はずっと低いかと思いますが、CLIイメージのディスプレイ解像度を変える方法について以下に記します。

QEMUターゲットを起動するのにrunqemuというコマンドを使いますが、CLIイメージを実行する場合に、runqemuコマンドに以下のようなパラメータとオプションを指定してやると、QEMUターゲットのモニタの表示モードを変更することができます。
% runqemu <MACHINE> <IMAGE> bootparams="uvesafb.mode_option=<DISPLAY_MODE>"

例えば、QEMU x86-64ターゲットを使ってcore-image-full-cmdlineイメージを1024x768 32ビット・カラー・モードで起動したい場合は、以下のようなコマンドによってそれができます。
% runqemu qemux86-64 core-image-full-cmdline bootparams="uvesafb.mode_option=1024x768-32"

runqemuコマンドをオプション指定なし実行すると、Terminalウィンドウに以下のような起動情報が出力されますが、これがrunqemuコマンドのデフォルトのオプションです。
UBShot_20150321_195605-Yocto_Modifying_QEM_VGA-DisplayResolution-704x631
--append "vga=0 uvesafb.mode_option=640x480-32 ..."」というオブションが存在しますが、これがQEMUターゲットのデフォルトのモニタ表示モードに相当します。

bootparams="uvesafb.mode_option=1024x768-32"」というオブションを指定することで、runqemuコマンドの起動情報出力は以下のように変わります。
UBShot_20150321_200051-Yocto_Modifying_QEM_VGA-DisplayResolution-704x631
つまりカーネルパラメータの「uvesafb.mode_option=」の設定値を上書きしていることになります。結果として、QEMUターゲットのモニタの表示モードが変更される訳です。

参考のために、QEMU x86-64ターゲット上で動作しているcore-image-full-cmdlineの640x480と1024x768のスクリーンショットを掲載しておきます。
UBShot_20150321_195825-Yocto_Modifying_QEM_VGA-DisplayResolution-642x509
UBShot_20150321_200119-Yocto_Modifying_QEM_VGA-DisplayResolution-1026x797
posted by とみやん at 14:44| Comment(0) | TrackBack(0) | Embedded Linux > Yocto Project
この記事へのコメント
コメントを書く
お名前: [必須入力]

メールアドレス:

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
この記事へのトラックバックURL
http://blog.sakura.ne.jp/tb/115274192

この記事へのトラックバック