新驱动程序中添加的新ioctl可以使用哪一系列的数字

时间:2013-07-05 03:56:55

标签: linux linux-kernel linux-device-driver

参考此链接http://stackoverflow.com/questions/8922102/adding-new-ioctls-into-kernel-number-range我发现,如果未使用copy-to-user/copy-from-user,则必须将方向编码为ioctl数字。

请有人解释如何通过设置编码方向来获得新的ioctl数字。

1 个答案:

答案 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获取更多信息。