1. 程式人生 > >linux的GPIO應用例項

linux的GPIO應用例項

需求描述:
主機板上的狀態燈應能正確顯示ONU模組的連通狀態,即當光節點模組插到主機板插槽之後,狀態燈應亮,移掉之後應滅。

硬體介面:
When SFP module is plugged in, the GPIO[2] status will change from high to low automatically.
When SW detect the change, just make the GPIO[18] to generate low signal (default is high), the ONU led will be lighted.

以上為接任務時的資訊。於是開始尋找解決問題的資訊。

GPIO的背景資訊?


即通用輸入輸出。把CPU針腳不通過匯流排或控制器直接連到外設上來進行控制的工業標準,比如連一個針腳到LED上,通過置一個bit的0/1就可以控制該LED得亮滅。

硬體的結構是怎樣的? 找schematics看一看:
1.右邊是CPU,左邊是pin腳連的東西,“>>”,“<<”表示輸入的方向

 

2.對應第一張圖,左邊是燈,右邊是連到的CPU的GPIO介面

led gpio 

3.對應第一張圖,左邊是CPU
onu

軟體的方案?
有2種實現方法,一種是對GPIO[2]的電位進行輪詢,一種是讓GPIO[2]的電位變化產生中斷。
找到一個當前主機板上的別人使用GPIO的例子,該例子的功能是:按下硬體重啟按鈕後會向CPU的GPIO針腳發使主機板重啟。
此例子是用中斷實現的,準備也用中斷的方式來實現。

那麼,怎麼讓GPIO的[2]的電位變化產生中斷呢?

在現在的裝置上看看,列出已經被佔用的中斷號:
root:/proc# cat interrupts
           CPU0       CPU1       CPU2       CPU3       CPU4       CPU5       CPU6
  0:        526         83         11          4       1423        164        355            MIPS  SMTC_IPI
  2:          0          0          0          0          0          40            MIPS  pmcmsp_tsmac
  3:          0          0          3          0          0          00            MIPS  pmcmsp_tsmac
  4:          0          0          0          0          0          00            MIPS  ehci_hcd:usb1, ehci_hcd:usb2
  5:          0          0          0          0         13          00            MIPS  pmcmsp_tsmac
  6:          0          0          0          0          0          00            MIPS  CIC cascade
  8:          0          0          0          0          0          00         MSP_CIC  Softreset button
 21:          0          0          0          0          0          00         MSP_CIC  PER cascade
 25:    5853436       1664         28          4          0          00         MSP_CIC  timer
 27:       3575          0          0          0          0          00         MSP_CIC  serial
 34:          0          0          0          0    5851128        138         30         MSP_CIC  VPE1 local timer
 46:          1          0          0          0          0          00         MSP_PER  pmcmsptwi

ERR:          1

現有按鈕的硬體是怎麼連的?

button-gpio

gpio-irq

現有按鈕的中斷是怎麼實現的?

在上圖中可以看到GPIO21針腳同時連到了按鈕與IRQ0(Interrupt Request 0)。檢視程式碼

 

現在的問題?
在此CPU中,GPIO0-15可以配置產生內部中斷,GPIO16及其以上不能通過配置產生;上面的例子用的是GPIO21,不能通過配置產生中斷,所以才要接到IRQ0
要實現的LED燈的GPIO的腳不像按鈕的例子,是沒有接到外部中斷的,但要求對LED的GPIO2進行電位判斷,在GPIO0-15的範圍內,是可以通過配置CPU來產生中斷的。
但是如何進行配置的文件CPU廠商不提供,另外CPU的SDK現在也不支援對GPIO中斷進行配置。
小結:以能獲取的硬體與軟體,無法使GPIO2產生中斷。
那麼只能走輪詢的路了。程式碼如下:

 

ok.