目录

    • 一、简单介绍
    • 二、主要源码文件和目录
      • gpio子系统
      • pinctrl子系统
      • 两个子系统之间的关系
      • 设备树例子
    • 三、主要的数据结构
      • gpio子系统
      • pinctrl子系统
    • 四、驱动初始化流程
    • 五、难点说明

一、简单介绍

GPIO子系统: Linux GPIO子系统是Linux内核中负责处理GPIO(通用输入输出)的一部分。它提供了一套接口,使得硬件工程师和软件开发者能够方便地使用和控制GPIO(来自百度百科);
Linux的pinctrl子系统是一种提供引脚复用和引脚配置的机制,它允许内核或者用户空间动态地控制硬件的引脚功能(来自百度百科);

二、主要源码文件和目录

gpio子系统

目录 linux-5.10.1xx/drivers/gpio/ ;
gpio-dwapb.c : 以DesignWare的IP库为例,具体芯片平台架构gpio外设的适配文件,其它平台gpio-xxxx.c 同理;
gpiolib-devres.c: 主要关于struct gpio_desc结构的操作;
gpiolib.c : gpio子系统和核心层;
gpiolib-sysfs.c : 在用户空间通过sysfs文件系统导出引脚,操作引脚的底层实现函数;
gpiolib-cdev.c : struct gpio_device结构注册为字符设备,操作相关函数;
gpiolib-legacy.c : 几个操作函数;
gpiolib-of.c : 关于gpio设备树配置解析的操作函数封装;
gpio-mmio.c : struct gpio_chip的钩子函数的定义在此处;

文件整体调用关系图:
在这里插入图片描述

pinctrl子系统

目录 linux-5.10.xxx/drivers/pinctrl/;
core.c:pinctrl核心,向外暴露的接口可以链接其它文件中的调用流程转换;
devicetree.c : 解析某个设备的设备树中关于引脚的设置,如解析pinctrl-0属性;
pinconf-generic.c: 操作设备树节点到 struct pinctrl_map结构的函数封装和pinctrl-utils.c 中接口配合使用;
pinconf.c : 操作struct pinctrl_map 和 struct pinctrl_setting的辅助接口;
pinctrl-xxxxx.c:具体芯片平台解析设备树pinctrl外设的probe函数,自定义结构的定义包含struct pinctrl_dev 是它的派生类;
pinctrl-utils.c :struct pinctrl_map 结构成员的操作;
pinmux.c: 请求pin引脚为某种复用功能时的函数集合,向下调用struct pinmux_ops *ops->set_mux成员函数,具体将配置进行执行到寄存器的操作实现;

文件整体调用关系图:
在这里插入图片描述

两个子系统之间的关系

核心纽带数据结构:

//此结构定义的是gpio空间和pinctrl空间一段对应的引脚范围
struct pinctrl_gpio_range{struct list_head node;const char *name;unsigned int id;unsigned int base;//gpio空间此段gpio编号的开始unsigned int pin_base;//pinctrl空间此段pin空间的开始unsigned const *pins;unsigned int npins;//此段范围总的引脚个数struct gpio_chip *gc;
}

图示:

在这里插入图片描述

设备树例子

以DesignWare的IP库为例,led gpio和pinctrl为两个外设
led设备设备树:

leds {compatible = "gpio-leds";pinctrl-names = "default";pinctrl-0 = <&leds_gpio>;status = "okay";heartbeat {label = "Heartbeat";gpios = <&port1 23 GPIO_ACTIVE_HIGH>;linux,default-trigger = "heartbeat";};};

gpio外设设备树:

gpio@地址 {compatible = "snps,dw-apb-gpio";reg = <0x0xxxxxxx 0xxxxx>;#address-cells = <1>;#size-cells = <0>;port1: gpio@0 {compatible = "snps,dw-apb-gpio-port";gpio-controller;#gpio-cells = <2>;snps,nr-gpios = <32>;reg = <0>;};port2: gpio@1 {compatible = "snps,dw-apb-gpio-port";gpio-controller;#gpio-cells = <2>;snps,nr-gpios = <32>;reg = <1>;};};

pinctrl外设设备树:

pinctrl@地址 {leds_gpio: leds_gpio {xxx,pins = <PF5>;    xxx,pull = <XXX_PULL_UP>;xxx,function = <XXX_FUNC_XXX>;};}

三、主要的数据结构

gpio子系统

struct gpio_chip:理解为一个gpio外设控制器或者gpio外设控制器下的某个端口的表示(每个端口有一组引脚);
struct gpio_device: struct gpio_chip的另一种表示,包含struct gpio_descs和struct gpio_chip的指针;
struct gpio_descs: 某个gpio外设或者gpio外设控制器下的某个端口下的某个引脚的表示,如一个外设或者端口下有个32个引脚那么每个引脚都会分配一个这样的结构;

pinctrl子系统

struct pinctrl:具体的设备在获取pinctrl-0属性前会生成一个这个结构,其中的 dev执行具体设备的dev;
struct pinctrl_dev: 包括 struct pin_desc ,struct pinctrl_desc 等;
struct pinctrl_gpio_range: 定义gpio和pinctrl一段引脚映射的关系;
struct pinctrl_map:对引脚的配置的一种表示,比如a引脚上拉是一个map,a引脚为gpio是一个map,其中的type成员会具体区分;
struct pin_desc: 关注成员gpio_owner;
struct pinctrl_pin_desc :注意和struct pin_desc的区分,表示pin号和pin的名字;

四、驱动初始化流程

1、pinctrl外设解析注册过程

xxxxx_probe(pinctrl-xxxx.c)->
devm_pinctrl_register(core.c) ->
pinctrl_register(core.c)->
pinctrl_enable 注册pinctrl外设到核心层的队列pinctrldev_list里;
调用过程中会涉及到pinctrl子系统中以上主要数据struct pinctrl_dev, struct pinctrl_pin_desc ,struct pin_desc等的创建和初始化;

2、具体设备根据设备中引脚的配置调用struct pinctrl_dev 的 struct pinctrl_desc的struct pinmux_ops钩子函数配置引脚

内核源码/drivers/base/dd.c ->
pinctrl_init_done(core.c)->
pinctrl_commit_state (core.c)->
pinmux_enable_setting (pinmux.c)->
pinmux_ops *ops->set_mux( pinctrl-xxxx.c 中注册的struct pinmux_ops 成员)

3、具体设备调用struct pinctrl_dev 的 struct pinctrl_desc的pinctrl_ops的 dt_node_to_map,通过解析具体设备的引脚配置生成 pinctrl_map的过程

内核源码/drivers/base/pinctrl.c -> devm_pinctrl_get(core.c)->
pinctrl_get(core.c)->
create_pinctrl(dev, NULL);(pinctrl/core.c) ->
pinctrl_dt_to_map(devicetree.c) 循环调用 ->
dt_to_map_one_config(devicetree.c )->
dt_node_to_map(pinctrl-xxxx.c 中注册的struct pinctrl_ops 成员)
设备在解析设备树获取引脚配置时会根据设备的设备树pinctrl-0等状态生成struct pinctrl结构,解析设备树引脚配置生成 struct pinctrl_map 并挂到struct pinctrl的链表成员中,需要仔细看代码理解;

五、难点说明

1、pinctrl子系统struct pinctrl_map 结构说明

struct pinctrl_map {const char *dev_name;const char *name;enum pinctrl_map_type type; //const char *ctrl_dev_name;union {struct pinctrl_map_mux mux;struct pinctrl_map_configs configs;} data;
};

以上述led设备树为例,会生成两个map,解析xxx,function属性生成一个成员type类型PIN_MAP_TYPE_MUX_GROUP的map,解析xxx,pull生成一个成员type类型PIN_MAP_TYPE_CONFIGS_PIN的map;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/80587.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/80587.shtml
英文地址,请注明出处:http://en.pswp.cn/pingmian/80587.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vue 2 项目中配置 Tailwind CSS、Font Awesome和daisyUI

Vue 2 项目中配置 Tailwind CSS 和 安装 daisyUI 首先重点注意&#xff0c;Vue2中安装Tailwind和daisyui一定要注意版本。 最佳版本 使用 Vue 2 TailwindCSS v2 DaisyUI v1 的兼容版本 "tailwindcss": "npm:tailwindcss/postcss7-compat^2.2.17", &q…

5.11 - 5.12 JDBC+Mybatis+StringBoot项目配置文件

JDBC&#xff1a; 预编译SQL优点&#xff1a;安全&#xff0c;性能更高。 在cmd里面输入java-jar就可以运行jar包。 Mybatis&#xff1a; 持久层框架。用于简化JDBC的开发。 数据库连接池里面放置的是一个一个Connection连接对象。&#xff08;连接池中的连接可以复用&#…

探索科技的前沿动态:科技爱好者周刊

探索科技的前沿动态:科技爱好者周刊 在信息爆炸的时代,我们每时每刻都被新技术、新理念包围。而如何在这纷繁复杂的信息中找到对自己有价值的内容,成了一大挑战。今天,我们要介绍的是一个宝贵的资源——科技爱好者周刊,它致力于为科技爱好者提供优质的科技资讯,每周五发…

Vue3 官方宣布淘汰 Axios,拥抱Alova.js

过去十年,Axios 凭借其简洁的API设计和浏览器/Node.js双环境支持,成为前端开发者的首选请求库。但随着现代前端框架的演进和工程化需求的升级,Alova.js 以更轻量、更智能、更符合现代开发范式的姿态登场。 一、Axios的痛点 1,冗余的适配逻辑,比如Axios的通用配置(但实际…

Spring AI 与 Groq 的深度集成:解锁高效 AI 推理新体验

Spring AI 与 Groq 的深度集成&#xff1a;解锁高效 AI 推理新体验 前言 在人工智能飞速发展的当下&#xff0c;AI 推理的效率和性能成为开发者关注的焦点。Groq 作为一款基于 LPU™ 的超快速 AI 推理引擎&#xff0c;凭借其强大的性能&#xff0c;能够支持各类 AI 模型&…

风车OVF镜像:解放AI开发限制的Ubuntu精简系统

风车OVF镜像&#xff1a;解放AI开发限制的Ubuntu精简系统 AI白嫖续杯一站式-风车ovf AI白嫖续杯一站式解决-风车ovf 前言 作为一名AI开发者&#xff0c;我经常在Windows和Linux环境之间切换开发。然而&#xff0c;Windows平台上的各种免费版限制逐渐成为我工作效率的瓶颈。在寻…

第十部分:文件与动静态库

目录 1、文件系统 1.1、磁盘 1.2、文件系统 1.3、文件的增删查改 2、软硬链接 2.1、软链接 2.2、硬链接 3、物理内存与文件 4、动静态库 4.1、静态库 4.1.1、静态库的制作 4.1.2、静态库的使用 4.2、动态库 4.2.1、动态库的制作 4.2.2、动态库的使用 4.3、动静…

android14优化ntp时间同步

简介 网络时间协议NTP&#xff08;Network Time Protocol&#xff09;是TCP/IP协议族里面的一个应用层协议&#xff0c;用来使客户端和服务器之间进行时钟同步&#xff0c;提供高精准度的时间校正。 当机器的ntp时间同步出现问题时&#xff0c;可以从ntp配置方面进行优化&…

ZYNQ笔记(二十):Clocking Wizard 动态配置

版本&#xff1a;Vivado2020.2&#xff08;Vitis&#xff09; 任务&#xff1a;ZYNQ PS端 通过 AXI4Lite 接口配置 Clocking Wizard IP核输出时钟频率 目录 一、介绍 二、寄存器定义 三、配置 四、PS端代码 一、介绍 Xilinx 的 Clock Wizard IP核 用于在 FPGA 中生成和管理…

服务器带宽基础知识

服务器带宽基础知识详解 一、带宽的定义与基本概念 服务器带宽&#xff08;Bandwidth&#xff09;是指服务器与互联网之间在单位时间内传输数据的能力&#xff0c;通常以 Mbps&#xff08;兆比特每秒&#xff09; 或 Gbps&#xff08;吉比特每秒&#xff09; 为单位衡量。它决…

OpenCV CUDA 模块中在 GPU 上对图像或矩阵进行 翻转(镜像)操作的一个函数 flip()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 cv::cuda::flip 是 OpenCV 的 CUDA 模块中的一个函数&#xff0c;用于在 GPU 上对图像或矩阵进行 翻转&#xff08;镜像&#xff09;操作。它类似…

shell脚本实现docker运行镜像挂载

根据本文脚本展示内容可以实现多种容器挂载 演示nginx挂载 创建挂载目录 mkdir -p /data/nginx/{conf,html,logs} 参数含义&#xff1a; docker run -d --name 给运行的镜像取名 -v /宿主机/目录:/容器内/目录 镜像名 示例&#xff1a; docker启动nginx&#xff08;当…

WiseAD:基于视觉-语言模型的知识增强型端到端自动驾驶——论文阅读

《WiseAD: Knowledge Augmented End-to-End Autonomous Driving with Vision-Language Model》2024年12月发表&#xff0c;来自新加坡国立和浙大的论文。 在快速发展的视觉语言模型&#xff08;VLM&#xff09;中&#xff0c;一般人类知识和令人印象深刻的逻辑推理能力的出现&a…

NestJS 知识框架

一、核心概念 1. 架构基础 基于 Express/Fastify 的 Node.js 框架 采用模块化设计 使用 TypeScript 构建&#xff08;也支持 JavaScript&#xff09; 借鉴 Angular 的设计理念 2. 主要组件 模块 (Module): 应用的基本组织单元 控制器 (Controller): 处理 HTTP 请求 服务…

深入理解 Istio v1.25.2

要深入理解 Istio 的最新版本&#xff08;截至 2025 年 5 月&#xff0c;最新版本为 1.25.2&#xff0c;发布Iweb:1⁊&#xff09;源码&#xff0c;我们可以通过分析其核心组件和代码结构来加深对 Istio 的理解。以下是对 Istio 源码的解读&#xff0c;结合其架构和功能&#x…

星际篮球争霸赛/MVP争夺战 - 华为OD机试真题(A卷、Java题解)

华为OD机试题库《C》限时优惠 9.9 华为OD机试题库《Python》限时优惠 9.9 华为OD机试题库《JavaScript》限时优惠 9.9 针对刷题难&#xff0c;效率慢&#xff0c;我们提供一对一算法辅导&#xff0c; 针对个人情况定制化的提高计划&#xff08;全称1V1效率更高&#xff09;。 看…

Kubernetes etcd 故障恢复(1)

1.查看集群状态 获取主节点和故障节点id ETCDCTL_API3 ./etcdctl --cacert/etc/kubernetes/ssl/new-ca.pem --cert/etc/kubernetes/ssl/etcd.pem --key/etc/kubernetes/ssl/etcd-key.pem --endpoints"https://192.168.7.132:2379,https://192.168.7.134:2379,https://19…

在UI原型设计中,低、高保真原型图有什么区别?

在数字产品开发中&#xff0c;原型&#xff08;Prototype&#xff09; 是连接创意与落地的桥梁。它通过可视化的方式验证功能、交互与用户体验&#xff0c;避免开发资源浪费。而低保真&#xff08;Lo-Fi&#xff09;与高保真&#xff08;Hi-Fi&#xff09;原型&#xff0c;则是…

使用FastAPI和React以及MongoDB构建全栈Web应用02 前言

Who this book is for 本书适合哪些人阅读 This book is designed for web developers who aspire to build robust, scalable, and efficient web applications. It caters to a broad spectrum of developers, from those with foundational knowledge to experienced prof…

linux下minio的进程管理脚本

准备工作&#xff1a; 参考链接&#xff1a; Deploy MinIO: Single-Node Single-Drive — MinIO Object Storage for Linux 下载&#xff1a; wget https://dl.min.io/server/minio/release/linux-amd64/minio kill-app.sh #!/bin/bash # 文件名&#xff1a; kill-app.sh…