新聞中心
在嵌入式系統(tǒng)開發(fā)中,GPIO(General-purpose input/output)端口是一個重要的概念。它允許將一個數(shù)字輸入或輸出信號連接到嵌入式系統(tǒng)外部的設(shè)備,如LED燈、開關(guān)、傳感器、馬達等各種設(shè)備上。因此,掌握GPIO編程技巧是至關(guān)重要的,它可以幫助嵌入式開發(fā)者在各種不同的應(yīng)用場景中,輕松地實現(xiàn)不同的IO端口控制。

創(chuàng)新互聯(lián)公司長期為上1000家客戶提供的網(wǎng)站建設(shè)服務(wù),團隊從業(yè)經(jīng)驗10年,關(guān)注不同地域、不同群體,并針對不同對象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺,與合作伙伴共同營造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為南通企業(yè)提供專業(yè)的成都做網(wǎng)站、網(wǎng)站設(shè)計,南通網(wǎng)站改版等技術(shù)服務(wù)。擁有10多年豐富建站經(jīng)驗和眾多成功案例,為您定制開發(fā)。
而在Linux系統(tǒng)中,GPIO端口的管理和控制存在許多不同的方法,這篇文章將深入探討其中的細節(jié),幫助讀者更好地掌握Linux控制GPIO技巧。
GPIO系統(tǒng)文件
在Linux系統(tǒng)中,GPIO控制是通過引腳的讀寫操作來實現(xiàn)的。這些引腳通常被稱為“GPIO口”。而要對GPIO口進行讀寫操作,我們需要使用Linux系統(tǒng)的GPIO系統(tǒng)文件。在Linux內(nèi)核中,這些文件通常存儲在/sys/class/gpio目錄下。
例如,如果我們需要掃描GPIO 1口的狀態(tài),我們可以使用以下命令:
echo 1 > /sys/class/gpio/export
echo in > /sys/class/gpio/gpio1/direction
cat /sys/class/gpio/gpio1/value
上述命令的意思是,首先將GPIO 1口引腳信息寫入exports文件,之后設(shè)置GPIO 1口為輸入模式,最后讀取GPIO 1口的狀態(tài)。如果口的狀態(tài)是高電平,這個命令將返回1;如果狀態(tài)是低電平,則返回0。
內(nèi)核模塊
另一種控制GPIO端口的方法是使用Linux內(nèi)核模塊。內(nèi)核模塊是一段代碼,可以嵌入到Linux內(nèi)核中,以擴展或更改Linux系統(tǒng)內(nèi)核的功能。使用內(nèi)核模塊,我們可以編寫C代碼來訪問GPIO口,將其設(shè)置為輸入或輸出模式,并讀取或?qū)懭肫錉顟B(tài)。
以下是一個簡單的內(nèi)核模塊示例,它可以檢測GPIO端口狀態(tài)的變化并在日志中記錄這些變化:
“`
#include
#include
#include
#include
static unsigned int gpioLED = 4; // 用于操作的GPIO口
static int __init gpio_init(void) {
int result = 0;
printk(KERN_INFO “GPIO test: Initializing the GPIO LED\n”); // 寫入內(nèi)核日志
if (!gpio_is_valid(gpioLED)) {
printk(KERN_INFO “GPIO test: invalid LED GPIO\n”); // 寫入內(nèi)核日志
return -ENODEV;
}
gpio_request(gpioLED, “sysfs”);
gpio_direction_output(gpioLED, 1); // 設(shè)置GPIO口為輸出模式,初始高電平狀態(tài)
printk(KERN_INFO “GPIO test: GPIO LED is initialized\n”); // 寫入內(nèi)核日志
return result;
}
static int __exit gpio_exit(void) {
gpio_set_value(gpioLED, 0); // 關(guān)閉GPIO口
gpio_free(gpioLED);
printk(KERN_INFO “Goodbye!\n”); // 寫入內(nèi)核日志
}
module_init(gpio_init);
module_exit(gpio_exit);
“`
這個示例將GPIO 4口設(shè)置為輸出模式,并將其初始狀態(tài)設(shè)置為高電平。在這個簡單的內(nèi)核模塊示例中,我們使用了內(nèi)核核心GPIO API以及其他的內(nèi)核API。但是,在實際開發(fā)中,由于內(nèi)核的巨大復(fù)雜性,我們通常需要使用GPIO庫來簡化GPIO調(diào)用,例如libgpiod、gpio_sysfs、bcm2835等第三方貢獻庫。
庫函數(shù)
GPIO庫是一種快速、簡便的方式來控制GPIO端口。這些庫通過封裝底層GPIO調(diào)用,提供了一組更具可用性的API,使用更為高效和便捷。下面是一個使用libgpiod庫控制GPIO的例子:
“`
#include
#include
int mn(void)
{
int ret = -1; // 初始化返回值
gpiochip_gpiospec_t spec; // 創(chuàng)建一個gpiochip_gpiospec_t結(jié)構(gòu)體
spec.line_offset = 0; // GPIO口的偏移地址
spec.flags = GPIOD_LINE_REQUEST_INPUT; // 請求GPIO口的輸入模式
gpio_line_request(“gpiochip0”, &spec, false); // 請求GPIO口并檢查返回值
while (ret
ret = gpio_line_get_value_fd(spec.fd); // 讀取GPIO口的狀態(tài)
printf(“%d\n”, ret);
}
gpio_line_release(spec.fd); // 釋放GPIO口
return 0;
}
“`
在這個例子中,我們使用了Linux底層GPIO調(diào)用庫libgpiod。它提供了一組使用方便的API函數(shù),可以輕松控制GPIO端口。在這個例子中,我們可以讀取來自連接設(shè)備的GPIO口,在屏幕上輸出狀態(tài)。
相關(guān)問題拓展閱讀:
- 14-Linux gpio模擬spi
14-Linux gpio模擬spi
首先是spidev,要在/dev/下面產(chǎn)生設(shè)備文件,需要spidev的支持
使用的是gpio模擬spi,gpio模擬spi的時序原理是bitbang文件實現(xiàn)的,所以這個也需要打開,如果是在openwrt下動態(tài)加載的話就是如下兩個配置
如果是直接內(nèi)核的話是如下兩個
跟I2C的arch層一樣,主要是devices的添加和board_info的添加,如下
對于platform_add_devices,因為是使用spi_gpio,所以name是”spi_gpio”這樣才可以與driver里面的spi_gpio相互匹配probe到。
因為SPI是可以一個總線上面掛多個,然后通過片選腳CS進行硬件切換,所以這變有個num_chipselect需要設(shè)置,如果有2個設(shè)置就設(shè)置2,一個設(shè)備就設(shè)置1,這邊設(shè)置好之后,后面board_info也要有對應(yīng)的個數(shù),而且片選引腳需要不同。
I2C是通過每個設(shè)備有自己不同的地址,通過地址來進行軟件切換。
對于board_info使用的是spidev,drivers/spi/spidev.c文件,該文件的內(nèi)容是注冊一個spidev驅(qū)動。該驅(qū)動是一個字符設(shè)備驅(qū)動。
如果設(shè)備與驅(qū)動匹配,那么就會執(zhí)行spidev_probe()的內(nèi)容。在spidev_probe()函數(shù)中會調(diào)用device_create()成功后在 /dev 目錄下就會生成 spidev 相關(guān)的設(shè)備節(jié)點。
這邊有幾個參數(shù)要注意:
調(diào)試過程想看一些細節(jié)的debug信息可以打開內(nèi)核的動態(tài)debug信息,這個在以前的print system里面有
printk的等級設(shè)置成8.
開始
定位到是 spi_gpio_request 的時候報錯
后仿橘者面就將zkernel/3.10.49/arch/mips/mtk/ziroom/zrmt7628.c里面GPIO的信息調(diào)整下,
因為SPI的引腳和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下面有個應(yīng)用層的實例,打開看下就清除了。
$(cc) spidev_test.c -o spidev_test生成可執(zhí)行文件spidev_test
然后拷貝到板子上,將MOSI和MISO短接就可以測試回環(huán)數(shù)據(jù)是否正常。
有邏輯分析儀的接上logic看波形就更加直觀。
gpio模擬SPI:
在ARM Linux下使用GPIO模擬SPI時序詳解:
linux SPI驅(qū)動:
關(guān)于linux下控制gpio的介紹到此就結(jié)束了,不知道你從中找到你需要的信息了嗎 ?如果你還想了解更多這方面的信息,記得收藏關(guān)注本站。
成都創(chuàng)新互聯(lián)建站主營:成都網(wǎng)站建設(shè)、網(wǎng)站維護、網(wǎng)站改版的網(wǎng)站建設(shè)公司,提供成都網(wǎng)站制作、成都網(wǎng)站建設(shè)、成都網(wǎng)站推廣、成都網(wǎng)站優(yōu)化seo、響應(yīng)式移動網(wǎng)站開發(fā)制作等網(wǎng)站服務(wù)。
分享文章:Linux控制GPIO技巧詳解(linux下控制gpio)
瀏覽地址:http://fisionsoft.com.cn/article/cdpjgis.html


咨詢
建站咨詢
