参考此链接http://stackoverflow.com/questions/8922102/adding-new-ioctls-into-kernel-number-range
我发现,如果未使用copy-to-user/copy-from-user
,则必须将方向编码为ioctl数字。
请有人解释如何通过设置编码方向来获得新的ioctl数字。
答案 0 :(得分:1)
您需要使用_IO()系列宏和记录的in the official ioctl-number documentation指南。 _IO宏在ioctl.h中声明。大多数采用8位int来表示类型,8位int表示ioctl编号,如果要打算传入IOCTL调用,则采用数据类型。理想情况下,类型对于您的驱动程序是唯一的问题,但是大多数数字已经被分配,因此这很难做到。 ioctl编号只是为了将其与其他编号区分开来,可以按顺序分配。
您可以从Chapter 6 of the LDD3获取更多信息。
编辑:您的评论让我相信您需要一个简单的例子。您不应该通过它的十六进制值来引用IOCTL编号。而是像这样使用_IO()宏:
// The type for all of my IOCTL calls.
// This number is from 0 to 255.
// Does not conflict with any number assignments in ioctl-number.txt.
#define MYIOC_TYPE 0xA4
// This ioctl takes no arguments. It does something in the driver
// without passing data back and forth. The ioctl number is from 0 to 255.
#define MYIOC_DOFOO _IO(MYIOC_TYPE, 0x00)
// This ioctl reads an integer value from the driver.
#define MYIOC_GETFOO _IOR(MYIOC_TYPE, 0x01, int)
// This ioctl writes an integer value from the driver.
#define MYIOC_SETFOO _IOW(MYIOC_TYPE, 0x02, int)
// This ioctl is confusing and is probably to be avoided.
// It writes a value to the driver while at the same time
// retrieves a value in the same pointer.
#define MYIOC_SETANDGETFOO _IOWR(MYIOC_TYPE, 0x03, int)
宏编码ioctl编号中的数据。因此,不是引用单个十六进制数,而是更适合引用ioctl的类型和数字。这些宏具有额外的好处,它们记录了数据的往返方向以及数据的类型。
您可以从Chapter 6 of the LDD3获取更多信息。