歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Linux設備驅動的Hello World—LED驅動

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

日期:2017/3/1 9:58:41   编辑:Linux編程

要看懂驅動源碼,肯定是要從最基本的看起,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