新聞中心
在Linux開發(fā)中,GPIO(General Purpose Input Output)常常被用來作為外設控制、傳感器輸入等。讀取GPIO電平以獲取外設反饋,是開發(fā)中常見的需求。本文將介紹在Linux中如何讀取GPIO電平的方法。

創(chuàng)新互聯(lián)專注為客戶提供全方位的互聯(lián)網綜合服務,包含不限于網站建設、網站制作、景谷網絡推廣、小程序制作、景谷網絡營銷、景谷企業(yè)策劃、景谷品牌公關、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運營等,從售前售中售后,我們都將竭誠為您服務,您的肯定,是我們最大的嘉獎;創(chuàng)新互聯(lián)為所有大學生創(chuàng)業(yè)者提供景谷建站搭建服務,24小時服務熱線:13518219792,官方網址:www.cdcxhl.com
一、GPIO的介紹
GPIO是一種通用輸入輸出引腳,可以被程序控制。在Linux開發(fā)中,GPIO通常是通過Linux內核提供的設備驅動來進行控制的。在Linux中,GPIO被抽象成了一個字符設備,對應著一個設備節(jié)點(/dev/gpiochip0,/dev/gpiochip1等)。
二、GPIO的聲明
在使用GPIO之前,需要先進行聲明和配置。
聲明方法如下:
#include
int gpio_request(unsigned int gpio, const char *label);
int gpio_direction_input(unsigned int gpio);
int gpio_direction_output(unsigned int gpio, int value);
gpio_request用于請求GPIO資源,gpio_direction_input和gpio_direction_output用于聲明使用的GPIO為輸入或輸出。
三、讀取GPIO電平
在GPIO聲明完成后,就可以進行GPIO電平的讀取了。
讀取GPIO電平的方法如下:
#include
int gpio_get_value(unsigned int gpio);
這里的gpio_get_value用于讀取GPIO的電平值。gpio參數是指GPIO編號,函數返回值為GPIO的電平(0或1)。
需要注意的是,gpio_get_value只適用于已經聲明為輸入的GPIO,讀取輸出GPIO的電平需要使用gpio_direction_output和gpio_set_value,具體用法和說明可以參考Linux內核文檔。
四、實例分析
下面我們來舉個實例分析如何在Linux中讀取GPIO電平。
1.在Linux系統(tǒng)中添加了一個LED燈,通過GPIO控制。
2.需要讀取GPIO0的電平,以便得知LED燈的亮滅情況。
3.可以將GPIO0聲明為輸入,然后進行電平讀取。
代碼如下:
#include
static unsigned int led_gpio = 0;
static int led_status = 0;
static int __init led_init(void)
{
int ret;
led_gpio = 0;
ret = gpio_request(led_gpio, “LED_GPIO”);
if (ret) {
printk(KERN_ERR “Unable to request GPIO %d, ret = %d\n”,
led_gpio, ret);
return ret;
}
gpio_direction_input(led_gpio);
led_status = gpio_get_value(LED_GPIO);
return 0;
}
模塊初始化時,使用gpio_request請求GPIO0資源,然后聲明GPIO0為輸入。接著使用gpio_get_value讀取GPIO0的電平,根據讀取到的電平值判斷LED燈的狀態(tài)。
相關問題拓展閱讀:
- 14-Linux gpio模擬spi
14-Linux gpio模擬spi
首先是spidev,要在/dev/下面產生設備文件,需要spidev的支持
使用的是gpio模擬spi,gpio模擬spi的時序原理是bitbang文件實現的,所以這個也需要打開,如果是在openwrt下動態(tài)加載的話就是如下兩個配置
如果是直接內核的話是如下兩個
跟I2C的arch層一樣,主要是devices的添加和board_info的添加,如下
對于platform_add_devices,因為是使用spi_gpio,所以name是”spi_gpio”這樣才可以與driver里面的spi_gpio相互匹配probe到。
因為SPI是可以一個總線上面掛多個,然后通過片選腳CS進行硬件切換,所以這變有個num_chipselect需要設置,如果有2個設置就設置2,一個設備就設置1,這邊設置好之后,后面board_info也要有對應的個數,而且片選引腳需要不同。
I2C是通過每個設備有自己不同的地址,通過地址來進行軟件切換。
對于board_info使用的是spidev,drivers/spi/spidev.c文件,該文件的內容是注冊一個spidev驅動。該驅動是一個字符設備驅動。
如果設備與驅動匹配,那么就會執(zhí)行spidev_probe()的內容。在spidev_probe()函數中會調用device_create()成功后在 /dev 目錄下就會生成 spidev 相關的設備節(jié)點。
這邊有幾個參數要注意:
調試過程想看一些細節(jié)的debug信息可以打開內核的動態(tài)debug信息,這個在以前的print system里面有
printk的等級設置成8.
開始
定位到是 spi_gpio_request 的時候報錯
后仿橘者面就將zkernel/3.10.49/arch/mips/mtk/ziroom/zrmt7628.c里面GPIO的信息調整下,
因為SPI的引腳和LED的引腳號一樣
,內核不知道哪里會檢測到。
修改后打印備薯如下:
之后在/dev/下面就生成了spidev1.0的設備
有了/dev/spidev1.0設備之后,就可以在應用成操作改設備收發(fā)數據。
在drivers/spi/spidev.c里面已經封裝好了ioctl的對應接口,根據這些伍禪接口就可以測試使用。
在Documentation/spi/spidev_test.c下面有個應用層的實例,打開看下就清除了。
$(cc) spidev_test.c -o spidev_test生成可執(zhí)行文件spidev_test
然后拷貝到板子上,將MOSI和MISO短接就可以測試回環(huán)數據是否正常。
有邏輯分析儀的接上logic看波形就更加直觀。
gpio模擬SPI:
在ARM Linux下使用GPIO模擬SPI時序詳解:
linux SPI驅動:
linux 讀gpio電平的介紹就聊到這里吧,感謝你花時間閱讀本站內容,更多關于linux 讀gpio電平,如何在Linux中讀取GPIO電平?,14-Linux gpio模擬spi的信息別忘了在本站進行查找喔。
香港服務器選創(chuàng)新互聯(lián),2H2G首月10元開通。
創(chuàng)新互聯(lián)(www.cdcxhl.com)互聯(lián)網服務提供商,擁有超過10年的服務器租用、服務器托管、云服務器、虛擬主機、網站系統(tǒng)開發(fā)經驗。專業(yè)提供云主機、虛擬主機、域名注冊、VPS主機、云服務器、香港云服務器、免備案服務器等。
分享標題:如何在Linux中讀取GPIO電平?(linux讀gpio電平)
網站地址:http://www.5511xx.com/article/dphchej.html


咨詢
建站咨詢
