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

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


咨詢
建站咨詢
