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)
それをつないで成功した。
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のディスプレイが無いのだった。