USBディスプレイ LCD-8000Uをudl(4)で使う (X Window System編)
2012/03/21(水) 16:06 NetBSD はてブ情報 はてブに登録 はてブ数

ZBOXを持ち出すときに小さなディスプレイがあると便利そうなのでCenturyのLCD-8000Uを購入しました。こいつはudl(4)で動くことが報告されているので安心です。

udlはすでにNetBSDに取り込まれているのでテキストコンソールであれば何もしなくても動くのだそうです。

ところが、i386では内臓のVGAがwsdisplay0で先に使われてしまい、あれこれ試してみたのですが、やり方がまずいらしく動かすことができませんでした。

ずいぶん前にudlを試したときにはうまく動いて満足したと記憶しているのですが、その時も確かテキストコンソールは試さず、Xが動いて喜んでいた気がします。

今回も、いっそのことX Window Systemを動かした方が楽なんじゃないかと思い、そっちに方針変更することにしました。

Xを動かすためには標準のNetBSDにいくつか修正が必要になります。基本的には、ふかうみさんのhttp://www.naobsd.org/udl/にあるものを使えば良いだけです。

修正点は大きく、kernelに対する修正とudl用のディスプレイドライバの追加になります。

kernelについては圧縮・展開を司るmicrocodeの追加とudlに対するioctlの追加です。

追加・修正説明
src/sys/dev/microcode/Makefileudlのmicrocodeを追加
src/sys/dev/microcode/udl新規追加するディレクトリ
src/sys/dev/microcode/udl/*ふかうみさんのkern.diffからそのまま
src/sys/dev/usb/Makefileioctlを定義したudlio.hの追加
src/sys/dev/usb/udl.c無効化されているioctlを有効化する定義を追加 (#define notyet 1)
src/sys/dev/usb/udlio.hioctlを定義したudlio.hの実体 (kern.diffより)

Xのドライバに関する修正はsrcとxsrcの両方に必要になります。

追加・修正説明
src/external/mit/xorg/server/drivers/Makefilexf86-video-wsudlの記述を追加
src/external/mit/xorg/server/drivers/xf86-video-wsudl新規作成
src/external/mit/xorg/server/drivers/xf86-video-wsudl/Makefileふかうみさんのsrc.diffそのまま
src/share/mk/bsd.own.mkwsudlの記述を追加

xsrc

追加・修正説明
xsrc/external/mit/xf86-video-wsudl新規追加
xsrc/external/mit/xf86-video-wsudl/*ふかうみさんのxsrc.diffをベースにwsudl_driver.cを少し修正
xsrc/external/mit/xorg-server/dist/hw/xfree86/os-support/bsd/bsd_init.cふかうみさんのxsrc.diffに含まれるパッチそのまま

基本はふかうみパッチベースで良いのですが、wsudl_driver.cについては最新のxsrcへの追従が必要でした。

--- wsudl_driver.c	2012-03-24 05:47:46.000000000 +0000
+++ wsudl_driver.c.new	2012-03-21 19:36:45.000000000 +0000
@@ -67,6 +67,7 @@
 
 #include "xf86.h"
 #include "xf86_OSproc.h"
+#include "xf86_OSlib.h"
 
 #include "mipointer.h"
 #include "mibstore.h"
@@ -76,8 +77,10 @@
 
 #include "fb.h"
 
+#if GET_ABI_MAJOR(ABI_VIDEODRV_VERSION) < 6
 #include "xf86Resources.h"
 #include "xf86RAC.h"
+#endif
 
 #include "damage.h"
 
@@ -354,8 +357,10 @@
 
 	fPtr->pEnt = xf86GetEntityInfo(pScrn->entityList[0]);
 
+#if GET_ABI_MAJOR(ABI_VIDEODRV_VERSION) < 6
 	pScrn->racMemFlags = RAC_FB | RAC_COLORMAP | RAC_CURSOR | RAC_VIEWPORT;
 	pScrn->racIoFlags = pScrn->racMemFlags;
+#endif
 
 	/* open wsdisplay device */
 	dev = xf86FindOptionValue(fPtr->pEnt->device->options, "device");

上記の修正をhttp://www.tokuda.net/NetBSD/udl/6.99.3/にとりあえず置きました。パッチはバラバラでいまいちですけど。

アドホックに作業していたので、src/share/mk/bsd.own.mkの修正を入れ忘れて、ドライバ単体のコンパイル時に/configureなんて実行できねぇ、とか怒られたりしながらなんとかkernelとwsudl_drv.soを作ることができました。

openchromeドライバでの教訓をいかして、OBJディレクトリではlibwsudl_drv.soになっているのをwsudl_drv.soに忘れずリネームして/usr/X11R7/lib/modules/driversに置きます。

次のようなxorg.confを書いてstartxします。

Section "ServerLayout"
	Identifier     "X.org Configured"
	Screen      0  "Screen0" 0 0
	InputDevice    "Mouse0" "CorePointer"
	InputDevice    "Keyboard0" "CoreKeyboard"
EndSection

Section "Files"
	ModulePath   "/usr/X11R7/lib/modules"
	FontPath     "/usr/X11R7/lib/X11/fonts/misc/"
	FontPath     "/usr/X11R7/lib/X11/fonts/TTF/"
	FontPath     "/usr/X11R7/lib/X11/fonts/Type1/"
	FontPath     "/usr/X11R7/lib/X11/fonts/100dpi/"
	FontPath     "/usr/X11R7/lib/X11/fonts/75dpi/"
EndSection

Section "Module"
	Load  "dbe"
	Load  "dri"
	Load  "dri2"
	Load  "extmod"
	Load  "glx"
EndSection

Section "InputDevice"
	Identifier  "Keyboard0"
	Driver      "kbd"
	Option	    "Protocol" "wskbd"
	Option	    "Device" "/dev/wskbd"
EndSection

Section "InputDevice"
	Identifier  "Mouse0"
	Driver      "mouse"
	Option	    "Protocol" "wsmouse"
	Option	    "Device" "/dev/wsmouse"
EndSection

Section "Monitor"
	Identifier   "Monitor0"
	VendorName   "Monitor Vendor"
	ModelName    "Monitor Model"
EndSection

Section "Device"
	Identifier  "Card0"
	Driver      "wsudl"
	Option      "device" "/dev/wsdisplay1"
EndSection

Section "Screen"
	Identifier "Screen0"
	Device     "Card0"
	Monitor    "Monitor0"
	DefaultDepth 16
	SubSection "Display"
		Viewport   0 0
		Depth     16
	EndSubSection
EndSection

あれぇ、起動しません。

[    52.840] (EE) wsudl(0): We are not attached to the udl driver

こんなエラーを吐いてモジュールをアンロードするメッセージに続いています。

不思議に思いながらこのエラーメッセージでソースを追いかけてみます。

        /* open wsdisplay device */
        dev = xf86FindOptionValue(fPtr->pEnt->device->options, "device");
        fPtr->fd = wsudl_open(dev);
        if (fPtr->fd == -1)
                return (FALSE);

        /* check if we are attached to the right device driver */
        r = ioctl(fPtr->fd, WSDISPLAYIO_GTYPE, &wstype);
        if (r == -1) {
                xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
                    "ioctl WSDISPLAYIO_GTYPE: %s\n", strerror(errno));
                return (FALSE);
        }
        if (wstype != WSDISPLAY_TYPE_DL) {
                xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
                    "We are not attached to the udl driver\n");
                return (FALSE);
        }

うーん、なんだかなー、と思いながら上の方を見ると"device"という文字列が。

あー、そういえばxorg.confのOptionでdeviceを/dev/wsdisplay1に設定していたなー。

ん?! そういえば、http://www.naobsd.org/udl/README.txt

# cd /dev
# mknod -m 600 wsdisplay1 c wsdisplay 256
# mknod -m 600 wsdisplay1cfg c wsdisplay 511
# wsconscfg -f /dev/wsdisplay1cfg 0

って書いてあったけど、作ったっけ? ていうか、前に作ったけど起動するたびに消えちゃうんで困ってたんだったよなー。もしかしてデバイスをopenできないんじゃないの?

っていうことで、wsdisplay1とwsdisplay1cfgをmknodして、いざ、startx!

おー、ちゃんと動きましたぞ。

IMG_20120324_001517.jpg

残された課題としては、テキストコンソールはどうやるのか、/devにいつもwsdisplay1関連のデバイスが追加されるようにするにはどうするのか、があるので、少しづつ解決していきたいと思います。


名前:  非公開コメント   

  • TB-URL  http://www.tokuda.net/diary/0783/tb/