ioctl参数cmd=2错误
在写内核驱动的时候,用到了ioctl。自己定义cmd作为ioctl的参数。如下:
enum CMD { LEVEL_DOWN, LEVEL_UP, GPIO_INPUT, GPIO_OUTPUT, GPIO_GET, };
ioctl底层调用代码:
static long led_ioctl(struct file *file, unsigned int cmd, unsigned long arg) { }
在应用层调用ioctl的时候,当传入的cmd=2时会出现错误。
ioctl返回值为-1。错误号errno:14, bad address。
上网查阅才知道需要使用_IOWR等宏来生成cmd命令,而不能自己写。
虽然自己写也可以,但很有可能和系统的其他cmd命令冲突。刚好当ioctl的cmd=2使就出现了错误。
从新定义cmd如下:
#define TYPE 'S' #define LEVEL_DOWN _IOWR(TYPE, 0, int) #define LEVEL_UP _IOWR(TYPE, 1, int) #define GPIO_INPUT _IOWR(TYPE, 2, int) #define GPIO_OUTPUT _IOWR(TYPE, 3, int) #define GPIO_GET _IOWR(TYPE, 4, int)