迅为4412开发板Linux驱动教程之GPIO的初始化
視頻下載地址:http://pan.baidu.com/s/1c06oiti
?
GPIO的初始化
??在內(nèi)核源碼目錄下使用命令“l(fā)s?drivers/gpio/*.o”,可以看到“gpio-exynos4”被編譯進了內(nèi)核
–?生成.o文件代表最終被編譯進了內(nèi)核
–?除了menuconfig配置文件,還可以通過.o文件來判定該文件是否編譯進了
內(nèi)核
?
??在“gpio-exynos4.c”文件最下面一行
–?core_initcall(exynos4_gpiolib_init);
–?core_initcall代表在linux初始化過程中會調(diào)用
–?初始化函數(shù)是在源碼目錄下“include/linux/init.h”文件中定義的,該頭文件
中定義了一系列的初始化函數(shù),在linux啟動的過程中會按等級
?
結(jié)構(gòu)體exynos4_gpio_common_4bit
??以有帶有l(wèi)abel=?"GPL2"的結(jié)構(gòu)體為例
?
??.base?=?(S5P_VA_GPIO2?+?0x100)
–?表示偏移地址和虛擬地址相加
??.eint_offset?=?0x20
–?表示中斷部分,介紹中斷的時候再講(IO口可以配置為中斷模式)
??.group?=?22
–?給GPIO分組
??chip.base?=?EXYNOS4_GPL2(0),
–?宏定義EXYNOS4_GPL2(0)賦值給初始化函數(shù)
??chip.ngpio?=?EXYNOS4_GPIO_L2_NR
–?表示這一小組中有幾個GPIO
??chip.label?=?"GPL2",
–?程序員需要關(guān)心的標志
?
??宏定義EXYNOS4_GPL2(0)分析
–?EXYNOS4_GPL2(_nr)?(EXYNOS4_GPIO_L2_START?+?(_nr))
–?枚舉GPIO
–?EXYNOS4_GPIO_L2_START=?EXYNOS4_GPIO_NEXT(EXYNOS4_GPIO_L1)
–?EXYNOS4_GPIO_NEXT宏定義
–?#define?EXYNOS4_GPIO_NEXT(__gpio)?\?((__gpio##_START)?+?(__gpio##_NR)?
+?CONFIG_S3C_GPIO_SPACE?+?1)
??GPIO的數(shù)量EXYNOS4_GPIO_L2_NR
–?可以通過手冊查到
?
??S5P_VA_GPIO2
–?虛擬地址
??查找S5P_VA_GPIO2宏定義,可以看到所有的GPIO被分為4個bank,這
個和datasheet上面是一致的。
–?S5P_VA_GPIO1
–?S5P_VA_GPIO2?S3C_ADDR(0x02240000)
–?S5P_VA_GPIO3
–?S5P_VA_GPIO4
??查找到S3C_ADDR宏定義
–?#define?S3C_ADDR(x)?(S3C_ADDR_BASE?+?(x))
??查找到S3C_ADDR_BASE宏定義,這是一個虛擬地址,可以看出,地址
范圍超出了1G或者2G內(nèi)存的范圍
–?#define?S3C_ADDR_BASE?0xF6000000
?
物理地址和虛擬地址的映射關(guān)系
?
??虛擬地址和物理地址映射
–?虛擬地址一般很好查找,一般在平臺相關(guān)gpio的文件中就可以找到宏定義
??在source?insight中搜索關(guān)鍵字“S5P_VA_GPIO2”,看看那里用到了這個
宏定義。搜索時間會比較長,1-5分鐘吧。
??搜索出來之后,可以看到除了gpio-exynos4.c文件中使用,cpu-exynos
中也使用了,這是一個平臺文件
?
??映射數(shù)組如下圖所示
?
?
??結(jié)構(gòu)體解釋
–?.virtual?=?(unsigned?long)S5P_VA_GPIO2,表示虛擬地址
–?.pfn?=?__phys_to_pfn(EXYNOS4_PA_GPIO2),表示物理地址
–?.length?=?SZ_4K,表示映射的寬度
–?.type?=?MT_DEVICE,
??查找到宏定義EXYNOS4_PA_GPIO2
–?#define?EXYNOS4_PA_GPIO2?0x11000000
–?這個物理地址0x11000000就是
?
GPIO的初始化流程
??初始化過程簡單描述
–?平臺文件分別定義好物理地址和虛擬地址
–?物理地址和虛擬地址之間映射
??在初始化中,引入了程序員需要使用的GPIO宏定義,并將宏定義裝入
chip結(jié)構(gòu)體中
?
GPIO的調(diào)用函數(shù)
??例如頭文件gpio-cfg.h中s3c_gpio_cfgpin函數(shù)。這個函數(shù)是給GPIO做配
置,第一個參數(shù)是宏EXYNOS4_GPL2(0),第二個是配置的狀態(tài)參數(shù)
–?配置頭文件在arm/arm/plat-samsung/include/plat/gpio-cfg.h
??查找該函數(shù),可以看到進入函數(shù)就會調(diào)用chip結(jié)構(gòu)體
–?s3c_gpiolib_getchip,這個函數(shù)通過pin調(diào)用之后,會返回s3c_gpios[chip]?的
參數(shù)
–?exynos4_gpio_common_4bit[]和s3c_gpios都是結(jié)構(gòu)體s3c_gpio_chip類型的
數(shù)據(jù)
–?然后計算偏移地址等等一系列操作,這一部分是linux內(nèi)核以及三星平臺完
成的,具體細節(jié)不用管。
??也就是我們控制GPIO的時候,可以通過GPIO的一些處理函數(shù)加上類似
EXYNOS4_GPL2(0)的宏定義,就可以操作GPIO
??后面再具體介紹GPIO操作中,常用函數(shù)的使用
?
常見問題
??不是說好的分頁大小要一樣,怎么GPIO經(jīng)過mmu處理的時候,又有
SZ_256又有SZ_4K?
–?實際上CPU查找地址的時候,仍舊是通過內(nèi)存。mmu本身不保存具體的數(shù)
據(jù),主要是提供一個虛擬地址和物理地址的表格,表格中還有字段的長
度。這個分頁和mmu沒什么關(guān)系,是CPU內(nèi)存以及物理地址之間通信使用
的概念。這個只是一個抽象的概念,理解mmu只是一個表格,CPU對GPIO
的操作就很好理解了。
?
??內(nèi)部寄存器不是很快么,CPU為什么不直接讀取?
–?內(nèi)部寄存器是很快,但是相對于CPU還是非常慢。CPU處理數(shù)據(jù)是將內(nèi)存
中一大段一大段處理,如果單個的讀取內(nèi)部寄存器的值,對CPU是極大的
浪費。把內(nèi)部寄存器也看成“特殊的物理地址”即可。
??只講了虛擬地址和物理地址對應(yīng)數(shù)組,怎么沒介紹哪里調(diào)用了?
–?大家可以看一下函數(shù)ioremap,linux會調(diào)用這個函數(shù)來實現(xiàn)gpio的映射關(guān)
系
–?今天講的已經(jīng)夠多夠深入了,大家只要能夠理解這么一層意思就可以了
,這個東西對我們實際寫驅(qū)動的幫助其實不是那么大!
?
??如果我還是理解不了“對宏定義EXYNOS4_GPL2(0)的操作就是對4412芯
片管腳AC21寄存器的操作”,怎么辦?
–?記住這個結(jié)論,能夠?qū)⒑曜兞?span style="margin:0px;padding:0px;font-family:'Times New Roman';">EXYNOS4_GPL2(0)和GPL這一組GPIO的第0位
寄存器聯(lián)想起來。
–?后面跟著我依葫蘆畫瓢,不影響大家實際寫程序,有興趣再回過頭理解
總結(jié)
以上是生活随笔為你收集整理的迅为4412开发板Linux驱动教程之GPIO的初始化的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 新时代的金融体系,市场对券商的要求发出的
- 下一篇: AndroidStudio运行报错 ap