linux內核pinctrl/gpio子系統驅動筆記

目錄

    • 一、簡單介紹
    • 二、主要源碼文件和目錄
      • 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…