免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3256 | 回复: 4
打印 上一主题 下一主题

frame buffer中系统调用的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-05-09 09:32 |只看该作者 |倒序浏览
最近正在写一个frame buffer驱动程序,底层的操作函数都填充得差不多了。现在就是怎样调用这些函数还有点疑问。
   
    我把fb_info中的 fb_ops内的函数填充完了之后,根据有些资料说,直接可以用ioctl来调用。而fbmem中还有个fb_ioctl函数,请问这两个函数到底是什么关系呢?
能够实现系统调用的是ioctl()还是fb_ioctl() ?

    期待高手指点一二。

论坛徽章:
0
2 [报告]
发表于 2009-05-09 09:44 |只看该作者
这是我自己写的fb_ioctl() ,各位大大看看正不正确。

static int fb_ioctl(struct inode *inode, struct file *file, unsigned int cmd,unsigned long arg)
{
    int fbidx = iminor(inode);
    unsigned long num;
    struct fb_info *info = registered_fb[fbidx];
    struct fb_ops *fb = info->fbops;
    void __user *argp = (void __user *)arg;/*用户空间参数的地址,通过copy_from_user()传递给内核空间。*/
    if (!fb)
        return -ENODEV;
    switch (cmd) {
    case FBIOGET_VSCREENINFO://获取屏的可变参数
        s3c2410fb_get_var(info);
        return copy_to_user(argp, &info->var,sizeof(info->var)) ? -EFAULT : 0;
                       /*成功读取参数后,返回0,否则,返回-EFAULT。*/
    case FBIOPUT_VSCREENINFO://设置屏的可变参数
          if(copy_from_user(&info->var, argp, sizeof(info->var)))return -EFAULT;/*num为未能传送的字节数*/
          else
            {s3c2410fb_set_var(info);return 0;}
           
        
    case FBIOGET_FSCREENINFO://获取屏的固定参数
         s3c2410fb_get_fix(info);
         return copy_to_user(argp, &info->fix,sizeof(info->fix)) ? -EFAULT : 0;
    case FBIOPUT_FSCREENINFO:
          if(copy_from_user(&info->fix,argp,sizeof(info->fix)))return -EFAULT;
          else
            {s3c2410fb_set_fix(info);return 0;}
         
    case FBIOPUTCMAP://设置调色板
        if (copy_from_user(&info->cmap, argp, sizeof(info->cmap))>0)
            return -EFAULT;
        else
            {s3c2410fb_set_cmap(info);return 0;}
    case FBIOGETCMAP://获取调色板信息
        s3c2410fb_get_cmap(info);
        return copy_to_user(argp,&info->cmap,sizeof(info->cmap)) ? -EFAULT : 0;
}

论坛徽章:
0
3 [报告]
发表于 2009-05-09 16:45 |只看该作者
原帖由 kycent 于 2009-5-9 09:32 发表
最近正在写一个frame buffer驱动程序,底层的操作函数都填充得差不多了。现在就是怎样调用这些函数还有点疑问。
   
    我把fb_info中的 fb_ops内的函数填充完了之后,根据有些资料说,直接可以用ioctl来调 ...

你如果不了解fb的驱动架构的话,那真不好解析
简单的来说,fb的驱动分两层,上层是抽象fb驱动(主要文件有fbmem.c, fbmon.c),底层层才是具体硬件驱动。具体硬件驱动要通过register_framebuffer将其注册到抽象fb驱动中。你可以理解抽象fb驱动为一个管理器,用户态通过该管理器的接口来调用底层具体硬件驱动接口
你如果看下fb_ioctl(位于fbmem.c中),其中有:
if (fb->fb_ioctl)
    ret = fb->fb_ioctl(info, cmd, arg);
其中fb->fb_ioctl,这里的fb_ioctl就是你写的驱动的fb_ioctl

论坛徽章:
0
4 [报告]
发表于 2009-05-10 13:49 |只看该作者

回复 #3 sep 的帖子

经你一指点,我有些明白了。是不是可以这样理解:fb_mem.c中的fb_ioctl()是用来控制抽象的fb的,而我自己写的那个fb_ioctl()则是用来控制硬件的?

论坛徽章:
0
5 [报告]
发表于 2009-05-10 19:56 |只看该作者
原帖由 kycent 于 2009-5-10 13:49 发表
经你一指点,我有些明白了。是不是可以这样理解:fb_mem.c中的fb_ioctl()是用来控制抽象的fb的,而我自己写的那个fb_ioctl()则是用来控制硬件的?

有点片面
其实找份代码来看,就一清二楚了。fb_mem.c中的fb_ioctl()是framebuffer common(即所有其他framebuffer共有的操作)操作的集合,自己写的那个fb_ioctl()是自己特定平台的操作函数
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP