注:本篇基于野火IMX6LL PRO开发板
一.什么是驱动程序
驱动程序(Driver)是一种软件,用于充当操作系统与硬件设备之间的桥梁,使它们能够互相通信和交互。驱动程序的主要功能是提供一个标准化的接口,使操作系统能够控制和管理硬件设备,实现数据传输、设备配置、错误处理和其他与硬件相关的任务。
驱动程序通常由设备制造商或硬件供应商开发,以确保设备与操作系统之间的兼容性和良好的性能。不同类型的硬件设备(如声卡、显卡、网卡、打印机等)通常需要具有独立的驱动程序才能在操作系统中正常工作。
驱动程序的工作原理如下:
-
识别硬件设备:操作系统会通过一个过程来识别系统中连接的硬件设备。识别的过程中,操作系统会通过与设备通信交换特定的标识信息或查询设备的特征。
-
加载驱动程序:一旦设备被识别,操作系统会查找设备对应的驱动程序。操作系统会根据设备的标识信息或其他特征来确定正确的驱动程序,并将其加载到内存中。
-
初始化设备:在加载驱动程序后,操作系统会调用相应的驱动程序代码来初始化设备。这包括配置设备参数、分配设备内存、建立设备与操作系统的连接等。
-
提供接口与功能:一旦设备初始化完成,驱动程序会向操作系统提供一个标准化的接口,使操作系统能够与设备进行通信。通过这个接口,操作系统可以向设备发送指令、请求数据、接收设备状态等,并获得设备提供的功能。
-
处理异常和错误:驱动程序还负责处理设备发生的异常和错误情况。例如,当设备发生故障或出现错误时,驱动程序会向操作系统报告错误信息或采取适当的纠正措施。
总而言之,驱动程序在操作系统中起着至关重要的作用,它们是实现硬件设备和操作系统之间无缝通信的关键组成部分。通过驱动程序的配合,操作系统可以管理和控制各种硬件设备,为用户提供更好的使用体验和功能扩展。
本质:为硬件设备创建相应的设备节点文件,创建设备文件时,规定好设备文件的使用方式。
二.应用程序
应用程序(Application Program)是一种软件,旨在帮助用户执行特定的任务或完成特定的功能。应用程序通常由开发人员或软件公司开发,以满足用户的需求并提供特定的功能和服务。
应用程序可以运行在各种计算设备上,包括个人电脑、智能手机、平板电脑、服务器等。它们可以包含各种类型的软件,如办公软件、娱乐软件、图像处理软件、游戏软件、通信软件等。应用程序的种类和功能范围广泛,以满足各行各业的需求。
应用程序的特点如下:
-
用户界面:应用程序通常具有用户界面,以便用户能够与其进行交互和操作。用户界面可以是图形用户界面(GUI)或命令行界面(CLI),具体取决于应用程序的类型和设计。
-
功能和任务:应用程序旨在提供特定的功能和执行特定的任务。不同的应用程序具有不同的功能,例如文字处理、电子表格计算、音频播放、视频编辑等。
-
数据处理:许多应用程序需要处理数据,如存储、读取、修改和分析数据。这可以是用户输入的数据、从外部源获取的数据或应用程序自身生成的数据。
-
持久性:应用程序通常需要存储和管理数据。这可能涉及到将数据保存到文件、数据库或其他存储介质中,以便在需要时进行读取和使用。
-
可定制性:一些应用程序允许用户根据自己的需求进行定制和配置。这可以包括更改用户界面的外观、设置偏好项、添加插件或扩展功能等。
应用程序的开发通常涉及编程语言、开发工具和技术。开发人员使用这些工具和技术来设计、编写、测试和发布应用程序。一旦应用程序开发完成,用户可以通过安装或下载它来使用,并根据自己的需要进行操作和配置。
综上所述,应用程序是为了满足用户需求和提供特定功能而设计的软件。它们为用户提供了各种各样的功能和服务,使用户能够更好地利用计算设备来完成特定任务或获得所需的功能。
本质:根据驱动程序规定的设备文件使用方式去控制硬件
控制硬件设备步骤
1.找到硬件设备所对应的设备节点文件
- /dev目录下
- /sys目录下
2.找出驱动程序规定的设备文件使用方式,并进行调用。
三.LED小demo
led.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>
//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"
int main(int argc, char *argv[])
{
int res = 0;
int r_fd, g_fd, b_fd;
printf("This is led demo\n");
//获取三个灯的文件描述符
r_fd = open(RLED_DEV_PATH, O_WRONLY);
if (r_fd < 0)
{
printf("Fail to Open %s device\n", RLED_DEV_PATH);
exit(1);
}
g_fd = open(GLED_DEV_PATH, O_WRONLY);
if (r_fd < 0)
{
printf("Fail to Open %s device\n", GLED_DEV_PATH);
exit(1);
}
b_fd = open(BLED_DEV_PATH, O_WRONLY);
if (r_fd < 0)
{
printf("Fail to Open %s device\n", BLED_DEV_PATH);
exit(1);
}
while (1)
{
//红灯亮一秒
write(r_fd, "255", 3);
sleep(1);
write(r_fd, "0", 1);
//绿灯亮一秒
write(g_fd, "255", 3);
sleep(1);
write(g_fd, "0", 1);
//红灯亮一秒
write(b_fd, "255", 3);
sleep(1);
write(b_fd, "0", 1);
}
write(r_fd, "0", 1);
write(g_fd, "0", 1);
write(b_fd, "0", 1);
close(r_fd);
close(g_fd);
close(b_fd);
return 0;
}
Makefile
ARCH ?= x86
ifneq ($(ARCH),x86)
CC=gcc
else
CC=arm-linux-gnueabihf-gcc
endif
#TARGET 目标生成文件
TARGET=led
#生成目录
BUILD_DIR=build
#存放.c的目录
SRC_DIR=led
#存放所有的.c文件,包含路径
SOURCES=$(foreach dir,$(SRC_DIR),$(wildcard $(dir)/*.c))
#存放所有的.o文件
OBJS=$(patsubst %.c,$(BUILD_DIR)/%.o,$(notdir $(SOURCES)))
#定义额外的搜索路径
VPATH=$(SRC_DIR)
$(BUILD_DIR)/$(TARGET):$(OBJS)
$(CC) $^ -o $@
$(BUILD_DIR)/%.o:%.c | create_build
$(CC) -c $< -o $@
.PHONY:clear earth create_build
clear:
rm -rf $(BUILD_DIR)
earth:
. /etc/profile
create_build:
mkdir -p $(BUILD_DIR)