最近做了一个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?