前言
本文主要介紹了Linux驅(qū)動(dòng)開發(fā)中一些常用的驅(qū)動(dòng)框架,platform、input、iic、spi等,硬件平臺(tái)使用的是正點(diǎn)原子的imx6ull開發(fā)板。
一:Pinctrl子系統(tǒng)、Gpio子系統(tǒng)
不管什么框架最后都是要追溯到配置IO的電氣屬性和復(fù)用功能
如果要使用外部中斷,設(shè)備樹節(jié)點(diǎn)中還需添加相關(guān)信息,什么邊沿觸發(fā)
二:最簡(jiǎn)單字符驅(qū)動(dòng)框架(不包含什么總線)
1:module_init和module_exit,驅(qū)動(dòng)的入口和出口
2:習(xí)慣性構(gòu)建一個(gè)結(jié)構(gòu)體來(lái)管理相關(guān)資源(主次設(shè)備號(hào)、cdev、class、device、設(shè)備節(jié)點(diǎn)等)
3:file_operations結(jié)構(gòu)體里面包含了該設(shè)備驅(qū)動(dòng)的操作函數(shù)集合,可以按需進(jìn)行實(shí)現(xiàn)
file_operations結(jié)構(gòu)體的原型,里面都是一些函數(shù)指針
驅(qū)動(dòng)實(shí)現(xiàn)部分操作函數(shù)?
4:init函數(shù)實(shí)現(xiàn)字符設(shè)備相關(guān)初始化
分配設(shè)備號(hào)、cdev_init、cdev_add、class_create、device_create
獲取節(jié)點(diǎn)、獲取gpio編號(hào)、申請(qǐng)gpio、設(shè)置輸入輸出模式
如果在某一過(guò)程申請(qǐng)資源失敗要釋放之前已經(jīng)申請(qǐng)成功的資源
5:exit函數(shù)釋放相關(guān)資源
三:定時(shí)器、中斷配置
定時(shí)器和中斷在驅(qū)動(dòng)設(shè)備中要添加的內(nèi)容
?
定時(shí)器初始化
重新修改定時(shí)器計(jì)數(shù),使得可以多次定時(shí)
外部中斷
四:platform總線驅(qū)動(dòng)框架
1:首先是module_init和module_exit,初始化一個(gè)platform_driver結(jié)構(gòu)體,主要初始化匹配列表和probe、remove函數(shù)
驅(qū)動(dòng)中對(duì)應(yīng)的compatible字段
設(shè)備樹中設(shè)備對(duì)應(yīng)的compatible字段
當(dāng)加載驅(qū)動(dòng)后就會(huì)通過(guò)compatible字段查找,驅(qū)動(dòng)和設(shè)備就可通過(guò)platform總線進(jìn)行匹配。后面就和最簡(jiǎn)單沒(méi)有總線的框架一樣、其實(shí)就是套了一層皮。
五:MISC雜項(xiàng)驅(qū)動(dòng)框架(主設(shè)備號(hào)是10)
大框架還是platform驅(qū)動(dòng)框架,要添加一個(gè)miscdevice類型結(jié)構(gòu)體
在probe中注冊(cè)、remove中銷毀,減少了分配設(shè)備號(hào)、cdev、class、device那繁瑣的一套
六:INPUT(主設(shè)備都是13)子系統(tǒng)驅(qū)動(dòng)框架
設(shè)備結(jié)構(gòu)體中要添加一個(gè)輸入設(shè)備
在init中申請(qǐng)和注冊(cè)、exit中取消注冊(cè)和釋放
設(shè)置事件和值(type、code、value)
使用input_event函數(shù)上報(bào)事件
上報(bào)的數(shù)據(jù)可以使用hexdump觀察
應(yīng)用層可以使用一個(gè)input_event結(jié)構(gòu)體變量來(lái)接收上報(bào)的數(shù)據(jù)
七:IIC驅(qū)動(dòng)框架
首先module_init和module_exit,添加一個(gè)i2c_driver,對(duì)應(yīng)init完成i2c_add_driver,exit中完成i2c_del_driver
同樣的,設(shè)備和驅(qū)動(dòng)匹配還是要靠compatible屬性
????
當(dāng)設(shè)備樹節(jié)點(diǎn)和驅(qū)動(dòng)文件匹配之后,執(zhí)行probe函數(shù),會(huì)傳入i2c_client類型的一個(gè)結(jié)構(gòu)體指針,可以使用一個(gè)指針變量保存下來(lái),當(dāng)在i2c讀寫寄存器的時(shí)候會(huì)用得到。
設(shè)備中定義一個(gè)指針進(jìn)行保存
I2C讀數(shù)據(jù)
I2C寫數(shù)據(jù)
八:SPI驅(qū)動(dòng)框架
首先module_init和module_exit,創(chuàng)建一個(gè)spi_driver類型的結(jié)構(gòu)體變量,init中spi_register_driver、exit中spi_unregister_driver
設(shè)備樹相關(guān)信息
?????
當(dāng)執(zhí)行到probe函數(shù)的時(shí)候會(huì)傳入一個(gè)spi_device類型的結(jié)構(gòu)體,像i2c驅(qū)動(dòng)一樣找一個(gè)變量存起來(lái)
設(shè)備中定義一個(gè)指針用來(lái)接收spi_device類型的指針
設(shè)置spi設(shè)備的工作模式
spi讀寫寄存器可以使用內(nèi)核自帶的spi_read和spi_write,其中都要傳入類型為spi_device的參數(shù),就是在調(diào)用probe傳入的那個(gè)。
文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-612424.html
總結(jié)
以上只是對(duì)學(xué)習(xí)驅(qū)動(dòng)這段時(shí)間的一個(gè)梳理和回顧,想系統(tǒng)學(xué)習(xí)可以閱讀正點(diǎn)的教程。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-612424.html
到了這里,關(guān)于嵌入式Linux驅(qū)動(dòng)開發(fā)——常見框架梳理的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!