frame buffer中系统调用的问题

发布于 2022-09-18 17:54:44 字数 263 浏览 11 评论 0

最近正在写一个frame buffer驱动程序,底层的操作函数都填充得差不多了。现在就是怎样调用这些函数还有点疑问。
   
    我把fb_info中的 fb_ops内的函数填充完了之后,根据有些资料说,直接可以用ioctl来调用。而fbmem中还有个fb_ioctl函数,请问这两个函数到底是什么关系呢?
能够实现系统调用的是ioctl()还是fb_ioctl() ?

    期待高手指点一二。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

情痴 2022-09-25 17:54: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;
}

烛影斜 2022-09-25 17:54:44

原帖由 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

眼眸印温柔 2022-09-25 17:54:44

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

り繁华旳梦境 2022-09-25 17:54:44

原帖由 kycent 于 2009-5-10 13:49 发表
经你一指点,我有些明白了。是不是可以这样理解:fb_mem.c中的fb_ioctl()是用来控制抽象的fb的,而我自己写的那个fb_ioctl()则是用来控制硬件的?

有点片面
其实找份代码来看,就一清二楚了。fb_mem.c中的fb_ioctl()是framebuffer common(即所有其他framebuffer共有的操作)操作的集合,自己写的那个fb_ioctl()是自己特定平台的操作函数

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文