0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

英創(chuàng)信息技術(shù)GPIO應(yīng)用于Linux LED子系統(tǒng)和輸入事件偵測介紹

英創(chuàng)信息技術(shù) ? 來源:英創(chuàng)信息技術(shù) ? 作者:英創(chuàng)信息技術(shù) ? 2020-02-06 11:30 ? 次閱讀

GPIO(General-purpose input/output)即通用輸入輸出,根據(jù)名字就能夠了解到在實(shí)際應(yīng)用中可以有很多種用途,最常見的便是用來控制LED燈的亮滅,或用來偵測輸入信號的高低變化。英創(chuàng)工控主板都給用戶提供了豐富的GPIO資源,ESMARC系列的板卡擁有32位GPIO,為了方便用戶能夠更方便的進(jìn)行開發(fā),英創(chuàng)公司進(jìn)一步在軟件上也增加了一些實(shí)用的功能。在GPIO用作控制LED燈的時候,用戶可以直接使用Linux的LED子系統(tǒng)來對指定的GPIO口進(jìn)行設(shè)置和操作,比如LED的亮滅或者設(shè)置觸發(fā)方式等。如果是將GPIO設(shè)置為輸入狀態(tài)偵測輸入信號的高低變化,一旦電平發(fā)生變化,內(nèi)核就會通知應(yīng)用程序,這時使用select函數(shù)就可以接收到內(nèi)核發(fā)出的消息,不用再通過while或者for函數(shù)不斷的輪詢,實(shí)際的功能已經(jīng)在ESMARC系列的ESM6800主板上通過測試和驗(yàn)證了。下面就針對兩個功能來介紹一下具體的使用方法。

用戶使用GPIO控制LED燈,可以直接調(diào)用英創(chuàng)公司提供的API函數(shù),將GPIO置為輸出然后置高或者置低。不過Linux系統(tǒng)將控制LED燈的這部分功能整合起來,設(shè)計成了一個標(biāo)準(zhǔn)的LED子系統(tǒng),對LED子系統(tǒng)的操作在shell環(huán)境中就能完成。英創(chuàng)公司也將這部分功能的支持加入到了板卡中,如果熟悉使用LED子系統(tǒng)來控制的用戶,就可以選用這種方式。通過加載一個內(nèi)核模塊led-emtronix.ko來啟用LED子系統(tǒng),加載的時候通過參數(shù)gpios來設(shè)置需要使用LED子系統(tǒng)操作的GPIO,gpios參數(shù)為一個32位的整數(shù),代表32位GPIO,1表示enable而0表示disable。所以當(dāng)我們選用GPIO0~GPIO3時,加載內(nèi)核模塊的命令如下:insmode led-emtronix.ko gpios=0x0f,加載完成后,用戶可以在/sys/class/leds/目錄下看到新生成了四個對應(yīng)的文件夾LED1、LED2、LED3和LED4,注意,為了方便用戶區(qū)分,LED子文件夾的標(biāo)號和GPIO的標(biāo)號是一一對應(yīng)的,比如GPIO10生成的子文件夾為LED10。

加載內(nèi)核模塊

我們選擇LED0這個目錄進(jìn)入,可以看到里面有許多文件,我們要使用到的文件為brightness和trigger這兩個。

文件列表

brightness這個文件用來控制LED的開關(guān),對應(yīng)板卡的GPIO電平高低,當(dāng)brightness文件的值為0時,GPIO輸出低電平,當(dāng)brightness文件的值為1時GPIO則輸出高電平,需要注意的是,加載內(nèi)核模塊后,默認(rèn)情況為輸出低電平即brightness文件的值為0。在shell中需要查看brightness的值可以使用命令cat brightness:

查看brightness文件

如果是需要設(shè)置brightness文件的值,則可以使用echo命令:

設(shè)置brightness文件的值

另一個文件trigger的作用是設(shè)置觸發(fā)方式,默認(rèn)為none即沒有觸發(fā)方式。使用cat命令讀取trigger文件可以得到支持的所有觸發(fā)方式,如下圖看到有磁盤,定時器,心跳,背光等多種觸發(fā)方式:

查看觸發(fā)方式

有方括號的表示為現(xiàn)在的有效觸發(fā)方式,如果要選用heartbeat作為觸發(fā)方式,還是使用echo命令來進(jìn)行設(shè)置:

設(shè)置trigger

設(shè)置之后可以通過示波器看到對應(yīng)的GPIO像心跳一樣,每秒會進(jìn)行一次拉高拉底。按照上面所介紹的方法,就能夠使用LED子系統(tǒng)來對板卡的GPIO進(jìn)行控制。

接下來介紹一下輸入事件通知的功能,英創(chuàng)板卡的GPIO上電是默認(rèn)都為輸入狀態(tài)(有3.3V上拉),在默認(rèn)狀態(tài)下是不會響應(yīng)輸入電平變化進(jìn)行事件通知的。要啟用這一功能,需要調(diào)用英創(chuàng)公司提供的,設(shè)置GPIO輸入狀態(tài)的API來實(shí)現(xiàn)。也就是在程序中需要調(diào)用一次API,設(shè)置GPIO為輸入,才會使能這一位GPIO的輸入事件通知功能,代碼如下:

int GPIO_OutDisable(int fd, unsigned int dwDisBits)

{

int rc;

struct double_pars dpars;

dpars.par1 = ESM6800_GPIO_OUTPUT_DISABLE;

dpars.par2 = dwDisBits;

rc = write(fd, &dpars, sizeof(struct double_pars));

return rc;

}

rc = GPIO_OutDisable(fd, i1); //set GPIO as input

if(rc < 0)

{

printf("GPIO_OutEnable::failed %d\n", rc);

return rc;

}

當(dāng)設(shè)置完成后,GPIO作為輸入狀態(tài),同時內(nèi)核會在輸入的電平變化時通知應(yīng)用層,使用select函數(shù)來監(jiān)聽GPIO的句柄的讀事件就能夠獲取到通知,用戶可以通過多線程的方式來實(shí)現(xiàn),代碼如下:

while( 1 )

{

//設(shè)置讀事件

FD_ZERO(&fdRead);

FD_SET(fd,&fdRead);

//設(shè)置超時時間

aTime.tv_sec = 0;

aTime.tv_usec = 20000;

ret = select(fd+1,&fdRead,NULL,NULL,&aTime);

//printf( "select ret = %d\n", ret);

if (ret < 0 )

{

printf("error!\n");

break;

}

if (ret > 0)

{

//判斷是否讀事件

if (FD_ISSET(fd,&fdRead))

{

//讀事件觸發(fā),進(jìn)行相應(yīng)的動作

dwPinState = 0xffffffff;

rc = GPIO_PinState(fd, &dwPinState);

if(rc < 0)

{

printf("GPIO_PinState::failed %d\n", rc);

return rc;

}

printf("PinState = 0x%08x\n", dwPinState);

}

}

}

當(dāng)輸入電平發(fā)生變化,select偵測到讀事件,就可以進(jìn)行相應(yīng)的操作,示例代碼只是簡單的讀取了當(dāng)前GPIO的輸入電平狀態(tài),用戶可以根據(jù)實(shí)際的應(yīng)用來修改。當(dāng)有多路GPIO用于偵測輸入電平變化的時候,在接收到讀事件后,如果需要判斷是哪一位GPIO偵測到電平變化,就要立刻讀取當(dāng)前GPIO的狀態(tài)來以此進(jìn)行判斷。對于不需要這一功能的用戶也不會有什么影響,當(dāng)調(diào)用函數(shù)將GPIO設(shè)置為輸入后,不使用select函數(shù)去監(jiān)聽GPIO的句柄即可,其他功能都和原來一致。

英創(chuàng)公司希望通過增加一些類似的實(shí)用功能,讓用戶的開發(fā)能夠更加方便,如果在使用過程中遇到任何問題,可以和英創(chuàng)公司的工程師聯(lián)系尋求技術(shù)支持。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11123

    瀏覽量

    207920
  • 嵌入式主板
    +關(guān)注

    關(guān)注

    7

    文章

    6081

    瀏覽量

    34942
收藏 人收藏

    評論

    相關(guān)推薦

    【龍芯2K0300蜂鳥板試用】龍芯2K0300蜂鳥開發(fā)板上GPIO的驅(qū)動及使用

    集成設(shè)計,功能擴(kuò)展等,可廣泛應(yīng)用于電力、交通、醫(yī)療、金融、通信、能源、信息家電和物聯(lián)網(wǎng)等領(lǐng)域。 下面通過一個具體的例子——LED燈的控制,來說明龍芯2K0300的GPIO如何使用。
    發(fā)表于 09-05 20:35

    【龍芯2K0300蜂鳥板試用】第四篇 龍芯2K0300蜂鳥板--繼續(xù)點(diǎn)燈

    通過GPIO子系統(tǒng)便可以控制類似LED、BEEP、KEY、紅外發(fā)射對管等這類硬件模塊。 通常在各個linux開發(fā)板裝載的默認(rèn)鏡像中,LED
    發(fā)表于 08-15 16:52

    linux--LED子系統(tǒng)一文讀懂

    Linux內(nèi)核中,LED子系統(tǒng)扮演著控制LED燈的核心角色,它通過一套規(guī)范化的驅(qū)動架構(gòu),簡化了LED驅(qū)動程序的開發(fā)流程,讓開發(fā)者能夠更專注
    的頭像 發(fā)表于 08-02 16:09 ?1674次閱讀
    <b class='flag-5'>linux--LED</b><b class='flag-5'>子系統(tǒng)</b>一文讀懂

    實(shí)測14us,Linux-RT實(shí)時性能及開發(fā)案例分享—基于全志T507-H國產(chǎn)平臺

    事件觸發(fā)LED電平翻轉(zhuǎn)的實(shí)際耗時結(jié)合系統(tǒng)延時與GPIO輸出延時得出數(shù)據(jù);(2)系統(tǒng)延遲:根據(jù)Linux-RT性能測試平均值得出數(shù)據(jù);(3)
    發(fā)表于 07-25 15:58

    實(shí)測14us,Linux-RT實(shí)時性能及開發(fā)案例分享—基于全志T507-H國產(chǎn)平臺

    ,僅供參考。 測試結(jié)果如下表所示: (1)GPIO輸入延時:通過使用示波器測量按鍵事件觸發(fā)LED電平翻轉(zhuǎn)的實(shí)際耗時結(jié)合系統(tǒng)延時與GPIO
    發(fā)表于 04-18 10:21

    Linux網(wǎng)絡(luò)子系統(tǒng)的實(shí)現(xiàn)

    Linux網(wǎng)絡(luò)子系統(tǒng)的分層 Linux網(wǎng)絡(luò)子系統(tǒng)實(shí)現(xiàn)需要: l 支持不同的協(xié)議族 ( INET, INET6, UNIX, NETLINK...) l 支持不同的網(wǎng)絡(luò)設(shè)備 l 支持統(tǒng)一
    的頭像 發(fā)表于 11-11 11:25 ?1069次閱讀
    <b class='flag-5'>Linux</b>網(wǎng)絡(luò)<b class='flag-5'>子系統(tǒng)</b>的實(shí)現(xiàn)

    GPIO的四種輸入模式介紹

    GPIO介紹 GPIO (general purpose input output)是通用輸入輸出端口的簡稱,通俗來講就是單片機(jī)上的引腳,在STM32中,
    的頭像 發(fā)表于 11-09 16:51 ?5354次閱讀
    <b class='flag-5'>GPIO</b>的四種<b class='flag-5'>輸入</b>模式<b class='flag-5'>介紹</b>

    如何配置GPIO為中斷功能呢?

    如何配置GPIO為中斷功能呢? GPIO在嵌入式系統(tǒng)中經(jīng)常用于控制外設(shè),如LED、攝像頭、傳感器等。除此之外,
    的頭像 發(fā)表于 10-30 09:57 ?3309次閱讀

    Linux內(nèi)核之LED子系統(tǒng)(二)

    這里說一說LED子系統(tǒng)的一些核心源代碼文件,是如何實(shí)現(xiàn)LED子系統(tǒng)。
    發(fā)表于 10-02 16:55 ?635次閱讀
    <b class='flag-5'>Linux</b>內(nèi)核之<b class='flag-5'>LED</b><b class='flag-5'>子系統(tǒng)</b>(二)

    Linux內(nèi)核之LED子系統(tǒng)(一)

    Linux內(nèi)核的LED子系統(tǒng)是一種重要的框架,用于管理和控制設(shè)備上的LED指示燈。在嵌入式系統(tǒng)
    發(fā)表于 10-02 16:53 ?885次閱讀
    <b class='flag-5'>Linux</b>內(nèi)核之<b class='flag-5'>LED</b><b class='flag-5'>子系統(tǒng)</b>(一)

    Linux平臺來研究GPIO軟件框架

    方法,讓它可以像單片機(jī)一樣簡單的操作 IO 口,這得益于各路 Linux 大神對系統(tǒng)底層的封裝。 在 Linux 中有 pinctrl 和 gpio
    的頭像 發(fā)表于 09-28 16:05 ?514次閱讀
    從<b class='flag-5'>Linux</b>平臺來研究<b class='flag-5'>GPIO</b>軟件框架

    gpio子系統(tǒng)API詳解

    gpio 子系統(tǒng) API gpio 子系統(tǒng)中操作一個 GPIO 需要如下幾步: 1、of_find_compatible_node2、of_
    的頭像 發(fā)表于 09-27 17:17 ?637次閱讀
    <b class='flag-5'>gpio</b><b class='flag-5'>子系統(tǒng)</b>API詳解

    Linux clock子系統(tǒng)是什么

    clock子系統(tǒng) Linux的時鐘子系統(tǒng)由CCF(common clock framework)框架管理, CCF向上給用戶提供了通用的時鐘接口,向下給驅(qū)動開發(fā)者提供硬件操作的接口 。各結(jié)構(gòu)體關(guān)系
    的頭像 發(fā)表于 09-27 14:25 ?666次閱讀
    <b class='flag-5'>Linux</b> clock<b class='flag-5'>子系統(tǒng)</b>是什么

    Linux reset子系統(tǒng)有什么功能

    Linux reset子系統(tǒng) reset子系統(tǒng)非常簡單,與clock子系統(tǒng)非常類似,但在驅(qū)動實(shí)現(xiàn)上,reset驅(qū)動更簡單。 因?yàn)閏lock驅(qū)動主要是時鐘的實(shí)現(xiàn),涉及到固定時鐘、分頻、門
    的頭像 發(fā)表于 09-27 14:06 ?619次閱讀
    <b class='flag-5'>Linux</b> reset<b class='flag-5'>子系統(tǒng)</b>有什么功能

    GPIO的基本概念、工作原理及關(guān)鍵技術(shù)

    通用輸入輸出(General Purpose Input/Output,GPIO)是一種廣泛應(yīng)用于嵌入式系統(tǒng)的接口技術(shù)。通過
    的頭像 發(fā)表于 09-26 17:21 ?8814次閱讀