知識(shí)儲(chǔ)備。
基本的框架
在linux系統(tǒng)中,App無(wú)法操作硬件的,不具備相應(yīng)的權(quán)限。在mmu(內(nèi)存管理單元)作了劃分的,應(yīng)用層只能操作屬于它的mmu部分。操作硬件只能是通過(guò)驅(qū)動(dòng)程序。應(yīng)用程序與驅(qū)動(dòng)程序之間有嚴(yán)格的界限。驅(qū)動(dòng)程序在內(nèi)核中。
app如何調(diào)用驅(qū)動(dòng)機(jī)制
如App使用open函數(shù)打開(kāi)設(shè)備時(shí),會(huì)先設(shè)置某個(gè)寄存器,會(huì)觸發(fā)一個(gè)異常swi指令(此時(shí)由用戶(hù)態(tài)切換到內(nèi)核態(tài)才有更高的權(quán)限),此時(shí)會(huì)有中斷服務(wù)程序被調(diào)用。然后根據(jù)先前設(shè)置的寄存器判斷是什么操作;然后去讀寫(xiě)硬件。
字符設(shè)備驅(qū)動(dòng)編寫(xiě)步驟
1. 實(shí)現(xiàn)入口函數(shù) XXX_init()和卸載函數(shù) XXX_exit()
2. 申請(qǐng)?jiān)O(shè)備號(hào) register_chrdev_region(與內(nèi)核相關(guān))
靜態(tài)分配設(shè)備號(hào):在事先知道設(shè)備主設(shè)備號(hào)的情況下通過(guò)參數(shù)函數(shù)指定第一個(gè)設(shè)備號(hào)而向系統(tǒng)申請(qǐng)分配一定數(shù)目的設(shè)備號(hào)。
動(dòng)態(tài)分配:alloc_chrdev_region():通過(guò)參數(shù)僅設(shè)置第一個(gè)次設(shè)備號(hào)(通常為0,事先不會(huì)知道主設(shè)備號(hào))和要分配的設(shè)備數(shù)目而系統(tǒng)動(dòng)態(tài)分配所需的設(shè)備號(hào)文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-741601.html
3. 注冊(cè)字符設(shè)備驅(qū)動(dòng) cdev_alloc / cdev_init /cdev_add(與內(nèi)核相關(guān))
4. 利用udev/mdev機(jī)制創(chuàng)建設(shè)備文件(節(jié)點(diǎn))class_create,device_create(與內(nèi)核相關(guān))
5. 硬件部分初始化
io資源映射 ioremao,內(nèi)核提供gpio庫(kù)函數(shù)(與硬件相關(guān))
注冊(cè)中斷(與硬件相關(guān))
初始化等待隊(duì)列(與內(nèi)核相關(guān))
初始化定時(shí)器(與內(nèi)核相關(guān))
6. 構(gòu)建file_operation結(jié)構(gòu)(與內(nèi)核相關(guān))
7. 實(shí)現(xiàn)硬件操作方法 XXX_open,XXX_read,XXX_write…(與硬件相關(guān))
通用GPIO驅(qū)動(dòng)框架的問(wèn)題及理解
setup_timer()函數(shù)
原型:#define setup_timer(timer, fn, data) \ __setup_timer((timer), (fn), (data), 0)
第一個(gè)參數(shù)文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-741601.html
到了這里,關(guān)于嵌入式驅(qū)動(dòng)開(kāi)發(fā)之框架及調(diào)試技巧累積的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!