歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Linux設備驅動的Hello World—LED驅動

 要看懂驅動源碼,肯定是要從最基本的看起,C語言中,如printf("hello world\n");而對於驅動,肯定是LED,呵呵,恰好年輕時寫過一個,還保留著,而且是流水燈式的,下面以ARM270(共有8個LED燈)為例。
 
一、無操作系統時的LED驅動
 
    在嵌入式系統的設計中,LED一般直接由CPU的GPIO(通用可編程 I/O 口)控制。GPIO一般由兩組寄存器控制,即一組控制寄存器和一組數據寄存器。控制寄存器可設置GPIO 口的工作方式為輸入或輸出。當引腳被設置為輸出時,向數據寄存器的對應位寫入1和0會分別在引腳上產生高電平和低電平;當引腳設置為輸入時,讀取數據寄存器的對應位可獲得引腳上相應的電平信號。則在無操作系統的情況下,設備驅動代碼如下所示。
 
    //片選B-CS4基地址為0x10000000,數碼管的偏移地址為0x500000.
 
    #defineSHOW_LED (*((volatile unsigned int *)0x10500000))
 
    #defineCTRL _LED (*((volatile unsigned int *)0x40E00068))  //GPIO80設置為轉換功能2
 
    //初始化LED ,一般不需要初始化,因為boot已經對其進行初始化了。
 
    voidLightInit(void)

    {

        CTRL_LED = 0x1400; /*設置GPIO為輸出*/
 
    }
 
    //點亮第n個LED
 
    voidLightOn(void)

    {

        SHOW_LED &= ~(1 << n);/*在GPIO上輸出低電平*/

    }
 
    //熄滅第n個LED
 
    voidLightOff(void)

    {

        SHOW_LED |= (1 << n); /*在GPIO上輸出高電平*/

    }
 
    上述程序中的LightInit()、LightOn()、LightOff()等函數都將作為 LED驅動提供給應用程序的外部接口函數。 程序中ToVirtual()等函數的作用是當系統啟動了硬件MMU之後,根據物理地址和虛擬地址的映射關系,將寄存器的物理地址轉化為虛擬地址。

Copyright © Linux教程網 All Rights Reserved