ioctl()函数的cmd参数是怎样得出的?
来源:互联网 发布:英文演讲视频软件 编辑:程序博客网 时间:2024/06/04 22:43
ioctl()函数的cmd参数是怎样得出的?
① Linux对ioctl()函数的cmd参数有特殊的定义
② 我们来以_IOW为例,看看Linux系统是如何定义_IOW宏的
#define _IOW(type,nr,size) _IOC(_IOC_WRITE,(type),(nr),sizeof(size))
#define _IOC(dir,type,nr,size) \
(((dir) << _IOC_DIRSHIFT) | \
((type) << _IOC_TYPESHIFT) | \
((nr) << _IOC_NRSHIFT) | \
((size) << _IOC_SIZESHIFT))
③ 可以看出 cmd在用户程序端由一些宏根据设备类型、序列号、传送方向、数据尺寸等生成,这个整数通过系统调用传递到内核中的驱动程序,再由驱动程序使用解码宏从这个整数中得到设备的类型、序列号、传送方向、数据尺寸等信息,然后通过switch{case}结构进行相应的操作
④ 因此,在驱动程序和应用程序中必须有相同的关于cmd参数的宏定义,其具体的实例如下:(红色部分)
驱动程序中:
..........
MODULE_AUTHOR("Lw");
MODULE_LICENSE("Dual BSD/GPL");
#define GPIODEV_MAJOR0
#define GPIODEV_NR_DEVS9
#define DEVICE_NAME"gpiocdev"
#define GPIO_MAGIC'k'
#define IOCTL_GPIO_INPUT_IOW(GPIO_MAGIC,1,int)
#define IOCTL_GPIO_OUTPUT_IOW(GPIO_MAGIC,2,int)
static int gpio_ioctl(struct inode *inode,
struct file *file,
unsigned int cmd,
unsigned long arg)
{
unsigned int data;
int ret;
ret=copy_from_user(&data,(unsigned int __user *)arg,sizeof(int));
if(ret)
return -EFAULT;
switch(cmd)
{
case IOCTL_GPIO_INPUT: gpio_config(0x0,data); return 0;
case IOCTL_GPIO_OUTPUT: gpio_config(0x55555555,data); return 0;
default:
return -EINVAL;
}
}
.................
应用程序中:
...........
#define GPIO_MAGIC 'k'
#define IOCTL_GPIO_INPUT _IOW(GPIO_MAGIC,1,int)
#define IOCTL_GPIO_OUTPUT _IOW(GPIO_MAGIC,2,int)
int main(int argc,char *argv[])
{
int dev_fd,i,j;
unsigned int write_data;
unsigned int output_no=1;
dev_fd=open("/dev/gpiocdev1",O_RDWR|O_NONBLOCK);
if(dev_fd==-1)
{
printf("Can't open the device gpio\n");
exit(1);
}
ioctl(dev_fd,IOCTL_GPIO_OUTPUT,&output_no);
while(1)
{
for(i=0;i<16;i++)
{
write_data=0xfffffffe;
write_data &=~(i<<5);
write(dev_fd,&write_data,sizeof(write_data));
//sleep(1);//delay 1s
usleep(500000); //delay 500ms
}
}
close(dev_fd);
return 0;
}
- ioctl()函数的cmd参数是怎样得出的?
- ioctl函数的参数介绍
- ioctl函数的参数介绍
- linux驱动程序的ioctl()函数的cmd参数不能为2
- Linux驱动设计ioctl函数的cmd参数不能为2
- Linux驱动设计ioctl函数的cmd参数不能为2
- 通过函数得出参数首字符的ASCII码
- WINMAIN函数的参数是怎样传递的
- linux驱动系统调用ioctl()的cmd参数详解【字段划分图】
- ioctl函数的作用
- ioctl函数的使用
- ioctl函数的使用
- ioctl函数的使用
- ioctl函数的学习
- linux 的ioctl()函数
- 函数ioctl的使用
- ioctl函数的学习
- IOCTL函数的实现
- Delphi 代码优化
- mysql中now,curdate,curtime,sysdate区别
- 【Android API指南】自定义组件
- 使用 wkhtmltoimage 来建立网页的快照(ubuntu)
- VS中常常用到的宏OutDir,我们在那里设置该宏的值呢?
- ioctl()函数的cmd参数是怎样得出的?
- 单元测试入门——使用NUnit框架
- goog 1: check continuous array.
- Delphi代码优化
- Qt经典出错信息之undefined reference to `vtable for classname
- live555---1--编译与运行
- powerdesign CDM图画图详解
- red5使oflaDemo播放采用绝对路径
- 2013年互联网十大趋势