Linux 外设驱动 应用 1 IO口输出

news/2024/10/8 12:42:24 标签: linux

从这里开始外设驱动介绍,这里使用的IMX8的芯片作为驱动介绍

开发流程:

  1. 修改设备树,配置 GPIO1_IO07 为 GPIO 输出。
  2. 使用 sysfs 接口或编写驱动程序控制 GPIO 引脚。
  3. 编译并测试。

这里假设设备树,已经配置好了。不在论述这个问题,设备树的问题。会其它地方单独来说,这里说明如何编写驱动程序。

应用1 IO口输出

1.1 硬件介绍

LED 是英文 Light Emitting Diode 的缩写,译为发光二极管。是由含镓(Ga)、砷(As)、磷(P)、氮(N)等的化合物制成。发光二极管是半导体二极管中的一种,可以把电能转换成光能,与普通二极管一样具有单向导电性。LED 灯应用:例如开关指示灯、LED 广告牌、LED 显示屏、LED 车灯、红路灯等。

平台有 4 个 LED 灯,每个 LED 接一个 IO 引脚,通过控制 IO 的高低来控制灯的亮灭。

在这里插入图片描述
对应四个IO口:
GPIO1_IO07 D7
GPIO1_IO08 D8
GPIO5_IO03 D9
GPIO1_IO01 D10

2 引脚编号介绍

2.1 GPIO口分布

这个是IMX8 的芯片的引脚分布,可以看到引脚编号从GPIO1~GPIO5,每组GPIO的有20到32 个引脚,具体要看芯片的介绍。
在这里插入图片描述

2.2 IMX8 内核, 获取引脚号

查看引脚的编号:

cat /sys/kernel/debug/gpio
在这里插入图片描述
这里看出四个引脚的对应的编号: 计算公式global_gpio_number = (GPIO控制器号 - 1) * 32 + 引脚号

GPIO1_IO07 D7 对应GPIO0 编号= 0+7=7
GPIO1_IO08 D8 对应GPIO0 编号= 0+8=8
GPIO5_IO03 D9 对应GPIO4 编号= 128+7=135
GPIO1_IO01 D10 对应GPIO0 编号= 0+1=1

3 驱动程序编写

3.1 sysfs 控制 GPIO口

导出该引脚

echo 7 > /sys/class/gpio/export

设置方向为输出

echo out > /sys/class/gpio/gpio7/direction

设置输出电平

echo 1 > /sys/class/gpio/gpio7/value

echo 0 > /sys/class/gpio/gpio7/value

清理

echo 7 > /sys/class/gpio/unexport

3.2 使用 GPIO 子系统 API 编写内核驱动

对应linux的驱动代码

int gpio_request(unsigned gpio, const char *label);
void gpio_free(unsigned gpio);
int gpio_direction_input(unsigned gpio);
int gpio_direction_output(unsigned gpio, int value);
int gpio_get_value(unsigned gpio);
void gpio_set_value(unsigned gpio, int value);

3.2.1 驱动代码

需要开发包含头文件

#include <linux/gpio.h>
#include <linux/of_gpio.h>
#include <linux/platform_device.h>
#include <linux/module.h>
#include <linux/gpio.h>
#include <linux/module.h>
#include <linux/kernel.h>

#define MY_GPIO_PIN 7  // 使用 GPIO 编号 24

static int __init my_gpio_init(void)
{
    int ret;

    // 请求 GPIO
    ret = gpio_request(MY_GPIO_PIN, "my_gpio");
    if (ret) {
        pr_err("Failed to request GPIO %d, error %d\n", MY_GPIO_PIN, ret);
        return ret;
    }

    // 设置 GPIO 为输出,并设置初始值为高
    gpio_direction_output(MY_GPIO_PIN, 1);
    pr_info("GPIO %d set as output with initial value 1\n", MY_GPIO_PIN);

    // 设置 GPIO 为低电平
    gpio_set_value(MY_GPIO_PIN, 0);
    pr_info("GPIO %d set to 0\n", MY_GPIO_PIN);

    return 0;
}

static void __exit my_gpio_exit(void)
{
    // 释放 GPIO
    gpio_free(MY_GPIO_PIN);
    pr_info("GPIO %d freed\n", MY_GPIO_PIN);
}

module_init(my_gpio_init);
module_exit(my_gpio_exit);

MODULE_LICENSE("GPL");
MODULE_AUTHOR("Your Name");
MODULE_DESCRIPTION("Simple GPIO Driver Example");

3.2.2 编译编译文件

obj-m := my_gpio_driver.o

KDIR := /lib/modules/$(shell uname -r)/build

all:
    make -C $(KDIR) M=$(PWD) modules

clean:
    make -C $(KDIR) M=$(PWD) clean

3.2.3 加载驱动模块

加载驱动到内核库中

sudo insmod my_gpio_driver.ko

检查日记,验证是否成功

dmesg

3.2.4 卸载驱动模块

sudo rmmod my_gpio_driver

3.2.5 总结

总结

  1. 编写驱动代码:使用 gpio_request() 请求 GPIO,并通过方向设置和读写操作控制 GPIO。
  2. 编译驱动模块:使用 make 和 Makefile 将驱动编译成 .ko 内核模块。 加载模块:通过 insmod 加载驱动,使用 dmesg 检查加载日志。
  3. 测试 GPIO 驱动:通过硬件验证 GPIO 的输入或输出功能。 卸载驱动:通过 rmmod 卸载模块,并释放 GPIO。
  4. 用户空间操作 GPIO:通过 sysfs 接口在用户空间控制 GPIO。

4 应用代码编写

实现流水灯效果

int main(int argc ,char* argv[])
{
		int fd;
		fd = open("/dev/ledtest", O_RDWR, 0777);//打开模块设备文件
		if(fd < 0){								 //打开失败
			printf("open device error\n");
			return -1;
		}
	
		while(1)
		{
			ioctl(fd, 1, 0);//调用ioctl命令,第一参数是灯开,第二个参数是第几个灯
			sleep(1);
			ioctl(fd, 1, 1);
			sleep(1);
			ioctl(fd, 1, 2);
			sleep(1);
			ioctl(fd, 1, 3);
			sleep(1);

			ioctl(fd, 0, 0);//调用ioctl命令,第一参数是灯关,第二个参数是第几个灯
			sleep(1);
			ioctl(fd, 0, 1);
			sleep(1);
			ioctl(fd, 0, 2);
			sleep(1);
			ioctl(fd, 0, 3);
			sleep(1);	
		}
}

http://www.niftyadmin.cn/n/5694144.html

相关文章

linux 重置root密码

在Linux系统中重置root密码的步骤取决于您当前无法使用的root账户的状态。以下是两种常见情况的步骤&#xff1a; 如果您可以通过其他具有sudo权限的用户登录&#xff0c;请执行以下命令&#xff1a; sudo passwd root 然后输入新密码并确认。 如果您无法登录系统&#xff0…

@KafkaListener注解中containerFactory属性的作用

在使用Spring Kafka时&#xff0c;containerFactory 属性是 KafkaListener 注解中的一个选项&#xff0c;它允许你指定一个 ContainerFactory Bean 的名称。这个 ContainerFactory 负责创建和管理 Kafka 消息监听容器。 以下是 containerFactory 属性的一些关键作用&#xff1…

14_Linux中参数和变量查看方法

Linux中参数和变量查看方法 环境变量查看方法内核参数shell内部变量系统配置变量总结Linux 系统中存在大量的变量,它们用于不同的目的,涵盖了环境配置、内核参数、系统设置等多个方面。以下是对不同类型的变量及其查看方法的总结: 环境变量 环境变量是在用户登录会话期间有…

昆虫分类与检测系统源码分享[一条龙教学YOLOV8标注好的数据集一键训练_70+全套改进创新点发刊_Web前端展示]

昆虫分类与检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Visio…

k8s 中存储之 hostPath 卷

目录 1 hostPath 卷介绍 2 hostPath 卷实际应用操作 2.1 创建 pod 资源类型 2.2 修改清单文件增加 hostPath 对应的参数配置 2.3 查看是否创建 卷 和 pod 2.4 创建发布文件测试是否正常访问 1 hostPath 卷介绍 EmptyDir中数据不会被持久化&#xff0c;它会随着Pod的结束而销…

常见的图像处理算法:均值滤波----mean filter

一、什么是均值滤波 均值滤波器是一种常见的图像滤波器&#xff0c;是典型的线性滤波算法。其基本原理是用一个给定的窗口覆盖图像中的每一个像素点&#xff0c;将窗口内的像素值求平均值&#xff0c;然后用这个平均值代替原来的像素值。均值滤波器可以去除噪声、平滑图像、减少…

swagger2.9.2 和 springboot3.3.4版本冲突问腿

swagger2.9.2 和 springboot3.3.4版本冲突问腿 问题描述&#xff1a;当我们使用 swagger 2.9.2版本的时候&#xff0c;如果恰好我们使用的 springboot 版本是3.x版本&#xff0c;会出现启动报错的问题 解决办法&#xff1a;直接使用swagger 3.x 版本和 springboot 3.x 版本 …

迷茫解惑(一)——面向就业

文章目录 一、前言二、关于实习三、关于私信四、关于发论文五、关于工程经验-产品经历六、效率七、关于导师的思想 一、前言 我总是是在不同的阶段会存在困惑&#xff0c;会问师兄、老师、亲戚、哥哥等等&#xff0c;今天做个小总结&#xff0c;以后应该会有不同的总结吧。 先…