- Linux設(shè)備驅(qū)動(dòng)開發(fā)詳解:基于最新的Linux4.0內(nèi)核
- 宋寶華
- 490字
- 2018-12-31 20:25:17
1.6 設(shè)備驅(qū)動(dòng)Hello World:LED驅(qū)動(dòng)
1.6.1 無(wú)操作系統(tǒng)時(shí)的LED驅(qū)動(dòng)
在嵌入式系統(tǒng)的設(shè)計(jì)中,LED一般直接由CPU的GPIO(通用可編程I/O)口控制。GPIO一般由兩組寄存器控制,即一組控制寄存器和一組數(shù)據(jù)寄存器。控制寄存器可設(shè)置GPIO口的工作方式為輸入或者輸出。當(dāng)引腳被設(shè)置為輸出時(shí),向數(shù)據(jù)寄存器的對(duì)應(yīng)位寫入1和0會(huì)分別在引腳上產(chǎn)生高電平和低電平;當(dāng)引腳設(shè)置為輸入時(shí),讀取數(shù)據(jù)寄存器的對(duì)應(yīng)位可獲得引腳上的電平為高或低。
在本例子中,我們屏蔽具體CPU的差異,假設(shè)在GPIO_REG_CTRL物理地址中控制寄存器處的第n位寫入1可設(shè)置GPIO口為輸出,在地址GPIO_REG_DATA物理地址中數(shù)據(jù)寄存器的第n位寫入1或0可在引腳上產(chǎn)生高或低電平,則在無(wú)操作系統(tǒng)的情況下,設(shè)備驅(qū)動(dòng)見代碼清單1.3。
代碼清單1.3 無(wú)操作系統(tǒng)時(shí)的LED驅(qū)動(dòng)
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); /* 設(shè)置GPIO為輸出 */ 7 } 8 9 /* 點(diǎn)亮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()都直接作為驅(qū)動(dòng)提供給應(yīng)用程序的外部接口函數(shù)。程序中ToVirtual()的作用是當(dāng)系統(tǒng)啟動(dòng)了硬件MMU之后,根據(jù)物理地址和虛擬地址的映射關(guān)系,將寄存器的物理地址轉(zhuǎn)化為虛擬地址。
推薦閱讀
- 全屋互聯(lián):智能家居系統(tǒng)開發(fā)指南
- 阿里云數(shù)字新基建系列:云原生操作系統(tǒng)Kubernetes
- Linux內(nèi)核完全注釋(20周年版·第2版)
- 操作系統(tǒng)基礎(chǔ)與實(shí)踐:基于openEuler平臺(tái)
- SharePoint 2013 應(yīng)用開發(fā)實(shí)戰(zhàn)
- Linux集群和自動(dòng)化運(yùn)維
- 異質(zhì)結(jié)原理與器件
- Instant Optimizing Embedded Systems using Busybox
- 網(wǎng)絡(luò)操作系統(tǒng)管理與應(yīng)用(第三版)
- AWS Development Essentials
- INSTANT Migration from Windows Server 2008 and 2008 R2 to 2012 How-to
- CentOS 6 Linux Server Cookbook
- 從實(shí)踐中學(xué)習(xí)Windows滲透測(cè)試
- 電腦辦公(Windows 10 + Office 2016)入門與提高(超值版)
- VMware vSphere 5.1 Cookbook