字符设备驱动之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点亮