当前位置: 首页 > news >正文

[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 注册流程

http://www.cnnetsun.cn/news/543809.html

相关文章:

  • 3.41 运筹规划问题入门:线性规划、整数规划、混合整数规划详解
  • 翻转内容的两种办法
  • Sign-Sacker签名掠夺者:终极数字签名复制技术完整指南
  • 3.32 视觉算法在企业中的应用:从人脸识别到缺陷检测,6大应用场景
  • ReactPage内容导出PPT:革命性的企业级内容复用解决方案
  • 如何快速配置DOL游戏美化包:新手终极指南
  • 工作流自动化方法论:从业务流程优化到零代码配置实战
  • 智能字体管理实战指南:WenQuanYi Micro Hei极致配置完全手册
  • ReactPage终极指南:从零开始构建现代化网页编辑器
  • Compose笔记(六十九)--Pager
  • 【图像分割】黎曼流形特征空间的多视角聚类遥感图像分割【含Matlab源码 14899期】
  • 不同 AI 生成 2026 年工作计划 PPT 的使用门槛对比
  • node.js基于vue的实验室器材耗材设备信息管理系统_x50ntw8y
  • 入梦工具箱
  • 中药材原料口碑排行榜:哪些药材最受欢迎?
  • 腾讯天美AI团队重新定义语言模型训练:精确还是多样?
  • 亲测好用!继续教育9个AI论文网站深度测评
  • PX4实战(十一):PX4运动规划模块(flight mode manager)详解
  • 提示工程架构师推荐:社交网络提示设计的10个高效工具
  • 斯坦福大学等发布:AI助手在企业政策执行上“偏科“得如此严重
  • FreeSWITCH 简单图形化界面51 - 拨号应用 Bridge 介绍
  • Qt OpenGL 生成Mipmap技术详解
  • 2026继续教育必备10个降AI率工具测评榜单
  • A.每日一题——1161. 最大层内元素和
  • AU48 语音处理模组:全双工通话设备的性能升级优选方案
  • 1.线性switch case语句逆向特征
  • HY-MT1.5-1.8B模型微调教程:特定领域适应性训练步骤
  • AutoGPT十年演进(2015–2025)
  • RAG十年演进(2015–2025)
  • HY-MT1.5-1.8B轻量部署实战:手机端也能跑的翻译模型