Yoh2の日記: USB接続サブモニタ (CENUTRY LCD-8000U) をLinuxで動かしてみる (メモ) 3
ちょいと前にUSB接続のディスプレイを買った。
モノはCENTURYのLCD-8000U。
これはDisplayLink社のチップを使っているらしい。
こいつをLinuxで動かそうといろいろ試してみた。
眠いので体裁を整えたり、詳細を記述したりするのは後回しにするとして、とりあえずつらつらと。
- 各種情報はfreedesktop.org DisplayLink Wikiを基点に探すとよい。
- 上記ページで紹介されているフレームバッファドライバは以下の3つ。
- udlfb
- displaylink-mod
- displaxlinkfb
- udlfb or displaylink-modと連携して動くXのディスプレイドライバ xf86-driver-displaylink もある。
- 他、ユーザーモードのライブラリlibdloがある。
udlfb
オリジナルのDisplayLinkフレームバッファドライバ。カーネル2.6.31ではstagingドライバとして試験的に入っている。
解像度がハードコーディングされている4種(800x480、1024x768、1280x1024、1480x1050)のみ対応。
それ以外の解像度だと1280x1024として扱われる。
LCD-8000Uの解像度は800x600のため、やっぱり1280x1024に。
モニタは左上の800x600の領域を映している。
fbgrabなんかすると右下がスカスカ。
displaylink-mod
udlfbの発展版。いろんな解像度に対応。構造体のメンバ定義が変わったため、新しめのカーネルではちょっといじらないとコンパイルが通らない。
これ + mplayerの -vo fbdev2 だと表示がおかしい。udlfbならOKなんだが。なぜに。
なお、-vo fbdevならdisplaylink-modでも大丈夫。
displaylinkfb
udlfbやdisplaylink-modがちと癖のあるフレームバッファデバイスなのに対し、こちらを使うとごく普通のフレームバッファデバイスとして動作させることができるらしい。
Xもvesa用のドライバがそのまま使えるらしい。
……が、これ、今のところうまく動かせてない。
モジュールは作って読み込ませるまではうまく動くけど、デバイスを繋ぐと、register_framebuffer()等のAPIのバージョンが違うとか言われて失敗する。うーむ。
(udlfb、displaylink-mod利用時の画面更新タイミング)
単純にmplayerの-vo fbdev or fbdev2を使って動画再生しようとしても画面が全然更新されない。
デバイスファイルをクローズするか、ioctl()を使う必要あり。
画面更新用のioctl()リクエスト番号は0xAA。
パラメータには以下の構造体へのポインタを渡す。
struct dloarea
{
int x, y;
int w, h;
int x2, y2;
};
x、y、w、hで更新領域の指定。x2、y2は使用しない。
このioctl()を適当な更新タイミングで繰り返し呼び出し続ければその都度再描画されるので、そういったプログラムを動かしつつmplayerを動かせば動画もOK。
ioctl()リクエスト番号0xADでEDIDの値が得られるので、画面の大きさ等を動的に得たい場合はこれを使うべし。このioctl()のパラメータには128バイトのバッファを渡す。
プログラムを書くのが面倒なら、bashスクリプトで
while true; do touch /dev/fbX; done
(fbXのXの部分には適切な数値を入れること)
としてお茶を濁すのも可。ただしCPU使用率はちと高め。
xf86-driver-displaylink
IntelのドライバやATIのドライバでXineramaをオンにすると
Xサーバが起動しないので今のところ使い物にならず。
Xineramaオフなら何とか動くけどうれしくない。
Intelのドライバに関しては、displaylink-modのソースと同じサーバに、displaylink-modと同時に動かすことができると思わしきドライバのソースがあった (ただしexperimental)。
でもビルドできず断念。(今入れてるXのバージョンが新しすぎるっぽい)
libdlo
動いたー。make checkで何か映ったー。わーい。
うん。今のところそれだけ。
# ところで、この製品、モニタの明るさを三段階(Hi/Mid/Lo)に
# 設定できるけど、マニュアルを読むと、Lo以外は消費電流が
# USB規格上の上限の500mAを超える仕様。
# んで、デフォルト設定がMid。いいのか?
# ……まあいいか、CENTURYだし(何
私のも (スコア:1)
ところで、このチップ色表現が酷い有様ではありませんか?
綺麗なグラデーションの場合、階段のような層が出来て気になります。
Re:私のも (スコア:1)
16bppにするとひどくなりますね……て、これは他のモニタでも一緒でした。単に色数の限界みたいです。
32bppでは綺麗なものです。
とはいえ、デスクトップPCにつないでいるモニタ(EIZO FlexScan S2000)と比べるとさすがに画質は劣ります。
でもノートPC(Lenovo ThinkPad X61)よりは上に感じます。まあ、このノートPCのモニタは映ればいいと割り切ったモノでしょうけど。
あと、グラデーション画像を、色が変化している方向に移動させると、その間だけちょと段差が見えますね。
もし、32bppの静止画像でも階段状に見えるのなら、チップの種類(LCD-8000UはDL-120というチップらしい)か液晶パネルで差が出てるのかもしれませんね。
# あるいは目の肥え方の差かも。
巧妙に潜伏したバグは心霊現象と区別が付かない。
Re:私のも (スコア:1)
色に関しては諦めるとして1つ問題が
Win7でAeroON(or 32bit?)の場合、動画を再生するとジャギーが発生する
3Dゲームを試しに表示させた所、停止時は正常、動き出すとジャギー発生
試しに32から16bitに下げたところ正常に表示したものの、aeroがoffになってしまい
使いにくいです。
USB2.0の転送速度の限界
搭載チップの限界等が考えられます。
チェック環境
win7 x64 AMD PhenomX4