01硬件原理分析 以點(diǎn)燈和按鍵為例,打開(kāi)飛凌嵌入式OK-MX9352-C開(kāi)發(fā)板的原理圖,可以看到一顆LED燈,它由MX93_PAD_CCM_CLKO4控制。由于這一個(gè)GPIO屬于1.8V電平域,所以在OK-MX9352-C開(kāi)發(fā)板的底板上并沒(méi)有直接將GPIO接到LED上,而是用GPIO控制了一個(gè)MOS管,再由MOS管去控制LED的亮滅——當GPIO電平為高時(shí),MOS導通,LED點(diǎn)亮;當GPIO電平為低時(shí),MOS關(guān)斷,LED熄滅。 ![]()
![]()
02設備樹(shù)引腳復用 打開(kāi)飛凌嵌入式OK-MX9352-C開(kāi)發(fā)板的設備樹(shù): OKMX93-linux-kernel/arch/arm64/boot/dts/freescale/OK-MX93-C.dts 在iomuxc節點(diǎn)下新建一組引腳復用,復用的兩個(gè)GPIO分別是底板上的LED燈D6和按鍵K1。 ![]()
接下來(lái)新建一個(gè)GPIO節點(diǎn),內容如下:
![]()
注釋掉LED和KEY部分,防止復用沖突:
![]()
保存退出后重新編譯設備樹(shù)。 執行環(huán)境變量: forlinx@ubuntu:~/ok-mx93/OKMX93-linux-sdk$ . environment-setup-aarch64-toolchain 單獨編譯設備樹(shù): forlinx@ubuntu:~/ok-mx93/OKMX93-linux-sdk/OKMX93-linux-kernel$ make ARCH=arm64 CROSS_COMPILE=aarch64-poky-linux- dtbs 編譯完成后,單獨更新設備樹(shù)。首先將U盤(pán)插到虛擬機上,將生成的設備樹(shù)文件拷貝到U盤(pán): forlinx@ubuntu:~/ok-mx93/OKMX93-linux-sdk/OKMX93-linux-kernel$ cp arch/arm64/boot/dts/freescale/OK-MX93-C.dtb /media/forlinx/2075-A0A7/
將生成的dtb文件使用U盤(pán)拷貝到OK-MX9352-C開(kāi)發(fā)板上,替換掉:/run/media/Boot-mmcblk0p1/OK-MX93-C.dtb root@ok-mx93:/run/media/Boot-mmcblk0p1# cp /run/media/sda/OK-MX93-C.dtb ./ 重啟OK-MX9352-C開(kāi)發(fā)板。 03通過(guò)命令測試 在OKMX6ULL-S開(kāi)發(fā)板中,操作GPIO的方式是通過(guò)操作/sys/class/gpio下的文件來(lái)實(shí)現的。而在OK-MX9352-C上,引入了新的Lingpiod的方式,而原有的基于sysfs的操作方式已經(jīng)不再被支持。 Libgpiod是一種字符設備接口,GPIO訪(fǎng)問(wèn)控制是通過(guò)操作字符設備文件(比如/dev/gpiodchip0)實(shí)現的。OK-MX9352-C共有4組GPIO,可以在/dev下查看GPIO設備文件。 Libgpiod可以通過(guò)shell終端和C庫兩種方式使用,本節介紹在shell終端控制GPIO的方法,下一節我們將會(huì )介紹使用C庫的方式控制GPIO。 ![]()
3.1 gpiodetect 查看所有GPIO設備 ![]()
這里的gpiochip0- gpiochip4分別對應的是設備樹(shù)當中的GPIO1-GPIO4這四組GPIO,但是順序并不是一一對應的,這是由于對應的寄存器地址順序問(wèn)題導致的。那么goiochip0如何跟設備樹(shù)對應起來(lái)呢?我們可以打開(kāi)設備樹(shù)當中的dtsi文件,文件路徑為: OKMX93-linux-kernel/arch/arm64/boot/dts/freescale/imx93.dtsi forlinx@ubuntu:~/ok-mx93/OKMX93-linux-sdk$ vi OKMX93-linux-kernel/arch/arm64/boot/dts/freescale/imx93.dtsi
查看GPIO3的寄存器基地址為:gpio3: gpio@43820080,對應的是gpiochip1,而GPIO4對應的是gpiochip2。
![]()
其余GPIO的對應關(guān)系如下,可供大家參考:
![]()
3.2 gpioinfo 由3.1可知,LED燈對應的是GPIO4,即gpiochip2;按鍵對應的是GPIO3,即gpiochip1。列出gpiochip2控制器的引腳情況: ![]()
3.3 gpioset 該命令用于設置GPIO電平,2代表gpiochip2,即GPIO4,28是GPIO pin,當設置該GPIO為1時(shí),底板上的D6點(diǎn)亮。 ![]()
3.4 gpioget 該命令用于獲取GPIO引腳狀態(tài),以按鍵為例,按鍵對應的是GPIO3-27,即gpiochip1 27。按鍵沒(méi)有按下時(shí),讀取到按鍵狀態(tài)為1,當按鍵按下時(shí),讀到按鍵狀態(tài)為0。
![]()
3.5 gpiomon 監控GPIO的狀態(tài)是否發(fā)生變化,同樣以按鍵為例,當按鍵按下時(shí): ![]()
04使用Libgpiod庫編程 Libgpiod是用于與Linux GPIO交互的C庫和工具,Linux官方于Linux 4.8 版本引入了Libgpiod的功能。而在OK-MX9352-C開(kāi)發(fā)板搭載的Linux5.15內核版本中,已經(jīng)不再支持sysfs的方式操作GPIO。與sysfs相比,Libgpiod更加可靠,具備更多功能,例如,可一次讀寫(xiě)多個(gè)GPIO值。 4.1 源碼獲取 如果想要在PC上交叉編譯出能夠在開(kāi)發(fā)板上運行的應用,則交叉編譯時(shí)鏈接的庫文件應該與開(kāi)發(fā)板上的保持一致,可以直接把開(kāi)發(fā)板上的庫拷貝到開(kāi)發(fā)環(huán)境進(jìn)行使用。該庫文件在開(kāi)發(fā)板上的路徑為: ![]()
從上圖可以看出,Libgpiod庫的版本為libgpiod.so.2.2.2,軟鏈接到libgpiod.so.2。 在飛凌嵌入式提供的OK-MX9352-C開(kāi)發(fā)板資料中,已經(jīng)將所需的庫文件、頭文件以及相關(guān)例程進(jìn)行了打包,用戶(hù)可以直接使用。資料路徑為:用戶(hù)資料/應用筆記/ OK-MX9352-C-GPIO接口_Linux應用筆記/Libgpiod測試源碼。咨詢(xún)在線(xiàn)客服即可獲取資料。 4.2 編譯測試例程 將Libgpiod測試源碼目錄下的gpiotest.c、gpio-toggle.c、lib.tar.bz2拷貝到開(kāi)發(fā)環(huán)境中: ![]()
將lib.tar.bz2解壓到本目錄下,編譯時(shí)會(huì )使用到里邊的gpiod.h文件和Libgpiod庫文件: ![]()
示例1循環(huán)控制LED亮和滅,時(shí)間間隔為1s 交叉編譯gpio-toggle.c 設置環(huán)境變量(注意 . 后邊有空格)
![]()
交叉編譯 ![]()
將可執行文件gpio-toggle拷貝到開(kāi)發(fā)板中并執行可看到LED(D6)燈1s亮,1s滅。其中輸入參數2、28為:gpiochip2 line28。 ![]()
示例2按鍵控制LED亮滅,每按一次狀態(tài)翻轉 交叉編譯gpio-test.c 設置環(huán)境變量(注意點(diǎn)后邊有空格)
![]()
交叉編譯 ![]()
將可執行文件gpio-test拷貝到OK-MX9352-C開(kāi)發(fā)板中并執行,可看到每按一次按鍵,LED燈的狀態(tài)就翻轉一次,其中輸入參數1、27為:gpiochip1 line27 ;2、28為:gpiochip2 line28。 ![]()
以上就是為OK-MX9352-C開(kāi)發(fā)板配置GPIO的過(guò)程,希望能夠對屏幕前的各位工程師小伙伴有所幫助。
|