Uvesafb

提供: ArchWiki
2020年8月2日 (日) 23:38時点におけるKgx (トーク | 投稿記録)による版 (→‎Uvesafb と 915resolution: 翻訳)
ナビゲーションに移動 検索に移動

関連記事

他のフレームバッファドライバーと違って、uvesafb は v86d と呼ばれるユーザースペースの仮想化デーモンを必要とします。x86 の上で x86 のコードをエミュレートするのは馬鹿げているようにも見えますが、他のアーキテクチャでフレームバッファコードを使用したいという場合に大事になります (特に x86 以外のアーキテクチャ)。カーネル 2.6.24 では新しいフレームバッファドライバーが追加されました。標準の vesafb よりも多くの機能が存在します:

  1. 遅延時間後の正しいブランクとハードウェアの復帰
  2. システム BIOS のようにカスタム解像度をサポート。

vesafb と同じ数だけのハードウェアをサポートします。

インストール

AUR から v86dAURインストールしてください。

システムの準備

フレームバッファ関連のカーネルブートパラメータは全てブートローダーの設定から削除して vesafb フレームバッファがロードされないようにしてください。

$ grep vga /proc/cmdline
$ grep -ir vga /etc/modprobe.d/

上記のコマンドで何も返ってこないようにする必要があります。vga= オプションを記述している場合は、削除してください。

GRUB

ノート: This might not work.

まず /etc/default/grub を編集して GRUB_GFXPAYLOAD_LINUX=keep 行をコメントアウトしてください。

そして標準のスクリプトを使って grub.cfg を再生成します:

# grub-mkconfig -o /boot/grub/grub.cfg

GRUB legacy

uvesafb が正しく動作するように /boot/grub/menu.lst の kernel 行から vga=xxx という記述を全て削除してください。

Systemd

systemd を使っている場合、v86d フックを /etc/mkinitcpio.conf の HOOKS に追加します。これで uvesafb が起動時に動くようになります。

HOOKS="base udev v86d ..."

uvesafb の設定

解像度の定義

uvesafb の設定は /usr/lib/modprobe.d/uvesafb.conf で定義します:

# This file sets the parameters for uvesafb module.
# The following format should be used:
# options uvesafb mode_option=<xres>x<yres>[-<bpp>][@<refresh>] scroll=<ywrap|ypan|redraw> ...
#
# For more details see:
# https://www.kernel.org/doc/Documentation/fb/uvesafb.txt
#
options uvesafb mode_option=1280x800-32 scroll=ywrap

mode_option のドキュメントは linux.git/tree/Documentation/fb/modedb.txt にあります。

パッケージが更新されたときにカスタマイズした設定が上書きされないように、ファイルを /etc/modprobe.d/uvesafb.conf にコピーしてください:

# cp /usr/lib/modprobe.d/uvesafb.conf /etc/modprobe.d/uvesafb.conf

そして /etc/mkinitcpio.conf の FILES セクションのエントリに設定ファイルを追加します:

FILES="/etc/modprobe.d/uvesafb.conf"

変更を適用するにはカーネルの initramfs イメージを再生成する必要があります。

# mkinitcpio -p linux

システムを再起動して変更が適用されたか確認してください。

解像度の最適化

次のコマンドを使うことで使用できる解像度を全てリストアップできます:

$ cat /sys/bus/platform/drivers/uvesafb/uvesafb.0/vbe_modes

返ってきたエントリを使って /usr/lib/modprobe.d/uvesafb.conf を修正しましょう。

現在の解像度のチェック

以下のコマンドを使うことで現在のフレームバッファの解像度を表示できます。設定が反映されているかどうか確認するのに使ってください:

$ cat /sys/devices/virtual/graphics/fbcon/subsystem/fb0/virtual_size
$ cat /sys/class/graphics/fb0/virtual_size

Uvesafb をカーネルに組み込む

自分でカーネルをコンパイルする場合、カーネルに uvesafb を組み込んで /etc/rc.local などから v86d を実行することができます。この場合、オプションは video=uvesafb:<options> という形式でカーネルパラメータとして指定します。下で書かれているように uvesafb と 915resolution を組み合わせるときはこの方法を使うことはできないので注意してください。

Uvesafb と 915resolution

以下では、より複雑なシナリオについて説明します。ワイドスクリーンラップトップ用の多くのインテルビデオチップセットには、バグのあるBIOSが搭載されていることが知られています。これは、ワイドスクリーンのメインのネイティブ解像度をサポートしていません。このため、ブート時にBIOSにパッチを適用し、Xサーバーがワイドスクリーンの解像度を使用できるようにするために、915resolutionが作成されました。今日、Xサーバーは915resolutionの助けなしでこれを行うことができます。ただし、915resolutionをuvesafbと組み合わせると、Xを起動することなく、ワイドスクリーンフレームバッファーを取得できます。この場合、915resolutionを実行した後でuvesafbをロードして、uvesafbが適切な解像度に頼れるようにする必要があります。

915resolution-static

このシナリオでは、915解像度を静的にコンパイルする必要があります(initramfsに置かれるので、外部ライブラリにリンクすることはできません。)。したがって、 [community] リポジトリで915 resolutionパッケージを使用することはできません。代わりに、AURで915resolution-staticAUR アーカイブ: 915resolution-static aur-mirror}}を探してください。 これは915解像度を静的にコンパイルし、915解像度フックを提供しますので、uvesafbをロードする前に915解像度を実行して、パッチされた解像度を得ることができます。makepkgとpacmanを使って915 resolution-staticをインストールしてください。

解像度

交換するBIOSモードと取得する解像度を定義するには、915resolutionフックを編集する必要があります。あなたは915resolutionのすべてのオプションについての情報を得ることができます。

$ 915resolution -h

/lib/initcpio/hooks/915resolution を編集して915resolutionのオプションを変更します。

run_hook ()
{
   msg -n ":: Patching the VBIOS..."
   /usr/sbin/915resolution 5c 1280 800
   msg "done."
}

デフォルトとして、5cは、置き換えるBIOSモードのコードです。次のコマンドを使用して、使用可能なBIOSビデオモードのリストを取得できます 915resolution -l

ノート: 915resolutionはそれを新しいユーザー定義モードに置き換えるので、(フレームバッファーでもXでも)不要なモードのコードを選択する必要があります。上記の例では、1280 800 が新しい望ましい解像度です。

HOOKS

915resolutionフックを追加し、その後、 /etc/mkinitcpio.confのHOOKSにv86dフックを追加します。keymap、resume from suspension、をfilesystemのフックの前に置きます。

HOOKS="base udev 915resolution v86d ..."

次に、mkinitcpioを使用してinitramfsを再生成する必要があります(次のコマンドを設定に合わせて調整してください)

mkinitcpio -p linux

トラブルシューティング

Uvesafb cannot reserve memory

vga=xxx カーネルパラメータを削除するのを忘れてないか確認してください -- この設定が残っていると UVESA フレームバッファが標準の VESA フレームバッファで上書きされてしまいます。

もしくは video=vesa:off vga=normal をカーネルコマンドラインに追加してください。

Error: "pci_root PNP0A08:00 address space collision + Uvesafb cannot reserve memory"

これは2.6.34-ARCHカーネルを搭載したAcer Aspire One 751hで発生します。他のシステムでも発生するかどうかは不明です。別のフレームバッファーがuvesafbのセットアップに干渉しない場合でも、uvesafbは必要なメモリー領域を予約できません。

この問題は、ブートローダーの設定でカーネルパラメータに以下を追加することで修正できます。

pci=nocrs

参照