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.

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章