驅(qū)動學(xué)習(xí)感想
最近看到某些驅(qū)動說自己屬于linux某某子系統(tǒng)的驅(qū)動,例如I2C、USB等,但在其代碼中由混雜著注冊了
其他類型的驅(qū)動注冊函數(shù),例如USB 鼠標(biāo)驅(qū)動中,就在驅(qū)動初始化函數(shù)中注冊了調(diào)用了inpu驅(qū)動的注冊函數(shù)。
現(xiàn)在的感悟是:
對于Linux系統(tǒng)而言,真正的設(shè)備文件分類主要有:
1、字符設(shè)備
2、塊設(shè)備
3、網(wǎng)絡(luò)設(shè)備
因此Linux設(shè)備驅(qū)動框架雖然有很多種,但是提供給用戶程序進(jìn)行操作時,最終都是要?dú)w屬到上述的三種設(shè)備文件類型中去。
所以對于USB鼠標(biāo),只能認(rèn)為USB設(shè)備和主機(jī)的通信方式使用的是USB通信協(xié)議,但是這只是將數(shù)據(jù)從設(shè)備讀取到了內(nèi)核,但是內(nèi)核該如何將信息提交給應(yīng)用程序呢?
這就需要考慮設(shè)備屬于哪種類型,字符設(shè)備?塊設(shè)備?網(wǎng)絡(luò)設(shè)備?,鼠標(biāo)一般歸屬為字符設(shè)備類型,而且屬于輸入設(shè)備(輸入設(shè)備的本質(zhì)也是字符設(shè)備)。因此這里可以
使用字符設(shè)備的方式組織將信息發(fā)送給應(yīng)用程序,也可以使用linux 提供的Input驅(qū)動框架,使用事件管理機(jī)制簡化驅(qū)動的編寫。
當(dāng)然,這兩種方式都需要先按照設(shè)備與主機(jī)的通信方式選擇對應(yīng)的驅(qū)動框架,在后再在對應(yīng)框架的初始化函數(shù)中注冊字符設(shè)備驅(qū)動或者Input驅(qū)動,完成應(yīng)用程序交給驅(qū)動的任務(wù)。
其次,常常在某些驅(qū)動中會專門為設(shè)備定制一個私有數(shù)據(jù)結(jié)構(gòu)體,當(dāng)然名字不一定帶有“pdata”,這樣做的目的,是將某些設(shè)備的特殊功能通過這樣的方式,帶入內(nèi)核,
以便在設(shè)備初始化的時候調(diào)用,例如 中斷、gpio、時鐘等。