當然寫驅(qū)動,你得清楚上層調(diào)用是否導致存在函數(shù)重入、
什么執(zhí)行context下(1. 中斷、2. 軟中斷、3. tasklet(軟中斷的一種)、 4. timer(基于軟中斷實現(xiàn))、5. hrtimer (軟中斷或硬中斷環(huán)境下執(zhí)行) 、6. workqueue(也是kernel thread)、7. kernel thread、8. 普通thread的內(nèi)核態(tài)下)會訪問此函數(shù)和此資源,需要什么樣的“同步機制”保護。
你利用子系統(tǒng)(例如input子系統(tǒng))的去實現(xiàn)驅(qū)動需要實現(xiàn)功能。你利用總線的api函數(shù)去訪問設備硬件,例如i2c_transfer、spi_sync等
注意probe函數(shù)傳入的device,是bus_type實現(xiàn)的,在module_init時注冊了驅(qū)動到對應總線上,在.machine_init時,會通過board板級代碼把此bus的設備加入到對應的總線上(無論是否需要device tree方式)。無論是誰創(chuàng)建的設備(bus函數(shù)或者machine_init的函數(shù)),加入bus后,match成功后,就傳入到驅(qū)動的probe函數(shù)上了,所以probe函數(shù)傳入的就是對應bus的device結(jié)構,例如i2c是struct i2c_client , spi總線是struct spi_device,platform虛擬總線傳入的是struct platform_device *。 具體參見我的《linux device driver model_2018_02_03(必讀).pptx》
像手機的touch driver比較復雜(例如cypress或者synaptics廠家),他還自己創(chuàng)建了一條虛擬的bus來實現(xiàn)動態(tài)支持不同的子function的添加。
需要考慮一個驅(qū)動如何支持多個設備,避免全局和靜態(tài)變量,而采用基于xxx_priv_dev的結(jié)構體成員變量代替,一個xxx_priv_dev 對應一個device。
關于具體的寫linux驅(qū)動的方法、技巧和注意事項,歡迎觀看我的《如何編寫linux設備驅(qū)動》的視頻:
https://edu.51cto.com/course/17132.html
另外我的相關培訓視頻請看:
歡迎觀看我發(fā)布的各個課程: https://edu.51cto.com/lecturer/8896847.html
另外我的免費的linux各種驅(qū)動開發(fā)課程如下:
https://edu.51cto.com/course/17138.html
另外有需要云服務器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、高防服務器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。