linux驅動gpio
① linux 查看gpio 被哪個驅動佔用
linux系統中的設備驅動是否安裝好一般檢查幾個方面: 1、系統日誌。嵌入式系統多是直接dmesg一下,看有沒有設備關鍵字相關的出錯信息(通用系統可檢查/var/log/messages文件)。 2、已載入的模塊。檢查模塊載入列表中有沒有相關設備的模塊。
② 在mini2440中,linux驅動程序已有,怎麼利用介面函數設置GPIOB0輸出PWM
要想讓GPIO口輸出PWM波形的話。有兩種方案:第一種就是准備好GPIO驅動程序,然後應用程序通過read函數和write函數或者ioctl函數來操作GPIO驅動程序,也就是讓應用程序模擬PWM波形。第二種方案就是直接自己編寫或者用系統現成的PWM驅動程序,因為ARM處理器肯定有對應的pwm控制管腳,然後應用程序直接操作PWM驅動程序就可以了,就不用做類似模擬pwm波形那樣的操作了。
③ 嵌入式Linux中如何實現應用程序與驅動程序函數介面問題,以GPIO為例
嵌入式Linux中如何實現應用程序與驅動程序函數介面問題,以GPIO為例
驅動中的函數定義:
static int sbc2440_leds_ioctl(
struct inode *inode,
struct file *file,
unsigned int cmd,
unsigned long arg)
{
switch(cmd) {
case 0:
case 1:
if (arg > 4) {
return -EINVAL;
}
s3c2410_gpio_setpin(led_table[arg], !cmd);
return 0;
default:
return -EINVAL;
}
}
應用程序中的函數定義:
ioctl(fd, on, led_no);
不明白的地方是函數名都不一樣,應用程序中的ioctl函數是如何將參數傳遞到驅動程序sbc2440_leds_ioctl中的?
xicain
④ 如何在Linux系統中直接操作GPIO
在一個老手的指導下,應用層可以直接操作GPIO,具體指設置GPIO的輸入輸出以及輸出電平高或者低。這個大大地提高了靈活性,官方的文檔有GPIO Sysfs Interface for Userspace,GPIO Sysfs。
這里我記錄一下使用過例子:
# RK30_PIN0_PD4
# A0-7 -> 0-7 / B0-7 -> 8-15 / C0-7 -> 16-23 / D0-7 -> 24-31
echo 28 > /sys/class/gpio/export
echo "out" > /sys/class/gpio/gpio28/direction
echo 1 > /sys/class/gpio/gpio28/value
以上代碼作用是:將RK30_PIN0_PD4設置為輸出,將輸出電平設置為高電平。
⑤ 如何在Linux系統中直接操作GPIO
方法/步驟
1
安裝SD Linux系統
如圖所示,先後將Arino Software 1.5.3 (Arino IDE)和SD-Card Linux Image下載到本機,Arino IDE在後面查找GPIO與Arino IO 之間的映射關系時需要用到。
如圖所示,將SDCard1.0.4.tar.bz2解壓後出現一個「image-full-galileo」的文件夾。
在MicroSD使用前需先將其以Fat32進行格式化,然後將「image-full-galileo」文件夾下地所有文件直接拷貝到microSD卡的根目錄下。
進入Galileo
將MicroSD插到Galileo中,在路由器頁面的已連接設備列表中會看到設備名稱為「clanton」有線連接設備,找到其IP地址,然後中
Terminal(Unix和Linux,Windows可用Putty)中通過ssh進入Galileo,「ssh
[email protected]」。
有意思的是,這個在MicroSD中運行的Linux系統開啟了ssh服務,並且root賬號沒有設置密碼,可以直接進入。如上圖所示,彈出一對話框後輸入 「yes」回車即可進入Galileo,出現下圖中的 「root@clanton」說明這一步成功完成了
到這里,可能會有疑問了,Galileo板載也是有一個操作系統的,microSD卡中也有一個Linux,如何保證現在進入的就是microSD卡中的系
統呢?在Terminal中輸入「cat/proc/version」即可查看Linux系統版本,顯示為「3.8.7-yocto-standard」,這就是前面下載的為Galileo定製的Linux操作系統,Yocto。
找到那個屬於你的GPIO
下面就要開始這篇文章中的核心部分,也是最難的一部。找Linux GPIO 與 Arino IO之間的映射關系!
如右圖所示,在「/sys/class/gpio/」中有多大60多個GPIO,如何找出右側GPIO與左側Arino IDE中對應的IO呢。
首先將0-13IO口全部設為「INPUT」輸入模式
voidsetup(){//putyoursetupcodehere,torunonce:
pinMode(0,INPUT); pinMode(1,INPUT); pinMode(2,INPUT); pinMode(3,INPUT);
pinMode(4,INPUT); pinMode(5,INPUT); pinMode(6,INPUT); pinMode(7,INPUT);
pinMode(8,INPUT); pinMode(9,INPUT); pinMode(10,INPUT);
pinMode(11,INPUT); pinMode(12,INPUT); pinMode(13,INPUT); } voidloop(){
//putyourmaincodehere,torunrepeatedly: }
如圖所示,左側"pinMode(13,OUTPUT)"將13引腳變為輸出模式,右側gpio7變成out模式,因此gpio7對應的就是Arino IO 13(pin13)
按照這種方法依次找出Arino IO與GPIO之間如下的對應關系
GPIODigitalI/Ogpio11pin0
gpio12pin1 gpio13pin2 gpio14pin3 gpio6pin4 gpio0pin5 gpio1pin6
gpio38pin7 gpio40pin8 gpio4pin9 gpio10pin10 gpio5pin11 gpio15pin12
gpio7pin13
下面就需要來對上面找到的gpio對應關系進行驗證了。「echo "out"
>/sys/class/gpio/gpio*/direction」為將gpio變為輸出模式,「echo "1"
>/sys/class/gpio/gpio*/value」為將gpio輸出高電平。然後就有了下面這段python程序,這段程序依次將
pin13,pin12,pin11,pin10四個引腳的LED點亮然後關閉,但由於python程序的執行效率問題,應該所有LED同時點亮有了延時
成為流水燈,如下圖所示效果。這段程序在Linux系統的任意文件夾內均可。
importos,timewhileTrue:os.system('echo"out">/sys/class/gpio/gpio7/direction')
os.system('echo"1">/sys/class/gpio/gpio7/value')
os.system('echo"out">/sys/class/gpio/gpio15/direction')
os.system('echo"1">/sys/class/gpio/gpio15/value')
os.system('echo"out">/sys/class/gpio/gpio5/direction')
os.system('echo"1">/sys/class/gpio/gpio5/value')
os.system('echo"out">/sys/class/gpio/gpio10/direction')
os.system('echo"1">/sys/class/gpio/gpio10/value') time.sleep(0.2)
os.system('echo"0">/sys/class/gpio/gpio5/value')
os.system('echo"0">/sys/class/gpio/gpio15/value')
os.system('echo"0">/sys/class/gpio/gpio7/value')
os.system('echo"0">/sys/class/gpio/gpio10/value') time.sleep(0.2)
⑥ Linux內核gpio
本文基於 RockPI 4A 單板 Linux 4.4 內核介紹 RK3399 Linux GPIO 功能。
GPIO(General Purpose Input/Output Port) :通用輸入輸出埠。
除作為一般的輸入/輸出功能外,還可以配置為中斷和模擬 PWM、I2C 等介面功能。
RK3399 GPIO 屬性如下:
1、一共有5組 GPIO(GPIO0~4) ,每組 GPIO 為一個 Bank ,共32個引腳。每個 Bank 包括4個 Group (GPIOA(0~7) ~ D(0~7)) 。不是所有 Bank 都有 GPIOA~D 的編號, RK3399 共122個 GPIO 引腳。
2、所有 GPIO 都可被配置為 CA55或CA53 的中斷功能,且 GPIO0 和 GPIO1 可用於系統低功耗喚醒模式。
3、在上電復位後,所有 GPIO 默認輸入狀態。
4、軟體可配置 GPIO 驅動強度。
RK3399 引腳在系統中顯示如下:
RK3399 GPIO 引腳號計算方式:
例:
以 ROCKPI 4A 單板 WIFI 模塊電源( GPIO0_B2 )為例,介紹 DTS 中 GPIO 配置。
在系統啟動後,可以查看 GPIO ,命令如下:
註:
如果debugfs沒有掛載,使用下面命令掛載
Linux 內核 GPIO 主要實現文件:
GPIO 子系統有兩套 API :
1、基於描述符(descriptor-based)
前綴為: gpiod_ 。
參考: Documentation/gpio/consumer.txt
2、老版本介面(legacy)
前綴為: gpio_ 。
參考: Documentation/gpio/gpio-legacy.txt
3、常用API
GPIO 還有很多介面,就不一一列舉了。
RK3399 GPIO 控制器驅動實現文件: drivers/pinctrl/pinctrl-rockchip.c ,涉及主要函數:
所有 GPIO 子系統的 API 最終都會調到 SOC 的 GPIO 控制器驅動函數。
ROCKPi 4A 單板有個40個引腳的擴展口,引用 radxa 圖片,見下圖。
1、進入測試目錄
2、導出GPIO
在使用 GPIO2_A7 前,需要導出該引腳。方法:配置 export 後,會出現 gpio71 節點。
測試時,注意不要使用在程序中已經申請過或配置為其它功能的 GPIO 引腳。
3、配置GPIO方向
設置 GPIO2_A7 的輸入/輸出方向。
in :表示輸入。
out :表示輸出。
active_low :用於中斷配置中高電平或低電平有效。
edge :用於中斷配置中上升沿或下降沿有效。
4、配置GPIO輸出值
在 GPIO 為輸入時,通過 value 查詢 GPIO 的輸入電平(高或低電平)。
在 GPIO 為輸出時,通過 value 配置 GPIO 的輸出電平(高或低電平)。
5、查看GPIO
查看已經導出的 GPIO71 。
6、取消導出
使用完 GPIO2_A7 後,需要進行釋放。方法:配置 unexport 後, gpio71 節點會消失。