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介面
3.對應第一張圖,左邊是CPU
軟體的方案?
有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
現有按鈕的硬體是怎麼連的?
現有按鈕的中斷是怎麼實現的?
在上圖中可以看到GPIO21針腳同時連到了按鈕與IRQ0(Interrupt Request 0)。檢視程式碼
現在的問題?
在此CPU中,GPIO0-15可以配置產生內部中斷,GPIO16及其以上不能通過配置產生;上面的例子用的是GPIO21,不能通過配置產生中斷,所以才要接到IRQ0
要實現的LED燈的GPIO的腳不像按鈕的例子,是沒有接到外部中斷的,但要求對LED的GPIO2進行電位判斷,在GPIO0-15的範圍內,是可以通過配置CPU來產生中斷的。
但是如何進行配置的文件CPU廠商不提供,另外CPU的SDK現在也不支援對GPIO中斷進行配置。
小結:以能獲取的硬體與軟體,無法使GPIO2產生中斷。
那麼只能走輪詢的路了。程式碼如下:
ok.