|
| 请教ioctl参数问题 |
| 新闻出处:21ic
发布时间: 2007-10-20 |
gooogleman 发布于 2007-10-18 11:16:00 请教ioctl参数问题 int (*ioctl) (struct inode *inode, struct file *filp, unsigned int cmd, unsigned long arg); 的参数arg是干什么的 static int leds_ioctl(struct inode *inode,struct file *file,unsigned int cmd,[52RD.com] unsigned long arg){ switch(cmd){[ case 0: case 1: if (arg > 4){ return -EINVAL; }][52RD.com] write_gpio_bit(led_table[arg],!cmd); default: return -EINVAL; } } 看不懂arg是哪里传来的参数,刚学linux请大侠指教。
阿南 发布于 2007-10-18 14:06:00 arg是用户程序以unsinged long形式被传递给驱动程序的,用途可以由您自己决定
gooogleman 发布于 2007-10-20 12:32:00 int (*ioctl) (struct inode *inode, struct file *filp, unsigned int cmd, unsigned long arg); inode 和 filp 指针是对应应用程序传递的文件描述符 fd 的值, 和传递给 open 方法的相同参数. cmd 参数从用户那里不改变地传下来, 并且可选的参数 arg 参数以一个 unsigned long 的形式传递, 不管 它是否由用户给定为一个整数或一个指针. 如果调用程序不传递第 3 个参数, 被驱动操作收到的 arg 值是无定义的. 因为类型检查在这个额外参数上被关闭, 编译器不能警告你如果一个无效的参 数被传递给 ioctl, 并且任何关联的错误将难以查找. 如果你可能想到的, 大部分 ioctl 实现包括一个大的 switch 语句来根据 cmd 参数, 选择正确的做法. 不同的命令有不同的数值, 它们常常被给予符号名来简化编码. 符号名通过一个预处理定义来安 排. 定制的驱动常常声明这样的符号在它们的头文件中; scull.h 为 scull 声明它们. 用户程序必须, 当 然, 包含那个头文件来存取这些符号.
|
| 【关闭】 【打印】 |
|
|
|
|