【Linux高级驱动】LCD驱动框架分析
2023-09-27 14:27:16 时间
1.framebuffer接口层(fbmem.c)
功能:给用户提供接口
fbmem_init //入口函数
/*1.申请主设备号,注册字符设备*/
register_chrdev(FB_MAJOR(29),"fb",&fb_fops)
/*2.创建一个设备类*/
fb_class = class_create(THIS_MODULE, "graphics");
static const struct file_operations fb_fops = {
.owner = THIS_MODULE,
.read = fb_read,
.write = fb_write,
.unlocked_ioctl = fb_ioctl,
#ifdef CONFIG_COMPAT
.compat_ioctl = fb_compat_ioctl,
#endif
.mmap = fb_mmap,
.open = fb_open,
.release = fb_release,
#ifdef HAVE_ARCH_FB_UNMAPPED_AREA
.get_unmapped_area = get_fb_unmapped_area,
#endif
#ifdef CONFIG_FB_DEFERRED_IO
.fsync = fb_deferred_io_fsync,
#endif
};
/*1.申请主设备号,注册字符设备*/
register_chrdev(FB_MAJOR(29),"fb",&fb_fops)
/*2.创建一个设备类*/
fb_class = class_create(THIS_MODULE, "graphics");
static const struct file_operations fb_fops = {
.owner = THIS_MODULE,
.read = fb_read,
.write = fb_write,
.unlocked_ioctl = fb_ioctl,
#ifdef CONFIG_COMPAT
.compat_ioctl = fb_compat_ioctl,
#endif
.mmap = fb_mmap,
.open = fb_open,
.release = fb_release,
#ifdef HAVE_ARCH_FB_UNMAPPED_AREA
.get_unmapped_area = get_fb_unmapped_area,
#endif
#ifdef CONFIG_FB_DEFERRED_IO
.fsync = fb_deferred_io_fsync,
#endif
};
2.从应用层往下分析
open
app: open("/dev/xxx",xxx)
===============================
vfs: sys_open
...
...
fbmem.c struct file_operations fb_fops
.open = fb_open,
/*1.获取此设备号*/
int fbidx = iminor(inode);
struct fb_info *info;
/*2.以此设备号为下标,从register_fb数组中取出fb_info结构体*/
info = registered_fb[fbidx];
file->private_data = info;
if (info->fbops->fb_open) {
res = info->fbops->fb_open(info,1);
===============================
vfs: sys_open
...
...
fbmem.c struct file_operations fb_fops
.open = fb_open,
/*1.获取此设备号*/
int fbidx = iminor(inode);
struct fb_info *info;
/*2.以此设备号为下标,从register_fb数组中取出fb_info结构体*/
info = registered_fb[fbidx];
file->private_data = info;
if (info->fbops->fb_open) {
res = info->fbops->fb_open(info,1);
ioctl
app: ioctl(fd,FBIOGET_VSCREENINFO,args)
===========================================
vfs: sys_ioctl
...
...
fbmem.c struct file_operations fb_fops
.unlocked_ioctl = fb_ioctl,
/*1.获取此设备号*/
struct inode *inode = file->f_path.dentry->d_inode;
int fbidx = iminor(inode);
/*2.以此设备号为下标,从register_fb数组中取出fb_info结构体*/
struct fb_info *info = registered_fb[fbidx];
do_fb_ioctl(info, cmd, arg);
struct fb_var_screeninfo var; //表示可变参数
struct fb_fix_screeninfo fix; //表示固定参数
switch (cmd) {
case FBIOGET_VSCREENINFO:
if (!lock_fb_info(info))
return -ENODEV;
var = info->var; //取出fb_info中的可变参数
unlock_fb_info(info);
ret = copy_to_user(argp, &var, sizeof(var)) ? -EFAULT : 0;
break;
}
===========================================
vfs: sys_ioctl
...
...
fbmem.c struct file_operations fb_fops
.unlocked_ioctl = fb_ioctl,
/*1.获取此设备号*/
struct inode *inode = file->f_path.dentry->d_inode;
int fbidx = iminor(inode);
/*2.以此设备号为下标,从register_fb数组中取出fb_info结构体*/
struct fb_info *info = registered_fb[fbidx];
do_fb_ioctl(info, cmd, arg);
struct fb_var_screeninfo var; //表示可变参数
struct fb_fix_screeninfo fix; //表示固定参数
switch (cmd) {
case FBIOGET_VSCREENINFO:
if (!lock_fb_info(info))
return -ENODEV;
var = info->var; //取出fb_info中的可变参数
unlock_fb_info(info);
ret = copy_to_user(argp, &var, sizeof(var)) ? -EFAULT : 0;
break;
}
搜索registered_fb数组,看在哪里被设置了?
s3c_fb_probe(struct platform_device *pdev)
...
...
for (win = 0; win < S3C_FB_MAX_WIN; win++) {
/*设置一个硬件窗口:一个窗口就是一个帧缓冲设备,一个帧缓冲设备用struct fb_info来描述*/
s3c_fb_probe_win //drivers\video\s3c-fb.c
/*构建fb_info:表示一个帧缓冲设备*/
/*设置fb_info*/
/*设置它的可变参数*/
/*设置它的固定参数*/
/*设置它的操作方法*/
/*注册一个fb_info结构体*/
register_framebuffer(struct fb_info *fb_info)
/*将fb_info加入数组项*/
registered_fb[i] = fb_info;
...
...
for (win = 0; win < S3C_FB_MAX_WIN; win++) {
/*设置一个硬件窗口:一个窗口就是一个帧缓冲设备,一个帧缓冲设备用struct fb_info来描述*/
s3c_fb_probe_win //drivers\video\s3c-fb.c
/*构建fb_info:表示一个帧缓冲设备*/
/*设置fb_info*/
/*设置它的可变参数*/
/*设置它的固定参数*/
/*设置它的操作方法*/
/*注册一个fb_info结构体*/
register_framebuffer(struct fb_info *fb_info)
/*将fb_info加入数组项*/
registered_fb[i] = fb_info;
@成鹏致远
(blogs:http://lcw.cnblogs.com)
(email:wwwlllll@126.com)
(qq:552158509)
相关文章
- linux每日命令(20):find命令概览
- linux kernel编译配置相关
- 【ARM-Linux开发】Rico Board上编译USB WiFi RT3070驱动
- 【Linux开发】V4L2驱动框架分析学习
- 【Linux开发】linux设备驱动归纳总结(五):2.操作硬件——IO内存
- 【Linux开发】linux设备驱动归纳总结(四):1.进程管理的相关概念
- 【Linux开发】linux设备驱动归纳总结(三):7.异步通知fasync
- linux硬链接与软链接
- 在linux里面ps -ef | grep tomcat 什么意思
- 如何安装pandom : 一个针对Linux的真随机数生成器
- 转:学习linux驱动经典书籍
- Linux下smi/mdio总线驱动
- Linux shell中的一个问题 ${}带正则匹配的表达式
- linux下不同服务器间数据传输(wget,scp)
- Linux cc与gcc
- Linux设备驱动(转)
- linux内核驱动中_IO, _IOR, _IOW, _IOWR 宏的用法与解析
- linux下so动态库一些不为人知的秘密(中二)
- 21.Linux-写USB键盘驱动(详解)
- 14.linux-platform机制实现驱动层分离(详解)
- LINUX下CDT和EDT时区的切换
- 从Tiny4412--mma7660 gsensor驱动探索Linux内核I2C总线驱动框架
- 手把手教你从零实现Linux misc设备驱动二(基于友善之臂4412开发板)
- Linux下GPIO驱动
- 嵌入式Linux USB WIFI驱动的移植
- 怎样在Windows和Linux下写相同的代码