1. 程式人生 > >linux核心中的GPIO系統之(1):軟體框架

linux核心中的GPIO系統之(1):軟體框架

一、前言

作為一個工作多年的系統工程師,免不了做兩件事情:培訓新員工和給新員工分配任務。對於那些剛剛從學校出來的學生,一般在開始的時候總是分配一些非常簡單的任務,例如GPIO driver、LED driver。往往CPU datasheet的關於GPIO或者IO ports的章節都是比較簡單的,非常適合剛入行的工程師。雖然GPIO子系統相關的硬體比較簡單,沒有複雜的協議,不過,對於軟體抽象而言,其分層次的軟體思想是每個嵌入式軟體工程師需要掌握的內容。

我更傾向使用GPIO系統這個名字來代替GPIO driver這個名字,GPIO driver僅僅包含了pin signal狀態控制和讀取的內容,而GPIO系統包括了pin multiplexing、pin configuration、GPIO control、GPIO interrupt control等內容。本文主要是以3.14核心作為例子,講述linux kernel中GPIO系統的軟體框架。

二、GPIO相關硬體有哪些差異

嵌入式工程師總是要處理各種各樣的target board,每個target board上的GPIO總是存在不同,例如:

1、和CPU的連線方式不同

對於ARM的嵌入式硬體平臺,SOC本身可以提供大量的IO port,SOC上的GPIO controller是通過SOC的匯流排(AMBA)連線到CPU的。對於嵌入式系統而言,除了SOC的IO port,一些外設晶片也可能會提供IO port,例如:

(1)有些key controller晶片、codec或者PMU的晶片會提供I/O port

(2)有些專用的IO expander晶片可以擴充套件16個或者32個GPIO

從硬體角度看,這些IO和SOC提供的那些IO完全不同,CPU和IO expander是通過I2C(也有可能是SPI等其他型別的bus)連線的,在這種情況下,訪問這些SOC之外的GPIO需要I2C的操作,而控制SOC上的GPIO只需要寫暫存器的操作。不要小看這個不同,寫一個SOC memory map的暫存器非常快,但是通過I2C來操作IO就不是那麼快了,甚至,如果匯流排繁忙有可能阻塞當前程序,這種情況下,核心同步機制必須有所區別(如果操作GPIO可能導致sleep,那麼同步機制不能採用spinlock)。

2、訪問方式不同

SOC片內的GPIO controller和SOC片外的IO expander的訪問當然不一樣,不過,即便都是SOC片內的GPIO controller,不同的ARM晶片,其訪問方式也不完全相同,例如:有些SOC的GPIO controller會提供一個暫存器來控制輸出電平。向暫存器寫1就是set high,向暫存器寫0就是set low。但是有些SOC的GPIO controller會提供兩個暫存器來控制輸出電平。向其中一個暫存器寫一就是set high,向另外一個暫存器寫一就是set low。

3、配置方式不同

即便是使用了同樣的硬體(例如都使用同樣的某款SOC),不同硬體系統上GPIO的配置不同。在一個系統上配置為輸入,在另外的系統上可能配置為輸出。

4、GPIO特性不同。這些特性包括:

(1)是否能觸發中斷。對一個SOC而言,並非所有的IO port都支援中斷功能,可能某些處理器只有一兩組GPIO有中斷功能。

(2)如果能夠觸發中斷,那麼該GPIO是否能夠將CPU從sleep狀態喚醒

(3)有些有軟體可控的上拉或者下拉電阻的特性,有的GPIO不支援這種特性。在設定為輸入的時候,有的GPIO可以設定debouce的演算法,有的則不可以。

5、多功能複用

有的GPIO就是單純的作為一個GPIO出現,有些GPIO有其他的複用的功能。例如IO expander上的GPIO只能是GPIO,但是SOC上的某個GPIO除了做普通的IO pin腳,還可以是SPI上clock訊號線。

三、硬體功能分類

ARM based SOC的datasheet中總有一個章節叫做GPIO controller(或者I/O ports)的章節來描述如何配置、使用SOC的引腳。雖然GPIO controller的硬體描述中充滿了大量的暫存器的描述,但是這些暫存器的功能大概分成下面三個類別:

1、有些硬體邏輯是和IO port本身的功能設定相關的,我們稱這個HW block為pin controller。軟體通過設定pin controller這個硬體單元的暫存器可以實現:

(1)引腳功能配置。例如該I/O pin是一個普通的GPIO還是一些特殊功能引腳(例如memeory bank上CS訊號)。

(2)引腳特性配置。例如pull-up/down電阻的設定,drive-strength的設定等。

2、如果一組GPIO被配置成SPI,那麼這些pin腳被連線到了SPI controller,如果配置成GPIO,那麼控制這些引腳的就是GPIO controller。通過訪問GPIO controller的暫存器,軟體可以:

(1)配置GPIO的方向

(2)如果是輸出,可以配置high level或者low level

(3)如果是輸入,可以獲取GPIO引腳上的電平狀態

3、如果一組gpio有中斷控制器的功能,雖然控制暫存器在datasheet中的I/O ports章節描述,但是實際上這些GPIO已經被組織成了一個interrupt controller的硬體block,它更像是一個GPIO type的中斷控制器,通過訪問GPIO type的中斷控制器的暫存器,軟體可以:

(1)中斷的enable和disable(mask和unmask)

(2)觸發方式

(3)中斷狀態清除

四、如何通過軟體抽象來掩蓋硬體差異

傳統的GPIO driver是負責上面三大類的控制,而新的linux kernel中的GPIO subsystem則用三個軟體模組來對應上面三類硬體功能:

(1)pin control subsystem。驅動pin controller硬體的軟體子系統。

(2)GPIO subsystem。驅動GPIO controller硬體的軟體子系統。

(3)GPIO interrupt chip driver。這個模組是作為一個interrupt subsystem中的一個底層硬體驅動模組存在的。本文主要描述前兩個軟體模組,具體GPIO interrupt chip driver以及interrupt subsystem請參考本站其他相關文件。

1、pin control subsystem block diagram

下圖描述了pin control subsystem的模組圖:

pinctrl

底層的pin controller driver是硬體相關的模組,初始化的時候會向pin control core模組註冊pin control裝置(通過pinctrl_register這個bootom level interface)。pin control core模組是一個硬體無關模組,它抽象了所有pin controller的硬體特性,僅僅從使用者(各個driver就是pin control subsystem的使用者)角度給出了top level的介面函式,這樣,各個driver不需要關注pin controller的底層硬體相關的內容。

2、GPIO subsystem block diagram

下圖描述了GPIO subsystem的模組圖:

gpio

基本上這個軟體框架圖和pin control subsystem是一樣的,其軟體抽象的思想也是一樣的,當然其內部具體的實現不一樣,我們會在後續的文章中描述。

相關推薦

linux心中GPIO系統1軟體框架

一、前言作為一個工作多年的系統工程師,免不了做兩件事情:培訓新員工和給新員工分配任務。對於那些剛剛從學校出來的學生,一般在開始的時候總是分配一些非常簡單的任務,例如GPIO driver、LED driver。往往CPU datasheet的關於GPIO或者IO ports的

linux心中GPIO的使用--標準介面函式

在linux核心中,有一些基本模組可以使用標準的介面函式來操作,比如GPIO、interrupt、clock,所謂的標準介面函式是指一些與硬體平臺無關的、linux下做驅動通用的函式, 常用的有: gpio_request();gpio_free()

Linux學習並不難》文件系統管理1xfs文件系統介紹

Linux xfs 文件系統 18.1 《Linux學習並不難》文件系統管理(1):xfs文件系統介紹xfs是一種高性能的64位日誌文件系統,由Silicon Graphics在1993年為IRIX操作系統開發。2000年5月,以GNU通用公共許可證發布這套文件系統的源代碼,之後被移植到Linu

Linux kernel的中斷子系統綜述

lock www. api cdc 電平 還需 結構 現在 ces 一、前言一個合格的linux驅動工程師需要對kernel中的中斷子系統有深刻的理解,只有這樣,在寫具體driver的時候才能:1、正確的使用linux kernel提供的的API,例如最著名的request

Linux kernel的中斷子系統High level irq event handler

總結:從架構相關的彙編處理跳轉到Machine/控制器相關的handle_arch_irq,generic_handle_irq作為High level irq event handler入口。 一介紹了進入High level irq event handler的路徑__irq_svc-->irq_

Linux kernel的中斷子系統IRQ number和中斷描述符

總結: 二描述了中斷處理示意圖,以及關中斷、開中斷,和IRQ number重要概念。 三介紹了三個重要的結構體,irq_desc、irq_data、irq_chip及其之間關係。 四介紹了irq_desc這個全域性變數的初始化,五是操作中斷描述符相關結構體的API介面介紹。 一、前言 本文主要圍繞IRQ

Linux kernel的中斷子系統驅動申請中斷API

總結:二重點區分了搶佔式核心和非搶佔式核心的區別:搶佔式核心可以在核心空間進行搶佔,通過對中斷處理進行執行緒化可以提高Linux核心實時性。 三介紹了Linux中斷註冊函式request_threaded_irq,其實request_irq也是對request_threaded_irq的封裝。 四對requ

Linux kernel的中斷子系統ARM中斷處理過程

總結:二中斷處理經過兩種模式:IRQ模式和SVC模式,這兩種模式都有自己的stack,同時涉及到異常向量表中的中斷向量。 三ARM處理器在感知到中斷之後,切換CPSR暫存器模式到IRQ;儲存CPSR和PC;mask irq;PC指向irq vector。 四進入中斷的IRQ模式相關處理,然後根據當前處於使用

linux下C語言程式設計日誌1基於TCP協議的伺服器/客戶端程式

  基於TCP協議的伺服器/客戶端程式  首先我們看一下使用TCP協議進行網路通訊的程式基本模型:伺服器首先進行初始化操作:呼叫函式socket建立一個套接字,函式bind將這個套接字與伺服器的公認地址繫結在一起,函式listen將這個套接字換成傾聽套接字,然後呼叫函式acc

ZooKeeper系統跟隨者工作模式

當ZooKeeper叢集啟動之後,需要完成leader和follower之間的資料同步。 首先leader和observer有一

深入理解Plasma1Plasma 框架

這一系列文章將圍繞以太坊的二層擴容框架,介紹其基本執行原理,具體操作細節,安全性討論以及未來研究方向等。本篇文章作為開篇,主要目的是理解 Plasma 框架。 Plasma 作為以太坊的二層擴容框架,自從 2017 年被 Joseph Poon(Lightning N

VC++深入詳解1MFC框架程式剖析

學了一段Win32SDK應用程式以後,因為種種雜七雜八的事情,讓windows程式設計的內容停滯了很長一段時間。但是我今天還是鼓足了勇氣,繼續開始後面的內容。(不過後面的筆記不再是跟著楊力祥老師的上課內容了,因為他對MFC的講解似乎課程剩下的不是很足,所以我換了孫鑫老師的聽

智慧家居專案1軟體開發流程

結合公司開發過的產品以及對自學知識的總結,整理出此係列文章  。側重點還是在軟體部分。 公司開發某個專案,肯定是為了盈利賺錢。開發的專案無非就是自己的產品或者承接甲方的開發任務。 大體的流程可以分為幾個部分或階段:                          

linux系統管理1 核心編譯選項檢視

三個方法 proc檔案系統 ubunut debain 紅帽等 proc檔案系統 /proc/config.gz This file shows you the compile-time configuration settings for the kernel (gzip compr

linux調度算法1--快速找到最高優先級進程

保持 active fin long 開始 維護 運行 nice 好的 為什麽要了解內核的調度策略呢?呵呵,因為它值得我們學習,不算是廢話吧。內核調度程序很先進很強大,管理你的LINUX上跑的大量的亂七八糟的進程,同時還保持著對用戶操作的高靈敏響應,如果可能,為什麽不把這種

一次性講明白Linux系統呼叫1

什麼是系統呼叫 Linux核心中設定了很多可以實現各種系統功能的子程式,這些子程式就叫系統呼叫。而系統呼叫和普通函式呼叫的區別主要是在系統呼叫是系統提供的,函式一般是函式庫或者自己提供的。 為什麼要用系統呼叫 其實很多我們平時用的C語言標準函式,在Linux

標號2python(就業階段)——Linux系統命令1——《高階Linux命令及命令選項的使用》

一、高階Linux命令及命令選項的使用 <1>重定向命令:> Linux允許將命令執行結果重定向到一個檔案,本應顯示在終端上的內容儲存到指定檔案中。 1、ls >> test.txt 輸出重定向則會追加到檔案的尾部。 2、ls > test.t

Linux套接字與虛擬檔案系統1初始化和建立

引言    在Unix的世界裡,萬物皆檔案,通過虛擬檔案系統VFS,程式可以用標準的Unix系統呼叫對不同的檔案系統,甚至不同介質上的檔案系統進行讀寫操作。對於網路套接字socket也是如此,除了專屬的Berkeley Sockets API,還支援一些標準的檔案IO系統呼叫如read(v)、w

從新手到系統管理員Linux Shell指令碼程式設計數學Part I

本文由 [茶話匯] – [Qing] 編譯自 [Avishek Kumar] 轉載請註明出處 這部分主要討論數學相關的shell指令碼程式設計。 加法運算 新建一個檔案“Addition.sh”,輸入下面的內容並賦予其可執行的許可權。 [code language=”bash”] #!/bin/b

燕姐的 Linux 私房菜1—— Linux 簡介

1、作業系統與硬體 無論是 Linux、OS X、Windows 作業系統,他們都是由以下部分組成(分層結構): 最底層:硬體; 底層之上:將硬體的介面抽象成為系統呼叫(kernel); 再之上:庫; 在此之上為:應用程式。 程式的執行可以有兩種方式: (1)開機自動啟動執行; (2