[Armadillo:04137] Re: SVGA表示時にディスプレイにて両端が切れる
nakai
email@hidden
2009年 3月 23日 (月) 18:55:58 JST
nakaiです。
modedbをいじって、
フロントポーチ、バックポーチ、同期期間などを調整してみてはどうでしょう?
山内 洋典 さんは書きました:
> NTTDMSEの山内です。
> いつもお世話になっております。
>
> Quixunのタッチパネル QT-802-AV-TPをArmadillo-500に接続し、
> 以下の手順にて動作させることが出来ましたが、
> ディスプレイ側のOSDから水平位置等を調節しても
> 表示領域の両端が切れてしまいます。
> (directFBのプログラムdf_inputで確認しております。)
>
> directfbrc, mxcfbドライバ等いじりながら探っておりますが、
> 表示内容には変化がありません。
> このあたりの問題をLinuxとして解決したい場合には
> どのあたりのソースをいじるのが妥当なのでしょうか?
>
>
> ○作業内容
>
> ※対象カーネルソースはAtmark-dist。
> CFカード上のDebian環境でも、カーネルイメージに同じものを使えば動作しました。
>
> ・directfbをカーネルに組込み
> 参考URL:http://armadillo.atmark-techno.com/articles/sd-a500-embedded-course-ch4
>
> ・USB touchscreenドライバに手を入れる
> 参考URL:http://armadillo.atmark-techno.com/articles/sd-a500-embedded-course-ch4
>
> 上記の対応に加えていくつか対応を入れる。
>
> ・全てのドライバをカーネル組込みにするとusbtouchscreenよりusbhidが優先されるので、
> USB HIDに認識されないようにHID_QUIRK_IGNOREフラグを設定。
> 参考URL:http://www.netfort.gr.jp/~dancer/diary/200709.html
>
> drivers/usb/input/hid-core.c
> /* ##### 2009.03.17 added */
> //ignore EGALAX DEVICES
> { 0x3823, 0x0001, HID_QUIRK_IGNORE },
> { 0x0123, 0x0001, HID_QUIRK_IGNORE },
> { 0x0eef, 0x0001, HID_QUIRK_IGNORE },
> { 0x0eef, 0x0002, HID_QUIRK_IGNORE },
>
> ・データフォーマットが想定と違うためusbtouchscreen.cでドロップされている様なので対応
>
> ドライバは画面をタッチ時に0x80または0x81から始まる5byteが読み出されることを想定しているが、
> usbtouchscreen.c egalax_process()にprintk()を追加して確認したところ、
> 実際にQT802を接続時には以下の様な6byte(例:02 03 58 00 84 00)が読み取れる。
> /* pkt
> * [0] 02(fixed)
> * [1] 03 press 02 release
> * [2-3] X
> * [4-5] Y
> */
> drivers/usb/input/usbtouchscreen.c に以下の様な対応を追加。
>
> static int egalax_read_data(unsigned char *pkt, int *x, int *y, int *touch, int *press)
> {
> //printk(KERN_INFO "egalax_read_data: pkt %02X %02X %02X %02X %02X %02X\n", pkt[0], pkt[1], pkt[2], pkt[3], pkt[4], pkt[5]);
>
> /* pkt
> * [0] 02(fixed)
> * [1] 03 press 02 release
> * [2-3] X 48-1932
> * [4-5] Y 128-1900
> */
> int _x, _y;
> _x = (pkt[3] << 8) | (pkt[2] & 0xFF);
> _y = (pkt[5] << 8) | (pkt[4] & 0xFF);
> _x = 1932 - _x;
> _y = 1900 - _y;
> if( _x < 0 ){ _x = 0; }
> if( _y < 0 ){ _y = 0; }
>
> *x = (int)( (CONFIG_INPUT_TSDEV_SCREEN_X * _x ) / (1932-48));
> *y = (int)( (CONFIG_INPUT_TSDEV_SCREEN_Y * _y ) / (1900-128));
> if(pkt[1] == 0x02)
> {
> *touch = 0x01;
> }
> else
> {
> *touch = 0x00;
> }
>
> printk(KERN_INFO "egalax_read_data: x=%d y=%d touch=%d\n", *x, *y, *touch);
>
> // if ((pkt[0] & EGALAX_PKT_TYPE_MASK) != EGALAX_PKT_TYPE_REPT)
> // return 0;
>
> //#if !defined(CONFIG_USB_TOUCHSCREEN_EGALAX_QT701AVS)
> // *x = ((pkt[3] & 0x0F) << 7) | (pkt[4] & 0x7F);
> // *y = ((pkt[1] & 0x0F) << 7) | (pkt[2] & 0x7F);
> //#else
> // {
> // int _x, _y, _x2, _y2;
> // _x = ((pkt[1] & 0x0F) << 7) | (pkt[2] & 0x7F);
> // _y = ((pkt[3] & 0x0F) << 7) | (pkt[4] & 0x7F);
> //
> // _x2 = ((_x - 90) < 0 ? 0 : (_x - 90));
> // _y2 = ((1900 - _y) < 0 ? 0 : (1900 - _y));
> //
> // printk(KERN_ERR "egalax_read_data: _x,_y %d %d _x2,_y2 %d %d\n", _x, _y, _x2, _y2);
> //
> // *x = (int)((CONFIG_INPUT_TSDEV_SCREEN_X * _x2) / 1850);
> // *y = (int)((CONFIG_INPUT_TSDEV_SCREEN_Y * _y2) / 1750);
> // }
> //#endif
> //
> // *touch = pkt[0] & 0x01;
>
> return 1;
>
> }
>
> static int egalax_get_pkt_len(unsigned char *buf)
> {
> switch (buf[0] & EGALAX_PKT_TYPE_MASK) {
> case EGALAX_PKT_TYPE_REPT:
> return 5;
>
> case EGALAX_PKT_TYPE_DIAG:
> return buf[1] + 2;
>
> //##### 2009.03.17 added
> case 0x02:
> return 6;
> }
>
> return 0;
> }
>
> ・tsdev evdev usbhid usbtouchscreenをカーネル組込みで設定。
>
> Device Drivers --->
> input device support --->
> <*> Touchscreen interface
> (800) Horizontal screen resolution
> (600) Vertical screen resolution
> <*> Event interface
> USB support --->
> <*> USB Human Interface Device(full HID) support
> <*> USB Touchscreen Drfiver
> [*] eGalax device support
>
> ⇒この時点でQT802のタッチパネルが一応動作する。
>
>
> 以上、よろしくお願いします。
> ============================================================
> 山内 洋典 <email@hidden>
>
> _______________________________________________
> armadillo mailing list
> email@hidden
> http://lists.atmark-techno.com/cgi-bin/mailman/listinfo/armadillo
armadillo メーリングリストの案内