USBディスプレイ LCD-8000Uをudl(4)で使う (X Window System編)
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/Makefile | udlのmicrocodeを追加 |
src/sys/dev/microcode/udl | 新規追加するディレクトリ |
src/sys/dev/microcode/udl/* | ふかうみさんのkern.diffからそのまま |
src/sys/dev/usb/Makefile | ioctlを定義したudlio.hの追加 |
src/sys/dev/usb/udl.c | 無効化されているioctlを有効化する定義を追加 (#define notyet 1) |
src/sys/dev/usb/udlio.h | ioctlを定義したudlio.hの実体 (kern.diffより) |
Xのドライバに関する修正はsrcとxsrcの両方に必要になります。
追加・修正 | 説明 |
---|---|
src/external/mit/xorg/server/drivers/Makefile | xf86-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.mk | wsudlの記述を追加 |
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!
おー、ちゃんと動きましたぞ。
残された課題としては、テキストコンソールはどうやるのか、/devにいつもwsdisplay1関連のデバイスが追加されるようにするにはどうするのか、があるので、少しづつ解決していきたいと思います。
- TB-URL http://www.tokuda.net/diary/0783/tb/