MX6LL控制LED设备

MX6LL控制LED设备_第1张图片

注:本篇基于野火IMX6LL PRO开发板

一.什么是驱动程序

驱动程序(Driver)是一种软件,用于充当操作系统与硬件设备之间的桥梁,使它们能够互相通信和交互。驱动程序的主要功能是提供一个标准化的接口,使操作系统能够控制和管理硬件设备,实现数据传输、设备配置、错误处理和其他与硬件相关的任务。

驱动程序通常由设备制造商或硬件供应商开发,以确保设备与操作系统之间的兼容性和良好的性能。不同类型的硬件设备(如声卡、显卡、网卡、打印机等)通常需要具有独立的驱动程序才能在操作系统中正常工作。

驱动程序的工作原理如下:

  1. 识别硬件设备:操作系统会通过一个过程来识别系统中连接的硬件设备。识别的过程中,操作系统会通过与设备通信交换特定的标识信息或查询设备的特征。

  2. 加载驱动程序:一旦设备被识别,操作系统会查找设备对应的驱动程序。操作系统会根据设备的标识信息或其他特征来确定正确的驱动程序,并将其加载到内存中。

  3. 初始化设备:在加载驱动程序后,操作系统会调用相应的驱动程序代码来初始化设备。这包括配置设备参数、分配设备内存、建立设备与操作系统的连接等。

  4. 提供接口与功能:一旦设备初始化完成,驱动程序会向操作系统提供一个标准化的接口,使操作系统能够与设备进行通信。通过这个接口,操作系统可以向设备发送指令、请求数据、接收设备状态等,并获得设备提供的功能。

  5. 处理异常和错误:驱动程序还负责处理设备发生的异常和错误情况。例如,当设备发生故障或出现错误时,驱动程序会向操作系统报告错误信息或采取适当的纠正措施。

总而言之,驱动程序在操作系统中起着至关重要的作用,它们是实现硬件设备和操作系统之间无缝通信的关键组成部分。通过驱动程序的配合,操作系统可以管理和控制各种硬件设备,为用户提供更好的使用体验和功能扩展。

本质:为硬件设备创建相应的设备节点文件,创建设备文件时,规定好设备文件的使用方式。

二.应用程序

应用程序(Application Program)是一种软件,旨在帮助用户执行特定的任务或完成特定的功能。应用程序通常由开发人员或软件公司开发,以满足用户的需求并提供特定的功能和服务。

应用程序可以运行在各种计算设备上,包括个人电脑、智能手机、平板电脑、服务器等。它们可以包含各种类型的软件,如办公软件、娱乐软件、图像处理软件、游戏软件、通信软件等。应用程序的种类和功能范围广泛,以满足各行各业的需求。

应用程序的特点如下:

  1. 用户界面:应用程序通常具有用户界面,以便用户能够与其进行交互和操作。用户界面可以是图形用户界面(GUI)或命令行界面(CLI),具体取决于应用程序的类型和设计。

  2. 功能和任务:应用程序旨在提供特定的功能和执行特定的任务。不同的应用程序具有不同的功能,例如文字处理、电子表格计算、音频播放、视频编辑等。

  3. 数据处理:许多应用程序需要处理数据,如存储、读取、修改和分析数据。这可以是用户输入的数据、从外部源获取的数据或应用程序自身生成的数据。

  4. 持久性:应用程序通常需要存储和管理数据。这可能涉及到将数据保存到文件、数据库或其他存储介质中,以便在需要时进行读取和使用。

  5. 可定制性:一些应用程序允许用户根据自己的需求进行定制和配置。这可以包括更改用户界面的外观、设置偏好项、添加插件或扩展功能等。

应用程序的开发通常涉及编程语言、开发工具和技术。开发人员使用这些工具和技术来设计、编写、测试和发布应用程序。一旦应用程序开发完成,用户可以通过安装或下载它来使用,并根据自己的需要进行操作和配置。

综上所述,应用程序是为了满足用户需求和提供特定功能而设计的软件。它们为用户提供了各种各样的功能和服务,使用户能够更好地利用计算设备来完成特定任务或获得所需的功能。

本质:根据驱动程序规定的设备文件使用方式去控制硬件

控制硬件设备步骤

1.找到硬件设备所对应的设备节点文件

  • /dev目录下
  • /sys目录下
    2.找出驱动程序规定的设备文件使用方式,并进行调用。

三.LED小demo

led.c

#include 
#include 
#include 
#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"

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)

你可能感兴趣的:(microsoft,linux,嵌入式硬件)