Linux 外设驱动 应用 1 IO口输出
从这里开始外设驱动介绍,这里使用的IMX8的芯片作为驱动介绍
开发流程:
- 修改设备树,配置 GPIO1_IO07 为 GPIO 输出。
- 使用 sysfs 接口或编写驱动程序控制 GPIO 引脚。
- 编译并测试。
这里假设设备树,已经配置好了。不在论述这个问题,设备树的问题。会其它地方单独来说,这里说明如何编写驱动程序。
应用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 总结
总结
- 编写驱动代码:使用 gpio_request() 请求 GPIO,并通过方向设置和读写操作控制 GPIO。
- 编译驱动模块:使用 make 和 Makefile 将驱动编译成 .ko 内核模块。 加载模块:通过 insmod 加载驱动,使用 dmesg 检查加载日志。
- 测试 GPIO 驱动:通过硬件验证 GPIO 的输入或输出功能。 卸载驱动:通过 rmmod 卸载模块,并释放 GPIO。
- 用户空间操作 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); }
}
相关文章:

Linux 外设驱动 应用 1 IO口输出
从这里开始外设驱动介绍,这里使用的IMX8的芯片作为驱动介绍 开发流程: 修改设备树,配置 GPIO1_IO07 为 GPIO 输出。使用 sysfs 接口或编写驱动程序控制 GPIO 引脚。编译并测试。 这里假设设备树,已经配置好了。不在论述这个问题…...

基于SpringBoot+Vue+MySQL的留守儿童爱心网站
系统展示 用户前台界面 管理员后台界面 系统背景 随着现代社会的发展,留守儿童问题日益受到关注。传统的纸质管理方式已经无法满足现代人们对留守儿童爱心信息的需求。为了提高留守儿童爱心信息的管理效率,增加用户信息的安全性,并方便及时反…...

调用第三方接口
目录 一、分析给出的接口文档 二、请求体格式之间的区别 三、示例代码 一、分析给出的接口文档 一般的接口文档包括以下几大部分: 1、请求URL:http://{ip}:{port}/api/ec/dev/message/sendCustomMessageSingle 2、请求方式:POST、GET等 3、…...
JAVA 多线程入门例子:CountDownLatch
首先确定线程数量。如果数据集合的大小小于50,就只使用一个线程;否则使用5个线程。计算每个线程平均处理的数据数量sizePerThread以及余数remainder。在划分数据子集合时,对于每个线程的处理范围进行计算。如果有余数,就将余数依次…...

k8s jenkins 动态创建slave
k8s jenkins 动态创建slave 简述使用jenkins动态slave的优势:配置jenkins动态slave配置 Pod Template配置容器模板挂载卷 测试 简述 持续构建与发布是我们日常工作中必不可少的一个步骤,目前大多公司都采用 Jenkins 集群来搭建符合需求的 CI/CD 流程&am…...

MVS海康工业相机达不到标称最大帧率
文章目录 一、相机参数设置1、取消相机帧率限制2、修改相机图像格式3、调整相机曝光时间4、检查相机数据包大小(网口相机特有参数)5、 恢复相机默认参数6、 相机 ADC 输出位深调整 二、系统环境设置1、 网口相机设置2、 USB 相机设置 一、相机参数设置 …...
数据结构:用双栈实现一个队列
要用两个栈实现一个队列,可以利用“栈”的后进先出 (LIFO) 特性来模拟“队列”的先进先出 (FIFO) 操作。具体做法是使用两个栈:一个作为入栈栈,另一个作为出栈栈。 算法步骤 入队操作(enqueue): 将元素压…...
QScroller Class
Header:#include < QScroller > qmake:QT += widgets Since:Qt 5.0 Inherits:QObject This class was introduced in Qt 5.0. Public Types enum Input {InputPress, InputMove, InputRelease } enum ScrollerGestureType {TouchGesture, LeftMouseButtonGesture,…...
React高阶组件详解
React高阶组件(HOC)详解 定义 React高阶组件(HOC)是一个函数,该函数接受一个组件作为参数并返回一个新的组件。高阶组件本身不是一个组件,而是一个函数,它利用React的组合特性,对传入…...

TextView把其它控件挤出屏幕的处理办法
1.如果TextView后面的控件是紧挨着TextView的,可以给TextView添加maxWidth限制其最大长度 上有问题的布局代码 <?xml version"1.0" encoding"utf-8"?> <layout xmlns:android"http://schemas.android.com/apk/res/android&qu…...
长度为 K 的重复字符子串数目
长度为 K 的重复字符子串 给你一个由小写字母组成的长度为n的字符串 S ,找出所有长度为 k 且包含重复字符的子串,请你返回全部满足要求的子串的数目。 数据范围: 2≤k≤400 , 5≤n≤900 进阶: 时间复杂度O(n),空间复杂…...

html+css+js实现轮播图
实现效果: HTML部分 <div class"carousel"><div class"carousel-wrapper"><img src"./image/1.png" alt""></div><ul class"carousel-indictor"><li class"active"…...
Boost集成模型异同
一、常见Boost集成模型 AdaBoost、GBDT和XGBoost都是集成学习中的提升(Boosting)算法,它们通过组合多个弱学习器来构建一个强学习器。从经验上来说,XGBoost是诸多竞赛的大杀器,在实际业务工作中可能需要用到集成模型的…...
【系统架构设计师】案例专题四:嵌入式系统考点梳理
更多内容请见: 备考系统架构设计师-核心总结目录 摘要:本文主要梳理系统架构设计师 - 嵌入式系统 案例考点 ,主要包括嵌入式相关概念、软件和硬件可靠性、冗余技术、软件容错、集群技术、负载均衡、可维护性的评价指标、软件维护的分类等。 文章目录 一、相关概念二、软件可…...

Ngin入门套餐
快速了解Nginx 一、代理1.1 正向代理1.2 反向代理1.3 正向代理和反向代理的区别 二、Nginx负载均衡策略2.1 轮询(Round Robin)2.2 加权轮询(Weighted Round Robin)2.3 IP 哈希(IP Hash)2.4 最少连接&#x…...

使用linux编译main.cpp文件
1、首先创建一个简单的test.cpp,使用终端命令形式: touch test.cpp 创建结束,记得ls一下,如下: 2、找到创建结束的test.cpp文件,然后右键编辑,输入一个简单的代码,如下 #include …...

服务器部署Traefik 实现子级域名路由服务(对外子域名80,路由对内大端口)
文章目录 1.Traefik安装2.启动nginx配置路由 本文档只是为了留档方便以后工作运维,或者给同事分享文档内容比较简陋命令也不是特别全,不适合小白观看,如有不懂可以私信,上班期间都是在得 前言,领导让我调研在线发布得…...
@RequestParam @PathVirable @RequestBody @ApiParam的区别
RequestParam 最常用用value指定参数名字,required字段指定参数是否必须,默认为true,当requiredfalse时,一般配合着defaultValue"xx"使用对应的url是这样的: https://localhost/requestParam/test?key1va…...

Vulnhub靶场案例渗透[5]- DC4
文章目录 1. 靶场搭建2. 信息收集2.1 确定靶机ip2.2 主机信息收集2.3 主机目录探测 3. 渗透过程3.1 sql注入检测3.2 burp爆破3.3 反弹shell3.4 提权 4. 总结 1. 靶场搭建 靶场源地址 检验下载文件的检验码,对比没问题使用vmware打开 # windwos 命令 Get-FileHash …...

http协议概述与状态码
目录 1.HTTP概述 1.1请求报文起始行与开头 1.2响应报文起始行 1.3响应报文开头 2.http状态协议码 1.HTTP概述 默认端口 80 HTTP超文本传输与协议: 数据请求和响应 传输:将网站的数据传递给用户 超文本:图片 视频等 请求request:打开网站 访问网站 响应r…...
uniapp 对接腾讯云IM群组成员管理(增删改查)
UniApp 实战:腾讯云IM群组成员管理(增删改查) 一、前言 在社交类App开发中,群组成员管理是核心功能之一。本文将基于UniApp框架,结合腾讯云IM SDK,详细讲解如何实现群组成员的增删改查全流程。 权限校验…...

7.4.分块查找
一.分块查找的算法思想: 1.实例: 以上述图片的顺序表为例, 该顺序表的数据元素从整体来看是乱序的,但如果把这些数据元素分成一块一块的小区间, 第一个区间[0,1]索引上的数据元素都是小于等于10的, 第二…...

突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合
强化学习(Reinforcement Learning, RL)是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程,然后使用强化学习的Actor-Critic机制(中文译作“知行互动”机制),逐步迭代求解…...

云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地
借阿里云中企出海大会的东风,以**「云启出海,智联未来|打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办,现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...

Module Federation 和 Native Federation 的比较
前言 Module Federation 是 Webpack 5 引入的微前端架构方案,允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…...
拉力测试cuda pytorch 把 4070显卡拉满
import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试,通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小,增大可提高计算复杂度duration: 测试持续时间(秒&…...

EtherNet/IP转DeviceNet协议网关详解
一,设备主要功能 疆鸿智能JH-DVN-EIP本产品是自主研发的一款EtherNet/IP从站功能的通讯网关。该产品主要功能是连接DeviceNet总线和EtherNet/IP网络,本网关连接到EtherNet/IP总线中做为从站使用,连接到DeviceNet总线中做为从站使用。 在自动…...

push [特殊字符] present
push 🆚 present 前言present和dismiss特点代码演示 push和pop特点代码演示 前言 在 iOS 开发中,push 和 present 是两种不同的视图控制器切换方式,它们有着显著的区别。 present和dismiss 特点 在当前控制器上方新建视图层级需要手动调用…...
git: early EOF
macOS报错: Initialized empty Git repository in /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core/.git/ remote: Enumerating objects: 2691797, done. remote: Counting objects: 100% (1760/1760), done. remote: Compressing objects: 100% (636/636…...
HTML前端开发:JavaScript 获取元素方法详解
作为前端开发者,高效获取 DOM 元素是必备技能。以下是 JS 中核心的获取元素方法,分为两大系列: 一、getElementBy... 系列 传统方法,直接通过 DOM 接口访问,返回动态集合(元素变化会实时更新)。…...