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

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

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

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

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

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

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

加載內(nèi)核模塊

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

文件列表

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

查看brightness文件

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

設置brightness文件的值

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

查看觸發(fā)方式

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

設置trigger

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

接下來介紹一下輸入事件通知的功能,英創(chuàng)板卡的GPIO上電是默認都為輸入狀態(tài)(有3.3V上拉),在默認狀態(tài)下是不會響應輸入電平變化進行事件通知的。要啟用這一功能,需要調(diào)用英創(chuàng)公司提供的,設置GPIO輸入狀態(tài)的API來實現(xiàn)。也就是在程序中需要調(diào)用一次API,設置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;

}

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

while( 1 )

{

//設置讀事件

FD_ZERO(&fdRead);

FD_SET(fd,&fdRead);

//設置超時時間

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ā),進行相應的動作

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);

}

}

}

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

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

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

    關注

    87

    文章

    11310

    瀏覽量

    209621
  • 嵌入式主板
    +關注

    關注

    7

    文章

    6085

    瀏覽量

    35367
收藏 人收藏

    評論

    相關推薦

    飛騰助力首屆教育信息技術應用創(chuàng)新大賽圓滿落幕

    近日,由中國教育技術協(xié)會主辦,教育部教育管理信息中心教育信創(chuàng)實驗室、公安部第三研究所、中國電子工業(yè)標準化技術協(xié)會信創(chuàng)工委會支持,北京航空航天
    的頭像 發(fā)表于 12-24 09:57 ?123次閱讀

    有方科技參編的信息技術團體標準發(fā)布

    近日,有方科技參編的《信息技術產(chǎn)品供應鏈成熟度 共性指標 第1部分:企業(yè)背景評價》《信息技術產(chǎn)品供應鏈成熟度 共性指標 第2部分:技術掌控評價》《信息技術產(chǎn)品供應鏈成熟度 共性指標 第
    的頭像 發(fā)表于 12-23 10:44 ?141次閱讀

    龍芯中科助力2024首屆教育信息技術應用創(chuàng)新大賽成功舉辦

    近日,2024首屆教育信息技術應用創(chuàng)新大賽在北京航空航天大學成功舉辦。本次大賽由中國教育技術協(xié)會主辦,教育信創(chuàng)實驗室、公安部第三研究所、中國電子工業(yè)標準化技術協(xié)會信
    的頭像 發(fā)表于 12-19 17:02 ?235次閱讀

    如何通過PMC_GPIO喚醒AMD Versal? Adaptive SoC Linux系統(tǒng)

    在功耗敏感的系統(tǒng)里,我們通常會在系統(tǒng)空閑的時候將系統(tǒng)休眠,然后可以通過一些外設的輸入來喚醒系統(tǒng),比如 Uart、USB 和
    的頭像 發(fā)表于 12-17 10:07 ?175次閱讀
    如何通過PMC_<b class='flag-5'>GPIO</b>喚醒AMD Versal? Adaptive SoC <b class='flag-5'>Linux</b><b class='flag-5'>系統(tǒng)</b>

    中科創(chuàng)達榮獲2024年軟件和信息技術服務優(yōu)秀企業(yè)

    及前百家企業(yè)”名單。中科創(chuàng)達憑借非凡的技術實力與持續(xù)的創(chuàng)新能力,成功入選“2024年度軟件和信息技術服務競爭力百強企業(yè)”以及“2024年軟件和信息技術服務優(yōu)秀企業(yè)”。
    的頭像 發(fā)表于 10-30 11:44 ?490次閱讀

    嵌入式學習-飛凌嵌入式ElfBoard ELF 1板卡-應用編程示例控制LED燈之sysfs文件系統(tǒng)

    上下拉即可。也可以通過Linux中的pinctrl子系統(tǒng)GPIO子系統(tǒng),通過配置引腳和系統(tǒng)提供的API進行控制。而
    發(fā)表于 10-21 09:52

    飛凌嵌入式ElfBoard ELF 1板卡-應用編程示例控制LED燈之sysfs文件系統(tǒng)

    上下拉即可。也可以通過Linux中的pinctrl子系統(tǒng)GPIO子系統(tǒng),通過配置引腳和系統(tǒng)提供的API進行控制。 而
    發(fā)表于 10-18 09:31

    gpio接口是干什么的 gpio四種輸入輸出模式怎么選擇

    GPIO接口的作用 GPIO(General Purpose Input/Output)接口,即通用輸入輸出接口,是一種用于連接和控制各種外部設備的數(shù)字接口。它由一組引腳組成,可以通過
    的頭像 發(fā)表于 10-06 16:07 ?2927次閱讀

    深度解析linux時鐘子系統(tǒng)

    linux內(nèi)核中實現(xiàn)了一個CLK子系統(tǒng),用于對上層提供各模塊(例如需要時鐘信號的外設,USB等)的時鐘驅動接口,對下層提供具體SOC的時鐘操作細節(jié)。
    的頭像 發(fā)表于 09-29 16:46 ?483次閱讀
    深度解析<b class='flag-5'>linux</b>時鐘<b class='flag-5'>子系統(tǒng)</b>

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

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

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

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

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

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

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

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

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

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

    簡述智能制造系統(tǒng)的組成 智能制造系統(tǒng)子系統(tǒng)包括哪些

    智能制造系統(tǒng)是一種基于先進技術和智能化的制造方式,它包括多個子系統(tǒng),每個子系統(tǒng)都扮演著重要的角色。下面詳細介紹智能制造
    的頭像 發(fā)表于 01-19 10:36 ?2889次閱讀