没有合适的资源?快使用搜索试试~ 我知道了~
lcd设备驱动之全解析.docx
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 130 浏览量
2023-09-01
13:56:29
上传
评论
收藏 331KB DOCX 举报
温馨提示
试读
62页
lcd设备驱动之全解析.docx
资源推荐
资源详情
资源评论
linux 中 LCD 设备驱动(1)——framebuffer(帧缓冲)
1、framebuffer 帧缓冲
帧缓冲(framebuffer)是 Linux 系统为显示设备提供的一个接口,它将
显示缓冲区抽象,屏蔽图像硬件的底层差异,允许上层应用程序在图形模式下
直接对显示缓冲区进行读写操作。用户不必关心物理显示缓冲区的具体位置及
存放方式,这些都由帧缓冲设备驱动本身来完成。
framebuffer 机制模仿显卡的功能,将显卡硬件结构抽象为一系列的数据
结构,可以通过 framebuffer 的读写直接对显存进行操作。用户可以将
framebuffer 看成是显存的一个映像,将其映射到进程空间后,就可以直接进行
读写操作,写操作会直接反映在屏幕上。
framebuffer 是个字符设备,主设备号为 29,对应于/dev/fb%d 设备文件。
通常,使用如下方式(前面的数字表示次设备号)
0 = /dev/fb0 第一个 fb 设备
1 = /dev/fb1 第二个 fb 设备
fb 也是一种普通的内存设备,可以读写其内容。例如,屏幕抓屏:cp
/dev/fb0 myfilefb 虽然可以像内存设备(/dev/mem)一样,对其
read,write,seek 以及 mmap。但区别在于 fb 使用的不是整个内存区,而是显存
部分。
2、fb 与应用程序的交互
对于用户程序而言,它和其他的设备并没有什么区别,用户可以把 fb 看成是一
块内存,既可以向内存中写数据,也可以读数据。fb 的显示缓冲区位于内核空
间,应用程序可以把此空间映射到自己的用户空间,在进行操作。
在应用程序中,操作/dev/fbn 的一般步骤如下:
(1)打开/dev/fbn 设备文件。
(2)用 ioctl()操作取得当前显示屏幕的参数,如屏幕分辨率、每
个像素点的比特数。根据屏幕参数可计算屏幕缓冲区的大小。
(3)用 mmap()函数,将屏幕缓冲区映射到用户空间。
(4)映射后就可以直接读/写屏幕缓冲区,进行绘图和图片显示了。
3、fb 的结构及其相关结构体
在 linux 中,fb 设备驱动的源码主要在 Fb.h (linux2.6.28\include\linux)和
Fbmem.c (linux2.6.28\drivers\video)两个文件中,它们是 fb 设备驱动的中间
层,为上层提供系统调用,为底层驱动提供接口。
在 fb.h 文件中有 fb 驱动需要使用的很多结构,我们先对这些结构体进行说明:
本章共介绍 5 个结构体:
(1)、struct fb_info 结构体
(2)、struct fb_ops 结构体
(3)、struct fb_fix_screeninfo 结构体
(4)、struct fb_var_screeninfo 结构体
(5)、struct fb_cmap 结构体
(1)、struct fb_info 结构体介绍
一个帧缓冲区对应一个 struct fb_info 结构,它包括了帧缓冲设备的属性和操
作的完整集合,每个帧设备都有一个 fb_info 结构体。源码如下:
struct fb_info {
int node;
int flags;
struct mutex lock;/* Lock for open/release/ioctl funcs */互斥锁
struct fb_var_screeninfo var;/* Current var */当前缓冲区的可变参数
struct fb_fix_screeninfo fix;/* Current fix */固定参数
struct fb_monspecs monspecs;/* Current Monitor specs */当前显示器标志
struct work_struct queue;/* Framebuffer event queue */帧缓冲事件队列
struct fb_pixmap pixmap;/* Image hardware mapper */图像硬件 mapper
struct fb_pixmap sprite;/* Cursor hardware mapper */光标硬件 mapper
struct fb_cmap cmap;/* Current cmap */当前的调色板
struct list_head modelist; /* mode list */
struct fb_videomode *mode;/* current mode */当前的视频模式
#ifdef CONFIG_FB_BACKLIGHT 如果配置了 LCD 支持背光灯
/* assigned backlight device */
/* set before framebuffer registration,
remove after unregister */背光调整
struct backlight_device *bl_dev;
/* Backlight level curve */
struct mutex bl_curve_mutex;
u8 bl_curve[FB_BACKLIGHT_LEVELS];
#endif
#ifdef CONFIG_FB_DEFERRED_IO
struct delayed_work deferred_work;
struct fb_deferred_io *fbdefio;
#endif
struct fb_ops *fbops;帧缓冲操作函数集
struct device *device;/* This is the parent */父设备
struct device *dev;/* This is this fb device */fb 设备
int class_flag; /* private sysfs flags */私有的
sysfs 标志
#ifdef CONFIG_FB_TILEBLITTING
struct fb_tile_ops *tileops; /* Tile Blitting */图块 blitting
#endif
char __iomem *screen_base;/* Virtual address */虚拟基地址
unsigned long screen_size;/* Amount of ioremapped VRAM or 0 */ ioremap 的
虚拟内存大小
void *pseudo_palette;/* Fake palette of 16 colors */ 伪 16 位调色板
#define FBINFO_STATE_RUNNING 0
#define FBINFO_STATE_SUSPENDED 1
u32 state; /* Hardware state i.e suspend */硬件的状态
void *fbcon_par; /* fbcon use-only private area
*/
/* From here on everything is device dependent */
void *par;
};
(2)、struct fb_ops 结构体介绍
/*
* Frame buffer operations
*
* LOCKING NOTE: those functions must _ALL_ be called with the console
* semaphore held, this is the only suitable locking mechanism we have
* in 2.6. Some may be called at interrupt time at this point though.
*/
fb_ops 结构体用来实现对帧缓冲设备的操作,这些函数需要驱动开发人员编写,
struct fb_ops {
/* open/release and usage marking */
struct module *owner;
打开和释放
int (*fb_open)(struct fb_info *info, int user);
int (*fb_release)(struct fb_info *info, int user);
这两个函数对于非线性布局的/常规内存映射无法工作的帧缓冲设备需要
/* For framebuffers with strange non linear layouts or that do not
* work with normal memory mapped access
*/
ssize_t (*fb_read)(struct fb_info *info, char __user *buf,
size_t count, loff_t *ppos);
ssize_t (*fb_write)(struct fb_info *info, const char __user *buf,
size_t count, loff_t *ppos);
检测可变参数,并调整到支持的值
/* checks var and eventually tweaks it to something supported,
* DO NOT MODIFY PAR */
int (*fb_check_var)(struct fb_var_screeninfo *var, struct fb_info
*info);
设置视频模式
/* set the video mode according to info->var */
int (*fb_set_par)(struct fb_info *info);
设置 color 寄存器的值
/* set color register */
int (*fb_setcolreg)(unsigned regno, unsigned red, unsigned green,
unsigned blue, unsigned transp, struct fb_info *info);
批量设置 color 寄存器,设置颜色表
/* set color registers in batch */
int (*fb_setcmap)(struct fb_cmap *cmap, struct fb_info *info);
显示空白
剩余61页未读,继续阅读
资源评论
南抖北快东卫
- 粉丝: 72
- 资源: 5584
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功