9. 控制LED灯设备(LED子系统) |
您所在的位置:网站首页 › 数字系统有哪些LED › 9. 控制LED灯设备(LED子系统) |
9. 控制LED灯设备(LED子系统)¶
本章分别使用C库和系统调用的文件操作方式控制开发板的LED灯,展示如何在应用层通过系统提供的设备文件控制相关硬件。 本章的示例代码目录为:base_code/linux_app/led/sys_class_leds。 9.1. LED子系统¶在Linux系统中,绝大多数硬件设备都有非常成熟的驱动框架,驱动工程师使用这些框架添加与板子相关的硬件支持,建立硬件与Linux内核的联系,内核再通过统一文件系统接口呈现给用户,用户通过对应的设备文件控制硬件。 对于LED设备,Linux提供了LED子系统驱动框架,在Linux内核源码中的“Documentation/leds/leds-class.txt”有相关的描述,它实现了一个leds类,用户层通过sysfs文件系统对LED进行控制。 9.1.1. LED设备目录¶使用了LED子系统驱动的设备,会被展现在/sys/class/leds目录下,可在主机和开发板使用如下命令查看,命令的输出可能会因为硬件环境不同而不一样: 1 2 3 4 5 6 7 8 9 10 11#在主机或ARM板的终端上执行如下命令: ls /sys/class/leds/ #根据具体的目录内容继续查看: #在主机上有input2::capslock目录,可在主机执行如下命令查看 ls /sys/class/leds/input2::capslock #在开发板上有cpu目录,可在开发板上执行如下命令查看 ls /sys/class/leds/cpu如下图 上图可看到,示例中的Ubuntu主机和开发板/sys/class/leds下包含了以LED设备名 字命名的目录,如“input2::capslock”、“input2::numlock”和“blue”、“cpu”等LED灯,这 些目录对应的具体LED灯如下表所示。 表 /sys/class/leds下目录对应的设备 /sys/class/leds下的目录 对应的LED灯设备 input2::capslock 键盘大写锁定指示灯(input后的数字编号可能不同) input2::numlock 键盘数字键盘指示灯(input后的数字编号可能不同) input2::scrolllock 键盘ScrollLock指示灯(input后的数字编号可能不同) cpu 开发板的心跳灯 red Pro开发板RGB灯的红色,Mini开发板的用户灯 green Pro开发板RGB灯的绿色,Mini开发板的用户灯 blue Pro开发板RGB灯的蓝色,Mini开发板的用户灯 mmc0: SD卡指示灯(出厂镜像默认没有启用) 9.1.2. LED设备属性¶上图中,在具体的LED目录下又包含brightness、max_brightness、trigger等文件,这些文件包含了LED设备的属性和控制接口。 max_brightness文件:表示LED灯的最大亮度值。 brightness文件:表示当前LED灯的亮度值,它的可取 值范围为[0~max_brightness],一些LED设备不支持多级亮度,直接以非0值来 表示LED为点亮状态,0值表示灭状态。 trigger文件:则指示了LED灯的触发方式,查看该文件的内容时,该文件会 列出它的所有可用触方式,而当前使用的触发方式会以“[]”符号括起。常见的触 发方式如下表所示。 表 trigger常见的触发方式 触发方式 说明 none 无触发方式 disk-activity 硬盘活动 nand-disk nand flash活动 mtd mtd设备活动 timer 定时器 heartbeat 系统心跳 9.2. 控制LED实验(C库函数)¶在《命令行点灯和检测按键》章节中,我们演示了使用echo命令修改设备文件,实际上也可以使用gedit、Vim等编辑器进 行修改,修改时注意用户权限即可。既然设备是以文件形式提供的,那么自然也可以使用C库函数 或系统调用的方式读写文件,达到控制设备的目的。 9.2.1. 实验代码分析¶本小节的示例代码目录为:led/sys_class_leds/c_stdio。 本小节先演示使用C库函数控制LED,具体如下所示。 通过C库函数控制LED(base_code/linux_app/led/sys_class_leds/c_stdio/sources/main.c文件)¶ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70#include #include #include //ARM 开发板LED设备的路径 #define RLED_DEV_PATH "/sys/class/leds/red/brightness" #define GLED_DEV_PATH "/sys/class/leds/green/brightness" #define BLED_DEV_PATH "/sys/class/leds/blue/brightness" //Ubuntu主机LED设备的路径,具体请根据自己的主机LED设备修改 // #define RLED_DEV_PATH "/sys/class/leds/input2::capslock/brightness" // #define GLED_DEV_PATH "/sys/class/leds/input2::numlock/brightness" // #define BLED_DEV_PATH "/sys/class/leds/input2::scrolllock/brightness" int main(int argc, char *argv[]) { FILE *r_fd, *g_fd, *b_fd; printf("This is the led demo\n"); //获取红灯的设备文件描述符 r_fd = fopen(RLED_DEV_PATH, "w"); if(r_fd |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |