001- linux - 字符设备控制之ioctl

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

猜你喜欢

转载自blog.csdn.net/Stone_Xin_H_T/article/details/81427884
今日推荐