小白也能玩轉(zhuǎn) i.MX6 平臺(tái)的 GPIO 應(yīng)用筆記

原創(chuàng) 2020-03-07 14:36:00 i.MX6 GPIO 應(yīng)用筆記 飛凌嵌入式

▋引言 本文主要以FETMX6x-C平臺(tái),Linux3.0.35內(nèi)核為基礎(chǔ),其他平臺(tái)也可以參考,不同平臺(tái)之間會(huì)存在差異,需自行修改適應(yīng)自己的使用。

GPIO的通用操作


1.1 普通GPIO的使用     

嵌入式系統(tǒng)中對(duì)GPIO的操作是最基本的操作。在Linux中有一個(gè)通用的GPIO操作接口。在開(kāi)發(fā)板文件系統(tǒng)中會(huì)有一個(gè)控制GPIO的目錄:/sys/class/gpio;linux-3.0.35內(nèi)核中Documention文件夾下邊有g(shù)pio.txt文檔可以參考。

root@freescale/sys/class/gpio$ ls

export      gpiochip0    gpiochip160  gpiochip32   gpiochip96 gpiochip128  gpiochip192   gpiochip64    unexport

名稱

描述

export

導(dǎo)出GPIO操作接口

unexport

撤銷(xiāo)GPIO操作接口的導(dǎo)出

gpiochip0

GPIO1組

gpiochip32

GPIO2組

gpiochip64

GPIO3組

gpiochip96

GPIO4組

gpiochip128

GPIO5組

gpiochip160

GPIO6組

gpiochip192

GPIO7組

其中,export和unexport為GPIO子系統(tǒng)的屬性文件,其余七個(gè)文件則為符號(hào)鏈接(gpiochip0,gpiochip32,gpiochip64,gpiochip96,gpiochip128,gpiochip160,gpiochip192),分別指向各自對(duì)應(yīng)的GPIO組。

以gpiochip0為例,此目錄下的文件有:

root@freescale/sys/class/gpio/gpiochip0$ ls

base      label      ngpio      power      subsystem  uevent

名稱

描述

base

GPIO組的初始編號(hào)

label

GPIO組標(biāo)簽

ngpio

該組的GPIO總數(shù)

power

設(shè)備供電方面的相關(guān)信息

subsystem

符號(hào)鏈接,指向父目錄

uevent

內(nèi)核與udev(自動(dòng)設(shè)備發(fā)現(xiàn)程序)之間的通信接口

當(dāng)我們操作某個(gè)GPIO之前,需要先向export文件寫(xiě)入該GPIO編號(hào)以導(dǎo)出它的設(shè)備目錄。GPIO編號(hào)的計(jì)算公式如下所示:

GPIO編號(hào)=(BANK-1)*32+N

在公式中BANK為GPIO引腳所在的GPIO組編號(hào),N則為引腳在該個(gè)BANK中的序號(hào)。以GPIO7-IO03為例,其BANK值為7,N值為3,因此排列序號(hào)為(7-1)*32+3=195。

下面介紹該目錄下的一些操作的用法。

1.1.1  GPIO編號(hào)導(dǎo)出

文件系統(tǒng)中/sys/class/gpio/export文件用于通知系統(tǒng)需要導(dǎo)出要控制的GPIO的編號(hào):

echo195 >/sys/class/gpio/export

命令成功后生成/sys/class/gpio/gpio195目錄。如果沒(méi)有出現(xiàn)相應(yīng)的目錄,說(shuō)明此引腳不可導(dǎo)出,一般這種情況是驅(qū)動(dòng)中pinmux功能配置不正確,或者配置了多種pinmux功能引起沖突導(dǎo)致。

1.1.2 取消GPIO編號(hào)導(dǎo)出

文件系統(tǒng)中/sys/class/gpio/unexport文件用于通知系統(tǒng)取消GPIO編號(hào)導(dǎo)出

echo195  > /sys/class/gpio/unexport

1.1.3 配置GPIO的輸入輸出方向

echoout >/sys/class/gpio/gpio195/direction

direction可接收的參數(shù):in,out,high,low;其中high,low設(shè)置方向?yàn)檩敵霾alue值設(shè)置為相應(yīng)的1/0。

1.1.4 查看GPIO的輸入輸出方向

cat/sys/class/gpio/gpio195/ direction

1.1.5 配置GPIO的高 電平(值為1/ 0)

當(dāng)GPIO配置為輸出模式時(shí),可以通過(guò)設(shè)置value值設(shè)置GPIO的高低電平。

echo1 >/sys/class/gpio/value

1.1.6 查看GPIO的輸出值

cat/sys/class/gpio/gpio195/value



驅(qū)動(dòng)配置


2.1 修改pinmux配置  

驅(qū)動(dòng)中的主要位置:linux3.0.35/drivers/gpio/gpiolib.c

修改文件arch/arm/mach-mx6/board-mx6q_c_sabresd.h,在其中增加該引腳對(duì)應(yīng)的GPIO配置,該引腳如果有其他復(fù)用配置,需要將其他復(fù)用配置去掉,只保留一種pinmux配置。內(nèi)核中引腳功能定義在arch/arm/plat-mxc/include/mach/iomux-mx6q.h文件中,該文件對(duì)每個(gè)引腳的復(fù)用功能進(jìn)行了定義,有興趣的可以自己看一下。

以釋放原SD卡功能占用的部分引腳為例

修改文件arch/arm/mach-mx6/board-mx6q_c_sabresd.h,在其中增加如下定義:

/*GPIO*/

MX6Q_PAD_SD3_CLK__GPIO_7_3,

MX6Q_PAD_SD3_CMD__GPIO_7_2,

MX6Q_PAD_SD3_DAT2__GPIO_7_6,

MX6Q_PAD_SD3_DAT3__GPIO_7_7,

MX6Q_PAD_SD3_DAT4__GPIO_7_1,

MX6Q_PAD_SD3_DAT5__GPIO_7_0,

將原來(lái)的SD卡的功能注釋掉

/*USDHC3 */

/*     MX6Q_PAD_SD3_CLK__USDHC3_CLK_50MHZ,

MX6Q_PAD_SD3_CMD__USDHC3_CMD_50MHZ,

MX6Q_PAD_SD3_DAT0__USDHC3_DAT0_50MHZ,

MX6Q_PAD_SD3_DAT1__USDHC3_DAT1_50MHZ,

MX6Q_PAD_SD3_DAT2__USDHC3_DAT2_50MHZ,

MX6Q_PAD_SD3_DAT3__USDHC3_DAT3_50MHZ,

MX6Q_PAD_SD3_DAT4__USDHC3_DAT4_50MHZ,

MX6Q_PAD_SD3_DAT5__USDHC3_DAT5_50MHZ,

*/

 修改前 


 修改后 

修改完成后重新編譯內(nèi)核,并將鏡像燒寫(xiě)到開(kāi)發(fā)板上進(jìn)行測(cè)試。


測(cè)試

echo195 > /sys/class/gpio/export

echoout > /sys/class/gpio/gpio195/direction

echo1 > /sys/class/gpio/gpio195/value

cat/sys/class/gpio/gpio195/value


Datasheet 查看 GPIO


3.1GPIO地址  

IMX6DQRM.pdf手冊(cè)中的第28章描述的是GPIO相關(guān)的內(nèi)容,手冊(cè)第二章MemoryMaps內(nèi)存映射大概在215頁(yè),有關(guān)于GPIO組的映射地址:


3.2 GPIO寄存器  

數(shù)據(jù)手冊(cè)第28章中第1429頁(yè)描述的是GPIO控制的8個(gè)32位寄存器

寄存器

描述

GPIOx_DR

數(shù)據(jù)寄存器,當(dāng)GPIO為輸出時(shí),可以通過(guò)寫(xiě)DR寄存器來(lái)驅(qū)動(dòng)GPIO引腳

GPIOx_GDIR

控制GPIO引腳方向

GPIOx_PSR

當(dāng)GPIO為輸入時(shí),從PSR寄存器讀取數(shù)據(jù)

GPIOx_ICR1

配置GPIO中斷的觸發(fā)方式,高低電平出發(fā)還是沿觸發(fā)

GPIOx_ICR2

配置GPIO中斷的觸發(fā)方式,高低電平出發(fā)還是沿觸發(fā)

GPIOx_IMR

中斷屏蔽寄存器

GPIOx_ISR

中斷狀態(tài)寄存器

GPIOx_EDGR_SEL

設(shè)置邊沿觸發(fā)方式


3.3 引腳復(fù)用  

數(shù)據(jù)手冊(cè)36章IOMUXController這一章節(jié)有興趣的也可以詳細(xì)看一下或者從網(wǎng)絡(luò)上找一些相關(guān)資料了解,此處不做詳述。
該章節(jié)主要描述引腳的復(fù)用配置以及一些功能的配置等,內(nèi)核代碼中關(guān)于這一塊的配置在linux-3.0.35/arch/arm/plat-mxc/include/mach/iomux-mx6q.h文件中。該文件中的具體配置有興趣的可以自己看一下,一般這塊恩智浦(NXP)官方是默認(rèn)配置好的,配置項(xiàng)的具體含義也可以從網(wǎng)上搜搜,并結(jié)合iomux-mx6q.h文件自己看看。



■ 關(guān)注“飛凌嵌入式”公眾號(hào),不定期分享行業(yè)干貨及產(chǎn)品一線資料。

■ 直接微信回復(fù)產(chǎn)品平臺(tái),如“LS1012A”,即可快速獲取對(duì)應(yīng)產(chǎn)品信息。

■ 想要了解飛凌更多信息,歡迎與我們聯(lián)系:

銷(xiāo)售工程師:400-699-6866

國(guó)際業(yè)務(wù)部:0312-3102650-854

技術(shù)服務(wù)部:0312-3119192

方案定制類(lèi):17713286015 (杜工),18633238067(王工)

■ 實(shí)時(shí)技術(shù)支持:

AM 9:00—11:30,PM 13:30—17:00(周一至周五)



相關(guān)產(chǎn)品 >

  • FETMX6Q-C核心板

    i.MX6Q核心板板層出不窮,要如何選擇?飛凌解讀i.mx6Q芯片強(qiáng)性能為您推薦四核A9架構(gòu)的i.MX6Q產(chǎn)品精選,包含iMX6Q 核心板、i.MX6Q 核心板、iMX6Q工業(yè)級(jí)核心板,歡迎采購(gòu)。  i.MX6Q核心板基于NXP(原Freescale)Cortex-A9架構(gòu)的i.MX6Q四核處理器設(shè)計(jì),核心板小尺寸核心板搭配獨(dú)特的薄款連接器,讓設(shè)計(jì)隨心所欲!

    了解詳情
    FETMX6Q-C核心板
  • OKMX6Q-C開(kāi)發(fā)板

    雙千兆飛凌嵌入式iMX6Q開(kāi)發(fā)板,板對(duì)板連接器,纖薄之際,次底板支持iMX6Q和iMX6DL核心板。i.MX6Q開(kāi)發(fā)板與i.MX6DL開(kāi)發(fā)板資源豐富,原理圖、PCB、軟件資源、硬件資源下載,技術(shù)支持等。歡迎選購(gòu)

    了解詳情
    OKMX6Q-C開(kāi)發(fā)板
  • FETMX6Q-S核心板

    NXP iMX6Quad系列具有四個(gè)內(nèi)核,運(yùn)行頻率達(dá)1.2 GHz,帶有1 MB L2緩存和64位DDR3或2通道、32位LPDDR2支持。飛凌提供商業(yè)級(jí)iMX6Q核心板,工業(yè)級(jí)iMX6Q核心板,兼容一同底板。具有抗震,抗氧化,抗干擾,更快速升級(jí)產(chǎn)品等優(yōu)勢(shì)。保定飛凌嵌入式專注imx6,imx6開(kāi)發(fā)板,飛思卡爾imx6等ARM嵌入式核心控制系統(tǒng)研發(fā)、設(shè)計(jì)和生產(chǎn),是imx6,imx6開(kāi)發(fā)板,飛思卡爾imx6提供者,imx6系列產(chǎn)品現(xiàn)已暢銷(xiāo)全國(guó),歡迎咨詢!
    了解詳情
    FETMX6Q-S核心板
  • OKMX6Q-S3開(kāi)發(fā)板

    飛凌嵌入式提供iMX6Q開(kāi)發(fā)板,iMX6解決方案,iMX6Q核心板,i.MX6Q開(kāi)發(fā)板解決方案。iMX6Q穩(wěn)定、快速、性價(jià)比高,歡迎選購(gòu) NXP iMX6系列芯片全支持,升級(jí)簡(jiǎn)配無(wú)憂替換。 了解詳情
    OKMX6Q-S3開(kāi)發(fā)板

推薦閱讀 換一批 換一批