本文檔主要介紹 iMX6 板子 gpio 引腳讀寫配置。有關(guān)平臺文件的設(shè)備注冊的資料可以參 考“iTOP-iMX6-平臺文件注冊設(shè)備”文檔。注冊的設(shè)備名稱是“gpio_ctl”。 硬件環(huán)境:iMX6 開發(fā)板:核心板 v_1.2、底板 v_2.2(以及 v_2.1 底板)。 軟件環(huán)境:Ubuntu12.04。 1.1 配置文件簡述 配置 gpio 需要研究三個文件,分別為“ arch/arm/plat-mxc/include/mach/iomux- mx6q.h”、“arch/arm/mach-mx6/board-mx6q_topeet.h”、“arch/arm/mach- mx6/board-mx6q_topeet.c”。 其中“arch/arm/plat-mxc/include/mach/iomux-mx6q.h”文件為 IMX6 所有 IO 及其 每個 IO 所有功能的定義集合,用戶可通過此文件來查詢某個 IO 的功能的定義。 “arch/arm/mach-mx6/board-mx6q_topeet.h”文件用來定義初始化 IMX6 對應(yīng)需要 用到的 IO 口的功能。在該文件對 gpio 進行初始化。 “arch/arm/mach-mx6/board-mx6q_topeet.c”文件為 IMX6 的板級初始化文件,在 該文件可以對 gpio 引腳進行設(shè)置。 1.2 硬件介紹 1.2.1 底板部分 查看 v_2.2 版本的 iMX6 底板原理圖。我們以下面的 5 個引腳為例。進行下面的操作。
![]() 下圖是 v_2.1 版本的底板原理圖。
![]() 在底板原理圖上搜索各個網(wǎng)絡(luò)標(biāo)號“EIM_D17”、“EIM_D18”、“EIM_D20”、 “KEY_ROW5”、“EIM_D19”。可以查看到均連接到板對板連接器。也就是全都連接到核 心板上。接下來去看核心板原理圖。 1.2.2 核心板部分 搜索上述的網(wǎng)絡(luò)標(biāo)號,查看連接到核心板的什么位置。如下圖。
![]() ![]() 由上圖可知,五個引腳分別接到核心的“EIM_D17”、“EIM_D18”、“EIM_D20”、 “GPIO_1”、“EIM_D19”引腳。接下來在“arch/arm/plat-mxc/include/mach/iomux- mx6q.h”查看各個 IO 口的功能定義。 1.3 軟件配置 1.3.1 iomux-mx6q.h 文件 iomux-mx6q.h 文件主要功能是查詢某個 IO 的功能的定義。 進入 iMX6 內(nèi)核源碼目錄,使用“vi arch/arm/plat-mxc/include/mach/iomux- mx6q.h”命令打開 iomux-mx6q.h 文件。如下圖。
![]() 搜索上述查看到的五個引腳名稱。 以引腳 1 為例。使用“/EIM_D17”搜索到如下信息。如下圖。
![]() 由上圖可以看見擴展總線”EIM_D17”被定義為 8 種功能。我們在使用該引腳是要注 意,無論是初始化還是定義功能,都不能沖突,避免自己使用的功能被其他功能占用。 EIM_D17 配置為 GPIO 功能時使用的是定義為:_MX6Q_PAD_EIM_D17__GPIO_3_17。 其中 _MX6Q_PAD_EIM_D17__GPIO_3_17 被定義為: #define _MX6Q_PAD_EIM_D17__GPIO_3_17 \ IOMUX_PAD(0x03A8, 0x0094, 5, 0x0000, 0, 0) 這個宏比較關(guān)鍵,其原型為: #define IOMUX_PAD(_pad_ctrl_ofs,_mux_ctrl_ofs,_mux_mode,_sel_input_ofs,_sel_input,_pad_ctrl) IOMUX_PAD 宏有 6 個參數(shù),每個參數(shù)的意思是:
![]() 引腳 2、3、12 和引腳 1 定義類似。不再贅述。再搜索一下引腳 10 的定義。使用 “/GPIO_1”命令,查看到如下信息。(注意 GPIO 為 MX6Q_PAD 之后的 GPIO)
![]() 由 上 圖 可 知 , GPIO_1 配 置 為 GPIO 功 能 時 使 用 的 定 義 為 : _MX6Q_PAD_GPIO_1__GPIO_1_1 。 現(xiàn)在可以暫時總結(jié)一下我們得到的信息。如下圖。
![]() 1.3.2 board-mx6q_topeet.h 文件 board-mx6q_topeet.h 文件用來定義初始化 IMX6 對應(yīng)需要用到的 IO 口的功能。 在 board-mx6q_topeet.h 文件中要搜索使用的 IO 有沒有沒被定義為其他功能,有的話 需要注釋掉,然后添加自己的初始化定義。 在內(nèi)核源碼目錄輸入“vi arch/arm/mach-mx6/board-mx6q_topeet.h”命令,打開 board-mx6q_topeet.h 文件。如下圖。
![]() 還是以 EIM_D17 的配置為例進行操作。使用”/MX6Q_PAD_EIM_D17”搜索初始化信 息,查看到該功能已經(jīng)被初始化。把該初始化注釋掉,如下圖。
![]() 再次搜素沒有發(fā)現(xiàn)其他相關(guān)定義。其他引腳與此類似。要保證沒有被其他功能定義 (iomux-mx6q.h 文件中的定義)。還需要注釋掉一個地方,如下圖。
![]() 下面給上述引腳添加初始化。如下圖。
![]() 注意,是添加到 mx6q_topeet_pads[]之中。 1.3.3 board-mx6q_topeet.c 文件 board-mx6q_topeet.c 文件可以對 gpio 引腳進行設(shè)置。 在 board-mx6q_topeet.c 文件中我們將要使用的 gpio 管腳有可能被其他功能占用,需 要我們把其他功能注釋掉、或者設(shè)置為 NULL。 在 iMX6 的內(nèi)核源碼目錄,使用”vi arch/arm/mach-mx6/board-mx6q_topeet.c”命 令打開 board-mx6q_topeet.c 文件,如下圖。
![]() 使用命令“/IMX_GPIO_NR(3, 17)”查找 EIM_D17 對應(yīng)的配置。(此處應(yīng)注意 17 和前 面的逗號之間有個空格,不然搜索不到)。把搜索到配置修改為 NULL。如下圖。
![]() 其它引腳與此類似。全部修改如下圖。
![]() ![]() ![]() 至此。我們的配置就都做完了。注意:IMX_GPIO_NR(1, 1)一共有兩處。 按照”iTOP-i.MX6 開發(fā)板之全能版使用手冊”中的內(nèi)核編譯步驟,進行編譯內(nèi)核。重新 燒寫到開發(fā)板。進行下一步測試。 |