前面已經記錄學習了led驅動程式的**分析,並且成功將驅動模組載入到了開發板,現在就可以進行led應用程式的測試啦!
測試**如下:
/*-------led流水燈測試程式-------*/
#include
#include
#include
#include
#include
#include
#include
#define led_cnt 4
#define devname_len 10
/*定義乙個魔數。魔數有著特殊的功能。我們定義了led_on和led_off,但是這個巨集定義可能和系統的別的重複,因此我們採用魔數機制,定義乙個系統未用的魔數,然後讓魔數生成我們定義的led_on和led_off,這樣,我們的定義就不會和系統的相同了。*/
#define platdrv_magic 0x60
#define led_off _io (platdrv_magic, 0x18)
#define led_on _io (platdrv_magic, 0x19)
int main (int argc, char **argv)
; for(i=0; i"/dev/led%d", i);
fd[i] = open(dev_name, o_rdwr, 0755);
if(fd[i] < 0)
goto err;
}while(1)
for(i=0; i1);}}
for(i=0; ireturn
0;err:
for(i=0; i= 0)
}return -1;
} /* ----- end of main() ----- */
最終開發板上的led燈從led0開始到led3依次亮起,再熄滅。
總結:
1、要理解應用程式、庫、核心、驅動程式之間的關係:
2、linux是如何執行乙個外設的,以我們的led程式為例:
(1)應用程式使用庫函式open開啟led的裝置檔案。
(2)庫傳入的執行軟中斷swi指令,引起cpu異常,進入核心。
(3)核心的異常處理函式根據這些引數找到相應的驅動程式,返回乙個檔案控制代碼fd給庫,進而返回給應用程式。
(4)應用程式獲取這個fd,使用庫提供的控制函式ioctl或者write發出控制指令。
(5)庫根據write或ioctl函式傳入的引數執行swi指令,引起cpu異常,進入核心。
(6)核心的異常處理函式根據這些引數呼叫驅動程式的相關函式,點亮led。
3、在開發板/dev目錄建立裝置節點,再執行./led_test。
>: mknod /dev/led0 c 250 0
>: mknod /dev/led1 c 250 1
>: mknod /dev/led2 c 250 2
>: mknod /dev/led3 c 250 3
命令中的250是我的led的裝置號,不同情況可能裝置號不同,可以用
>: cat /proc/devices
檢視一下自己的裝置號。
FL2440新增自帶led驅動
在之前學習驅動自己寫過led的驅動程式,其實s3c2440對於驅動已經支援得非常好,核心裡面已經有了led的驅動程式,我們要使能led驅動只需要稍作修改。device drivers led support led class support led support for samsung s3c2...
fl2440按鍵中斷驅動
include include include include include include include include include include include copy to user include 核心時鐘 include atomic t include s3c2410 gpf...
控制fl2440開發板led燈亮滅,蜂鳴器發聲
led燈亮滅,蜂鳴器發聲是通過設定相應暫存器的值來控制的,主要有gpbcon gpbdat gpbup等,gpbcon有gpb0 10,每乙個gpbi設定不同的值來表示輸入輸出等,設定gpbdat的每一位表示高低電平,gpbup設定gpbi是否有效,通過對這三個暫存器的設定則可實現led燈和蜂鳴器。...