steletoの日記 このページをアンテナに追加 RSSフィード

2008-04-17

[][][] w100_pan_display 01:53  w100_pan_displayを含むブックマーク  w100_pan_displayのブックマークコメント

他所のpan対応パッチや、先日の描画回りログの結果からして、「とりあえずpan_display()でY軸方向に首振りできるようにすればいいのかな?」と推測。

ということで、いろいろなpan対応パッチw100_set_dispregs()をマネマネしてみたらこんなのができた。landscapeな画面でしか確認してないけどもキー飛び飛び現象は直ったっぽい。これでいいのか知らんけど動いてるからいいや。

--- w100fb.c.orig       2008-04-18 09:33:45.000000000 +0900
+++ w100fb.c    2008-04-18 09:36:01.000000000 +0900
@@ -680,6 +680,11 @@
  */
 static int w100fb_set_par(struct fb_info *info)
 {
+       return 0;
+}
+
+static int w100fb_set_par_init(struct fb_info *info)
+{
        struct w100fb_par *par=info->par;

        if (par->xres != info->var.xres || par->yres != info->var.yres) {
@@ -688,7 +693,7 @@
                par->mode = w100fb_get_mode(par, &par->xres, &par->yres, 0);

                info->fix.visual = FB_VISUAL_TRUECOLOR;
-               info->fix.ypanstep = 0;
+               info->fix.ypanstep = 1;
                info->fix.ywrapstep = 0;
                info->fix.line_length = par->xres * BITS_PER_PIXEL / 8;

@@ -706,6 +711,41 @@
 }


+static int w100fb_pan_display(struct fb_var_screeninfo *var, struct fb_info *info)
+{
+       struct w100fb_par *par = info->par;
+       int yres = 0, offset = 0;
+
+       if (par->xres == par->mode->xres) {
+               if (par->flip) {
+                       /* 180 degree */
+                       yres = info->var.yres + var->yoffset;
+                       offset = (info->var.xres * yres) - 1;
+               } else {
+                       /*   0 degree */
+                       offset = info->var.xres * var->yoffset;
+               }
+       } else {
+               if (par->flip) {
+                       /* 270 degree */
+                       offset = info->var.xres * var->yoffset - 1;
+               } else {
+                       /*  90 degree */
+                       yres = info->var.yres + var->yoffset;
+                       offset = par->xres * (yres - 1);
+               }
+       }
+
+       w100_update_disable();
+
+       writel(W100_FB_BASE + ((offset * BITS_PER_PIXEL / 8) & ~0x03UL),
+              remapped_regs + mmGRAPHIC_OFFSET);
+
+       w100_update_enable();
+
+               return 0;
+}
+
 /*
  *  Frame buffer operations
  */
@@ -720,6 +760,7 @@
        .fb_copyarea  = w100fb_copyarea,
        .fb_imageblit = w100fb_imageblit,
        .fb_sync      = w100fb_sync,
+       .fb_pan_display = w100fb_pan_display,
 };

 #ifdef CONFIG_PM
@@ -922,7 +963,7 @@
                goto out;
        }

-       w100fb_set_par(info);
+       w100fb_set_par_init(info);

        if (register_framebuffer(info) < 0) {
                err = -EINVAL;

androidzaurusandroidzaurus 2008/04/19 08:39 すごーい。すごーい。ちゃんとダブルバッファだー。メモリは足りているんだろうか。動いているから足りてるんだろうな。FB_ BASEってw100についてるSRAM指してませんでしたっけ?

steletosteleto 2008/04/22 00:46 おぉっW100_FB_BASEの中身までは全然気にしてませんでしたw
というわけで確認してみましたが、W100_FB_BASE→MEM_EXT_BASE_VALUE→0x800000でしたんでw100内蔵RAMではなくそこにぶら下っている外付けSDRAM(1M×16bit)っぽいです。(容量はWalrus.Visit.さんところより)

http://digit.que.ne.jp/visit/index.cgi?Linux%a5%b6%a5%a6%a5%eb%a5%b9%b3%ab%c8%af%a5%e1%a5%e2%2f%a5%cf%a1%bc%a5%c9%a5%a6%a5%a7%a5%a2#i14

VGAがちょうど300KiB×16bitなのでダブルバッファしても大丈夫そうです。

dot_h2o2dot_h2o2 2008/05/28 00:23 貴重な情報、ありがとうございます。
C760でも効果がありました。
(描写処理も早くなったように感じられます。)