Raspberry Pi でUSBディスプレイを使う
LCD-8000UというUSB接続のディスプレイが手元にあるので、Raspberry Piで使用してみました。
今入手するとしたらこちらですかね。
センチュリー PLUS ONE 8インチUSB接続サブモニター ブラック LCD-8000U2
- 出版社/メーカー: センチュリー
- 発売日: 2013/04/01
- メディア: Personal Computers
- この商品を含むブログを見る
参考にしたページ
http://ameblo.jp/takeoka/entry-11567229228.html
http://anup.info/blog/2012/10/13/raspberry-pi-mimo-monitor
カーネルコンパイル
DisplayLinkのドライバが必要なので、カーネルのコンパイルを行います。
ツールチェイン準備
Raspberry Pi自体でセルフコンパイルするのは時間がかかりすぎるので、Linuxのホストでクロスコンパイルします。
以下の場所からcross toolchainをダウンロードし、
% git clone https://github.com/raspberrypi/tools
arm-bcm2708/arm-bcm2708-linux-gnueabi をどこか適当なところ(例えば /opt)に置きます。
カーネルソース取得
% git clone --branch=rpi-3.6.y https://github.com/raspberrypi/linux.git
コンパイル
動作しているRaspberry Piにおいて、以下のコマンドでkernel configを取得して、
% zcat /proc/config.gz > current-config
コンパイルを行うホストにコピーしてソースツリーの下に.configとして置きます。
Makefileに以下を追加(ツールチェインのパスは上でツールチェインを置いた場所を元に指定します)
ARCH := arm CROSS_COMPILE := /opt/arm-bcm2708-linux-gnueabi/bin/arm-bcm2708-linux-gnueabi-
また、一応EXTRAVERSIONにわかりやすい文字列を入れておくとよいと思います。(下記の例のようにすると、uname -r したときに "3.6.11-tk" が得られます)
EXTRAVERSION = -tk
make menuconfigして以下の場所のDisplaylinkドライバをモジュールで追加します。
--> Device Drivers --> Graphics Support --> Support for Framebuffer support --> Displaylink USB Framebuffer support = M
コンパイル(-jの数字はホスト側のコア数に合わせて適宜)
% make -j 4
テンポラリディレクトリにモジュールをインストール
INSTALL_MOD_PATH=$HOME/work/rpi-module make modules_install
カーネル、モジュールをRaspberry Piのしかるべき場所に配置します。
(host) arch/arm/boot/zImage → (rpi) /boot/kernel-tk.img
(host) .config → (rpi) /boot/config.txt
(host) $HOME/work/rpi-module/lib/modules/3.6.11-tk → (rpi) /lib/modules/3.6.11-tk
また、/boot/config.txt のどこかに以下の行を追加します。
kernel=kernel-tk.img
以上でカーネルとモジュールができましたので、リブートして起動を確認します。
またuname -aの出力も確認しておきましょう。
% uname -a Linux pi2 3.6.11-tk #1 PREEMPT Wed Aug 14 03:32:09 JST 2013 armv6l GNU/Linux
接続
かなり電流を食うので、セルフパワーのUSBハブを使用しましょう。ついでにRaspberry Piの電源もそちらからもらえばよいです。2Aくらい出て、スイッチつきのだと便利です。
こんなイメージ。
【2009年モデル】エレコム USBハブ 2.0対応 4ポート ACアダプタ付 2.0m ブラック U2H-TZ420SBK
- 出版社/メーカー: エレコム
- 発売日: 2009/08/19
- メディア: Personal Computers
- クリック: 1回
- この商品を含むブログ (1件) を見る
コンソール、X設定
ドライバの方はできたので、コンソールとXをUSBディスプレイに出す設定を行います。
デバイスの確認
dmesgでudlfb関係の出力を確認します。
% dmesg : [ 7.669219] udlfb: console enable=1 [ 7.674456] udlfb: fb_defio enable=1 [ 7.760408] udlfb: shadow enable=1 [ 7.829036] udlfb: vendor descriptor length:23 data:23 5f 01 0021 00 04 04 07 00 01 [ 7.959442] udlfb: DL chip limited to 1500000 pixel modes [ 7.966732] usb 1-1.3.3: reset high-speed USB device number 6 using dwc_otg [ 8.069779] udlfb: allocated 4 65024 byte urbs [ 8.149977] usbcore: registered new interface driver udlfb [ 8.178561] udlfb: 800x600 @ 74 Hz valid mode [ 8.190944] udlfb: Reallocating framebuffer. Addresses will change! [ 8.211090] udlfb: 800x600 @ 74 Hz valid mode [ 8.217193] udlfb: set_par mode 800x600 [ 8.278429] udlfb: DisplayLink USB device /dev/fb1 attached. 800x600 resolution. Using 1880K framebuffer memory :
上記では/dev/fb1に割り当てられているのが確認できます。
コンソールをLCDに出す設定
framebufferをコンソールとして使用するのにfbconという仕組みがあって、
カーネルソースの Documentation/fb/fbcon.txt に説明があります。
これを使用するにはカーネルオプション(/boot/cmdline.txtに書く)に以下のような設定を追加すればよいはずなのですが、
fbcon=map:10 fbcon=rotate:1 fbcon=font:ProFont6x11
ドライバのバグなのか設定が悪いのか、ブート時に無限にメッセージが出て進まなくなってしまいます。
(2013.10.08追記:カーネルを3.6.11から3.11.2に変えたら上記設定で動くようになりました。)
なのでこれは一旦諦めて、ブートが終わってからコマンドを発行してコンソールをfbにマップする方法を取ります。
/etc/rc.local に以下を追加
# map tty to fb1 if [ -e /dev/fb1 ]; then con2fbmap 1 1 fi
これで、起動が終わった時点でUSBモニターにgettyの画面が出るようになります。(runlevel3の場合)
Xの設定
/etc/X11/xorg.conf (新規作成):
以下は(デュアルヘッドではなく)/dev/fb1のみでXを動かす設定になります。
Section "ServerLayout" Identifier "default" Screen 0 "screenUsb" 0 0 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するとUSBモニターでXが走ります。
配線や電源をうまくまとめればコンパクトな環境にはなりそうですが、
このディスプレイ意外と重いので、持ち運びにはイマイチな感じですかねー。