关于驱动中ioctl函数中参数问题

andy1658 2012-05-23 05:44:42
在linux2.6.33内核中,linux驱动程序的ioctl()函数的cmd参数不能为偶数,如果为偶数,将不调用ioctl()函数;
我在应用层写的程序想设置ioctl()函数中的cmd为2,但是实际没有调用ioctl()函数,
是否在应用层访问驱动层的ioctl()函数必须使用幻数才可以访问,直接定义一个宏偶数访问就出错,请高手帮忙解答,谢谢
...全文
363 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
曹大夯 2012-05-25
  • 打赏
  • 举报
回复
没太明白你说的问题。
什么是幻数?宏偶数?

把具体的代码和值贴出来看看,具体描述一下你 碰到的问题。
cainiao_learn 2012-05-25
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]

引用 5 楼 的回复:

引用 4 楼 的回复:

我记得不是所有偶数,因为2在系统中被用到了,你跟踪下ioctl的部分就知道了,所以还是老老实实用幻数吧。

我试过了,用2就不会调用函数,但是我之前的内核和应用层都是这样用的,没有问题,不知道现在为啥不能用,因为应用层的程序不是自己写的,要兼容之前的应用层程序,有没有办法可以避开这个问题呢?

原因就是ioctl在遇到2的时……
[/Quote]


我也遇到类似的疑问,只不过我直接用的是幻数,关键是不知道是不是可以随便设置?
falloutmx 2012-05-25
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

引用 4 楼 的回复:

我记得不是所有偶数,因为2在系统中被用到了,你跟踪下ioctl的部分就知道了,所以还是老老实实用幻数吧。

我试过了,用2就不会调用函数,但是我之前的内核和应用层都是这样用的,没有问题,不知道现在为啥不能用,因为应用层的程序不是自己写的,要兼容之前的应用层程序,有没有办法可以避开这个问题呢?
[/Quote]
原因就是ioctl在遇到2的时候会调用自己的函数,而不是你驱动的2。解决方式就是加幻数或者用旧的内核。我这样说很明白了吧?
andy1658 2012-05-25
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]

ioctl用的少,不过印象里应该没偶数一说. 坐等高人解答。

要避开应该不难。 首先看你意思,以前程序跑是没问题的。
那ioctl不动,然他为之前应用程序提供服务。

你在驱动注册 read write函数。 应用层直接用read write来控制读写。
快的话,几分钟应该就改好了。

(我平时就是用的read write 没用 ioctl ...)
[/Quote]
关键是现在应用层是没法改动的,只能通过底层提供跟之前一样的接口啊,呵呵
  • 打赏
  • 举报
回复
ioctl用的少,不过印象里应该没偶数一说. 坐等高人解答。

要避开应该不难。 首先看你意思,以前程序跑是没问题的。
那ioctl不动,然他为之前应用程序提供服务。

你在驱动注册 read write函数。 应用层直接用read write来控制读写。
快的话,几分钟应该就改好了。

(我平时就是用的read write 没用 ioctl ...)
andy1658 2012-05-25
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]

我记得不是所有偶数,因为2在系统中被用到了,你跟踪下ioctl的部分就知道了,所以还是老老实实用幻数吧。
[/Quote]
我试过了,用2就不会调用函数,但是我之前的内核和应用层都是这样用的,没有问题,不知道现在为啥不能用,因为应用层的程序不是自己写的,要兼容之前的应用层程序,有没有办法可以避开这个问题呢?
falloutmx 2012-05-25
  • 打赏
  • 举报
回复
我记得不是所有偶数,因为2在系统中被用到了,你跟踪下ioctl的部分就知道了,所以还是老老实实用幻数吧。
andy1658 2012-05-25
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

没太明白你说的问题。
什么是幻数?宏偶数?

把具体的代码和值贴出来看看,具体描述一下你 碰到的问题。
[/Quote]
我已经将问题代码贴出来了,请大侠帮忙看看,谢谢
andy1658 2012-05-25
  • 打赏
  • 举报
回复

#define IO_READ_MODE 1
#define IO_WRITE_MODE 2
static int gpio_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg)
{
struct GPIO_INFO io_info;
int ret;

memset(&io_info,0x0,sizeof(io_info));
if (copy_from_user(&io_info, ( void *) arg, sizeof(io_info))){
printk(" the ret's value is -EFAULT\n");
return (-EFAULT);
}

switch(cmd){
case IO_READ_MODE:
ret=pxa168_gpio_ioc_read(&io_info);
if(ret)
return ret;

if (copy_to_user((void *) arg,&io_info, sizeof(io_info)))
return -EFAULT;
break;
case IO_WRITE_MODE:
ret=pxa168_gpio_ioc_write(&io_info);
if(ret)
return ret;
break;
default:
printk("Error: unknown ioctl command\n");
return -ENOTTY;
}
return 0;
}

上面是我驱动里面的ioctl函数,我在应用层调用这个函数方法如下:

#define IO_READ_MODE 1
#define IO_WRITE_MODE 2
ioctl(fd,IO_READ_MODE,&io_info);
ioctl(fd,IO_WRITE_MODE,&io_info);

我在调用的时候,ioctl(fd,IO_READ_MODE,&io_info);是正确执行的,但是,
ioctl(fd,IO_WRITE_MODE,&io_info);并没有进入函数执行就退出了,不知是什么原因,
但是我讲驱动层和应用层中的#define IO_WRITE_MODE 2改成#define IO_WRITE_MODE 3就可以调用了,后来发现只要宏定义的是偶数,调用就不成功,请高手帮忙解答,谢谢

21,597

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 驱动开发/核心开发
社区管理员
  • 驱动开发/核心开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧