Linux gpio子系統分析之二 軟體架構

2021-10-06 16:15:41 字數 4200 閱讀 1504

上一章大致對gpio子系統進行了說明,本章我們對gpio子系統的軟體進行說明,本章的主

要內容如下:

一、gpio子系統相關資料結構及其關聯說明

二、gpio子系統相關介面說明

此處我們以linux3.10核心版本為例,該版本下gpio子系統涉及的資料結構相對比較簡單,在新的版本下,加入了irqchip,支援了裝置資源管理等內容。在linux3.10版本下gpio子系統主要涉及兩個資料結構struct gpio_chip、struct gpio_desc,其中gpio_chip表示乙個gpio控制器,而gpio_desc表示乙個gpio。針對gpio子系統而言,主要就這兩個資料結構,當然了在高版本的核心中,針對linux gpio子系統對資料結構又進行了拆分,增加了struct gpio_device,而該資料結構也主要是從gpio_chip資料結構中抽出了gpio_base、ngpio等資訊。下面我們說明下這兩個資料結構。

如下即為gpio_chip的定義,主要包括如下幾方面的內容:

該gpio controller的操作介面,包括設定gpio方向的介面(direction_output、direction_input)、獲取gpio當前配置方向(get_direction)、設定gpio的介面(set)、獲取gpio值的介面(get)、gpio到中斷id的轉換函式(to_irq,前提是該gpio控制器支援gpio中斷);

該gpio控制器支援的gpio個數及gpio base id等,包括base、ngpio;

該gpio控制器支援的每乙個gpio的詳細資訊,即desc(稍後介紹);

若該gpio控制器支援裝置樹節點解析,則包含該gpio控制器對應的of_node,針對該gpio控制器的of_gpio_n_cells,以及解析裝置樹中gpio的介面函式of_xlate,該函式用於解析裝置樹中針對乙個gpio的配置,如「」,則首先根據gpio0獲取到該gpio控制器對應的gpio_chip(在匹配gpio_chip時,將「gpio0」與gpio_chip->of_node進行匹配,匹配成功後,再呼叫gpio_chip->of_xlate解析),即呼叫gpio_chip->of_xlate解析後面的「29 0」;

包含pinctrl的引數,即pin_ranges,針對pinctrl我還沒有梳理,此處暫且不展開,後面單獨分析。

該資料結構用於描述乙個gpio,該資料結構的定義如下,主要即為該gpio的flag,

flag包括:

該gpio是否已經申請(flag_requested,呼叫gpio_request,即設定該標籤);

gpio是否為輸出(flag_is_out,當我們將該gpio設定為輸出模式時,則設定該flag);

若通過sysfs檔案export乙個gpio,則設定flag_export、flag_sysfs、flag_requested;

flag_trig_rise、flag_trig_fall則主要針對gpio中斷的,表示上公升沿觸發還是下降沿觸發;

flag_active_low表示低有效;

open_drain、open_source表示gpio的型別,如open_drain

下面是這兩個資料結構的關聯,以及gpiolib提供的介面函式。如下圖所示:

gpio core提供的操作介面

gpiolib提供了gpio_set_value、gpio_get_value用於gpio的設定與gpio值的獲取;

設定gpio方向的介面gpio_driection_output、gpio_driection_input;

gpio的申請與釋放:gpio_request、gpio_free;

gpio id到中斷號的轉換介面gpio_to_irq

另外還包含gpio_chip的新增與刪除介面gpiochip_add、gpiochip_remove等;

另外還包含gpio core內部用於在sysfs下建立乙個gpio號相關屬性檔案的介面gpio_export、gpio_unexport等。

gpio 資料結構之間的關聯:

gpio_chips為煉表頭,所有已註冊的gpio_chip均鏈結至該鍊錶上;

每乙個gpio_chip均代表乙個gpio controller的驅動;

每乙個gpio_chip內均包括該gpio_chip所支援的所有gpio,即gpio_desc。

上面主要介紹了資料結構及關聯,此處主要說明幾個比較有代表性的主介面,包括

gpiochip_add、gpio_export。

該介面主要實現gpiochip的註冊,主要包括如下內容:

判斷該gpio chip的gpio號範圍是否有效,即是否超出系統支援範圍;

若該gpio chip未指定base index,則從系統中獲取乙個尚未使用的gpio範圍;

將gpio_chip插入到鍊錶gpio_chips中,該鍊錶是按gpio chip支援的gpio號範圍的順序從小到大插入的(如gpio_chipx的gpio號為0-31,gpio_chipy的gpio號範圍64-95,gpio_chipx在gpio_chipy前面);

設定該gpio_chip的每乙個gpio號對應的desc,完成desc與gpio_chip的關聯;

呼叫  of_gpiochip_add,設定該gpio_chip中裝置樹相關的引數,如of_node、of_xlate、of_gpio_n_cells等,主要用於裝置樹中其他外設模組引用某乙個gpio chip的gpio號時,對該gpio 號的解析,如在乙個input device的裝置樹描述中,定義了gpio引腳gpio=,而of_node則用於gpio chip的匹配查詢,而of_xlate則解析gpio號及其屬性等

呼叫gpiochip_export,為該gpio_chip註冊sysfs目錄及屬性檔案,主要建立乙個struct device,並鏈結至gpio class,同時為該device建立預設屬性檔案,即gpio_export、gpio_unexport,而gpio_export主要用於控制該gpio_chip下的gpio(如使用gpio y,則echo y > gpio_export,然後在gpio_export對應的store介面中,通過呼叫gpio_export,為該gpio在sysfs下建立該gpio0的目錄以及屬性檔案(如direction、value等));

該介面實現的功能如下:

呼叫device_create,為該gpio_chip建立乙個device(但是該device變數並沒有定義在gpio_chip中,而在linux4.x等新版核心中,已經將該device變數定義在gpio_chip中);

呼叫sysfs_create_group,為該gpio_chip建立目錄及屬性檔案

以上即為gpio_chip的主要功能,與hwmon子系統型別,在hwmon子系統中也主要就是建立sysfs屬性檔案,而與hwmon相比,gpio子系統還提供了系統介面,供核心其他子系統模組使用。

該介面實現的功能與gpiochip_export型別,步驟也是類似的:

呼叫device_create,為該gpio建立乙個device(該device變數也沒有和gpio_chip或者gpio_desc關聯);

呼叫sysfs_create_group,為該gpio建立目錄及屬性檔案,包括value、active_low、direction,若該gpio支援中斷,則還包括edge檔案(針對edge,其store介面會呼叫gpio_setup_irq,進行irq的申請,其中斷處理函式為gpio_sysfs_irq,其內部主要是呼叫sysfs_notify_dirent,wakeup poll佇列,若要使用這種方式的gpio中斷,可如下操作:執行echo "falling" >edge;然後通過epoll或select監控gpio對應的檔案value,若epoll或select監控到value檔案可讀,則說明中斷到來)。

以上即為gpio子系統的框架說明,主要是依據linux 3.10核心的**(在linux 4.x的核心,gpio子系統也複雜起來,包括irq、pinctrl等整合)主要涉及資料結構以及幾個主要的函式說明。下一章我們將說明如何如何實現乙個gpio控制器驅動,並實現乙個虛擬的gpio控制器驅動,用來驗證gpio控制器的實現流程。

framebuffer 子系統分析

fb info screen base dma alloc writecombine fbi dev,map size,map dma,gfp kernel fb info screen base 是framebuffer起始虛擬位址,也就是mmap後程式寫入fb的位址,該位址會直接寫入到fb in...

framebuffer 子系統分析

come from struct fb info ranges 0 apertures struct fb var screeninfo struct fb fix screeninfo 這兩個結構體分別記錄了顯示器可以修改和不可修改的資訊,這些資料成員需要在驅動程式中初始化。其中fix.visua...

input輸入子系統分析

1.檢視input子系統支援哪些裝置 cat proc bus input devices 2.應用程式如何使用 fd mouse open dev input event0 o rdwr event1表示滑鼠事件,input下的裝置檔案主裝置號都為13,如下圖所示 根據開啟裝置的主裝置號為13,知...