本系列文章仅作为记录Linux学习期间的感悟,文章内容如有侵权,请联系本人,感谢理解!拜谢各位大大~~~
frameBuffer是什么
-
Framebuffer 字面意思就是帧缓存的意思,即显存,里面保存着一帧图像。事实上,对于嵌入式系统而言。没有真正意义上的显存,Framebuffer 是通过内存模拟出来的。
- 1.1、设备位于 /dev/fb*
- 1.2、是一个platform类型设备
-
1.3、向应用层提供一个统一了标准接口的显示设备,不用关注最终输出端是
hdmi
orlcd控制器
framebuffer 显示原理如下:
frameBuffer 和 lcd 控制器的关系,如何进行协作
二者关系如下图所示
framebuffer 驱动架构
驱动层实现
驱动框架层
上图所示:fbmem.c 为内核提供的 fb框架,app应用层通过 swi中断机制,会调用到这里,然后有这里中转到具体的外设驱动
具体外设驱动
关注套路即可~
应用层实现
代码示例:
int fd_fb;
struct fb_var_screeninfo var; /* Current var */
int screen_size;
unsigned char *fbmem;
unsigned int line_width;
unsigned int pixel_width;
int main(int argc, char *argv[])
{
/*Step1: 打开设备 */
fd_fb = open("/dev/fb0", O_RDWR);
if (fd_fb < 0)
{
printf("can't open /dev/fb0\n");
return -1;
}
/*Step2:获取设备参数信息
* xres:x 方向总像素
* yres:y 方向总像素
* bits_per_pixel:每个像素占多少位
*/
if (ioctl(fd_fb, FBIOGET_VSCREENINFO, &var))
{
printf("can't get var\n");
return -1;
}
/* Step3: 计算线宽,分配显存 */
/* line_width 每行占的字节 */
line_width = var.xres * var.bits_per_pixel / 8;
pixel_width = var.bits_per_pixel / 8;
screen_size = var.xres * var.yres * var.bits_per_pixel / 8;
fbmem = (unsigned char *)mmap(NULL , screen_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd_fb, 0);
if (fbmem == (unsigned char *)-1)
{
printf("can't mmap\n");
return -1;
}
/* Step4: 清屏: 全部设为黑色 */
memset(fbmem, 0, screen_size);
/* Step5: 描点 */
lcd_put_ascii(var.xres/2, var.yres/2, 'A'); /*在屏幕中间显示8*16的字母A*/
/* Step6:释放资源*/
munmap(fbmem , screen_size);
/* Step7:关闭设备 */
close(fd_fb);
return 0;
}