要看懂驅動源碼,肯定是要從最基本的看起,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之後,根據物理地址和虛擬地址的映射關系,將寄存器的物理地址轉化為虛擬地址。