驅動開發硬核特訓 · Day 28(上篇):pinctrl 子系統詳解與實戰分析

📚 技術平臺:嵌入式Jerry(B站)


一、引言

在嵌入式系統中,SoC 芯片的引腳通常具有多種功能,如 GPIO、UART、I2C、SPI 等。為了在不同的應用場景中靈活配置引腳功能,Linux 內核引入了 pinctrl(Pin Control)子系統。該子系統提供了一種統一的機制,用于管理引腳的復用(pin multiplexing)、配置(pin configuration)以及狀態管理。


二、pinctrl 子系統概述

2.1 設計目標

pinctrl 子系統的主要目標包括:

  • 引腳復用管理:允許將同一引腳配置為不同的功能,如 GPIO、UART 等。
  • 引腳配置管理:設置引腳的電氣屬性,如上拉/下拉、電平驅動能力等。
  • 狀態管理:支持根據設備的不同工作狀態(如正常、休眠)切換引腳配置。
    在這里插入圖片描述

2.2 核心組件

pinctrl 子系統的核心組件包括:

  • pinctrl_dev:表示一個 pin 控制器設備。
  • pinctrl_desc:描述 pin 控制器的結構體,定義了操作接口。
  • pinctrl_ops:定義了 pin 控制器的操作函數集。
  • pinmux_ops:定義了引腳復用的操作函數集。
  • pinconf_ops:定義了引腳配置的操作函數集。

三、設備樹中的 pinctrl 配置

在設備樹中,pinctrl 的配置通常包括以下幾個部分:

3.1 pin 控制器節點

pinctrl: pinctrl@30330000 {compatible = "fsl,imx8mp-iomuxc";reg = <0x30330000 0x10000>;#address-cells = <1>;#size-cells = <0>;
};

3.2 引腳配置節點

pinctrl_uart1: uart1grp {fsl,pins = <MX8MP_IOMUXC_UART1_TXD__UART1_DCE_TX 0x1c4MX8MP_IOMUXC_UART1_RXD__UART1_DCE_RX 0x1c4>;
};

3.3 設備節點引用

&uart1 {pinctrl-names = "default";pinctrl-0 = <&pinctrl_uart1>;status = "okay";
};

四、pinctrl 驅動的實現

以 i.MX8MP 平臺為例,其 pinctrl 驅動位于 drivers/pinctrl/freescale/pinctrl-imx8mp.c。該驅動主要完成以下任務:

4.1 定義引腳描述

static const struct pinctrl_pin_desc imx8mp_pinctrl_pins[] = {PINCTRL_PIN(0, "GPIO0_IO00"),PINCTRL_PIN(1, "GPIO0_IO01"),// ...
};

4.2 實現操作函數集

static const struct pinctrl_ops imx8mp_pinctrl_ops = {.get_groups_count = imx_pinctrl_get_groups_count,.get_group_name = imx_pinctrl_get_group_name,.get_group_pins = imx_pinctrl_get_group_pins,.dt_node_to_map = imx_pinctrl_dt_node_to_map,.dt_free_map = imx_pinctrl_dt_free_map,
};

4.3 注冊 pin 控制器

static int imx8mp_pinctrl_probe(struct platform_device *pdev)
{return imx_pinctrl_probe(pdev, &imx8mp_pinctrl_data);
}

五、驅動中使用 pinctrl API

在設備驅動中,可以使用以下 API 來獲取和設置引腳狀態:

struct pinctrl *pinctrl;
struct pinctrl_state *state;pinctrl = devm_pinctrl_get(&pdev->dev);
state = pinctrl_lookup_state(pinctrl, "default");
pinctrl_select_state(pinctrl, state);

這些 API 允許驅動在運行時切換引腳的配置狀態,例如在設備進入休眠或喚醒時。


六、實戰案例:配置 UART 引腳

以配置 UART1 的引腳為例,設備樹中的配置如下:

pinctrl_uart1: uart1grp {fsl,pins = <MX8MP_IOMUXC_UART1_TXD__UART1_DCE_TX 0x1c4MX8MP_IOMUXC_UART1_RXD__UART1_DCE_RX 0x1c4>;
};&uart1 {pinctrl-names = "default";pinctrl-0 = <&pinctrl_uart1>;status = "okay";
};

在驅動中,可以使用上述的 pinctrl API 來設置引腳狀態。


七、pinctrl 與 GPIO 子系統的關系

pinctrl 子系統與 GPIO 子系統密切相關。通常,GPIO 控制器是 pin 控制器的一個子集。pinctrl 子系統負責引腳的復用和配置,而 GPIO 子系統負責引腳的輸入輸出操作。

在某些平臺上,pinctrl 驅動需要注冊 GPIO 范圍,以便 GPIO 子系統能夠正確地映射引腳。例如:

static struct pinctrl_gpio_range imx8mp_gpio_ranges[] = {{.name = "gpio1",.id = 0,.base = 0,.pin_base = 0,.npins = 32,.gc = &gpio1_chip,},// ...
};

八、總結

pinctrl 子系統為 Linux 內核提供了一個統一的引腳管理機制,使得驅動開發者可以方便地配置引腳的復用和電氣屬性。通過設備樹的配置和驅動中的 API 調用,pinctrl 子系統簡化了引腳管理的復雜性,提高了驅動的可移植性和可維護性。


技術平臺:嵌入式Jerry


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/79047.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/79047.shtml
英文地址,請注明出處:http://en.pswp.cn/web/79047.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

圖漾相機——Sample_V2示例程序(待補充)

文章目錄 1.SDK支持的平臺類型1.1 Windows 平臺1.2 Linux平臺 2.Sample_V2編譯流程2.1 Windows環境2.2 Linux環境編譯 3.Sample_V2示例程序測試3.1 ListDevice_v23.2 DepthStream_v23.3 ExposureTimeSetting_v23.4 ForceDeviceIP_v23.5 GetCalibData_v23.6 NetStatistic_v23.7 …

Google-chrome版本升級后sogou輸入法不工作了

背景&#xff1a; 筆記本Thinkpad E450&#xff0c;操作系統Ubuntu 24.04.2 LTS&#xff0c;Chrome瀏覽器版本135.0.7049.114-1&#xff0c;Edge瀏覽器版本131.0.2903.99-1&#xff0c;輸入法Sogou版本4.2.1.145 現象&#xff1a; - **正常場景**&#xff1a;Edge中可通過Ctrl…

7系列 之 OSERDESE2

背景 《ug471_7Series_SelectIO.pdf》介紹了Xilinx 7 系列 SelectIO 的輸入/輸出特性及邏輯資源的相關內容。 第 1 章《SelectIO Resources》介紹了輸出驅動器和輸入接收器的電氣特性&#xff0c;并通過大量實例解析了各類標準接口的實現。 第 2 章《SelectIO Logic Resource…

Ansible 流程控制

條件語句(判斷) 當滿足什么條件時&#xff0c;就執行那些tasks when 當...時ansible獲取主機名 # 主機名中&#xff0c;不包含.沒有區別 ansible_hostname # 包含.只顯示第一個.前面的名字 ansible_fqdn # 包含.顯示完整的主機名不管是shell還是各大編程語言中&#xf…

git命令積累(個人學習)

如何將docx文件不上傳&#xff1f; 創建或編輯 .gitignore 文件 打開 .gitignore 文件&#xff0c;添加以下內容來忽略所有 .docx 文件&#xff1a; *.docx清除已追蹤的 .docx 文件 git rm --cached "*.docx"這將從 Git 倉庫中刪除 .docx 文件&#xff0c;但不會刪…

springboot應用大批量導出excel產生oom處理措施實踐(適用于poieasyexcel)

一、背景&#xff1a; 在某些信息管理場景中&#xff0c;存在大批量導出需求&#xff0c;例如一次性導出10~100w行excel數據&#xff0c;如果不做特殊的處理&#xff0c;很容易導致Out Of Memory&#xff0c;特別是堆內存溢出。 oom復現 例如修改IDEA運行配置&#xff0c;VM…

谷歌在即將舉行的I/O大會之前,意外泄露了其全新設計語言“Material 3 Expressive”的細節

每周跟蹤AI熱點新聞動向和震撼發展 想要探索生成式人工智能的前沿進展嗎&#xff1f;訂閱我們的簡報&#xff0c;深入解析最新的技術突破、實際應用案例和未來的趨勢。與全球數同行一同&#xff0c;從行業內部的深度分析和實用指南中受益。不要錯過這個機會&#xff0c;成為AI領…

深入理解負載均衡:傳輸層與應用層的原理與實戰

目錄 前言1. 傳輸層&#xff08;Layer 4&#xff09;負載均衡1.1 工作層級與核心機制1.2 實現方式詳解1.3 優缺點分析1.4 典型實現工具 2. 應用層&#xff08;Layer 7&#xff09;負載均衡2.1 工作層級與核心機制2.2 實現方式解析2.3 優缺點分析2.4 常用實現工具 3. Layer 4 與…

PyTorch 版本、torchvision 版本和 Python 版本的對應關系

PyTorch 版本、torchvision 版本和 Python 版本的對應關系 在深度學習領域&#xff0c;PyTorch 及其配套庫 torchvision 的使用極為廣泛。但不同版本的 PyTorch、torchvision 與 Python 之間存在嚴格的對應關系&#xff0c;若版本搭配不當&#xff0c;會導致代碼運行出錯…

【hadoop】Hbase java api 案例

代碼實現&#xff1a; HBaseConnection.java package com.peizheng.bigdata;import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hbase.HBaseConfiguration; import org.apache.hadoop.hbase.client.Connection; import org.apache.hadoop.hbase.client…

榮耀A8互動娛樂組件部署實錄(第3部分:控制端結構與房間通信協議)

作者&#xff1a;曾在 WebSocket 超時里泡了七天七夜的苦命人 一、控制端總體架構概述 榮耀A8控制端主要承擔的是“運營支點”功能&#xff0c;也就是開發與運營之間的橋梁。它既不直接參與玩家行為&#xff0c;又控制著玩家的行為邏輯和游戲規則觸發機制。控制端的主要職責包…

Vue3路由模式為history,使用nginx部署上線后刷新404的問題

一、問題 在使用nginx部署vue3的項目后&#xff0c;發現正常時可以訪問的&#xff0c;但是一旦刷新&#xff0c;就是出現404的情況 二、解決方法 1.vite.config.js配置 在vite.config.js中加入以下配置 export default defineConfig(({ mode }) > {const isProduction …

企業級UI測試的“雙保險”:TestComplete的智能對象識別與詳細報告功能

企業級UI測試真是讓人頭疼&#xff01;界面元素變來變去&#xff0c;測試腳本動不動就報錯&#xff0c;測試工作根本沒法順利推進。而且&#xff0c;測試結果的管理和共享也麻煩得很&#xff0c;團隊協作效率大打折扣。別急&#xff01;TestComplete的智能對象識別和詳細測試報…

SpringBoot的自動配置和起步依賴原理

關于Spring Boot的自動配置和起步依賴&#xff0c;我想結合最新的實現機制來展開說明。先說自動配置——這是Spring Boot最核心的"約定優于配置"思想的落地體現。舉個例子&#xff0c;當我們創建一個新的Spring Boot項目時&#xff0c;只要在pom.xml里添加了spring-b…

《MATLAB實戰訓練營:從入門到工業級應用》高階挑戰篇-《5G通信速成:MATLAB毫米波信道建模仿真指南》

《MATLAB實戰訓練營&#xff1a;從入門到工業級應用》高階挑戰篇-5G通信速成&#xff1a;MATLAB毫米波信道建模仿真指南 &#x1f680;&#x1f4e1; 大家好&#xff01;今天我將帶大家進入5G通信的奇妙世界&#xff0c;我們一起探索5G通信中最激動人心的部分之一——毫米波信…

一、Redis快速入門

Redis的常見命令和客戶端使用 一、初識Redis Redis是一種鍵值型的NoSql數據庫&#xff0c;這里有兩個關鍵字&#xff1a; 鍵值型 NoSql 其中鍵值型&#xff0c;是指Redis中存儲的數據都是以key、value對的形式存儲&#xff0c;而value的形式多種多樣&#xff0c;可以是字符…

gitcode 上傳文件報錯文件太大has exceeded the limited size (10 MiB) in commit

登陸gitcoe&#xff0c;在項目設置->提交設置 ,勾選提交文件限制&#xff0c;修改限制的大小。 修改完后&#xff0c;重新提交代碼。

【運維】構建基于Python的自動化運維平臺:用Flask和Celery打造高效管理工具

《Python OpenCV從菜鳥到高手》帶你進入圖像處理與計算機視覺的大門! 解鎖Python編程的無限可能:《奇妙的Python》帶你漫游代碼世界 隨著企業IT基礎設施的復雜性不斷增加,手動運維已無法滿足高效管理的需求。本文詳細介紹如何基于Python構建一個自動化運維平臺,利用Flask…

基于大模型預測的產鉗助產分娩全方位研究報告

目錄 一、引言 1.1 研究背景與意義 1.2 研究目的與方法 二、產鉗助產分娩概述 2.1 產鉗助產定義與歷史 2.2 適用情況與臨床意義 三、大模型預測原理與數據基礎 3.1 大模型技術原理 3.2 數據收集與處理 3.3 模型訓練與驗證 四、術前預測與準備 4.1 大模型術前風險預…

css使用aspect-ratio制作4:3和9:16和1:1等等比例布局

文章目錄 1. 前言2. 用法2.1 基本語法2.2. 與max-width、max-height等屬性結合使用2.3. 動態計算比例 3. 應用場景4. 兼容性和替代方案5. 總結 1. 前言 在網頁制作過程中&#xff0c;有時候我們只知道寬度&#xff0c;或者只知道高度&#xff0c;這時候需要制作一個4:3和9:16這…