<strike id="kiyse"></strike>
  • <tr id="kiyse"></tr>
  • <strike id="kiyse"></strike><samp id="kiyse"><tbody id="kiyse"></tbody></samp>
    <strike id="kiyse"><s id="kiyse"></s></strike>
    <tr id="kiyse"></tr>
    <noframes id="kiyse"><code id="kiyse"></code></noframes>
    <th id="kiyse"></th>
    <samp id="kiyse"></samp>
  • <th id="kiyse"><s id="kiyse"></s></th>
  • GPIO應(yīng)用于Linux LED子系統(tǒng)和輸入事件偵測(cè)

     2018-1-4     作者:黃志超         
    文章標(biāo)簽:C/C++GPIO

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


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


    GPIO在Linux-LED子系統(tǒng)和輸入事件偵測(cè)中的應(yīng)用.gif

    加載內(nèi)核模塊


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


    GPIO在Linux-LED子系統(tǒng)和輸入事件偵測(cè)中的應(yīng)用.gif

    文件列表


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


    GPIO在Linux-LED子系統(tǒng)和輸入事件偵測(cè)中的應(yīng)用.gif

    查看brightness文件


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


    GPIO在Linux-LED子系統(tǒng)和輸入事件偵測(cè)中的應(yīng)用.gif

    設(shè)置brightness文件的值


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


    GPIO在Linux-LED子系統(tǒng)和輸入事件偵測(cè)中的應(yīng)用.gif

    查看觸發(fā)方式


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


    GPIO在Linux-LED子系統(tǒng)和輸入事件偵測(cè)中的應(yīng)用.gif

    設(shè)置trigger


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


      接下來(lái)介紹一下輸入事件通知的功能,英創(chuàng)板卡的GPIO上電是默認(rèn)都為輸入狀態(tài)(有3.3V上拉),在默認(rèn)狀態(tài)下是不會(huì)響應(yīng)輸入電平變化進(jìn)行事件通知的。要啟用這一功能,需要調(diào)用英創(chuàng)公司提供的,設(shè)置GPIO輸入狀態(tài)的API來(lái)實(shí)現(xiàn)。也就是在程序中需要調(diào)用一次API,設(shè)置GPIO為輸入,才會(huì)使能這一位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),同時(shí)內(nèi)核會(huì)在輸入的電平變化時(shí)通知應(yīng)用層,使用select函數(shù)來(lái)監(jiān)聽(tīng)GPIO的句柄的讀事件就能夠獲取到通知,用戶(hù)可以通過(guò)多線(xiàn)程的方式來(lái)實(shí)現(xiàn),代碼如下:


      while( 1 )

      {

        //設(shè)置讀事件

        FD_ZERO(&fdRead);

        FD_SET(fd,&fdRead);


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


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

    文章標(biāo)簽:C/C++GPIO
    久久精品国产亚洲一区二区| 国产精品无码无需播放器| 精品一线二线三线区别在哪欧美| 99国产精品热久久久久久| 国产精品亚洲片在线观看不卡 | 亚洲精品福利网泷泽萝拉| 久久精品视频观看| 久久精品一区二区| 中文成人无字幕乱码精品区| 久久免费国产精品| 国产乱人伦偷精品视频| 亚洲一区二区三区国产精品| 国产精品va无码免费麻豆| 精品剧情v国产在免费线观看 | 精品久久久久一区二区三区| 亚洲?V无码乱码国产精品| 九九久久国产精品免费热6| 下载天堂国产AV成人无码精品网站 | 精品无码AV无码免费专区| 精品无码人妻夜人多侵犯18 | 久99精品视频在线观看婷亚洲片国产一区一级在线 | 国产精品午夜免费观看网站| 亚洲精品综合久久| 精品一区二区三区色花堂| 99re热这里只有精品视频中文字幕| 精品露脸国产偷人在视频| 久久久久久无码国产精品中文字幕 | 欧洲精品色在线观看| 久久66热人妻偷产精品9| 久久国产免费观看精品3| 亚洲av永久无码精品天堂久久 | 亚洲色偷精品一区二区三区| 人人妻人人澡人人爽人人精品浪潮 | 91精品手机国产免费| 四虎永久在线日韩精品观看| 无码精品A∨在线观看十八禁| 无码国产精品久久一区免费| 国产视频精品免费| 国产精品成人久久久久三级午夜电影| 久久精品亚洲男人的天堂| 亚洲av无码精品网站|