i.MX6UL添加GPIO的方法基于飛凌嵌入式OKMX6UL開發板

原創 2017-04-28 14:50:00 i.MX6UL iMX6UL開發板
注:i.MX6UL添加GPIO方法,使用平臺為飛凌嵌入式OKMX6UL-C開發板,其它平臺可參考使用

 i.MX6UL開發板詳情,請點擊左側在線客服咨詢。

方法一:采用iomux的方法

在設備樹中iomux中添加復用gpio引腳如下,具體設置的上下拉電阻,驅動能力,查找i.MX6UL CPU手冊,對應修改。

 

比如MX6UL_PAD_CSI_DATA00__GPIO4_IO21    0x3008

MX6UL_PAD_CSI_DATA01__GPIO4_IO22    0x1f0b1

MX6UL_PAD_CSI_DATA02__GPIO4_IO23    0x1f0b1

MX6UL_PAD_CSI_DATA03__GPIO4_IO24    0x1f0b1

 

MX6UL_PAD_SNVS_TAMPER9__GPIO5_IO09    0x1f0b1

MX6UL_PAD_SNVS_TAMPER8__GPIO5_IO08   0x1f0b1

MX6UL_PAD_JTAG_TDO__GPIO1_IO12        0x1f0b1

  

同時修改設備樹文件中(其他地方復用引腳)

 

 

 

 

 

 

編譯設備樹。替換飛凌iMX6UL開發板中所用設備樹。

 

此時可以使用echo命令進行控制:

命令為:

echo $i > /sys/class/gpio/export

 

echo "out" > /sys/class/gpio/gpio$i/direction

echo "in" > /sys/class/gpio/gpio$i/direction

 

echo "1" > /sys/class/gpio/gpio$i/value

echo "0" > /sys/class/gpio/gpio$i/value

 

echo $i > /sys/class/gpio/unexport

 

以控制GPIO4_IO22為例:

1. 計算對應sys/class/gpio的值GPIOn_IOx = (n-1)*32 + x

GPIO4_IO22=(4-1)*32+22=118

2. GPIO4_IO22設置為輸出。

echo 118 > /sys/class/gpio/export用于通知系統需要導出控制的GPIO引腳編號

echo "out" > /sys/class/gpio/gpio118/direction 控制為輸出

echo "1" > /sys/class/gpio/gpio118/value 輸出為高電平

或者echo "0" > /sys/class/gpio/gpio118/value輸出為低電平

echo 118  > /sys/class/gpio/unexport 通知系統取消導出

3. GPIO4_IO22設置為輸入。

echo 118 > /sys/class/gpio/export用于通知系統需要導出控制的GPIO引腳編號

echo "in" > /sys/class/gpio/gpio118/direction 控制為輸入

這時給該引腳接高電平,輸入即為高電平,反之為低電平

echo 118  > /sys/class/gpio/unexport 通知系統取消導出

4. 另外客戶可以自己通過shell文件來控制gpio做為輸入或者輸出。

4.1 GPIO輸出測試

編寫測試腳本 vi gpiotest_o.sh

#!/bin/bash

# gpio list gpio (bank-1)*32 + nr  

for test in 118 119 120 137 136 12

do

echo Exporting pin $test.

echo $test> /sys/class/gpio/export

echo Setting pin $1.

echo  out > /sys/class/gpio/gpio$test/direction

echo  $1 > /sys/class/gpio/gpio$test/value

echo $test> /sys/class/gpio/unexport

done

echo complete

 

修改腳本執行權限:chmod u+x gpiotest_o.sh

測試gpio輸出為低。進入到腳本所在路徑:./gpiotest_o.sh  0

所有GPIO輸出低電平 0V。

測試gpio輸出為高電平。進入到腳本所在路徑:./gpiotest_o.sh  1

所有GPIO輸出高電平。輸出的高電平,根據引腳所在的電源域不同,可能會有區別。

 

另外有些客戶發現

echo 118 > /sys/class/gpio/export用于通知系統需要導出控制的GPIO引腳編號

echo "out" > /sys/class/gpio/gpio118/direction 控制為輸出

echo "1" > /sys/class/gpio/gpio118/value 輸出為高電平

cat /sys/class/gpio/gpio118/value 仍舊為0

原因如下圖所示,客戶可以從CPU手冊中查找到相關內容:

 

輸入模式讀取的是psr的值。

 

讀取output的value值是從PSR中讀取的。而寫入output值是寫入到DR中的。可以通過設置SION位回環。

 

4.2 GPIO輸入測試

編寫測試腳本 vi gpiotest_i.sh

#!/bin/bash

# gpio list gpio (bank-1)*32 + nr  

for test in 118 119 120 137 136 12

do

echo Exporting pin $test.

echo $test> /sys/class/gpio/export

echo  in > /sys/class/gpio/gpio$test/direction

gpioval=`cat  /sys/class/gpio/gpio$test/value`

echo GPIO $test = $gpioval

echo

echo $test> /sys/class/gpio/unexport

done

echo complete

 

修改腳本執行權限:chmod u+x gpiotest_i.sh

測試gpio輸入為低。進入到腳本所在路徑:./gpiotest_i.sh 

所有GPIO輸入為 0。

 

測試gpio輸入為高電平,比如5v。進入到腳本所在路徑:./gpiotest_i.sh

所有GPIO輸入為1。(如果為非零值,是因為讀取對應的位為1,可以修改內核源碼中drivers/gpio/gpio-generic.c文件,將其中中bgpio_get函數中

return bgc->read_reg(bgc->reg_dat) & bgc->pin2mask(bgc, gpio);修改為

return !!(bgc->read_reg(bgc->reg_dat) & bgc->pin2mask(bgc, gpio));

修改之后,value值為1)

 

\iomuxc\shell\di\in-test.sh,復制到forlinx(比如)目錄下./in-test.sh 118

\iomuxc\shell\do\close.sh,復制到forlinx(比如)目錄下./close.sh 118

\iomuxc\shell\do\open.sh,復制到forlinx(比如)目錄下./open.sh 118

或者采用\iomuxc\write-117-out-high\test,復制到forlinx(比如)目錄下./test 將gpio 117輸出為高。



方法二:創建dev/gpio節點。

1、在設備樹文件中添加設備節點定義以及其引腳定義:

 

 

并將其他復用引腳對應的功能disabed,保證這些引腳沒被重復定義使用。引腳的pinmux可以查看imx6ul-pinfunc.h文件。

 

2、在driver/misc/gpio目錄下添加gpio驅動gpio-user.c,名字需要與節點定義里的驅動名字保持相同,客戶也可以自己寫驅動。同時添加Kconfig和Makefile文件。

修改driver/misc下Kconfig和Makefile文件:

driver/misc/Makefile 中添加:

obj-y            += gpio/

編輯driver/misc/Kconfig, 添加一行:

source "drivers/misc/gpio/Kconfig",如圖:

 

在根目錄下修改linux_imx6ul_config文件,添加:

CONFIG_GPIO_USER_INTF=y

3、編譯。

make zImage

make ARCH=arm CROSS_COMPILE=arm-fsl-linux-gnueabi- dtbs

 

4、拷貝前面生成的zImage, imx6ul-14x14-evk.dtb 到 SD卡system目錄中,SD卡方式燒錄。

dev下有gpio節點。

 

采用gpio-test.c為用戶測試程序。編譯為gpio-test。

使用gpio-test in 2測試DI。

使用gpio-test out 0 1 測試DO1 輸出為高電平。

使用gpio-test out 0 0 測試DO1 輸出為低電平。

 


相關產品 >

  • OKMX6UL-C開發板

    飛凌嵌入式專注imx6系列imx6ul開發板、飛思卡爾imx6ul核心板等ARM嵌入式核心控制系統研發、設計和生產,i.mx6UL系列產品現已暢銷全國,作為恩智浦imx6ul,imx6ul開發板,i.mx6提供者,飛凌嵌入式提供基于iMX6 iMX6UL解決方案定制。

    了解詳情
    OKMX6UL-C開發板
  • OKMX6ULL-C開發板

    40*29mm,雙網雙CAN,8路串口| i.MX6ULL開發板是基于NXP i.MX6ULL設計開發的的一款Linux開發板 ,主頻800MHz,體積小,其核心板僅40*29mm,采用板對板連接器,適應場景豐富。 了解詳情
    OKMX6ULL-C開發板

推薦閱讀 換一批 換一批