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/valueecho 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 编号 24static int __init my_gpio_init(void)
{int ret;// 请求 GPIOret = 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)
{// 释放 GPIOgpio_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.oKDIR := /lib/modules/$(shell uname -r)/buildall:make -C $(KDIR) M=$(PWD) modulesclean: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.xdnf.cn/news/1557156.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

【英语】5. 考研英语语法体系

文章目录 前言句字的成分一、常规句型简单句&#xff08;5 种&#xff09;1. 定义&#xff1a;句子中只包含 *一套主谓结构* 的句子。&#xff08;一个句子只能有一个谓语动词&#xff09;2. 分类 并列句&#xff08;由关联词组成&#xff09;&#xff08;3 种&#xff09;基本…

二分图算法总结 C++实现

总体概念 染色法 基本思路步骤 将所有的边及其相接的边用邻接表存储起来&#xff1b;遍历所有的点&#xff0c;找到未上色的点&#xff1b;用BFS将该点及其相接的点迭代上色&#xff1b;在上述染色步骤中&#xff0c;如果相邻点的颜色相同则无法形成二分图&#xff1b; 题目…

继电保护之电压重动、电压并列和电压切换

实践&#xff1a;以某开关室10kV母联隔离柜为例&#xff1a; ZYQ-824为PT并列装置&#xff0c;装置内包含一系列继电器&#xff0c;用于PT重动及并列。按照装置编号原则&#xff0c;交流电压切换箱一般命名为7n。 ​下图为装置内继电器线圈部分接线&#xff1a; 下图为装置内…

销售秘籍:故事+观点+结论

在销售的浩瀚宇宙中&#xff0c;隐藏着一个不朽的秘诀——利用人类共有的“错失恐惧”&#xff0c;激发客户内心的渴望与行动。正如村上春树所言&#xff0c;每个故事都深深植根于灵魂&#xff0c;而大仲马则揭示&#xff0c;灵魂之眼所见&#xff0c;比肉眼更为长久铭记。 错…

如何将数据从 AWS S3 导入到 Elastic Cloud - 第 1 部分:Elastic Serverless Forwarder

作者&#xff1a;来自 Elastic Hemendra Singh Lodhi 这是多部分博客系列的第一部分&#xff0c;探讨了将数据从 AWS S3 导入 Elastic Cloud 的不同选项。 Elasticsearch 提供了多种从 AWS S3 存储桶导入数据的选项&#xff0c;允许客户根据其特定需求和架构策略选择最合适的方…

Mysql锁机制解读(敲详细)

目录 锁的概念 全局锁 表级锁 表锁 元数据锁 意向锁 锁的概念 全局锁 表级锁 表锁 元数据锁 主要是对未提交事务&#xff0c;修改表结构造成表结构混乱&#xff0c;进行控制。 在不涉及表结构变化的情况下,元素锁可以忽略。 意向锁 避免有行级锁影响加表级锁&#xff0…

YoloV9改进策略:BackBone改进|CAFormer在YoloV9中的创新应用,显著提升目标检测性能

摘要 在目标检测领域,模型性能的提升一直是研究者和开发者们关注的重点。近期,我们尝试将CAFormer模块引入YoloV9模型中,以替换其原有的主干网络,这一创新性的改进带来了显著的性能提升。 CAFormer,作为MetaFormer框架下的一个变体,结合了深度可分离卷积和普通自注意力…

​.NET一款反序列化执行命令的白名单工具

01阅读须知 此文所提供的信息只为网络安全人员对自己所负责的网站、服务器等&#xff08;包括但不限于&#xff09;进行检测或维护参考&#xff0c;未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作。利用此文所提供的信息而造成的直接或间接后果和损失&#xf…

Unity_Obfuscator Pro代码混淆工具_学习日志

Unity_Obfuscator Pro代码混淆工具_学习日志 切勿将密码或 API 密钥存储在您附带的应用程序内。 混淆后的热更新暂时没有想到怎么办 Obfuscator 文档 https://docs.guardingpearsoftware.com/manual/Obfuscator/Description.html商店链接Obfuscator Pro&#xff08;大约$70&a…

sqli-labs靶场第三关less-3

sqli-labs靶场第三关less-3 1、确定注入点 http://192.168.128.3/sq/Less-3/?id1 http://192.168.128.3/sq/Less-3/?id2 有不同回显&#xff0c;判断可能存在注入&#xff0c; 2、判断注入类型 输入 http://192.168.128.3/sq/Less-3/?id1 and 11 http://192.168.128.3/sq/L…

Nginx07-静态资源访问

零、文章目录 Nginx07-静态资源访问 1、Nginx解决跨域问题 &#xff08;1&#xff09;同源策略 同源策略&#xff08;Same-Origin Policy&#xff09;是一个关键的网络安全概念&#xff0c;由Netscape公司在1995年引入&#xff0c;现在被所有现代浏览器所采用。它限制了从一…

每日一题|871. 最低加油次数|动态规划、内层逆序遍历

题目分析&#xff1a;找到第一个能够实现当前油量能够行驶的最大距离大于等于目标距离&#xff0c;且加油次数最小的加油站和加油次数。 每次加油之后能够行驶的最大距离都是由上一次加油的距离决定的&#xff0c;因此使用dp。 1、dp数组定义 dp[i]是一个一维数组&#xff0…

毕业设计项目 深度学习安全帽佩戴检测(源码+论文)

文章目录 0 前言1 项目运行效果2 设计概要3 最后 0 前言 &#x1f525;这两年开始毕业设计和毕业答辩的要求和难度不断提升&#xff0c;传统的毕设题目缺少创新和亮点&#xff0c;往往达不到毕业答辩的要求&#xff0c;这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师…

keras yolo8目标检测

是从coco数据集提取其中的veh_ids[3,6,8,10] labels[car,bus,truck,traffic light]来做目标检测,分别表示汽车,公交车&#xff0c;卡车&#xff0c;交通灯,用的backbone keras_cv.models.YOLOV8Backbone.from_preset( "yolo_v8_m_backbone_coco" ),不用预训练…

JVM 内存区域 堆

堆是JVM中相当核心的内容&#xff0c;因为堆是JVM中管理的最大一块内存区域&#xff0c;大部分的GC也发生在堆区&#xff0c;那接下来就让深入地探究一下JVM中的堆结构。 需要明确&#xff0c;一个JVM实例只存在一个堆内存&#xff0c;堆区在JVM启动的时候就被创建&#xff0c…

(贪心) 反悔贪心之反悔堆

文章目录 ⭐例题&#x1f6a9;题意与思路 ⭐返回贪心&#x1f6a9;原理&#xff08;反悔池&#xff09;&#x1f6a9;落实到题&#x1f6a9;AC code ⭐练习题⭐END&#x1f31f;交流方式 ⭐例题 经典例题&#xff1a; 871. 最低加油次数 &#x1f6a9;题意与思路 题意&#xf…

MATLAB与R语言在建模中的合作与应用(下篇)

目录 目录 模型训练的协同使用 1. 使用 R 语言进行统计建模 2. 使用 MATLAB 进行机器学习建模 模型评估与调优 1. 在 R 中评估模型性能 2. 在 MATLAB 中进行模型优化 实战示例&#xff1a;MATLAB 与 R 的协同建模 总结 在上篇文章中&#xff0c;我们介绍了 MATLAB 和 R…

2024兴国专转本长期集训产品发布!

9月13日&#xff0c;兴国教育2024长期集训产品发布会在江苏南京顺利召开。 成立于2002年的兴国品牌&#xff0c;时至今日&#xff0c;已经走过了二十二年。兴国新媒体发言人祁老师在发布会上&#xff0c;为大家介绍了兴国这二十年来的变化。 截至2024年8月&#xff0c;兴国在全…

论文阅读:Split-Aperture 2-in-1 Computational Cameras (二)

Split-Aperture 2-in-1 Computational Cameras (一) Coded Optics for High Dynamic Range Imaging 接下来&#xff0c;文章介绍了二合一相机在几种场景下的应用&#xff0c;首先是高动态范围成像&#xff0c;现有的快照高动态范围&#xff08;HDR&#xff09;成像工作已经证…

ctf.bugku - 本地管理员

题目来源&#xff1a;本地管理员 - Bugku CTF 访问页面 页面的最后返回一个字符串&#xff1b; 结尾 应该是base64 编码&#xff1b; 解码得到 test123 同时&#xff0c;提示信息还有 IP禁止访问&#xff0c;本地管理员登陆&#xff1b; 所以&#xff0c;请求头添加&#x…