2016-04-15 43 views
0

我正在为embeeded系统创建一个驱动程序。我正在使用IOCTL函数。 设备注册正确,打开和写入功能按预期工作,但IOCTL不能。IOCTL:仅在开关柜中使用参数0

当我从参数0的用户空间调用IOCTL时,ioctl_num = 0调用my_ioctl函数,但是当我使用任何其他值时,my_ioctl内核函数未被调用。

#define READ_IOCTL      _IO(UAM_DEV_MAGIC, 0) 
#define WRITE_IOCTL      _IO(UAM_DEV_MAGIC, 1) 
#define ASK_VALUE      _IO(UAM_DEV_MAGIC, 2) 

当我使用READ_IOCTL(0)从用户空间进行IOCTL调用时,一切工作正常。但是,当我尝试WRITE_IOCTL和ASK_VALUE(1和2)。

如果我使用以下命令:

#define READ_IOCTL      _IO(UAM_DEV_MAGIC, 1) 
#define WRITE_IOCTL      _IO(UAM_DEV_MAGIC, 0) 
#define ASK_VALUE      _IO(UAM_DEV_MAGIC, 2) 

只适用WRITE_IOCTL从用户空间调用。我正在使用Linux 3.16和PowerPC。任何想法有什么不对?

+0

这里是一个示例驱动程序。可能会有所帮助https://github.com/jeyaramvrp/kernel-module-programming/tree/master/sample-char-dir – Jeyaram

+0

感谢您的回答。我看过代码,但它看起来与我所做的非常相似。它看起来像程序不会重组魔术数字。任何想法为什么它与0,而不是与1,2,3等工作? –

+0

'任何想法为什么它与0一起工作,而不是与1,2,3等?' - 可能,您的代码符合预定义的ioctl代码。参见[man ioctl_list](http://man7.org/linux/man-pages/man2/ioctl_list.2.html)。 – Tsyvarev

回答

0

我找到了解决方案。我在64位的内核中。用户空间中的c代码是32位的。我必须在64位编译才能工作。