- 论坛徽章:
- 0
|
这是我自己写的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;
} |
|