Linux pinctrl子系統分析之六 設備與pinctrl子系統的bind

2020-08-29 jerry的編程路

本章我們分析設備與pinctrl子系統的bind,在前面幾章我們介紹了soc pin 描述相關的數據結構與註冊接口、board pin 描述相關的數據結構與註冊接口,但是我們卻沒有看到是在何時由誰實現對設備相關的引腳進行引腳復用與引腳配置的,而這些就是本章的內容。


設備與pinctrl 子系統的bind

在前面我們說了,device是pinctrl的持有者,因此設備相關的引腳復用設置以及引腳配置均應由設備來進行控制,若由設備進行控制的話,難道由每個設備的驅動程序實現引腳復用相關的調用,那豈不是很大的改動量???在進行開發設計時,這種方式顯然是不可取的,在pinctrl子系統的實現中,藉助設備驅動模型中的driver_probe_device接口,當device與drivermatch後,在driver_probe_device->really_probe的接口中,在調用driver/bus的probe接口進行probe之前,通過調用pinctrl_bind_pins接口實現dev與pinctrl子系統的綁定,並完成pin相關的復用與配置操作。那為什麼是在調用driver/bus的probe接口進行probe之前??因為driver的probe接口中會訪問設備,因此需要在訪問設備操作之前,完成引腳的配置。

pinctrl_bind_pins接口

那pinctrl_bind_pins接口實現什麼功能呢?我們通過之前分析數據結構、pinctrl device、pinctrlmap,大概也可知道一二,主要包含如下內容:

  1. 完成如下的數據結構關聯圖,為該設備申請struct dev_pin_info類型的內存空間;
  2. 根據設備名稱,在pinctrl_list鍊表查找該設備對應struct pinctrl 類型的變量:
    1. 若pinctrl_list鍊表上存在對應的pinctrl,則將其與struct dev_pin_info進行綁定;
    2. 若pinctrl_list鍊表上不存在對應的pinctrl,則首先調用pinctrl_dt_to_map接口,對於支持設備樹的內核,則解析該設備的節點內容,解析出該設備所對應的map信息,並pinctrl map註冊至pinctrl_maps鍊表上;然後則申請struct pinctrl類型的內存空間,並查找pinctrl_maps鍊表上所有dev_name與該設備名稱相同的pinctrl_map,並依據pinctrl_map信息為該pinctrl創建對應的state,並為該state創建對應的pinctrl_setting信息,至此即完成下圖中數據結構間的關聯圖(其中pinctrl_setting中存儲了該device對應的mux group、pin/group config相關的group/pin id、function id等信息)。
  3. 獲取該dev default state或者init state對應的struct pinctrl_state類型的變量,然後調用接口pinctrl_select_state進行group mux、group/pin config的操作,即完成設備相關引腳的配置。

而pinctrl_bind_pins接口也基本上就是實現上述內容,下面是該函數的實現代碼,其中

  1. devm_pinctrl_get則實現上述1-2中描述的內容;
  2. 而通過pinctrl_lookup_state完成該設備init_state、default_state、sleep_state、idle_state的查找,最後調用pinctrl_select_state接口,實現引腳復用以及引腳配置操作(針對group mux,則最終調用pinctrl_dev提供的pin_request、set_mux實現相應的引腳復用設置操作;針對pin/group config,則最終調用pinctrl_dev提供的pin_config_group_set實現pin/group的配置,有興趣的童鞋可以跟蹤一下,這部分的代碼不複雜)。


devm_pinctrl_get接口

剛才上面說了,該接口實現pinctrl的查找或創建工作,下面我們說明一下,其內部主要調用pinctrl_get實現pinctrl的查找或創建工作。

pinctrl_get的實現簡單明了:

  1. 調用find_pinctrl接口,根據設備名稱從pinctrl_list中查找是否存在該pinctrl,若存在函數返回;
  2. 若未找到,則調用create_pinctrl創建一個pinctrl。

create_pinctrl

如下即是create_pinctrl接口的實現,其主要內容:

  1. 調用pinctrl_dt_to_map接口,針對支持設備樹的情況,則對該設備的節點內容進行解析,解析出該設備對應的pinctrl map信息,並註冊至pinctrl_maps鍊表中,一個設備對應的pinctrl map包括mux group、pin/group config等(可參考上一篇文章內容)。pinctrl_dt_to_map主要調用pinctrl dev的dt_node_to_map接口對設備節點中的map信息進行解析;
  2. 在pinctrl_maps鍊表上,查找該設備所對應的所有pinctrl_map(根據設備名稱查找),然後根據pinctrl_map提供的信息,調用add_setting,為該pinctrl創建pinctrl_state、並設置pinctrl_state對應的pinctrl_setting信息,就是實現最上面的數據結構間的關聯,大家對照著上面的數據結構再去看add_setting接口的實現就相對容易很多。


以上即是設備與pinctrl綁定的大致分析,希望對大家有所幫助。

相關焦點

  • Linux pinctrl子系統分析之四 pinctrl device的註冊與註銷
    前面我們分析了pinctrl子系統相關的數據結構等內容,本章我們分析pinctrl device的註冊與註銷接口。 針對pinctrl device的註冊與註銷主要涉及pinctrl_register、pinctrl_unregister、devm_pinctrl_register、devm_pinctrl_unregister這幾個接口。
  • Linux pinctrl子系統分析之五 pinctrl map註冊與註銷
    前面我們分析了pinctrl device的註冊與註銷接口。本章我們分析pinctrl maps的註冊,pinctrl maps屬於board pin描述相關的範疇。 針對pinctrl map的註冊與註銷主要涉及兩方面:當內核不支持設備樹時,則通過調用pinctrl_register_mappings、pinctrl_register_map接口實現pinctrl maps的註冊;當內核支持設備樹時,則在設備與驅動match後,在設備驅動的probe接口調用pinctrl_bind_pins
  • 輕鬆掌握pinctrl子系統驅動開發——一個虛擬pinctrl dev驅動開發
    這周主要對pinctrl子系統進行分析,該分析的基本上已經分析完成,唯一沒有細說的估計就是gpio與pinctrl之間的關聯了。本章即是pinctrl子系統分析的最後一章,本章我們主要實現一個虛擬的pinctrl device驅動,以便我們能夠使用pinctrl子系統提供的接口,實現pinctrl device的驅動開發(本章實現的驅動代碼可以在ubuntu18.04系統上正常運行)。
  • Pinctrl子系統重要概念
    所以,要把引腳的復用、配置抽出來,做成Pinctrl子系統,給GPIO、I2C等模塊使用。BSP工程師要做什麼?看下圖:等BSP工程師在GPIO子系統、Pinctrl子系統中把自家晶片的支持加進去後,我們就可以非常方便地使用這些引腳了
  • 「正點原子Linux連載」第四十五章 pinctrl和gpio子系統實驗一
    45.1 pinctrl子系統45.1.1 pinctrl子系統簡介Linux驅動講究驅動分離與分層,pinctrl和gpio子系統就是驅動分離與分層思想下的產物,驅動分離與分層其實就是按照面向對象編程的設計思想而設計的設備驅動框架,關於驅動的分離與分層我們後面會講。
  • Linux regulator子系統分析之三 regulator註冊、註銷接口分析
    在上一章我們介紹了regulator子系統相關的數據結構間的關聯以及每一個數據結構的定義。針對數據結構間的關聯則需要regulator子系統提供的接口實現。而本章我們就說明這些接口。設備驅動模型子系統中,並完成與regulator_class的關聯;為該regulator_dev創建設備屬性文件(在sysfs文件系統下創建屬性文件,以便應用程式通過設備屬性文件即可查看該regulator_dev相關的配置信息,如最小電壓、最大電壓、操作模式、使能狀態、bypass、suspend相關state等),通過函數add_regulator_attributes;
  • 「正點原子FPGA連載」第二十六章gpio子系統簡介
    26.1.2ZYNQ的gpio子系統驅動gpio子系統雖然方便了驅動開發者使用gpio,但是最終還是得去操作硬體寄存器;所以在使用gpio子系統之前,我們需要向內核gpio子系統註冊這一套操作硬體寄存器的「方法」,關於這個後面再說,我們先來看看在設備樹中是如何描述gpio信息。
  • GPIO和Pinctrl子系統的使用在100ASK_IMX6ULL上機實驗
    NXP公司對於IMX6ULL晶片,有設備樹生成工具。GIT去了,使用GIT命令載後,在這個目錄下:01_all_series_quickstart\04_快速入門_正式開始\02_嵌入式Linux驅動開發基礎知識\source\05_gpio_and_pinctrl
  • Linux regmap子系統分析之二 從數據結構分析系統實現
    上一章我們簡要分析了regmap子系統,本章我們將從regmap子系統的數據結構介紹regmap子系統的實現。 一、數據結構間的關聯及說明 針對regmap子系統,我們首先要知道regmap子系統要解決的痛點是什麼?
  • Linux下如何使用X86 CPU的GPIO
    ,但ACPI對各個作業系統有兼容性問題,這就會出現你在Windows設備管理器能看到該設備,到linux下什麼也沒有,因為大部分X86硬體廠商的BIOS主要兼容Windows為主,一般桌面CPU都是用的Windows系統嘛。
  • Linux CommonClock Framework分析之二 CCF子系統內部實現簡述
    我們主要從如下幾點說明CCF子系統的內部設計流程:一、 CCF子系統內部數據結構的定義與關聯二、CCF子系統提供的接口一、 CCF子系統內部數據結構的定義與關聯在我們學習linux內核各子系統模塊時,通過其內部數據結構的定義及關聯,即可大致掌握其實現過程及所需要提供的接口等等
  • LINUX IIO子系統分析之二 IIO子系統數據結構分析
    上一章我們簡要說明了IIO子系統的架構,本章我們通過數據結構的定義,分析IIO子系統的設計實現,本章的主要內容如下:一、IIO子系統各數據結構說明 二、數據結構間的關聯說明 一、IIO子系統各數據結構說明 在上一章我們大概說明了IIO子系統的框架
  • LINUX IIO子系統專欄分析之一 IIO子系統概述
    從本章開始,我們進行IIO子系統專欄的分析文檔,本次IIO子系統專欄分析文檔大概包含如下幾章:一、 IIO子系統概述二、IIO子系統相關數據結構分析三、iio trigger 介紹四、iio event介紹五、iio buffer介紹六、iio device的註冊與註銷介紹七、iio trigger
  • 「正點原子Linux連載」第五十九章Linux LCD驅動實驗
    fb是一種機制,將系統中所有跟顯示有關的硬體以及軟體集合起來,虛擬出一個fb設備,當我們編寫好LCD驅動以後會生成一個名為/dev/fbX(X=0~n)的設備,應用程式通過訪問/dev/fbX這個設備就可以訪問LCD。
  • Linux V4l2子系統專欄之一 子系統概述
    從本章開始,我們開始分析V4L2子系統(Video for Linux two),主要用於音視頻設備的框架。V4l2主要用於驅動視頻輸出設備(video outpt interface)、Video overlay interface、Video output overlay device、VBI interface、Radio interface等。
  • Linux regmap子系統分析之一 系統概述
    本周開始我們學習下regmap子系統的架構。本系統專欄主要涉及如下幾個子章節:一、regmap子系統概述二、regmap子系統數據結構分析三、regmap子系統接口說明四、regmap bus實例說明(以i2c為例)本章我們主要對regmap子系統做一個簡單的說明。
  • Linux GUI子系統概述 GUI子系統的構成及工作流程
    Linux GUI子系統概述 GUI子系統的構成及工作流程 Nick 發表於 2020-12-05 10:45:54 作者:Nick 開始前的幾點說明
  • 「正點原子Linux連載」第三十七章Linux內核移植
    使用FileZilla將其發送到Ubuntu中並解壓,得到名為linux-imx-rel_imx_4.1.15_2.1.0_ga的目錄,為了和NXP官方的名字區分,可以使用「mv」命令對其重命名,我這裡將其重命名為「linux-imx-rel_imx_4.1.15_2.1.0_ga_alientek」,命令如下:mv linux-imx-rel_imx_4.1.15
  • LINUX CommonClock Framework子系統分析之一 系統概述
    本專欄主要介紹linux的ccf子系統,主要用於系統clock的管理等操作。本專欄我們大概分為如下幾章進行學習:一、CCF子系統概述二、CCF子系統數據結構分析及關聯說明三、CCF子系統的clk註冊與註銷接口實現分析四、虛擬的clk設備驅動實現 本章我們主要進行CCF子系統的概述。
  • Linux regulator子系統分析之一 總體概述
    Linux regulator 子系統主要用於管理電壓、電流電源設備的電壓、電流輸入使能、動態調整電壓、電流等,屬於電源管理的一部分。從本章開始我們分析regulator子系統。主要分為如下幾部分:一、regulator子系統總體概述二、regulator相關數據結構分析三、regulator相關註冊、註銷函數分析四、regulator設備驅動實現本章主要對regulator子系統進行簡要說明。