Linux驱动入门(一)FrameBuffer

本系列文章仅作为记录Linux学习期间的感悟,文章内容如有侵权,请联系本人,感谢理解!拜谢各位大大~~~

frameBuffer是什么

Framebuffer 字面意思就是帧缓存的意思,即显存,里面保存着一帧图像。事实上,对于嵌入式系统而言。没有真正意义上的显存,Framebuffer 是通过内存模拟出来的。
1.1、设备位于 /dev/fb*
1.2、是一个platform类型设备
1.3、向应用层提供一个统一了标准接口的显示设备,不用关注最终输出端是 hdmi or lcd控制器

framebuffer 显示原理如下:
在这里插入图片描述

frameBuffer 和 lcd 控制器的关系,如何进行协作

二者关系如下图所示
Linux内核-fb框架

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;     
}

参考资料:
Linux LCD Frambuffer 基础介绍和使用

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值