• 【Linux高级驱动】LCD驱动框架分析


    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     //driversvideos3c-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

    (emailwwwlllll@126.com)

    (qq552158509





  • 相关阅读:
    xml转json
    3DES双倍长加密
    数据的集合运算
    SQL:1999基本语法
    表的连接操作
    数据库的连接
    表空间的创建
    用户的创建
    通用函数
    转换函数
  • 原文地址:https://www.cnblogs.com/lcw/p/3802749.html
Copyright © 2020-2023  润新知