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

从这里开始外设驱动介绍,这里使用的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);	
		}
}

5 自动运行

5.1 利用脚本来启动程序

进入到 system 文件夹

cd /etc/systemd/system

创建一个service

vim led_blink.service

编辑这个serivce

[Unit]
Description=Blink LED    // 服务的名字
After=network.target     // 程序运行后
 
[Service]
ExecStart=/home/pi/Desktop/test/a.out   // 你的程序的路径

StandardOutput=journal     // 输出日志
StandardError=journal
 
[Install]
WantedBy=multi-user.target

重新启动加载服务

sudo systemctl daemon-reload
sudo systemctl enable led_blink.service
systemctl start led_blink.service
journalctl -u myapp.service    // 查看日志

其他命令参考

systemctl enable myapp.service  #开启开机自启动
systemctl disable myapp.service #停止开机自启动 
systemctl start myapp.service   #启动 myapp 服务 
systemctl stop myapp.service    #停止 myapp服务 
systemctl restart myapp.service #重启 myapp服务 
systemctl status myapp.service  #查看服务当前状态
systemctl list-units --type=service  #查看所有已启动的服务 
systemctl list-unit-files |grep myapp #查看是否正确启动
sudo systemctl daemon-reload #刷新配置system目录
### 回答1: Linux外设驱动是一个非常重要的话题,因为它涉及到Linux操作系统与外设之间的交互。在这个视频中,我们会详细讲解有关Linux外设驱动的方方面面。 首先,我们会介绍Linux操作系统和外设之间的基本交互方式。这包括输入/输出(IO)操作、设备文件、设备树等知识点。通过这些基本概念的介绍,你可以理解Linux如何与外设之间进行通讯并实现数据的传输。 其次,我们会重点讲解如何编写Linux外设驱动。这里我们涉及到的主要内容包括Linux模块编程、设备驱动框架、外设控制器驱动等。你将学习到如何编写一个简单的外设驱动,如何添加一个新的设备Linux驱动中等等。 同时,这个视频还会介绍Linux外设驱动的一些高级话题。比如中断处理、大页内存管理、DMA数据传输等等。这些内容不仅是深入理解Linux外设驱动的关键,也是能够编写高性能、高可靠性驱动的必要知识。 最后,我们还会提供一些实际的案例和应用场景,让你更深入了解如何在实际项目中应用Linux外设驱动。 总的来说,这个视频将提供全面、深入、平易近人的介绍Linux外设驱动的知识。如果你想更好地理解Linux操作系统和外设之间的交互,或者想深入研究嵌入式系统的开发,这个视频绝对是你不容错过的。 ### 回答2: Linux操作系统是一种自由和开放的操作系统,可以轻松安装在任何计算机上。与其他操作系统不同,Linux支持许多不同的外设,并且需要相应的驱动程序来支持这些设备。因此,外设驱动程序是Linux操作系统的重要组成部分。 一个外设驱动程序是一个在操作系统内核中运行的模块,它提供特定设备的功能和控制。每种外设都有自己的驱动程序。例如,磁盘驱动程序控制磁盘硬件,网络驱动程序控制网络接卡,USB驱动程序控制连接到计算机的USB设备。这些驱动程序允许操作系统通过统一的接使用硬件设备,使用户可以轻松地与电脑进行互动。 在Linux中,外设驱动程序分为两类:内核驱动程序和用户态驱动程序。内核驱动程序运行在操作系统内核中,可用于控制硬件。用户态驱动程序在用户空间中运行,可用于控制硬件设备。用户态驱动程序通常被称为应用程序程序,因为它们是为用户编写的。 在安装Linux时,通常会自动为系统中的硬件设备安装对应的驱动程序。但是,有时候硬件设备并不是Linux系统默认支持的,所以需要手动安装外设驱动程序以支持设备的工作。为此,开发者可以使用C语言或脚本语言,编写自己的驱动程序,以此支持适配新硬件设备。 总而言之,Linux操作系统的灵活性和自由性来自于它对外设驱动程序的支持。这种支持根据硬件设备的不同,可以的扩展支持面。因此,学习如何操作外设驱动程序对于任何Linux狂热爱好者和开发人员都是非常重要的。 ### 回答3: 在Linux系统中,外设驱动是连接硬件设备和操作系统之间的桥梁。在本视频中,我们将为您介绍Linux下的外部设备驱动程序,并说明如何编写和安装这些驱动程序。 首先,我们将讨论Linux内核和外部设备之间的交互方式。内核中有专门的设备驱动框架来协调设备的访问。为了使外部设备正常工作,需要编写一个特定于设备类型的驱动程序,并与内核中的框架进行交互。一旦驱动程序被编写并安装,它将能够与设备通信,从而使设备正常工作。 在本视频中,我们还将讨论Linux设备驱动程序中的编程概念和技术。首先,我们将介绍Linux设备树,并说明如何使用设备树绑定技术来连接硬件和内核。随后,我们将讨论一些基本的驱动程序概念,如中断处理程序、设备文件和字符设备驱动程序等。我们还将介绍Linux驱动程序模块的概念,这使得驱动程序可以动态地添加和删除。 最后,我们将向您展示如何安装驱动程序并使外部设备正常工作。我们将使用一个示例驱动程序来演示每个步骤,并向您展示如何编写、编译和安装该驱动程序。在这个过程中,我们将以实际的编程方式来介绍Linux外设驱动程序的基本知识和技术。 总之,本视频为您介绍了Linux外设驱动程序的基本知识和技术,并向您展示了如何编写和安装这些驱动程序。我相信本视频会给您带来非常有用的技能和知识,使您能够更好地理解和掌握Linux操作系统。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

数贾电子科技

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值