Raspberry Pi にHDMI->VGA変換器と、USBディスプレイをつなぐ | たけおか ぼちぼち日記

たけおか ぼちぼち日記

思いついたらメモ

Raspberry Pi の表示ネタ

1.Raspberry Piに HDMI -> VGA変換器を接続する

2.Raspberry Piに USB Linkなディスプレイを接続する



1.Raspberry Piに HDMI -> VGA変換器を接続する

Raspberry Piには VGA 出力が無くて困る。
一般の会議室にあるプロジェクタに接続できないのだ。

そこで、 HDMI -> VGA変換器を購入して使用してみた。
安くていいものが、当然にありがたい。

Amazonで、レビューを見つつ、下記のものを購入し、快調。
ただし、まだ、手持の Benqのディスプレイで使っているだけ。
-- 2013/JUL/07 音についても、うまく出力された。


「HDMI to VGA adapter ブラック / HDMI信号をVGA出力信号に変換するアダプター
(音声出力あり)(HDMI延長アダプタ付き)
MEDIA ACTIVE




http://www.amazon.co.jp/gp/product/B008XU9M26/ref=oh_details_o00_s00_i00?ie=UTF8&psc=1


VGAディスプレイから情報が取得できない場合は、下記の設定を行う。
しかし、僕の場合、下記を行わなくとも、うまく映った。
下記を行うと、強制的に解像度を設定できている。


/boot/config.txt を編集し、
--

hdmi_ignore_edid=0xa5000080 #ディスプレイからのEDID参照しないようにする
hdmi_group=2 # 固定解像度を指定。この組み合わせは800x600
hdmi_mode=9
--


hdmi_group= と hdmi_mode= は、組で指定しなければならない。

解像度と、hdmi_group, hdmi_mode の関係は下の文書を見る
http://elinux.org/RPiconfig

このHDMI->VGA変換器で、OpenGL も omxplayer も動作する。
このどちらも、フレームバッファへ直書きで、結構厳しいものである。
X Windowも、普通に動作する。

いい買い物であったと思われる。


ちなみに、HDMI ディスプレイで、音を出すには、confix.txt に下記を書くとうまくいった。

# for Sound
hdmi_drive= 2




2.Raspberry Piに USB Linkなディスプレイを接続する

USB Linkなディスプレイは、コンパクトなものを以前から持っていた。
plus one(LCD-8000UD)
それをつないで成功した。

$たけおか ぼちぼち日記-USB Display

たけおか ぼちぼち日記-X twin head

X Window Systemを Twin head (2 Display)で運用中。
右のUSB Display では、 fvwm -display :0.1 で、fvwmが動作中。


今回は、全面的に、下のページを真似した。ありがとうございます。> Anup Narkhede さん

Mimo USB Monitor and Raspberry Pi



Raspberry Pi の kernel 再コンパイルは、x86 によるクロスコンパイルがいいと思う。
やりかた

1) クロスコンパイル用のツールを得る。

x86マシンで、
x86# mkdir -p /opt/arm-tools/
x86# chown 自分のuid /opt/arm-tools
自分のユーザに戻り、
x86$ cd /opt/arm-tools
x86$ git clone https://github.com/raspberrypi/tools

とする。
僕の場合、

/opt/arm-tools/arm-bcm2708/arm-bcm2708-linux-gnueabi/bin/arm-bcm2708-linux-gnueabi-

な、ツールが得られた。



2) kernelのソースを得る

kernel ソースを置きたいディレクトリに cd した後、下記を実行。

x86$ git clone --branch=rpi-3.6.11 --depth 1 git://github.com/bootc/linux.git

ちょっと時間が掛かる。

3) 動作中の Raspberry Pi の kernel config 情報が欲しい場合、
Linuxが動作中のRaspberry Piで、下記を実行
raspi$ zcat /proc/config.gz > raspi-kern-config

ここで、得られた raspi-kern-config は、クロス開発のx86 に送っておく。



4) kernel を config する

kernel ソースがあるディレクトリで、

x86$ make mrproper

※1 ここで、動作中の Raspi の raspi-kern-config を使用したければ、

x86$ cp raspi-kern-config .config
とする。

※2 ミニマルなconfig を使用したい時は、
x86$ cp arch/arm/configs/bcmrpi_cutdown_defconfig .config
とする。


そして、

x86$ ARCH=arm make menu-config

で、色々、好きにする。


USB Display を使うためには、
menu configのメニューを

‘Device Drivers’ > ‘Graphics Support’ > ‘Support for Framebuffer support’

と手繰り…

‘Displaylink USB Framebuffer support’ を‘M’にして、モジュールを使用可能にする。



5) kernel のコンパイル

環境変数 CCPREFIX に、ツールのプリフィックス
/opt/arm-tools/arm-bcm2708/arm-bcm2708-linux-gnueabi/bin/arm-bcm2708-linux-gnueabi-
を設定する

bsh系の人
x86$ export CCPREFIX=/opt/arm-tools/arm-bcm2708/arm-bcm2708-linux-gnueabi/bin/arm-bcm2708-linux-gnueabi-

csh系 の人
x86% setenv CCPREFIX /opt/arm-tools/arm-bcm2708/arm-bcm2708-linux-gnueabi/bin/arm-bcm2708-linux-gnueabi-


kernelをコンパイルする。

x86$ ARCH=arm CROSS_COMPILE=${CCPREFIX} make

この時、コア数に合わせて、make -j 4 などとすると、4並列でmake を行える。


kernelは、 arch/arm/boot/zImage にできる。

6) モジュールをターゲット機に持っていく

ワーキング・ディレクトリを作る
x86$ mkdir -p ../newlinux/module

モジュールのコピー
x86$ MODULES_TEMP=../newlinux/modules
x86$ ARCH=arm CROSS_COMPILE=${CCPREFIX} INSTALL_MOD_PATH=${MODULES_TEMP} make modules_install

kernelもコピー
x86$ cp arch/arm/boot/zImage ../newlinux/

すべてを固める
x86$ cd ..; tar cvjf newlinux.tar.bz2 newlinux

ファイルをターゲットに転送
x86$ scp newlinux.tar.bz2 raspi:~/tmp/



7) Raspiでの作業

raspi$ cd ~/tmp
raspi$ tar xvjf newlinux.tar.bz2
raspi$ sudo bash

kernelを、/bootにコピー

raspi# cd newlinux
raspi# cp zImage /boot/kernel_new.img

/boot/config.txt を編集して、どこかに

kernel=kernel_new.img

という行を追加。

モジュールのコピー
raspi# cd modules/lib/modules
raspi# mv 3.6.11-cutdown+ /lib/modules/


8) 新しいkernelで起動する

raspi# sync
raspi# sync
raspi# sync
raspi# reboot



9) もしも、新しいカーネルが動作しなかったら

起動に使用している SD-Cardを x86 マシンに挿入。
SD-Cardの /boot は、FATファイルシステムであり、その中身はx86マシンで容易に操作できる。

config.txt を編集し、
kernel=kernel_new.img
という行を、
kernel=kernel.img
(動作していた kernelのファイル名)
として指定し直すと、Raspiは、元の正常なkernelで起動できるようになる。



10) kernelの確認

raspi$ uname -a
とやると、新しい kernel の名前や作成時刻が確認できる。



--

USB Display のドライバ・モジュールの入ったkernelで Linuxが起動したら、
USB にUSB Display を接続する。

Raspiは、電源が弱いので、USBディスプレイは、電源を持ったUSBハブに接続する。


僕の場合、
dmesgは、以下の感じ。
ここで、/dev/fb1 となっていることを知ることが大事。


[ 103.206171] udlfb: DisplayLink LCD-8000UD-DVI - serial #000000
[ 103.206207] udlfb: vid_17e9&pid_02b8&rev_0101 driver's dlfb_data struct at da829800
[ 103.206217] udlfb: console enable=1
[ 103.206224] udlfb: fb_defio enable=1
[ 103.206231] udlfb: shadow enable=1
[ 103.206524] udlfb: vendor descriptor length:22 data:22 5f 01 0020 05 00 01 03 04 02
[ 103.206541] udlfb: DL chip limited to 2080000 pixel modes
[ 103.209403] udlfb: allocated 4 65024 byte urbs
[ 103.214829] usbcore: registered new interface driver udlfb
[ 103.358073] udlfb: Unable to get valid EDID from device/display
[ 103.358108] udlfb: 640x350 @ 85 Hz valid mode
[ 103.358121] udlfb: 640x400 @ 85 Hz valid mode
:
[ 103.358430] udlfb: 1920x1440 beyond chip capabilities
[ 103.358442] udlfb: Reallocating framebuffer. Addresses will change!
[ 103.365371] udlfb: 800x600 @ 60 Hz valid mode
[ 103.365395] udlfb: set_par mode 800x600
[ 103.387384] udlfb: DisplayLink USB device /dev/fb1 attached. 800x600 resolution. Using 1880K framebuffer memory




$ lsusb -v
で、

:
Bus 001 Device 010: ID 17e9:403d DisplayLink
Device Descriptor:
bLength 18
bDescriptorType 1
bcdUSB 2.00
bDeviceClass 0 (Defined at Interface level)
bDeviceSubClass 0
bDeviceProtocol 0
bMaxPacketSize0 64
idVendor 0x17e9 DisplayLink
idProduct 0x403d
bcdDevice 1.02
iManufacturer 1
iProduct 2
iSerial 3
bNumConfigurations 1
Configuration Descriptor:
bLength 9
bDescriptorType 2
wTotalLength 91
bNumInterfaces 2
bConfigurationValue 1
iConfiguration 0
bmAttributes 0xc0
Self Powered
MaxPower 500mA
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 0
bAlternateSetting 0
bNumEndpoints 3
bInterfaceClass 255 Vendor Specific Class
bInterfaceSubClass 0
bInterfaceProtocol 0
iInterface 0
** UNRECOGNIZED: 1b 5f 01 00 19 05 00 01 03 00 04 04 01 00 03 d0 00 02 04 00 bd 1f 00 01 04 01 02
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x01 EP 1 OUT
bmAttributes 2
Transfer Type Bulk
Synch Type None
Usage Type Data
wMaxPacketSize 0x0200 1x 512 bytes
bInterval 0
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x82 EP 2 IN
bmAttributes 3
Transfer Type Interrupt
Synch Type None
Usage Type Data
wMaxPacketSize 0x0008 1x 8 bytes
bInterval 4
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x0a EP 10 OUT
bmAttributes 2
Transfer Type Bulk
Synch Type None
Usage Type Data
wMaxPacketSize 0x0200 1x 512 bytes
bInterval 0
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 1
bAlternateSetting 0
bNumEndpoints 1
bInterfaceClass 3 Human Interface Device
bInterfaceSubClass 0 No Subclass
bInterfaceProtocol 0 None
iInterface 0
HID Device Descriptor:
bLength 9
bDescriptorType 33
bcdHID 1.10
bCountryCode 0 Not supported
bNumDescriptors 1
bDescriptorType 34 Report
wDescriptorLength 27
Report Descriptors:
** UNAVAILABLE **
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x85 EP 5 IN
bmAttributes 3
Transfer Type Interrupt
Synch Type None
Usage Type Data
wMaxPacketSize 0x0010 1x 16 bytes
bInterval 4

と出た。


X Windowで使用できるようにする。
なまいきに ツインヘッド(ディスプレイ 2つ)として使用できる。

X windowを終了して、root 権限で、
/etc/X11/xorg.conf (無なければ新規作成) に、下記のように書く。

/dev/fb1 などのデバイス名は、必ずチェックすべし。
通常は、HDMIコンソールが /dev/fb0 で、USB ディスプレイは、/dev/fb1になる。
しかし、コンソール無しなどとしていると、USBディスプレイが、/dev/fb0になる。


# /etc/X11/xorg.conf
Section "ServerLayout"
Identifier "default"
Screen 0 "buitlin Screen" 0 0
Screen 1 "screenUsb" Rightof "buitlin Screen"
EndSection

Section "Device"
Identifier "builtin Video Device"
Driver "fbdev"
Option "fbdev" "/dev/fb0" #通常は、HDMIコンソールが fb0
EndSection

Section "Monitor"
Identifier "Monitor0"
EndSection

Section "Screen"
Identifier "buitlin Screen"
Monitor "Monitor0"
Device "builtin Video Device"
EndSection


# USB Link
Section "Device"
Identifier "uga"
driver "fbdev"
Option "fbdev" "/dev/fb1" # デバイス名を要チェック
Option "ShadowFB" "off"
EndSection

Section "Monitor"
Identifier "monitor1"
EndSection

Section "Screen"
Identifier "screenUsb"
Device "uga"
Monitor "monitor1"
EndSection


$ startx
として、X windowを起動すると、
HDMIコンソールが X Windowのディスプレイ 0、
USBディスプレイがディスプレイ 1となる。
そして、USBディスプレイは、右側となる。

USBディスプレイは、画面が黒くなるかも知れない。



とりあえず、USBディスプレイを使用するには、

$ gnome-text-editor --display :0.1
とする。
すると、USBディスプレイに画面が出る。

X Window 純正アプリケーションであれば、
-display :0.1
という引数が有効である。
伝統的、X Window 純正アプリケーションは、
$ sudo apt-get install x11-apps
で入る。
$ xterm -display :0.1
$ oclock -display :0.1
などとして、ディスプレイ 1 の画面を使用できる。


だが、Raspberry Pi(Raspbian) 標準のデスクトップ環境(ウインドウ・マネージャ)では、
ディスプレイ 1の窓に、キーフォーカスが移らず、キー入力ができず、かなり悲しい。
(この状態で、$ fvwm -display :0.1 とすると、
ディスプレイ1 でfvwm が動作し、キーフォーカスが正常になるが、
ディスプレイ0と1で異なるウインドウ・マネージャが動作し、
非常にマニアックな使用環境となる)

X Window全体のウインドウ・マネージャに twm か、fvwm を使用すると、ちゃんと
セカンド・ディスプレイの入力窓にもキーフォーカスが移る。
そのために、
~/.xinitrc
の *最終行* に、
exec twm

exec fvwm
と記述する。
twm, fvwmを終了すると、X Window System 全体が終了する。

twm, fvwmは、
$ sudo apt-get install twm fvwm
で、インストールされる。


USBディスプレイを、左に置きたいときは、
Screen 1 "screenUsb" Leftof "buitlin Screen"
とする。


USBディスプレイは、描画速度は遅いが、これはコンパクトなものなので、持ち運びができる。

--

NTSC 入力を持つディスプレイでコンパクトなものがあるので、それも候補としてはアリだが、
僕の手元に、NTSCのディスプレイが無いのだった。