frame buffer中系统调用的问题
最近正在写一个frame buffer驱动程序,底层的操作函数都填充得差不多了。现在就是怎样调用这些函数还有点疑问。
我把fb_info中的 fb_ops内的函数填充完了之后,根据有些资料说,直接可以用ioctl来调用。而fbmem中还有个fb_ioctl函数,请问这两个函数到底是什么关系呢?
能够实现系统调用的是ioctl()还是fb_ioctl() ?
期待高手指点一二。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
这是我自己写的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;
}
你如果不了解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
经你一指点,我有些明白了。是不是可以这样理解:fb_mem.c中的fb_ioctl()是用来控制抽象的fb的,而我自己写的那个fb_ioctl()则是用来控制硬件的?
有点片面
其实找份代码来看,就一清二楚了。fb_mem.c中的fb_ioctl()是framebuffer common(即所有其他framebuffer共有的操作)操作的集合,自己写的那个fb_ioctl()是自己特定平台的操作函数