第八节 Linux系统编程-字符设备控制-led灯

-------------------------------------资源来源于网络,仅供自学使用,如有侵权,联系我必删.

第一:

字符类 led 灯

1)在前面介绍 open 函数的时候,已经提到过如何打开字符类设备,获得句柄的方法和一般文件都是一样。
Led 灯的设备节点在/dev 目录下,如下图所示,在超级终端可以使用 ls 命令查找。

第八节 Linux系统编程-字符设备控制-led灯_第1张图片

 

2)在前面介绍过,如果要给文件进行写操作,那么使用的是 write 函数。对于 led 小灯的操作,使用写函数,理论上也是可以的。但是对于 IO 口(这里的 IO 口指的是硬件上的 IO 口,不是指 IO 文件)的操作,Linux 专门设计了一个高效的函数 ioctl。

ioctl函数:
• int ioctl( int fd, int request, int cmd);
– 参数fd,函数open 返回的句柄
– 参数request 和参数cmd,由内核驱动决定具体操作,例如request 可以
代表那个IO 口
– 参数cmd:代表对IO 进行什么样的操作,也可以反过来。具体的含义由
驱动工程师在驱动中switch决定
– 返回值:返回0 成功;返回-1,出错

 

第二:

 小灯测试例程
编写简单的 leds.c 文件测试小灯。
首先添加头文件,如下图所示。

第八节 Linux系统编程-字符设备控制-led灯_第2张图片
通过 main 参数传过来的参数是 char 字符格式的,如果要传递给 ioctl 函数,需要用到数
值转化函数 atoi,添加了头文件#include
接着由于小灯的数量和命令都是 2,所以对小灯数量和操作数进行宏定义#define  LED_NUM 2 #define LED_C  2

然后 main 函数如下图所示

第八节 Linux系统编程-字符设备控制-led灯_第3张图片

#include 
#include 
#include 
#include 
#include 

#define LED_NUM 2
#define LED_C 2
//cmd为0,则灭,为1,则亮;
//io为0则是靠近蜂鸣器的小灯,为1则靠近独立按键的小灯
int main(int argc,char *argv[])
{
	int fd,led_num,led_c;
	char *leds = "/dev/leds";

	led_num = LED_NUM;
	led_c = LED_C;
	
        //解释那个参数具体代表什么含义,"argv1 is cmd;argv2 is io”,参数 1 对应命令,参数 2 对应具体那个 led 灯
	printf("argv1 is cmd;argv2 is io \n"); 
	//对传入的参数进行判断,超出范围直接退出
	if (atoi(argv[1]) >= led_c) {
		printf("argv1 is 0 or 1)");
		exit(1);
	}
	if (atoi(argv[2]) >= led_num) {
		printf("argv2 is 0 or 1)");
		exit(1);
	}
	//使用ioctl函数将参数传入内核
	if((fd = open(leds, O_RDWR|O_NOCTTY|O_NDELAY))<0)
		printf("open %s failed\n",leds);   
	else{
                        //调用了 ioctl 函数,将 main 函数的第一个和第二个参数传入驱动
			ioctl(fd,atoi(argv[1]),atoi(argv[2]));
			printf("ioctl %s success\n",leds);
		}
        //将打开的设备节点"/dev/leds"关闭
	close(fd);
	
	return(1);
}

 

第三:

编译运行测试

1)在 Ubuntu 系统下,如下图所示,进入前面实验创建的目录
“/home/linuxsystemcode/charcontrol”,将源码 leds.c 拷贝进去,如下图所示

第八节 Linux系统编程-字符设备控制-led灯_第4张图片

 

2)使用命令“arm-none-linux-gnueabi-gcc -o leds leds.c -static”编译 leds 文件,如下图所示,使用命令“ls”可以看到生成了 leds 可执行文件。

第八节 Linux系统编程-字符设备控制-led灯_第5张图片

 

3)将编译成的可执行文件 open,拷贝到 U 盘,启动开发板,插入 U 盘,加载 U 盘,运行程序如下

第八节 Linux系统编程-字符设备控制-led灯_第6张图片

 

4)如下图所示,如果不加参数会有提示,然后报错

第八节 Linux系统编程-字符设备控制-led灯_第7张图片

 

5)如下图所示,使用命令“./mnt/udisk/leds 0 0”运行,可以看到靠近蜂鸣器的小灯灭了

第八节 Linux系统编程-字符设备控制-led灯_第8张图片

 

 

所有参数对小灯的控制如下:
0 0 靠近蜂鸣器的小灯灭;
0 1 靠近按键的小灯灭;
1 0 靠近蜂鸣器的小灯亮;
1 1 靠近按键的小灯亮。
用户可以自行测试一下。

 

你可能感兴趣的:(第八节 Linux系统编程-字符设备控制-led灯)