news 2026/6/23 10:04:31

[Linux外设驱动详解]8. GPIO子系统

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
[Linux外设驱动详解]8. GPIO子系统

8. GPIO子系统

8.1 概述

GPIO(General Purpose Input/Output,通用输入输出)是嵌入式系统中最基础、最常用的外设接口之一。Linux 内核通过 GPIO 子系统为驱动开发者提供了一套统一的 API,屏蔽了不同 SoC 硬件实现的差异。

什么是 GPIO?

  • 简单来说,GPIO 就是芯片引脚的软件控制能力
  • 每个引脚可以独立配置为输入或输出模式
  • 输出模式下可以控制引脚电平(高/低)
  • 输入模式下可以读取引脚电平状态

为什么需要 GPIO 子系统?

┌─────────────────────────────────────────────────────────────┐ │ 驱动开发者 │ │ 只需调用 gpiod_set_value() 等统一 API │ └─────────────────────────────────────────────────────────────┘ │ ▼ ┌─────────────────────────────────────────────────────────────┐ │ GPIO 子系统 (gpiolib) │ │ 提供抽象层,统一管理所有 GPIO 控制器 │ └─────────────────────────────────────────────────────────────┘ │ ▼ ┌─────────────────────────────────────────────────────────────┐ │ GPIO Controller 驱动 │ │ Rockchip GPIO │ NXP GPIO │ TI GPIO │ ... │ └─────────────────────────────────────────────────────────────┘ │ ▼ ┌─────────────────────────────────────────────────────────────┐ │ 硬件 (SoC GPIO) │ └─────────────────────────────────────────────────────────────┘

8.2 GPIOLIB 架构

8.2.1 核心数据结构

1. struct gpio_desc - GPIO 描述符
/* kernel/drivers/gpio/gpiolib.h */structgpio_desc{structgpio_device*gdev;// 所属的 GPIO 设备unsignedlongflags;// 状态标志位constchar*label;// 使用者标签constchar*name;// GPIO 名称// ... 其他字段};

flags 标志位说明:

标志位宏定义说明
0FLAG_REQUESTEDGPIO 已被请求占用
1FLAG_IS_OUT方向为输出
6FLAG_ACTIVE_LOW低电平有效
7FLAG_OPEN_DRAIN开漏输出模式
8FLAG_OPEN_SOURCE开源输出模式
9FLAG_USED_AS_IRQ被用作中断
13FLAG_PULL_UP上拉使能
14FLAG_PULL_DOWN下拉使能
2. struct gpio_chip - GPIO 控制器
/* kernel/include/linux/gpio/driver.h */structgpio_chip{constchar*label;// 功能名称structgpio_device*gpiodev;// 内部状态structdevice*parent;// 父设备structmodule*owner;intbase;// GPIO 编号基数u16 ngpio;// GPIO 数量// 方向控制int(*get_direction)(structgpio_chip*gc,unsignedintoffset);int(*direction_input)(structgpio_chip*gc,unsignedintoffset);int(*direction_output)(structgpio_chip*gc,unsignedintoffset,intvalue);// 数据读写int(*get)(structgpio_chip*gc,unsignedintoffset);void(*set)(structgpio_chip*gc,unsignedintoffset,intvalue);// 配置int(*set_config)(structgpio_chip*gc,unsignedintoffset,unsignedlongconfig);// 中断相关int(*to_irq)(structgpio_chip*gc,unsignedintoffset);// 请求/释放int(*request)(structgpio_chip*gc,unsignedintoffset);void(*free)(structgpio_chip*gc,unsignedintoffset);};
3. struct gpio_device - GPIO 设备
/* kernel/drivers/gpio/gpiolib.h */structgpio_device{intid;// 设备 IDstructdevicedev;// 设备模型structcdevchrdev;// 字符设备structgpio_chip*chip;// 指向 gpio_chipstructgpio_desc*descs;// GPIO 描述符数组intbase;// 全局编号基数u16 ngpio;// GPIO 数量constchar*label;// 描述性名称structlist_headlist;// 链入全局 gpio_devices 链表};

8.2.2 架构层次图

┌─────────────────────────────────────────────────────────────────────┐ │ Consumer API 层 │ │ gpiod_get() / gpiod_set_value() / gpiod_get_value() │ └─────────────────────────────────────────────────────────────────────┘ │ │ 操作 gpio_desc ▼ ┌─────────────────────────────────────────────────────────────────────┐ │ GPIOLIB 核心层 │ │ - GPIO 描述符管理 │ │ - 权限检查 │ │ - 统一编号空间 │ │ - 与设备树/ACPI 交互 │ └─────────────────────────────────────────────────────────────────────┘ │ │ 调用 gpio_chip ops ▼ ┌─────────────────────────────────────────────────────────────────────┐ │ GPIO Controller 驱动层 │ │ gpio-rockchip.c │ gpio-pl061.c │ gpio-tegra.c │ ... │ │ 实现 gpio_chip 回调函数 │ └─────────────────────────────────────────────────────────────────────┘ │ │ 读写寄存器 ▼ ┌─────────────────────────────────────────────────────────────────────┐ │ 硬件寄存器 │ └─────────────────────────────────────────────────────────────────────┘

8.2.3 注册流程

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/23 2:54:52

3.39 相机标定与角点检测:工业视觉的基础技术,附完整代码

3.39 相机标定与角点检测:工业视觉的基础技术,附完整代码 引言 相机标定和角点检测是工业视觉的基础技术。本文将深入解析这些技术的原理和实现。 一、相机标定 1.1 标定原理 相机标定用于确定相机的内参和外参。 # 相机标定 import cv2 import numpy as npdef camera_…

作者头像 李华
网站建设 2026/6/21 20:28:10

3.34 RCNN算法详解:Selective Search、IOU、NMS,目标检测的开山之作

3.34 RCNN算法详解:Selective Search、IOU、NMS,目标检测的开山之作 引言 R-CNN是目标检测领域的开山之作,引入了Selective Search、IOU、NMS等关键技术。本文将深入解析R-CNN的原理和实现。 一、R-CNN概述 1.1 算法流程 R-CNN的流程:候选区域生成 -> 特征提取 -&g…

作者头像 李华
网站建设 2026/6/19 21:44:02

3.35 FastRCNN算法详解:RoI Pooling、多任务损失函数,速度提升10倍

3.35 FastRCNN算法详解:RoI Pooling、多任务损失函数,速度提升10倍 引言 Fast R-CNN是对R-CNN的改进,通过RoI Pooling和多任务损失函数,速度提升10倍。本文将深入解析Fast R-CNN的改进。 一、Fast R-CNN改进 1.1 主要改进 # Fast …

作者头像 李华
网站建设 2026/6/19 1:28:47

3步解锁AO3镜像站:同人作品稳定访问终极指南

3步解锁AO3镜像站:同人作品稳定访问终极指南 【免费下载链接】AO3-Mirror-Site 项目地址: https://gitcode.com/gh_mirrors/ao/AO3-Mirror-Site 还在为无法稳定访问AO3同人作品库而烦恼吗?AO3镜像站正是你需要的解决方案!这个开源项目…

作者头像 李华
网站建设 2026/6/15 17:35:17

Sign-Sacker:数字签名伪装技术的深度解析与实战应用

Sign-Sacker:数字签名伪装技术的深度解析与实战应用 【免费下载链接】Sign-Sacker 项目地址: https://gitcode.com/gh_mirrors/si/Sign-Sacker 在当今数字安全环境中,数字签名已成为验证软件真实性和完整性的重要机制。然而,这种安全…

作者头像 李华
网站建设 2026/6/6 4:50:30

AO3镜像站技术深度解析:构建无障碍同人文化交流平台

AO3镜像站技术深度解析:构建无障碍同人文化交流平台 【免费下载链接】AO3-Mirror-Site 项目地址: https://gitcode.com/gh_mirrors/ao/AO3-Mirror-Site AO3镜像站作为开源技术项目,致力于解决国内用户访问AO3同人作品库的网络障碍,通…

作者头像 李华