QT 在 Framebuffer上的字体显示问题

最近做了一个Linux下的 frambuffer驱动,然后移植了qt5和qt4,
为了做一个简单的demo用于验证驱动是好的。
现在的现象是,通过qt在显示ttf字体的时候,感觉渲染非常糟糕,不知道是驱动问题还是配置问题。
下面两个截图,2个图显示的内容一样,唯一的区别是,字体颜色不同。
为了区分ttf显示样式,还同时显示了点阵字体(所谓qpf字体)。
其中,上方法时间字符串为点阵字体;下发的英文为ttf字体。
图1显示的字体颜色为蓝色,可以看到点阵字体显示正常,但是ttf就很奇怪。
图2显示的字体颜色为白色,两者看起来显示都正常,ttf还蛮好看的。
另外,已经经过直接写入fb验证,rgb颜色序列在驱动中是正确的。
图片说明

图片说明

现在搞不清楚 到底哪里有问题。
另外,也直接使用 FreeType2来读取点阵来显示,这个和直接显示点阵字体一样,没什么问题。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
 #define IMAGE_WIDTH     128                 
 #define IMAGE_HEIGHT    96
 
//set to 0 means use internal fp_ops
static struct fb_ops oledfb_ops ={.owner        = THIS_MODULE,};
static struct fb_info *oled_fb_info;
 
int fb_init(void)
{
    int r;
     
    oled_fb_info=framebuffer_alloc(0, NULL);
     
     
    strcpy(oled_fb_info->fix.id, "OLED-SPI-1.27");
     
    oled_fb_info->fix.smem_len    = IMAGE_WIDTH*IMAGE_HEIGHT*3;
    oled_fb_info->fix.type        = FB_TYPE_PACKED_PIXELS;
    oled_fb_info->fix.visual      = FB_VISUAL_TRUECOLOR;
    oled_fb_info->fix.line_length = IMAGE_WIDTH * 3;
 
    oled_fb_info->var.xres             = IMAGE_WIDTH;
    oled_fb_info->var.yres             = IMAGE_HEIGHT;
    oled_fb_info->var.xres_virtual     = IMAGE_WIDTH;
    oled_fb_info->var.yres_virtual     = IMAGE_HEIGHT;
    oled_fb_info->var.bits_per_pixel   = 24;
     
    oled_fb_info->var.height=19;//mm unit
    oled_fb_info->var.width=26;//mm unit
     
     
    oled_fb_info->var.red.offset       = 16;
    oled_fb_info->var.green.offset     = 8;
    oled_fb_info->var.blue.offset      = 0;
     
    oled_fb_info->var.red.length       = 8;
    oled_fb_info->var.blue.length      = 8;
    oled_fb_info->var.green.length     = 8;
     
     
    oled_fb_info->fbops=&oledfb_ops;
     
    //oled_fb_info->pseudo_palette=colregs;
     
    //this is used fo mmap
    oled_fb_info->fix.smem_start = virt_to_phys(pOledDrv->pFrameBuffer);
    oled_fb_info->screen_base    = pOledDrv->pFrameBuffer;
     
    r=register_framebuffer(oled_fb_info);
 
    printk("register fb :%d\n",r);
     
    printk("fb buffer:%x,(P:%lx)\n",(int)oled_fb_info->screen_base,oled_fb_info->fix.smem_start);
     
    return 0;
}

问题找到,是驱动问题,因为我的屏幕需要对每一个色值进行 >>2才能正常。
也就是我的屏幕支持的颜色为6*6*6模式。。。。

楼主,你好。您这个项目的做法是否是将screen_base设置为自己申请的内存,然后再通过其他内核线程将内存里的数据通过IIC写入OLED?