- Linux設備驅動開發詳解:基于最新的Linux4.0內核
- 宋寶華
- 11字
- 2018-12-31 20:25:16
1.6 設備驅動Hello World:LED驅動
1.6.1 無操作系統時的LED驅動
在嵌入式系統的設計中,LED一般直接由CPU的GPIO(通用可編程I/O)口控制。GPIO一般由兩組寄存器控制,即一組控制寄存器和一組數據寄存器。控制寄存器可設置GPIO口的工作方式為輸入或者輸出。當引腳被設置為輸出時,向數據寄存器的對應位寫入1和0會分別在引腳上產生高電平和低電平;當引腳設置為輸入時,讀取數據寄存器的對應位可獲得引腳上的電平為高或低。
在本例子中,我們屏蔽具體CPU的差異,假設在GPIO_REG_CTRL物理地址中控制寄存器處的第n位寫入1可設置GPIO口為輸出,在地址GPIO_REG_DATA物理地址中數據寄存器的第n位寫入1或0可在引腳上產生高或低電平,則在無操作系統的情況下,設備驅動見代碼清單1.3。
代碼清單1.3 無操作系統時的LED驅動
1 #define reg_gpio_ctrl *(volatile int *)(ToVirtual(GPIO_REG_CTRL)) 2 #define reg_gpio_data *(volatile int *)(ToVirtual(GPIO_REG_DATA)) 3 /* 初始化LED */ 4 void LightInit(void) 5 { 6 reg_gpio_ctrl |= (1 << n); /* 設置GPIO為輸出 */ 7 } 8 9 /* 點亮LED */ 10 void LightOn(void) 11 { 12 reg_gpio_data |= (1 << n); /* 在GPIO上輸出高電平 */ 13 } 14 15 /* 熄滅LED */ 16 void LightOff(void) 17 { 18 reg_gpio_data &= ~(1 << n); /* 在GPIO上輸出低電平 */ 19 }
上述程序中的LightInit()、LightOn()、LightOff()都直接作為驅動提供給應用程序的外部接口函數。程序中ToVirtual()的作用是當系統啟動了硬件MMU之后,根據物理地址和虛擬地址的映射關系,將寄存器的物理地址轉化為虛擬地址。
推薦閱讀
- Kubernetes修煉手冊
- Linux運維之道(第3版)
- 混沌工程實戰:手把手教你實現系統穩定性
- 網絡操作系統教程:Windows Server 2016管理與配置
- Dreamweaver CS5.5 Mobile and Web Development with HTML5,CSS3,and jQuery
- 計算機應用基礎(Windows 7+Office 2016)
- Windows 10從新手到高手
- Learning IBM Watson Analytics
- Linux系統安全:縱深防御、安全掃描與入侵檢測
- Linux系統管理初學者指南:基于CentOS 7.6
- OpenSolaris紅寶書
- Getting Started with Citrix XenApp 6.5
- 從零開始學Windows 7
- WordPress 3 For Business Bloggers
- 馴獅記:Mac OS X 10.8 Mountain Lion使用手冊