ioctl
是设备驱动程序中对设备的I/O通道进行管理的函数。所谓对I/O通道进行管理,就是对设备的一些特性进行控制,例如串口的传输波特率、马达的转速等等。
它的参数个数如下:
int ioctl(int fd,int request, int cmd, …);
其中fd就是用户程序打开设备时使用open函数返回的文件标示符,
request 由内核驱动决定具体操作,例如request可以代表哪个IO口
cmd 代表对IO口进行什么样的操作,就是用户程序对设备的控制命令,至于后面的省略号,那是一些补充参数,一般最多一个,有或没有是和cmd的意义相关的。
ioctl函数是文件结构中的一个属性分量,就是说如果你的驱动程序提供了对ioctl的支持,用户就能在用户程序中使用ioctl函数控制设备的I/O通道。
request 和 cmd 可以反过来操作,可以通过SWITCH实现
成功返回0 失败返回-1
前提驱动以写好并放在了/dev下
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#define LED_NUM 2
#define LED_CMD 2
int main(int argc , char* argv[])
{
int fd , led_num, led_c;
char *leds = "/dev/leds";//驱动路径
printf("argv1 is cmd ,argv2 is io \n");//cmd 表示亮灭,argv2表示哪个led灯
if(atoi(argv[1]) >= LED_NUM)//限制传递参数值
{
printf("argv1 is 0 or 1 \n");
exit(1);
}
if(atoi(argv[2]) >= LED_NUM)
{
printf("argv1 is 0 or 1 \n");
exit(1);
}
//打开驱动, Linux下一切皆文件
if((fd = open(leds,O_RDWR|O_NOCTTY|O_NDELAY)) < 0)
{
printf("open %s failed \n",leds);
exit(1);
}else{
//控制驱动
ioctl(fd, atoi(argv[1]),atoi(argv[2]));
printf("open %s success \n ",leds);
}
//关闭文件
close(fd);
return 0;
}
编译:
arm-none-linux-gnueabi-gcc -o leds leds.c --static
mount /dev/sda /mnt/disk
umount /dev/sda