[嵌入式linux开发]利用linux内核驱动模块来控制硬件外设---LED

linux编写硬件外设的驱动–LED

在我们的linux驱动编写时, 若是使用了最小核心板/系统板, 这些系统模块通常都有官方的SDK, 将其中的GPIO或其他外设引出.

这样我们可以省去硬件内存映射的步骤, 直接操作其中注册好的设备.

知识点

  1. 内核态的文件打开/关闭与读写
  2. 虚拟设备到真实设备的映射, 硬件抽象的实现, 便于移植/修改
  3. 体验将多个代码文件共同编译成一个ko内核驱动模块
  4. 使用C语言程序来与用户态的驱动进行交互, 从而控制内核模块

哪里可以找到这些硬件设备

设备文件通常都存储在**/sys/class目录**下

在这里插入图片描述

编写LED内核驱动的前置知识

在LED设备的目录下, 有以下分区

在这里插入图片描述

其中brightness代表了当前的亮度, 可读可写, 写入要求为字符’1’或’0’.

其中trigger代表了LED的亮灭触发源, 可读可写, 可以通过cat指令来获取可以写入的变量范围.

在终端中通过命令行来控制LED

在终端下, 我们可以通过echo指令来为brightness赋值

echo 1/0 > /sys/class/leds/led0/brightness

实现最简单的C语言LED控制程序

对于我们的C语言程序来说, 这brightness也是一种文件而已, 要对其赋值, 自然要用到

  1. open函数
  2. write函数
  3. read函数(如有必要)

注意: open/write时要在root用户下, 否则没有权限, 导致打开文件失败

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>

int main(int argc, char** argv){
   
   
    int fd;
    char status;

    if (argc != 3) 
	{
   
   
		printf("Usage: %s <dev> <on | off>\n", argv[0]);
		return -1;
	}

    fd = open(argv[1], O_RDWR);
    if(fd == -1){
   
   
        printf("can not open file %s\r\n", argv[1]);
        return -1;
    }

    if(0 == strcmp(argv[2], "on")){
   
   
        status = '1';
        write(fd, &status, 1);
    }else{
   
   
        status = '0';
        write(fd, &status, 1);
    }

    close(fd);

    return 0;
}

编写完成之后, 进行简单的编译

gcc -o led_test led_test.c

如果发现报错: 找不到头文件 <stddef.h> 可以尝试sudo apt-get upgrade一下, 可能是内核更新导致的. 内核版本可通过uname -r指令查看

编译完成后, 就可以直接对其进行操作了

在这里插入图片描述

如果没有在root用户或者sudo前缀下直接打开led0, 就会报错无法打开文件

在这里插入图片描述

正常写入则不会有报错提示(不过也没有其他消息提示, 建议结合自己的硬件观察效果, 或者加一个read函数)

在这里插入图片描述

开始编写LED内核驱动模块

类似地, 我们内核驱动模块的关键点依旧在于file_operation中的成员函数的实现

LED驱动模块 – 本体

#include "linux/module.h"
#include "linux/kernel.h"
#include "linux/init.h"

#include "linux/fs.h"
#include "linux/errno.h"
#include <linux/miscdevice.h>
#include <linux/major.h>
#include <linux/mutex.h>
#include <linux/proc_fs.h>
#include <linux/seq_file.h>
#include <linux/stat.h>
#<
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值