注:i.MX6UL添加GPIO方法,使用平臺(tái)為飛凌嵌入式OKMX6UL-C開發(fā)板,其它平臺(tái)可參考使用 i.MX6UL開發(fā)板詳情 http://www.forlinx.com/60.htm 方法一:采用iomux的方法 在設(shè)備樹中iomux中添加復(fù)用gpio引腳如下,具體設(shè)置的上下拉電阻,驅(qū)動(dòng)能力,查找i.MX6UL CPU手冊(cè),對(duì)應(yīng)修改。 比如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 同時(shí)修改設(shè)備樹文件中(其他地方復(fù)用引腳) 編譯設(shè)備樹。替換飛凌iMX6UL開發(fā)板中所用設(shè)備樹。 此時(shí)可以使用echo命令進(jìn)行控制: 命令為: 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. 計(jì)算對(duì)應(yīng)sys/class/gpio的值GPIOn_IOx = (n-1)*32 + x GPIO4_IO22=(4-1)*32+22=118 2. 將GPIO4_IO22設(shè)置為輸出。 echo 118 > /sys/class/gpio/export用于通知系統(tǒng)需要導(dǎo)出控制的GPIO引腳編號(hào) 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 通知系統(tǒng)取消導(dǎo)出 3. 將GPIO4_IO22設(shè)置為輸入。 echo 118 > /sys/class/gpio/export用于通知系統(tǒng)需要導(dǎo)出控制的GPIO引腳編號(hào) echo "in" > /sys/class/gpio/gpio118/direction 控制為輸入 這時(shí)給該引腳接高電平,輸入即為高電平,反之為低電平 echo 118 > /sys/class/gpio/unexport 通知系統(tǒng)取消導(dǎo)出 4. 另外客戶可以自己通過(guò)shell文件來(lái)控制gpio做為輸入或者輸出。 4.1 GPIO輸出測(cè)試 編寫測(cè)試腳本 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 修改腳本執(zhí)行權(quán)限:chmod u+x gpiotest_o.sh 測(cè)試gpio輸出為低。進(jìn)入到腳本所在路徑:./gpiotest_o.sh 0 所有GPIO輸出低電平 0V。 測(cè)試gpio輸出為高電平。進(jìn)入到腳本所在路徑:./gpiotest_o.sh 1 所有GPIO輸出高電平。輸出的高電平,根據(jù)引腳所在的電源域不同,可能會(huì)有區(qū)別。 另外有些客戶發(fā)現(xiàn) echo 118 > /sys/class/gpio/export用于通知系統(tǒng)需要導(dǎo)出控制的GPIO引腳編號(hào) echo "out" > /sys/class/gpio/gpio118/direction 控制為輸出 echo "1" > /sys/class/gpio/gpio118/value 輸出為高電平 cat /sys/class/gpio/gpio118/value 仍舊為0 原因如下圖所示,客戶可以從CPU手冊(cè)中查找到相關(guān)內(nèi)容: 輸入模式讀取的是psr的值。 讀取output的value值是從PSR中讀取的。而寫入output值是寫入到DR中的?梢酝ㄟ^(guò)設(shè)置SION位回環(huán)。 4.2 GPIO輸入測(cè)試 編寫測(cè)試腳本 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 修改腳本執(zhí)行權(quán)限:chmod u+x gpiotest_i.sh 測(cè)試gpio輸入為低。進(jìn)入到腳本所在路徑:./gpiotest_i.sh 所有GPIO輸入為 0。 測(cè)試gpio輸入為高電平,比如5v。進(jìn)入到腳本所在路徑:./gpiotest_i.sh 所有GPIO輸入為1。(如果為非零值,是因?yàn)樽x取對(duì)應(yīng)的位為1,可以修改內(nèi)核源碼中drivers/gpio/gpio-generic.c文件,將其中中bgpio_get函數(shù)中 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,復(fù)制到forlinx(比如)目錄下./in-test.sh 118 \iomuxc\shell\do\close.sh,復(fù)制到forlinx(比如)目錄下./close.sh 118 \iomuxc\shell\do\open.sh,復(fù)制到forlinx(比如)目錄下./open.sh 118 或者采用\iomuxc\write-117-out-high\test,復(fù)制到forlinx(比如)目錄下./test 將gpio 117輸出為高。 方法二:創(chuàng)建dev/gpio節(jié)點(diǎn)。 1、在設(shè)備樹文件中添加設(shè)備節(jié)點(diǎn)定義以及其引腳定義: 并將其他復(fù)用引腳對(duì)應(yīng)的功能disabed,保證這些引腳沒(méi)被重復(fù)定義使用。引腳的pinmux可以查看imx6ul-pinfunc.h文件。 2、在driver/misc/gpio目錄下添加gpio驅(qū)動(dòng)gpio-user.c,名字需要與節(jié)點(diǎn)定義里的驅(qū)動(dòng)名字保持相同,客戶也可以自己寫驅(qū)動(dòng)。同時(shí)添加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下有g(shù)pio節(jié)點(diǎn)。 采用gpio-test.c為用戶測(cè)試程序。編譯為gpio-test。 使用gpio-test in 2測(cè)試DI。 使用gpio-test out 0 1 測(cè)試DO1 輸出為高電平。 使用gpio-test out 0 0 測(cè)試DO1 輸出為低電平。 http://www.forlinx.com/zixun/165.htm |