字符设备驱动之LED

ioctl函数简介

如果需要了解设备驱动,就必须了解ioctl函数,它的作用,就是对设备的I/O通道进行管理,即对设备的一些特性进行控制。例如:串口的波特率、马达的转速、LED的亮暗等

头文件

#include <sys/ioctl.h>

函数原型

int ioctl(int fd, int request, int cmd);
  • 参数1:文件描述符(Linux下一切皆文件,也可以为设备文件,即硬件设备)
  • 参数2:配合参数cmd,由内核驱动决定具体操作

返回值

  • 返回值为0,则函数调用成功
  • 返回值<0,函数调用失败

iotcl函数使用实例:

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>

#define LED_NUM 2
#define LED_C 2

int main(int argc,char *argv[])
{
	int fd,led_num,led_c;
	char *leds = "/dev/leds";
	
	led_num = LED_NUM;
	led_c = LED_C;

	printf("argv1 is cmd;argv2 is IO\n");
	if(atoi(argv[1]) >= led_c)
		printf("argv[1] is 0 or 1\n");

	if(atoi(argv[2]) >= led_num)
			printf("argv[2] is 0 or 1\n");
	
	fd = open(leds,O_RDWR | O_NOCTTY | O_NDELAY);
	if(fd < 0)
			printf("The file open failed!\n");
	else
	{
        //参数cmd为io,参数request为LED状态
        //argv[1]为1表示灯亮,为0表示灯按
        //argv[2]为1表示远离蜂鸣器的灯,为0表示靠近蜂鸣器的灯
			ioctl(fd,atoi(argv[1]),atoi(argv[2]));
			printf("ioctl %s is success!\n",leds);
	}
	close(fd);
	return 0;
}

程序使用方法:在Ubuntu下使用交叉编译器将程序源码编译为二进制文件,之后复制到开发板上运行

终端输入:./led(可执行文件名) 1 1 //可以使远离蜂鸣器的Led点亮