日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

迅为4412开发板Linux驱动教程之GPIO的初始化

發(fā)布時間:2024/3/26 58 豆豆
生活随笔 收集整理的這篇文章主要介紹了 迅为4412开发板Linux驱动教程之GPIO的初始化 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

視頻下載地址: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被分為4bank,這

個和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.hs3c_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只是一個表格,CPUGPIO

的操作就很好理解了。

?

??內(nèi)部寄存器不是很快么,CPU為什么不直接讀取?

–?內(nèi)部寄存器是很快,但是相對于CPU還是非常慢。CPU處理數(shù)據(jù)是將內(nèi)存

中一大段一大段處理,如果單個的讀取內(nèi)部寄存器的值,對CPU是極大的

浪費。把內(nèi)部寄存器也看成“特殊的物理地址”即可。

??只講了虛擬地址和物理地址對應(yīng)數(shù)組,怎么沒介紹哪里調(diào)用了?

–?大家可以看一下函數(shù)ioremaplinux會調(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。