新聞中心
編寫linux設(shè)備驅(qū)動(dòng)的注意事項(xiàng)之一
當(dāng)然寫驅(qū)動(dòng),你得清楚上層調(diào)用是否導(dǎo)致存在函數(shù)重入、
什么執(zhí)行context下(1. 中斷、2. 軟中斷、3. tasklet(軟中斷的一種)、 4. timer(基于軟中斷實(shí)現(xiàn))、5. hrtimer (軟中斷或硬中斷環(huán)境下執(zhí)行) 、6. workqueue(也是kernel thread)、7. kernel thread、8. 普通thread的內(nèi)核態(tài)下)會訪問此函數(shù)和此資源,需要什么樣的“同步機(jī)制”保護(hù)。
創(chuàng)新互聯(lián)是專業(yè)的路北網(wǎng)站建設(shè)公司,路北接單;提供成都網(wǎng)站設(shè)計(jì)、網(wǎng)站制作,網(wǎng)頁設(shè)計(jì),網(wǎng)站設(shè)計(jì),建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行路北網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴(kuò)展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團(tuán)隊(duì),希望更多企業(yè)前來合作!
你利用子系統(tǒng)(例如input子系統(tǒng))的去實(shí)現(xiàn)驅(qū)動(dòng)需要實(shí)現(xiàn)功能。你利用總線的api函數(shù)去訪問設(shè)備硬件,例如i2c_transfer、spi_sync等
注意probe函數(shù)傳入的device,是bus_type實(shí)現(xiàn)的,在module_init時(shí)注冊了驅(qū)動(dòng)到對應(yīng)總線上,在.machine_init時(shí),會通過board板級代碼把此bus的設(shè)備加入到對應(yīng)的總線上(無論是否需要device tree方式)。無論是誰創(chuàng)建的設(shè)備(bus函數(shù)或者machine_init的函數(shù)),加入bus后,match成功后,就傳入到驅(qū)動(dòng)的probe函數(shù)上了,所以probe函數(shù)傳入的就是對應(yīng)bus的device結(jié)構(gòu),例如i2c是struct i2c_client , spi總線是struct spi_device ,platform虛擬總線傳入的是struct platform_device *。 具體參見我的《linux device driver model_2018_02_03(必讀).pptx》
像手機(jī)的touch driver比較復(fù)雜(例如cypress或者synaptics廠家),他還自己創(chuàng)建了一條虛擬的bus來實(shí)現(xiàn)動(dòng)態(tài)支持不同的子function的添加。
需要考慮一個(gè)驅(qū)動(dòng)如何支持多個(gè)設(shè)備,避免全局和靜態(tài)變量,而采用基于xxx_priv_dev的結(jié)構(gòu)體成員變量代替,一個(gè)xxx_priv_dev 對應(yīng)一個(gè)device。
關(guān)于具體的寫linux驅(qū)動(dòng)的方法、技巧和注意事項(xiàng),歡迎觀看我的《如何編寫linux設(shè)備驅(qū)動(dòng)》的視頻:
https://edu.51cto.com/course/17132.html
另外我的相關(guān)培訓(xùn)視頻請看:
歡迎觀看我發(fā)布的各個(gè)課程: https://edu.51cto.com/lecturer/8896847.html
另外我的免費(fèi)的linux各種驅(qū)動(dòng)開發(fā)課程如下:
https://edu.51cto.com/course/17138.html
網(wǎng)站名稱:編寫linux設(shè)備驅(qū)動(dòng)的注意事項(xiàng)之一
網(wǎng)站網(wǎng)址:http://www.ef60e0e.cn/article/jhcijj.html