博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【Linux高级驱动】LCD驱动框架分析
阅读量:5773 次
发布时间:2019-06-18

本文共 2173 字,大约阅读时间需要 7 分钟。

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

 

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

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

    搜索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;

 

 

  @成鹏致远

(blogs:

(emailwwwlllll@126.com)

(qq552158509

 

转载地址:http://sexux.baihongyu.com/

你可能感兴趣的文章
Linux系统监视利器--htop
查看>>
Linux下挂载LVM遇到卷组同名的解决方法
查看>>
PHP 的 uniqid 函数产生的 id 真的是唯一的么?
查看>>
TCP/IP 协议
查看>>
以太网
查看>>
Linux下PHP Oracle客户端扩展(OCI8)安装
查看>>
MySQL主从配置
查看>>
windows环境中python3.5下安装paramiko
查看>>
群集技术全接触
查看>>
基于RTSP的实现多媒体文件下载
查看>>
epoll的一点总结
查看>>
grub密码
查看>>
AS3实用小知识
查看>>
golang中recover和panic用法
查看>>
我的友情链接
查看>>
PingingLab传世经典系列《CCNA完全配置宝典》-4.2 PPP基本配置
查看>>
我的友情链接
查看>>
IT人士的知识管理-第一篇
查看>>
产生随机数
查看>>
[cocos2d-x]针对不同的设备,选取不同的自适应图片
查看>>