一应用层操作硬件的两种方式
应用层想要对底层硬件进行操控嵌入式linux 培训,一般可以通过两种方法:
/dev/目录下的设备文件(设备节点);/sys/目录下设备的属性文件。
具体使用哪种形式须要依照不同功能类型设备进行选择,一般情况下,通常简单地设备会使用sysfs形式操控,其设备驱动在实现时会将设备的一些属性导入到用户空间sysfs文件系统,以属性文件的方式为用户空间提供对那些数据、属性的访问支持,例如LED、GPIO等。但对于一些较复杂的设备一般会使用设备节点的方法,例如LCD等、触摸屏、摄像头等。
1.1哪些是sysfs文件系统
sysfs是一个基于显存的文件系统,同devfs、proc文件系统一样,称为虚拟文件系统;它的作用是将内核信息以文件的形式提供给应用层使用,sysfs文件系统的主要功能便是对系统设备进行管理,它可以形成一个包含所有系统硬件层次的视图。、
1.2sysfs与/sys的关系
sysfs文件系统挂载在/sys目录下,启动ALPHA/MiniI.MX6U开发板linux社区,步入Linux系统(开发板出厂系统)以后,我们步入到/sys目录下查看,如下所示:
/sys下的子目录
说明
/sys/devices
这是系统中所有设备储存的目录,也就是系统中的所有设
备在sysfs中的呈现、表达,也是sysfs管理设备的最重要
的目录结构。
/sys/block
块设备的储存目录,这是一个过时的插口,根据sysfs的设
计理念,系统所有的设备都储存在/sys/devices目录下,所
以/sys/block目录下的文件一般是链接到/sys/devices目录下的文件。
/sys/bus
这是系统中的所有设备根据总线类型分类放置的目录结
构,/sys/devices目录下每一种设备都是挂在某种总线下
的,例如i2c设备挂在I2C总线下。同样,/sys/bus目录下
的文件一般也是链接到了/sys/devices目录。
/sys/class
这是系统中的所有设备根据其功能分类放置的目录结构,
同样该目录下的文件也是链接到了/sys/devices目录。根据
设备的功能界定组织在/sys/class目录下,例如/sys/class/leds
目录中储存了所有的LED设备,/sys/class/input目录中储存
/sys/dev
这是根据设备号的形式放置的目录结构,同样该目录下的
文件也是链接到了/sys/devices目录。该目录下有好多以主
设备号:次设备号(major:minor)命名的文件,这种文件都
是链接文件,链接到/sys/devices目录下对应的设备。
/sys/firmware
描述了内核中的固件
/sys/fs
用于描述系统中所有文件系统,包括文件系统本身和按文
件系统分类储存的已挂载点。
/sys/kernel
这儿是内核中所有可调参数的位置
/sys/module
这儿有系统中所有模块的信息。
/sys/power
这儿是系统中电源选项,有一些属性可以用于控制整个系
统的电源状态。
系统中所有的设备(对象)就会在/sys/devices彰显下来linux 应用,是sysfs文件系统中最重要的目录结构;而/sys/bus、/sys/class、/sys/dev分别将设备根据挂载的总线类型、功能分类以及设备号的方式将设备组织储存在这种目录中,这种目录下的文件都是链接到了/sys/devices中。
1.3LED的控制方法
正点原子I.MX6U开发板底板上有一颗可被用户控制的LED灯,如下所示:
此LED设备使用的是Linux内核标准LED驱动框架注册而成,在/dev目录下并没有其对应的设备节点,其实现使用sysfs方法控制。步入到/sys/class/leds目录下,如下所示:
这儿我们主要关注便是brightness、max_brightness以及trigger三个文件,这三个文件都是LED设备的属性文件:
brightness:控制LED的亮灭max_brightness:该属性文件只能被读取linux 应用,不能写,用于获取LED设备的最大照度等级。trigger:触发模式,该属性文件可读可写,读表示获取LED当前的触发模式,写表示设置LED的触发模式。不同的触发模式其触发条件不同,LED设备会依照不同的触发条件手动控制其亮、灭状态,通过cat命令查看该属性文件,可获取LED支持的所有触发模式以及LED当前被设置的触发模式:
方括弧([heartbeat])括上去的表示当前LED对应的触发模式,none表示无触发,常用的触发模式包括none(无触发)、mmc0(当对mmc0设备发起读写操作的时侯LED会闪动)、timer(LED会有规律的一亮一灭,被定时器控制住)、heartbeat(脉搏呼吸模式,LED模仿人的脉搏呼吸那样亮灭变化)。
大致控制方法:将设备属性文件进行写入操作
往trigger写入参数可改变LED灯的触发形式
往brightness写入数据可以开关LED灯,写1为开,写0为关
#include
#include
#include
#include
#include
#include
#include
#define LED_TRIGGER "/sys/class/leds/sys-led/trigger" //LED触发方式属性文件
#define LED_ON_OFF "/sys/class/leds/sys-led/brightness" //LED灯的开和关
#define HELP() fprintf(stderr, "usage:n %s n %s n", argv[0], argv[0])
#define NONE 0 //none表示无触发,常用的触发模式包括none(无触发)
#define MMC0 1 //mmc0(当对 mmc0设备发起读写操作的时候 LED会闪烁)
#define TIMER 2 //timer(LED会有规律的一亮一灭,被定时器控制住)
#define HEARTBEAT 3 //heartbeat(心跳呼吸模式,LED模仿人的心跳呼吸那样亮灭变化)。
/* 识别从键盘输入的第三个参数*/
int msg_handle(char *buf)
{
if(!strcmp(buf,"none")){return NONE;}
if(!strcmp(buf,"mmc0")){return MMC0;}
if(!strcmp(buf,"timer")){return TIMER;}
if(!strcmp(buf,"heartbeat")){return HEARTBEAT;}
return -1;
}
int main(int argc ,char *argv[])
{
int fd1 = 0; //打开控制触发方式的设备属性文件的索引
int fd2 = 0; //打开LED亮灭的设备属性文件的索引
int ret = 0;
int write_ret = 0; //write函数的返回值
if(argc < 2) //参数少于2时错误
{
HELP();
exit(-1);
}
fd1 = open(LED_TRIGGER,O_RDWR); //fd1设备文件操作为控制触发方式
if(fd1<0)
{
perror("触发模式:");
}
fd2 = open(LED_ON_OFF,O_RDWR); //fd2设备文件用于控制开关
if(fd2<0)
{
perror("开关状态:");
}
if(!strcmp(argv[1],"on")) //打开LED灯
{
write(fd1,"none",strlen("none"));
write(fd2,"1",1);
}
else if(!strcmp(argv[1],"off")) //关闭LED灯
{
write(fd1,"none",strlen("none"));
write(fd2,"0",1);
}
else if(!strcmp(argv[1],"trigger")) //改变LED灯的触发方式
{
if(argc != 3)
{
HELP();
exit(-1);
}
//当参数2为trigger时,运行程序时需要第三参数,none|mmc0|timer|heartbeat
ret = msg_handle(argv[2]);
switch (ret)
{
case NONE:
break;
case MMC0:
break;
case TIMER:
write_ret = write(fd1,argv[2],strlen(argv[2])); //定时器呼吸灯,按固定频率亮灭
if(write_ret < 0){perror("");}
break;
case HEARTBEAT:
write_ret = write(fd1,argv[2],strlen(argv[2])); //呼吸灯
if(write_ret < 0){perror("");}
break;
default:
HELP();
break;
}
}
close(fd1);
close(fd2);
}
程序中定义了两个宏,LED_TRIGGER和LED_BRIGHTNESS,分别对应/sys/class/leds/sys-led/trigger和/sys/class/leds/sys-led/brightness属性文件,HELP()为复印帮助信息
二交叉编译
交叉编译器的安装请看主页其他文章
在使用之前先对交叉编译工具的环境进行设置,使用source执行安装目录下的environment-setup-cortexa7hf-neon-poky-linux-gnueabi脚本文件即可,如下所示:
source /opt/fsl-imx-x11/4.1.15-2.1.0/environment-setup-cortexa7hf-neon-poky-linux-gnueabi
arm-linux-gnueabihf-gccleds.c-oled就是将leds.c文件交叉编译为开发板的可执行文件
scpledroot@192.168.121.168:/home/root为将led可执行文件拷贝到开发板中
接出来执行led程序测试:
./ledon#照亮LED./ledoff#熄灭LED./ledtriggerheartbeat#将LED触发模式设置为heartbeat./ledtriggertimer#将LED触发模式设置为timer
文章评论