一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

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

完善資料讓更多小伙伴認識你,還能領(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ù)名字就能夠了解到在實際應(yīng)用中可以有很多種用途,最常見的便是用來控制LED燈的亮滅,或用來偵測輸入信號的高低變化。英創(chuàng)工控主板都給用戶提供了豐富的GPIO資源,ESMARC系列的板卡擁有32位GPIO,為了方便用戶能夠更方便的進行開發(fā),英創(chuàng)公司進一步在軟件上也增加了一些實用的功能。在GPIO用作控制LED燈的時候,用戶可以直接使用Linux的LED子系統(tǒng)來對指定的GPIO口進行設(shè)置和操作,比如LED的亮滅或者設(shè)置觸發(fā)方式等。如果是將GPIO設(shè)置為輸入狀態(tài)偵測輸入信號的高低變化,一旦電平發(fā)生變化,內(nèi)核就會通知應(yīng)用程序,這時使用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燈的這部分功能整合起來,設(shè)計成了一個標(biāo)準的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這個目錄進入,可以看到里面有許多文件,我們要使用到的文件為brightness和trigger這兩個。

文件列表

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

查看brightness文件

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

設(shè)置brightness文件的值

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

查看觸發(fā)方式

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

設(shè)置trigger

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

接下來介紹一下輸入事件通知的功能,英創(chuàng)板卡的GPIO上電是默認都為輸入狀態(tài)(有3.3V上拉),在默認狀態(tài)下是不會響應(yīng)輸入電平變化進行事件通知的。要啟用這一功能,需要調(diào)用英創(chuàng)公司提供的,設(shè)置GPIO輸入狀態(tài)的API來實現(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的句柄的讀事件就能夠獲取到通知,用戶可以通過多線程的方式來實現(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ā),進行相應(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偵測到讀事件,就可以進行相應(yīng)的操作,示例代碼只是簡單的讀取了當(dāng)前GPIO的輸入電平狀態(tài),用戶可以根據(jù)實際的應(yīng)用來修改。當(dāng)有多路GPIO用于偵測輸入電平變化的時候,在接收到讀事件后,如果需要判斷是哪一位GPIO偵測到電平變化,就要立刻讀取當(dāng)前GPIO的狀態(tài)來以此進行判斷。對于不需要這一功能的用戶也不會有什么影響,當(dāng)調(diào)用函數(shù)將GPIO設(shè)置為輸入后,不使用select函數(shù)去監(jiān)聽GPIO的句柄即可,其他功能都和原來一致。

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

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

    關(guān)注

    87

    文章

    11512

    瀏覽量

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

    關(guān)注

    7

    文章

    6102

    瀏覽量

    36320
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    科普|信創(chuàng)是什么?一文讀懂“信息技術(shù)應(yīng)用創(chuàng)新”戰(zhàn)略

    什么是信創(chuàng)?信創(chuàng),即“信息技術(shù)應(yīng)用創(chuàng)新”,是國家推動IT系統(tǒng)自主可控、安全可控的重要戰(zhàn)略工程。它不僅是技術(shù)層面的創(chuàng)新,更承載著保障國家網(wǎng)絡(luò)安
    的頭像 發(fā)表于 06-13 10:06 ?2069次閱讀
    科普|信<b class='flag-5'>創(chuàng)</b>是什么?一文讀懂“<b class='flag-5'>信息技術(shù)</b>應(yīng)用創(chuàng)新”戰(zhàn)略

    RK3568驅(qū)動指南|第十二篇 GPIO子系統(tǒng)-第130章 GPIO的調(diào)試方法

    RK3568驅(qū)動指南|第十二篇 GPIO子系統(tǒng)-第130章 GPIO的調(diào)試方法
    的頭像 發(fā)表于 06-03 11:32 ?541次閱讀
    RK3568驅(qū)動指南|第十二篇 <b class='flag-5'>GPIO</b><b class='flag-5'>子系統(tǒng)</b>-第130章 <b class='flag-5'>GPIO</b>的調(diào)試方法

    迅為RK3568開發(fā)板驅(qū)動指南GPIO子系統(tǒng)GPIO子系統(tǒng)API函數(shù)的引入

    迅為RK3568開發(fā)板驅(qū)動指南GPIO子系統(tǒng)GPIO子系統(tǒng)API函數(shù)的引入
    的頭像 發(fā)表于 05-29 14:05 ?467次閱讀
    迅為RK3568開發(fā)板驅(qū)動指南<b class='flag-5'>GPIO</b><b class='flag-5'>子系統(tǒng)</b><b class='flag-5'>GPIO</b><b class='flag-5'>子系統(tǒng)</b>API函數(shù)的引入

    迅為RK3568驅(qū)動指南GPIO子系統(tǒng) GPIO操作函數(shù)實驗

    迅為電子RK3568開發(fā)板驅(qū)動指南GPIO子系統(tǒng) GPIO操作函數(shù)實驗
    的頭像 發(fā)表于 05-28 15:24 ?433次閱讀
    迅為RK3568驅(qū)動指南<b class='flag-5'>GPIO</b><b class='flag-5'>子系統(tǒng)</b> <b class='flag-5'>GPIO</b>操作函數(shù)實驗

    RK3568驅(qū)動指南|第十二篇 GPIO子系統(tǒng)-第135章 GPIO子系統(tǒng)與pinctrl子系統(tǒng)相結(jié)合實驗

    RK3568驅(qū)動指南|第十二篇 GPIO子系統(tǒng)-第135章 GPIO子系統(tǒng)與pinctrl子系統(tǒng)相結(jié)合實驗
    的頭像 發(fā)表于 05-23 13:47 ?378次閱讀
    RK3568驅(qū)動指南|第十二篇 <b class='flag-5'>GPIO</b><b class='flag-5'>子系統(tǒng)</b>-第135章 <b class='flag-5'>GPIO</b><b class='flag-5'>子系統(tǒng)</b>與pinctrl<b class='flag-5'>子系統(tǒng)</b>相結(jié)合實驗

    飛凌嵌入式ElfBoard ELF 1板卡-input子系統(tǒng)之input子系統(tǒng)簡介

    Linux系統(tǒng)中,Input子系統(tǒng)是一個用于處理輸入設(shè)備的軟件框架。它提供了一種統(tǒng)一的接口和機制,使得各種
    發(fā)表于 04-15 10:27

    嵌入式學(xué)習(xí)-飛凌嵌入式ElfBoard ELF 1板卡-Pinctrl和GPIO子系統(tǒng)之ioctl介紹

    本帖最后由 jf_13411809 于 2025-3-27 09:53 編輯 在Linux中,GPIO引腳通??梢酝ㄟ^ioctl系統(tǒng)調(diào)用與相應(yīng)的GPIO設(shè)備進行交互和控制。通過i
    發(fā)表于 03-27 09:12

    飛凌嵌入式ElfBoard ELF 1板卡-Pinctrl和GPIO子系統(tǒng)LED驅(qū)動

    /environment-setup-cortexa7hf-neon-poky-linux-gnueabi elf@ubuntu:~/work/test/04_Pinctrl和GPIO子系統(tǒng)/
    發(fā)表于 03-27 08:54

    嵌入式學(xué)習(xí)-飛凌嵌入式ElfBoard ELF 1板卡-Pinctrl和GPIO子系統(tǒng)GPIO子系統(tǒng)

    GPIO(General Purpose Input/Output)子系統(tǒng)用于控制和管理通用輸入/輸出引腳的一部分。它提供了一種標(biāo)準化的方式來訪問和操作硬件平臺上的
    發(fā)表于 03-25 13:29

    飛凌嵌入式ElfBoard ELF 1板卡-Pinctrl和GPIO子系統(tǒng)之ioctl介紹

    Linux中,GPIO引腳通??梢酝ㄟ^ioctl系統(tǒng)調(diào)用與相應(yīng)的GPIO設(shè)備進行交互和控制。通過ioctl命令,可以向GPIO設(shè)備發(fā)送不同
    發(fā)表于 03-25 13:28

    飛凌嵌入式ElfBoard ELF 1板卡-Pinctrl和GPIO子系統(tǒng)GPIO子系統(tǒng)

    GPIO(General Purpose Input/Output)子系統(tǒng)用于控制和管理通用輸入/輸出引腳的一部分。它提供了一種標(biāo)準化的方式來訪問和操作硬件平臺上的
    發(fā)表于 03-24 15:41

    飛凌嵌入式ElfBoard ELF 1板卡-Pinctrl和GPIO子系統(tǒng)之Pinctrl子系統(tǒng)

    、SPI、I2C、GPIO等。 二、引腳復(fù)用:i.MX6ULL支持引腳的多功能復(fù)用,即一個引腳可以用于多種不同的功能。pinctrl子系統(tǒng)允許驅(qū)動程序?qū)⒁_設(shè)置為特定功能的輸入或輸出,
    發(fā)表于 03-22 09:23

    GPIO在嵌入式系統(tǒng)中的作用

    在現(xiàn)代電子系統(tǒng)中,嵌入式系統(tǒng)因其小型化、低成本和高效率而變得越來越流行。這些系統(tǒng)廣泛應(yīng)用于從簡單的家用電器到復(fù)雜的工業(yè)自動化設(shè)備。在這些系統(tǒng)
    的頭像 發(fā)表于 01-09 09:45 ?949次閱讀

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

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

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

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