Linux pinctrl子系統分析之一 系統概述

       前面我們已經分析了gpio子系統,從現在開始我們還是把pinctrl子系統學習一下吧,pinctrl子系統主要涉及引腳複用設置、引腳設置等操作。本專欄大概劃分如下幾個篇章:
一、 pinctrl 子系統概述

二、pinctrl 子系統相關的數據結構及關聯

三、pinctrl device的註冊與註銷

四、pinctrl map的註冊與註銷

五、pinctrl 引腳配置及複用

六、pinctrl驅動實踐(虛擬pinctrl device驅動實現)

 

本篇是pinctrl子系統的第一篇文章,主要對pinctrl 子系統進行整體說明,瞭解pinctrl實現相關的大

致輪廓。本篇文章涉及的內容如下:

pinctrl子系統涉及的概念

pinctrl子系統實現的目標

pinctrl子系統軟件框架

 

 

 

pinctrl子系統涉及的概念

      作爲驅動開發人員,當我們對一塊新的開發板進行適配時,免不了要進行引腳的複用設置以及引腳自身的配置。我們知道一款soc所提供的引腳是有限的,且具體廠家依據soc設計的開發板,也並不需要使用soc所有的控制器,因此soc所提供的引腳,一般都會進行復用配置,如iic0可以使用pin8、pin9作爲scl、sda,同時pin8、pin9也可以作爲gpio或者作爲can0引腳。基於此,當我們進行開發板的適配時,則需要根據開發板引腳的使用情況,進行引腳複用的配置等操作。針對pinctrl子系統包括如下幾個概念:

  • pin複用: 包括複用模式、複用相關寄存器等;
  • pin配置: 針對有些引腳需要進行相關的配置,如pullup、pulldown、slew-rate、drive-open-drain等;
  • Pin group:幾個pin組合在一起,可以對該組合中的引腳進行配置。如上面所說的{pin8、pin9},即可作爲一個group(該group即可以作爲iic0的引腳使用,也可以配置成can0的引腳使用)。
  • Pin function:表示實現的功能,如上述的iic0,則作爲引腳使用的一種功能(iic引腳),而一個function是需要和一個或者多個group綁定的,假如我們規定pin12、pin13也可以作爲ii0的引腳,那麼function iic0,則可以與group{pin8、pin9}、group{pin12、pin13}關聯,而具體使用哪種group作爲iic0,則由具體的開發板設計相關。

 

 

pinctrl子系統實現的目標

  1. 我們先說下沒有pinctrl或者不使用pinctrl時,引腳配置的方式。我們可以在bootloader下進行引腳複用的設置(如nxp ls系列的soc,通過設置rcw進行引腳複用配置,並沒有使用pinctrl子系統),或者在linux kernel的板級文件中進行引腳複用的配置。
  2. 在進行復用配置時,出現了一個引腳同時配置兩個功能的錯誤情況,這就給調試帶來了困難,查了半天發現引腳複用錯了。。。
  3. 每一個芯片廠家實現了各自的引腳複用設計(如ti omap2在板級文件中就實現了引腳複用相關的設置)

pinctrl子系統實現的目標

介於上面的一些問題,linux引入了pinctrl子系統,用於解決上述問題,並提供引腳複用相關的操作,下面我們簡要說明下pinctrl子系統的設計要點

  1. 針對一款soc芯片,實現引腳定義、所有group的定義、所有可能的function定義,並提供引腳複用設置相關的接口、引腳配置相關的接口,這就對應到pinctrl子系統的pinctrl device;
  2. 針對每一款基於soc設計的開發板,均提供本開發板對應的引腳複用情況,包括使用哪些function(如使用iic0、iic1、can1、spi0);針對每一個使用的function,選用哪一個group(如上面ii0可選2個group,而在此處需要確定具體使用哪一個group),這就對應的pinctrl子系統的pinctrl maps。
  3. 在設備控制器驅動中,實現引腳複用及引腳配置的操作(如在iic控制器驅動或者spi控制器驅動中,完成spi對應引腳的配置操作)。

 

      基本上完成以上功能,即完成了pinctrl子系統的設計目錄,其中pinctrl device由芯片廠家實現;而pinctrl maps則由具體的開發板設計廠家實現。

 

    但是我們考慮一個問題,基於pinctrl子系統之後,具體設備相關引腳複用是由具體的設備驅動實現了,那豈不是每一個設備控制器驅動開發時均需要在設備驅動中進行引腳複用設置,這相比以前的在板級文件中進行引腳複用相比,是不是不夠完美呢?

    針對這個問題,就需要藉助設備驅動模型中來解決了。在設備驅動模型在完成device與driver的match之後,且在調用bus/driver->probe之前進行引腳複用的設置(調用pinctrl_bind_pins實現引腳複用的設置以及引腳配置操作),這樣的話每一個設備驅動亦不需要關注引腳配置相關信息(前面已經介紹了linux設備驅動模型,此處不再細述)。

   那pinctrl子系統又是如何解決“在進行引腳複用配置時,一個引腳同時配置兩個功能的錯誤情況”呢?

     這個問題也很好解決,之前我們在分析gpio子系統中,知道gpio引腳的使用與釋放時,需要進行申請與釋放,當調用gpio_requset申請一個gpio後,再對該gpio進行申請即出錯。而pinctrl子系統針對pin引腳的設置,也定義了類型的函數pin_request、pin_free,在pin_request中若已有device對該pin進行了配置,則返回失敗,從而可解決該問題。

 

 

 

pinctrl子系統軟件框架

下面我們簡要說明下pinctrl 子系統的軟件框架。從整體上理解pinctrl子系統的設計。如下圖所示即爲pinctrl子系統的主要分層,可分爲pinctrl device、pinctrl map、pinctrl 對外接口等幾部分。

  1. 抽象pin ctrl device,作爲對pin controller 的邏輯抽象,每一個soc型號可抽象一個pin ctrl device;
  2. 每一個pin ctrl device,包括設置pin controller的方法,包括引腳複用的設置方法、引腳配置的設置方法等、該pin controller支持的pin定義、group定義、function定義等
  3. 一個pin ctrl device,可以對應多個pin maps,因爲我們可能針對一款soc設置多款board,每款board只是引腳複用、外設等有所差別,因此使用pin ctrl maps表示一款board的引腳複用情況,從而一個pin ctrl device可以對應多個pin maps;
  4. Pin ctrl 子系統提供了引腳複用接口、引腳配置接口、pinctrl device註冊與註銷接口、也提供了pin maps註冊與註銷的接口
  5. 針對內核支持設備樹的情況,則在進行device、driver綁定時(調用pinctrl_bind_pins),則會解析設備樹參數,實現pin maps的註冊,並調用pinctrl_select_state,進行引腳複用及配置的設置等;
  6. 針對內核不支持設備樹的情況,若要使用pinctrl子系統,則可以在soc對應的板級文件中,調用pinctrl_register_maps完成pin maps的註冊,然後在進行device、driver綁定時(調用pinctrl_bind_pins),則調用pinctrl_select_state,進行引腳複用及配置的設置等;

 

 

 

 

     以上即是pinctrl子系統的框架,pinctrl 子系統確實解決了引腳複用的功能,且pinctrl子系統通過對pin controller抽象、pin mux、pin config、pin group、pin group、pin function、pinctrl_map等抽象,個人感覺pinctrl device、pinctrl_map的抽象真的很好,將soc pin controller引腳定義及操作、基於某一個soc設計多個開發板對應的引腳複用情況抽象爲pinctrl_map,這樣就將soc pin 複用功能、不同開發板的引腳複用配置給區分開。

 

 

   以上就是本章的主要內容,主要說明pinctrl子系統涉及的概念以及pinctrl的軟件框架,下一章我們就進行代碼的分析等工作。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章