Raspberry Pi でUSBディスプレイを使う

LCD-8000UというUSB接続のディスプレイが手元にあるので、Raspberry Piで使用してみました。

今入手するとしたらこちらですかね。

センチュリー PLUS ONE 8インチUSB接続サブモニター ブラック LCD-8000U2

センチュリー PLUS ONE 8インチUSB接続サブモニター ブラック LCD-8000U2

たぶん同じような手順で使えると思いますが、保証はいたしません(^^;

参考にしたページ
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くらい出て、スイッチつきのだと便利です。
こんなイメージ。

コンソール、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が走ります。

配線や電源をうまくまとめればコンパクトな環境にはなりそうですが、
このディスプレイ意外と重いので、持ち運びにはイマイチな感じですかねー。