【嵌入式Linux内核驱动】GPIO子系统

linux设备驱动程序——gpio控制 在gpio初始化的函数中添加这个接口,在加载完成之后查看/sys/class/gpio/目录下是否有相应的gpio$num(这里是gpio26)文件(需要注意的是,在上例中,当用户程序打开设备时才进行gpio的初始化,关闭文件时释放gpio的资源,所以需要打开文件再操作)。当用户程序执行时,用户程序一直获取用户的输入,根据用户输入"on"或者"off",然后将其写入设备文件,触发系统调用,设备文件根据设备号找到内核中相应的file_operation结构体,相应write函数被调用,执行相应的点灯操作。 阅读详情

GPIO子系统

总体框架
image-20230323210215556

通用功能

  • 可以设为输出:让它输出高低电平;
  • 可以设为输入,读取引脚当前电平;
  • 可以用来触发中断

通用属性

  • Active-High and Active-Low
  • Open Drain and Open Source 开漏和开源

GPIOLIB向上提供的gpiod相关接口

GPIOLIB向下提供的gpiochip相关接口

应用编程

/sys/bus/gpio/devices目录下,列出了部分GPIO控制器,如下表:

/sys/bus/gpio/devices/gpiochip0
/sys/bus/gpio/devices/gpiochip1
/sys/bus/gpio/devices/gpiochip2

/sys/class/gpio/gpiochipXXX下,有这些信息:

/sys/class/gpio/gpiochip508]# ls -1
base     // 这个GPIO控制器的GPIO编号
device
label    // 名字
ngpio    // 引脚个数
power
subsystem
uevent

查看GPIO使用情况

cat /sys/kernel/debug/gpio

通过SYSFS使用GPIO

如果只是简单的引脚控制(比如输出、查询输入值),可以不编写驱动程序。

但是涉及中断的话,就需要编写驱动程序了。

  1. 确定GPIO编号

查看每个/sys/class/gpio/gpiochipXXX目录下的label,确定是你要用的GPIO控制器,也称为GPIO Bank。

根据它名字gpiochipXXX,就可以知道基值是XXX。

基值加上引脚offset,就是这个引脚的编号。

  1. 导出/设置方向/读写值

举例:

echo 509 > /sys/class/gpio/export
echo out > /sys/class/gpio/gpio509/direction
echo 1 > /sys/class/gpio/gpio509/value
echo 509 > /sys/class/gpio/unexport

echo 509 > /sys/class/gpio/export
echo in > /sys/class/gpio/gpio509/direction
cat /sys/class/gpio/gpio509/value
echo 509 > /sys/class/gpio/unexport
内核驱动

具体应用时的驱动

GPIO控制器驱动

每个GPIO Controller用一个gpio_device来表示:

  • 里面每一个gpio引脚用一个gpio_desc来表示
  • gpio引脚的函数(引脚控制、中断相关),都放在gpio_chip里

分配/设置/注册一个gpio_chip结构体。

GPIO与Pinctrl的交互

在GPIO控制器设备树中使用如下代码建立映射关系

// 当前GPIO控制器的0号引脚, 对应pinctrlA中的128号引脚, 数量为12
gpio-ranges = <&pinctrlA 0 128 12>; 

在GPIO驱动程序中,解析跟Pinctrl之间的联系:处理gpio-ranges:

  • 这不需要我们自己写代码

  • 注册gpio_chip时会自动调用

Linux GPIO驱动开发:从入门到生产级实践 GPIO(通用输入输出)是嵌入式Linux开发中最基础的硬件接口技术,通过控制引脚电平实现与外部设备的交互。其工作原理基于SoC的寄存器映射,Linux内核通过GPIO子系统提供统一的访问框架。掌握GPIO驱动开发不仅能理解字符设备驱动、设备树等核心机制,更是学习中断处理、并发控制等高级特性的入口。在智能硬件、工业控制等物联网场景中,GPIO驱动作为连接物理世界与数字系统的桥梁,其稳定性和性能直接影响产品可靠性。通过树莓派等开发板实践GPIO驱动开发,可以快速构建完整的Linux驱动知识体系,其中涉及的内核 阅读详情

相关推荐

Linux GPIO驱动开发实战指南

GPIO(通用输入输出)是嵌入式系统中基础而关键的硬件接口技术,通过软件控制硬件引脚的电平状态实现设备交互。Linux内核GPIO子系统采用分层架构设计,通过统一的API抽象硬件差异,开发者只需调用gpio_request/direction_output等核心函数即可完成硬件控制。在物联网和嵌入式设备领域,GPIO驱动广泛应用于LED控制、按键检测、传感器数据采集等场景。以树莓派开发板为例,通过设备树配置硬件信息,结合sysfs用户接口,可以快速构建生产级GPIO驱动解决方案。本文详解从环境搭建、中断处理

weixin_31815843的博客 234

gpio_device,gpio_chip 和 gpio_desc

gpio_device,gpio_chip 和 gpio_desc

qq_23174771的博客 4049

从gpiod到of_get_named_gpio:Linux GPIO子系统API进化史与最佳实践

本文系统梳理了Linux GPIO子系统从传统整数编号API到现代描述符体系(gpiod_*)的演进历程,重点解析了设备树时代的关键函数of_get_named_gpio的工作原理与使用场景。文章深入对比了新旧API的优劣,提供了混合使用时的兼容性策略与最佳实践,并探讨了GPIO与中断、Pinctrl子系统的集成,旨在帮助嵌入式Linux开发者编写更健壮、可移植的驱动代码。

weixin_29185199的博客 223

LINUX驱动之——GPIO的基本驱动

Linux 驱动开发之GPIO

zzzzzz_9的博客 5031

Linux内核gpio驱动子系统剖析 | 02 - gpio控制器的抽象:gpio_chip结构体详解及驱动实现

NULL

Mculover666的博客(嵌入式) 1565

Linux内核GPIO驱动子系统剖析:gpio_chip结构体详解及驱动实现

本文将详细分析gpio_chip结构体的组成以及如何实现一个基本的GPIO驱动。gpio_chip结构体是GPIO驱动的核心数据结构,用于描述一个GPIO控制器。每个GPIO控制器可以管理多个GPIO引脚,而每个引脚都由一个gpio_chip结构体来表示。以上就是GPIO驱动子系统的gpio_chip结构体的详细介绍和驱动实现。在具体的gpio_chip操作函数中,可以访问gpio_chip结构体的成员变量,以完成具体的GPIO操作。首先,需要定义一个gpio_chip结构体的实例,并初始化相关成员。

CyberBytezZ的博客 798

嵌入式Linux GPIO子系统:从架构原理到用户空间与内核驱动实战

通用输入输出(GPIO)是嵌入式系统与外部硬件交互的基础接口。其核心原理在于通过软件抽象层,将物理引脚的操作封装为统一、安全的访问接口,从而屏蔽底层硬件差异。这一设计带来了显著的技术价值:它确保了驱动可移植性,实现了硬件资源的有效管理与并发访问控制,并提供了灵活的权限管理机制。在应用场景上,GPIO广泛用于控制LED、读取按键状态、模拟简单通信协议等。本文聚焦于Linux内核中的GPIO子系统,深入剖析其分层架构,涵盖从设备树(Device Tree)的硬件描述,到核心gpiolib抽象,再到用户空间通过s

weixin_29174013的博客 307

Linux内核gpio驱动子系统剖析 ── gpio子系统整体实现架构探究

通过GPIO Core、GPIO Chip、GPIO Pin和GPIO Interrupt等组件的协调配合,gpio子系统提供了一套管理和控制系统中GPIO引脚的统一接口和机制。gpio子系统是Linux内核中的一个重要子系统,它提供了一套统一的接口和机制,用于管理和控制系统中的GPIO引脚。通过gpio子系统,用户可以方便地对GPIO进行配置、读取和写入操作,实现与外部设备的交互。通过GPIO Chip和GPIO Pin结构体,gpio子系统可以很方便地管理和操作系统中的GPIO引脚。

PixelPusher的博客 283

嵌入式学习linux内核驱动6——dts和GPIO子系统

复制现有开发板DTS文件作为新板型的基础模板。修改文件名以区分不同开发板,例如从imx6ull.dts改为pute.dts。需在Makefile中添加新DTS文件对应的DTB生成规则。新加自己的设备树文件:修改新增一行:pute.dtb(加到对应的SOC下make dtbs编译所有的设备树文件只编译pute.dtsDTS文件由节点(node)和属性组成,节点可嵌套形成树状结构。属性以键值对形式存在,每行以分号结尾。节点可包含子节点(sub-node),形成层级关系。

m0_57137282的博客 912

Cursor集成Claude 4.6免费版:本地IDE合规调用指南

大语言模型编程助手(LLM Copilot)已成为现代开发标配,其核心能力依赖于上下文理解、代码推理与结构化输出等关键技术原理。Anthropic官方提供的Claude系列模型,尤其Claude 4.6,凭借200K超长上下文、tool use函数调用和严格可控的API设计,在工程实践中展现出显著技术价值。该能力可无缝嵌入本地IDE环境,支撑代码解释、跨文件分析、单元测试生成等高频开发场景。本文聚焦Cursor这一开源可审计IDE,详解如何合规复用Anthropic免费tier接口(/v1/messages

weixin_34095889的博客 536

Win10网络图标消失,网络图标变成灰色,打开网络设置闪退等问题解决

介绍 主要解决如下问题 网络图标消失 常用方法配置中出现的网络图标变成灰色没有办法打开 打开网络和Internet闪退 错误提示`网络发现已关闭。网络计算机和设备不可见。请启动网络和共享中心的网络发现。 连不上网,诊断结果为 依赖服务或组无法启动 这个问题大概率通过重装系统不能解决,请大家谨慎测试之后最后选择重装这个路线。 方法1:这一步一定要做(卸载三方软件) 把360安全卫士,软件管家这些东西都卸载掉。 我的问题一开始就是这个软件引起的,可能他检测到我还给台式机配了无线网卡,然后就把有线网络的一些

呆呆象呆呆的博客 3万+

嵌入式linux内核gpio使用,Linux内核驱动之GPIO子系统(一)GPIO的使用

一概述Linux内核中gpio是最简单,最常用的资源(和interrupt,dma,timer一样)驱动程序,应用程序都能够通过相应的接口使用gpio,gpio使用0~MAX_INT之间的整数标识,不能使用负数,gpio与硬件体系密切相关的,不过linux有一个框架处理gpio,能够使用统一的接口来操作gpio.在讲gpio核心(gpiolib.c)之前先来看看gpio是怎么使用的二内核中...

weixin_32270483的博客 363

CATIA二次开发核心技术:多实体零件自动化拆解与装配生成深度解析(零件转产品)

CATIA二次开发核心技术:多实体零件自动化拆解与装配生成深度解析

KE17RS的博客 2142

嵌入式Linux的GPIO中断

做个STM32开发的都知道,通过程序配置让普通的GPIO口具有中断功能。这样对于设备检测某些硬件的自动设备要方便的多。那么在嵌入式的Linux是否具有这样的功能呢?答案是肯定的,下面我们就来介绍一下如何配置嵌入式Linux的GPIO中断。 目前正好有一个项目,其硬件上有一个按钮对应GPIO的73管脚,下面我们就以这个管脚为例来讲述如何去设置管脚的中断,直接上源码,如下: #include <...

u010304442的博客 8098

芒果YOLO11改进21:检测头Head篇:即插即用|新颖轻量化非对称多级压缩LADH检测头,原创改进适配YOLOv8高效检测头,检测头新颖性改进,全网首发独一份

检测头Head篇:即插即用|新颖轻量化非对称多级压缩LADH检测头,原创改进适配YOLOv8高效检测头,检测头新颖性改进,全网首发独一份

包括YOLOv5、YOLOv7、YOLOv8等模型改进 790

ardupilot BMI088加速度陀螺仪学习

本节主要记录ardupilot 中BMI088传感器的学习过程,欢迎批评指正。BMI088是一款高性能6轴惯性传感器,由16位数字三轴±24g加速度计和16位数字三轴±2000°/ s陀螺仪组成。 BMI088允许高精度测量方向和沿三个正交轴的运动检测。BMI088具有高振动鲁棒性和3 x 4.5 x0.95mm³的小尺寸,是用于无人机和机器人应用等恶劣环境的高性能IMU中的独特产品。 BMI088专门设计用于有效抑制由于PCB上的共振或整个系统的结构而可能发生的振动。 除了高振动稳定性外,BMI088的出

陌城烟雨 2052

I.MX6U嵌入式Linux驱动开发(5)pintcl和gpio子系统实验

打开芯片参考手册,找到iomux,Linux内核源码,打开imxull.dtsi,搜索iomux有3个寄存器地址:IOMUXC SNVS寄存器、IOMUXC控制器、gpr控制器。打开板子对应的设备树文件,imx6ull-alientek-emmc.dts,搜索iomux。

weixin_38786847的博客 1111

LeRobot 机器人学习(Robot Learning)教程(二)经典机器人学

本文探讨了机器人学中基于学习的方法与传统动力学方法的对比与发展趋势。文章指出,传统方法依赖精确的动力学模型和大量人工调参,面临跨任务泛化能力弱、工程复杂度高、物理建模局限性等问题。随着机器学习技术的进步和机器人数据集的丰富,基于学习的方法展现出三大优势:(1)能够实现跨任务与实体的泛化;(2)降低对人类专业知识的依赖;(3)利用历史数据优化性能。文中以平面机械臂为例,分析了传统逆运动学方法的计算复杂性和环境适应性挑战,并指出基于学习的方案在处理高维感知输入、复杂接触动力学等方面具有明显优势。文章认为,结合物

2506_90492529的博客 1066

Linux设备驱动:GPIO子系统API接口概述

1、前言 在嵌入式Linux开发中,对嵌入式SoC中的GPIO进行控制非常重要,Linux内核中提供了GPIO子系统,驱动开发者在驱动代码中使用GPIO子系统提供的API函数,便可以达到对GPIO控制的效果,例如将IO口的方向设置为输入或输出,当IO口的方向为输入时,可以通过调用API函数获取相应的IO口电平,当IO口设置为输出方向时,可以调用相关的API函数去设置IO口电平,本文将简单描述如何去使用Linux内核中GPIO子系统的API接口。 下图是Linux内核中GPIO子系统的软件驱动分层图: 2、

what, when, why, how... 316

ThingsBoard教程(一):ThingBoard介绍及安装

ThingsBoard介绍 最近看了很多开源的物联网的项目,其中有一个让我印象很深,那就是Thingsboard 下面我就给大家介绍一下这个项目,并指导大家如何在本地安装一个Thingsboard来体验它。 首先引用官网的项目介绍就是 一个开源的用于数据收集,处理,可视化和设备管理的开源物联网平台。 它通过行业标准的物联网协议(MQTT,CoAP和HTTP)实现设备连接,并支持云和本地部署。ThingsBoard结合了可伸缩性,容错性和性能,因此您永远不会丢失数据。 用它开源收集链接设备,收集设备的数据,

知无涯 2万+

YOLOv12创新改进 | 全网独家创新篇、小目标检测改进 | AAAI 2025 | 引入HS-FPN中的HFP和SDP创新点,从频域增强小目标特征,淘汰FPN进行升级,助力YOLOv12有效涨点

本文提出了HS-FPN(高频和空间感知特征金字塔网络),通过HFP(高频感知)模块增强小目标特征,SDP(空间依赖感知)模块捕获像素间空间依赖关系。实验在AI-TOD等小目标数据集上验证了该方法的有效性,相比FPN显著提升检测性能。文章详细介绍了HS-FPN的网络结构、核心代码实现及在YOLOv12中的应用方法,并提供多种改进版本的yaml配置文件,为小目标检测任务提供了有效的解决方案。

Ai缝合怪、助力小伙伴高效发论文 336

Linux内核架构浅谈7-Linux 内核与 GPIO

本文深入解析Linux内核GPIO子系统架构与应用。GPIO作为硬件与软件交互的关键接口,在嵌入式系统中广泛用于LED控制、传感器读取等场景。文章首先介绍GPIO的硬件基础,包括引脚复用功能、电气特性和寄存器配置。随后详细剖析Linux内核GPIO子系统的三层架构:硬件抽象层(芯片专属驱动)、核心子系统层(统一API管理)和用户空间接口层(sysfs/libgpiod)。重点通过示例代码展示了ARM架构下GPIO控制器的驱动实现,包括输入/输出模式配置、电平读写操作以及驱动初始化的完整流程。该分层设计实现了

文石_2009的博客 972

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

嵌入式驱动开发

insmod 命令不能解决模块的依赖关系,比如 drv.ko 依赖 first.ko 这个模块,就必须先使用insmod 命令加载 first.ko 这个模块,然后再加载 drv.ko 这个模块。但是 modprobe 就不会存在这个问题, modprobe 会分析模块的依赖关系,然后会将所有的依赖模块都加载到内核中,因此modprobe 命令相比 insmod 要智能一些。

weixin_66451213的博客 2216

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

【嵌入式Linux】---- 从零构建:基于PetaLinux与SDK的GPIO驱动开发与系统集成实战

本文详细介绍了基于PetaLinux与SDK的嵌入式Linux GPIO驱动开发全流程,从环境搭建、硬件配置到驱动开发与系统集成。通过实战案例展示如何利用GPIO子系统API开发高效驱动,并分享调试技巧与性能优化方法,帮助开发者快速掌握嵌入式Linux开发核心技术。

weixin_29164091的博客 311

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

嵌入式Linux LED控制实战:从GPIO sysfs到内核驱动框架

GPIO(通用输入输出)是嵌入式系统中最基础的外设接口,其原理是通过配置寄存器控制引脚的电平状态。在Linux系统中,GPIO驱动提供了标准化的硬件抽象层,技术价值在于实现硬件操作的统一接口和权限管理。通过sysfs文件系统,开发者可以直接在用户空间操作GPIO,这种方案特别适合嵌入式Linux的快速原型开发和调试。应用场景包括LED控制、按键检测、继电器驱动等简单外设管理。本文以i.MX6ULL平台为例,详细讲解如何通过sysfs控制GPIO驱动LED,并深入分析LED子系统的设备树配置和触发器机制,帮助

weixin_30825199的博客 371

Linux内核驱动之gpio子系统的使用

编者声明:此文为华清远见技术老师原创,如需转载请标注济南华清远见。 一 概述   linux内核中gpio是最简单,最常用的资源(和 interrupt ,dma,timer一样)驱动程序,应用程序都能够通过相应的接口使用gpio,gpio使用0~MAX_INT之间的整数标识,不能使用负数,gpio与硬件体系密切相关的,不过linux有一个框架处理gpio,能够使用统一的接口来操作gpio

hq_laoli的博客 499
上一篇: 【C++/嵌入式梳理】二、01_计算机组成原理
下一篇: 【嵌入式Linux内核驱动】04_Jetson nano GPIO应用 | 驱动开发 | 官方gpiolib、设备树与chip_driver
赛博二哈
博客等级 码龄8年 5768粉丝 98原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值