嵌入式Linux設備驅動開發之:GPIO驅動程序實例
11.3GPIO驅動程序實例
11.3.1GPIO工作原理
FS2410開發板的S3C2410處理器具有117個多功能通用I/O(GPIO)端口管腳,包括GPIO8個端口組,分別為GPA(23個輸出端口)、GPB(11個輸入/輸出端口)、GPC(16個輸入/輸出端口)、GPD(16個輸入/輸出端口)、GPE(16個輸入/輸出端口)、GPF(8個輸入/輸出端口)、GPH(11個輸入/輸出端口)。根據各種系統設計的需求,通過軟件方法可以將這些端口配置成具有相應功能(例如:外部中斷或數據總線)的端口。
為了控制這些端口,S3C2410處理器為每個端口組分別提供幾種相應的控制寄存器。其中最常用的有端口配置寄存器(GPACON~GPHCON)和端口數據寄存器(GPADAT~GPHDAT)。因為大部分I/O管腳可以提供多種功能,通過配置寄存器(PnCON)設定每個管腳用于何種目的。數據寄存器的每位將對應于某個管腳上的輸入或輸出。所以通過對數據寄存器(PnDAT)的位讀寫,可以進行對每個端口的輸入或輸出。
在此主要以發光二極管(LED)和蜂鳴器為例,討論GPIO設備的驅動程序。它們的硬件驅動電路的原理圖如圖11.4所示。
圖11.4LED(左)和蜂鳴器(右)的驅動電路原理圖
在圖11.4中,可知使用S3C2410處理器的通用I/O口GPF4、GPF5、GPF6和GPF7分別直接驅動LEDD12、D11、D10以及D9,而使用GPB0端口驅動蜂鳴器。4個LED分別在對應端口(GPF4~GPF7)為低電平時發亮,而蜂鳴器在GPB0為高電平時發聲。這5個端口的數據流方向均為輸出。
在表11.15中,詳細描述了GPF的主要控制寄存器。GPB的相關寄存器的描述與此類似,具體可以參考S3C2410處理器數據手冊。
表11.15 GPF端口(GPF0-GPF7)的主要控制寄存器
寄存器 | 地址 | R/W | 功能 | 初始值 | |
GPFCON | 0x56000050 | R/W | 配置GPF端口組 | 0x0 | |
GPFDAT | 0x56000054 | R/W | GPF端口的數據寄存器 | 未定義 | |
GPFUP | 0x56000058 | R/W | GPF端口的取消上拉寄存器 | 0x0 | |
GPFCON | 位 | 描述 | |||
GPF7 | [15:14] | 00=輸入01=輸出10=EINT711=保留 | |||
GPF6 | [13:12] | 00=輸入01=輸出10=EINT611=保留 | |||
GPF5 | [11:10] | 00=輸入01=輸出10=EINT511=保留 | |||
GPF4 | [9:8] | 00=輸入01=輸出10=EINT411=保留 | |||
GPF3 | [7:6] | 00=輸入01=輸出10=EINT311=保留 | |||
GPF2 | [5:4] | 00=輸入01=輸出10=EINT211=保留 | |||
GPF1 | [3:2] | 00=輸入01=輸出10=EINT111=保留 | |||
GPF0 | [1:0] | 00=輸入01=輸出10=EINT011=保留 |
GPFDAT | 位 | 描述 |
GPF[7:0] | [7:0] | 每位對應于相應的端口,若端口用于輸入,則可以通過相應的位讀取數據;若端口用于輸出,則可以通過相應的位輸出數據;若端口用于其他功能,則其值無法確定。 |
GPFUP | 位 | 描述 |
GPF[7:0] | [7:0] | 0:向相應端口管腳賦予上拉(pull-up)功能 1:取消上拉功能 |
為了驅動LED和蜂鳴器,首先通過端口配置寄存器將5個相應寄存器配置為輸出模式。然后通過對端口數據寄存器的寫操作,實現對每個GPIO設備的控制(發亮或發聲)。在下一個小節中介紹的驅動程序中,s3c2410_gpio_cfgpin()函數和s3c2410_gpio_pullup()函數將進行對某個端口的配置,而s3c2410_gpio_setpin()函數實現向數據寄存器的某個端口的輸出。
linux操作系統文章專題:linux操作系統詳解(linux不再難懂)linux相關文章:linux教程
蜂鳴器相關文章:蜂鳴器原理
評論