驱动框架6——linux内核的gpiolib学习
以下內容源于朱有鵬《物聯網大講堂》課程的學習整理,如有侵權,請告知刪除。
八、linux內核的gpiolib學習1
1、gpiolib學習重點(主線)
(1)主線一:gpiolib的建立過程;
- 體系是如何建立的?
(2)主線二:gpiolib的使用方法:申請、使用、釋放
(3)主線三:gpiolib的架構:涉及哪些目錄的哪些文件
2、gpiolib的學習方法
(1)以一條主線進去,堅持主線;
(2)中途遇到雜碎知識,徹底搞定之,然后繼續主線;
(3)隨時做筆記以加深理解和記憶;
(4)學習途中注意架構思想,提升自己大腦的空間復雜度;
3、主線1:gpiolib的建立
找到目標函數
- smdkc110_map_io這個函數在靜態映射中曾經經過。
- ? ? ? s5pv210_gpiolib_init函數,是gpiolib初始化的函數。
九、linux內核的gpiolib學習2
1、struct?s3c_gpio_chip
(1)在文件gpio-core.h文件中
- 此結構體是一個GPIO端口的抽象,這個結構體的一個變量就可以完全的描述一個IO端口。
(2)端口和IO口是兩個概念
- S5PV210有很多個IO口(160個左右),這些IO口首先被分成N個端口(port group),然后每個端口中又包含了M個IO口。
- 譬如GPA0是一個端口,里面包含了8個IO口,我們一般記作:GPA0_0(或GPA0.0)、GPA0_1……
(3)內核中為每個GPIO分配了一個編號,編號是一個數字(譬如一共有160個IO時編號就可以從1到160連續分布),編號可以讓程序很方便的去識別每一個GPIO。
2、s5pv210_gpio_4bit[ ]數組
- 一個結構體數組,數組中包含了很多個struct s3c_gpio_chip類型的變量
- 填充了結構體中chip這個元素,這個元素是struct gpio_chip類型的,因此進一步細化為填充struct gpio_chip類型中的元素。其他元素好像沒有太深入。
十、linux內核的gpiolib學習3
1、S5PV210_GPA0宏
這個宏的返回值是GPA0端口的某一個IO口的基礎編號值,傳參是這個IO口在GPA0端口中的局部編號。
2、samsung_gpiolib_add_4bit_chips函數
- 進行gpiolib的注冊;
- 接收的參數是當前文件中定義好的結構體數組s5pv210_gpio_4bit(2個參數分別是數組名和數組元素個數);
- 此結構體數組,包含了當前系統中所有的IO端口的信息。
- 包含:端口的名字、端口中所有GPIO的編號、端口操作寄存器組的虛擬地址基地址、端口中IO口的數量、端口上下拉等模式的配置函數、端口中的IO口換算其對應的中斷號的函數(此時不用再查看原理圖)。
十一、linux內核的gpiolib學習4
1、幾個問題
(1)哪個目錄的哪個文件?
(2)函數名中為什么有個4bit?
- 三星的CPU中2440的CON寄存器是2bit對應一個IO口,而6410和210以及之后的系列中CON寄存器是4bit對應1個IO口。
- 所以gpiolib在操作2440和210的CON寄存器時是不同的。
2、函數調用關系
- samsung_gpiolib_add_4bit_chips
- ? ? ? ?samsung_gpiolib_add_4bit
- ? ? ? ?s3c_gpiolib_add
- samsung_gpiolib_add_4bit內部沒有做gpiolib的注冊工作,而是在做填充,填充的是每一個GPIO被設置成輸入模式/輸出模式的操作方法。
十二、linux內核的gpiolib學習5_6
1、s3c_gpiolib_add
(1)首先檢測并完善chip的direction_input/direction_ouput/set/get這4個方法;
(2)然后調用gpiochip_add方法進行真正的注冊操作。
- 這個注冊就是將(我們的封裝了一個GPIO端口的所有信息的)chip結構體變量,掛接到內核(gpiolib模塊定義的一個)gpio_desc數組中的某一個格子中。
2、從驅動框架角度再來分析一下gpiolib
(1)截至目前(gpiochip_add方法)已經搞清楚了gpiolib的建立工程,即主線一。
- 但是這只是整個gpiolib建立的一部分,是廠商驅動工程師負責的那一部分;
- 還有另一部分是內核開發者提供的驅動框架的那一部分,即第2條主線。(第一條起始見八3)
(2)drivers/gpio/gpiolib.c這個文件中所有的函數構成了第2部分,也就是內核開發者寫的gpiolib框架部分。
- gpiochip_add:是框架開出來的接口,給廠商驅動工程師用(針對某個開發板GPIO的情況,對內核進行一定的修改,注冊),用于向內核注冊gpiolib。(標記有多少組端口,屬性細節等,讓內核知道具體的GPIO信息。)
- gpio_request:是框架開出來的接口,給使用gpiolib來編寫自己的驅動的驅動工程師用的,驅動中要想使用某一個gpio,就必須先調用gpio_request接口來向內核的gpiolib部分申請,得到允許后才可以去使用這個gpio。
- gpio_free:對應gpio_request,用來釋放申請后用完了的gpio。
- gpio_request_one/gpio_request_array:這兩個是gpio_request的變種。
- gpiochip_is_requested:接口用來判斷某一個gpio是否已經被申請了
- gpio_direction_input/gpio_direction_output:接口用來設置GPIO為輸入/輸出模式,注意該函數內部實際并沒有對硬件進行操作,只是通過chip結構體變量的函數指針,調用了(將來SoC廠商的驅動工程師寫的)真正地操作硬件、實現gpio設置成輸出模式的那個函數。
- 以上的接口屬于一類,是給寫其他驅動并且用到了gpiolib的人使用的,剩下的函數是gpiolib內部自己的一些功能實現的代碼。
十三、linux內核的gpiolib學習7
1、gpiolib的attribute部分
(1)CONFIG_GPIO_SYSFS
- 在內核中很多實現方式,都是通過宏來配置的;
- 在.config文件有,則必然在menuconfig中有。
(2)GPIO的attribute演示
- 一般能cat,不能寫。
2、能夠cat的相關代碼分析
(1)gpiolib_sysfs_init:在/sys/class里定義了gpio這個類
(2)gpiochip_export
(3)sysfs_create_group用來創建許多attribute
總結
以上是生活随笔為你收集整理的驱动框架6——linux内核的gpiolib学习的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 搞技术要点
- 下一篇: C语言程序设计基础(01)—— 计算机与