iMX6系列應用筆記-iMX6Q GPIO 功能應用操作講解

原創 2021-01-20 12:58:00 iMX6 iMX6q
本文以飛凌嵌入式OKMX6Q/DL-C開發板為基礎講解,操作系統Linux3.0.35,其它品牌產品請參考使用,本文主要介紹了iMX6Q開發板GPIO的操作,寫本文章主要是記錄日常客戶經常問到的一些問題,為客戶提供一些解決思路,希望可以協助客戶加速產品的研發速度,由于水平有限,在服務過程中所提供的任何資料和信息,都僅供參考。

一、通用GPIO的使用

嵌入式系統中對GPIO的操作是最基本的操作。在Linux中有一個通用的GPIO操作接口。在imx6Q開發板文件系統中會有一個控制GPIO的目錄:/sys/class/gpio;Linux-3.0.35內核中Documention文件夾下邊有gpio.txt文檔可以參考。


root@freescale /sys/class/gpio$ ls
export       gpiochip0    gpiochip160  gpiochip32   gpiochip96
gpiochip128   gpiochip192   gpiochip64    unexport




名稱

描述

export

導出GPIO操作接口

unexport

撤銷GPIO操作接口的導出

gpiochip0

GPIO1組

gpiochip32

GPIO2組

gpiochip64

GPIO3組

gpiochip96

GPIO4組

gpiochip128

GPIO5組

gpiochip160

GPIO6組

gpiochip192

GPIO7組

 其中,export和unexport為GPIO子系統的屬性文件,其余七個文件則為符號鏈接(gpiochip0,gpiochip32,gpiochip64,gpiochip96,gpiochip128,gpiochip160,gpiochip192),分別指向各自對應的GPIO組。以gpiochip0為例,此目錄下的文件有:


root@freescale /sys/class/gpio/gpiochip0$ ls
base       label      ngpio      power      subsystem  uevent



名稱

描述

base

GPIO組的初始編號

label

GPIO組標簽

ngpio

該組的GPIO總數

power

設備供電方面的相關信息

subsystem

符號鏈接,指向父目錄

uevent

內核與udev(自動設備發現程序)之間的通信接口

當我們操作某個GPIO之前,需要先向export文件寫入該GPIO編號以導出它的設備目錄。GPIO編號的計算公式如下所示:

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

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

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

1、GPIO編號導出

文件系統中/sys/class/gpio/export文件用于通知系統需要導出要控制的GPIO的編號:echo 195 >/sys/class/gpio/export

命令成功后生成/sys/class/gpio/gpio195目錄。如果沒有出現相應的目錄,說明此引腳不可導出,一般這種情況是驅動中pinmux功能配置不正確,或者配置了多種pinmux功能引起沖突導致。

2、取消GPIO編號導出

文件系統中/sys/class/gpio/unexport文件 用于通知系統取消GPIO編號導出:echo 195  > /sys/class/gpio/unexport

3、 配置GPIO的輸入輸出方向

echo out >/sys/class/gpio/gpio195/direction

direction可接收的參數:in,out,high,low;其中high,low設置方向為輸出并將value值設置為相應的1/0。

4、查看GPIO的輸入輸出方向:cat /sys/class/gpio/gpio195/ direction

5、配置GPIO的高低電平(值為1/0)

當gpio配置為輸出模式時,可以通過設置value值設置gpio的高低電平。

echo 1 >/sys/class/gpio/value

6、 查看GPIO的輸出值cat /sys/class/gpio/gpio195/value

二、修改Pinmux配置

驅動中的主要位置:linux3.0.35/drivers/gpio/gpiolib.c

修改文件arch/arm/mach-mx6/board-mx6q_sabresd.h,在其中增加該引腳對應的gpio配置,該引腳如果有其他復用配置,需要將其他復用配置去掉,只保留一種pinmux配置。內核中引腳功能定義在arch/arm/plat-mxc/include/mach/iomux-mx6q.h文件中,該文件對每個引腳的復用功能進行了定義,有興趣的可以自己看一下。

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

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


/*GPIO*/3
       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,
       MX6Q_PAD_SD3_DAT6__GPIO_6_18,
       MX6Q_PAD_SD3_DAT7__GPIO_6_17,
       MX6Q_PAD_NANDF_D1__GPIO_2_1,
       MX6Q_PAD_NANDF_D0__GPIO_2_0,


將原來的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,
        MX6Q_PAD_SD3_DAT6__USDHC3_DAT6_50MHZ,
        MX6Q_PAD_SD3_DAT7__USDHC3_DAT7_50MHZ,
        MX6Q_PAD_NANDF_D0__GPIO_2_0,          
        MX6Q_PAD_NANDF_D1__GPIO_2_1,            */



修改前:

 

修改后:

 

修改完成后重新編譯內核,并將鏡像燒寫到iMX6Q開發板上進行測試。

測試

echo 195 > /sys/class/gpio/export

echo out > /sys/class/gpio/gpio195/direction

echo 1 > /sys/class/gpio/gpio195/value

cat /sys/class/gpio/gpio195/value


三、Datasheet查看gpio

1、GPIO地址

IMX6DQRM.pdf手冊中的第28章描述的是gpio相關的內容。

手冊第二章Memory Maps內存映射大概在215頁,有關于GPIO組的映射地址:

 

2、GPIO寄存器

數據手冊第28章中第1429頁描述的是GPIO控制的8個32位寄存器。

寄存器

描述

GPIOx_DR

數據寄存器,當GPIO為輸出時,可以通過寫DR寄存器來驅動gpio引腳

GPIOx_GDIR

控制GPIO引腳方向

GPIOx_PSR

當GPIO為輸入時,從PSR寄存器讀取數據

GPIOx_ICR1

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

GPIOx_ICR2

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

GPIOx_IMR

中斷屏蔽寄存器

GPIOx_ISR

中斷狀態寄存器

GPIOx_EDGR_SEL

設置邊沿觸發方式

3、引腳復用

iMX6Q數據手冊36章IOMUX Controller這一章節有興趣的也可以詳細看一下或者從網絡上找一些相關資料了解,此處不做詳述

該章節主要描述引腳的復用配置以及一些功能的配置等,內核代碼中關于這一塊的配置在linux-3.0.35/arch/arm/plat-mxc/include/mach/iomux-mx6q.h文件中。該文件中的具體配置有興趣的可以自己看一下,一般這塊恩智浦NXP官方是默認配置好的,配置項的具體含義也可以從網上搜搜,并結合iomux-mx6q.h文件自己看看。

4、參數查找配置方法

手冊第四章查找EIM_A22,可以看到需要ALT Mode是ALT5,而且Pad Settings需要配置的參數有PKE – ENABLED, 對應的Pad Registers為[SW_PAD_CTL_PAD_EIM_ADDR22]。

 

手冊繼續搜索[SW_PAD_CTL_PAD_EIM_ADDR22] 寄存器, 可以看到寄存器的具體配置和具體的偏移地址以及上拉的配置。

 

手冊尋找對應的MUX Control Registers [IOMUXC_SW_MUX_CTL_PAD_EIM_ADDR22]。可以看到具體的配置模式ALT5模式的配置值為0x05UL。

 

附錄:常見GPIO調試問題處理參考

常見GPIO調試問題處理參考:

 1.如果在GPIO導出時出現Device or resource busy的情況

      一般都是該引腳在內核中配置為其他功能,需要仔細檢查內核中引腳配置,不要被其他功能占用。

2.GPIO能夠導出,但是使用的時候各種功能都不正常的情況

     這種情況一般也是引腳在內核中配置為其他功能,需要仔細檢查內核中引腳配置,不要被其他功能占用(一般被串口占用會有這種情況);

    還有就是檢查硬件電路,看硬件上有沒有上拉下拉這樣的硬件控制。




相關產品 >

  • FETMX6Q-C核心板

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

    了解詳情
    FETMX6Q-C核心板
  • FETMX8MP-C核心板

    iMX8MP核心板基于 NXP  i.MX 8M Plus 處理器設計,  采用4核Cortex-A53 和 Cortex-M7架構。支持雙千兆網口,iMX8MP性能強勁最高運行速率可達2.3TOPS,并且i.MX8MP功耗更低≤2W 。iMX 8M Plus系列專注于機器學習和視覺、高級多媒體以及具有高可靠性的工業自動化。它旨在滿足智慧家庭、樓宇、城市和工業4.0應用的需求。飛凌iMX8MP核心板提供用戶手冊,iMX8MP原理圖,引腳定義等。
    了解詳情
    FETMX8MP-C核心板

推薦閱讀 換一批 換一批