字符設(shè)備驅(qū)動(dòng)的編寫(xiě)
(1)編寫(xiě)驅(qū)動(dòng)需要提供的功能函數(shù) (2)定義一個(gè)struct file_operation的變量,(1)中編寫(xiě)的功能函數(shù)應(yīng)當(dāng)對(duì)應(yīng)這個(gè)結(jié)構(gòu)體中的某一個(gè)函數(shù)指針,作為提供給應(yīng)用程序訪問(wèn)硬件設(shè)備的接口 (3)在驅(qū)動(dòng)的xxx_init函數(shù)中調(diào)用chrdev_register(第一個(gè)參數(shù)為0,則會(huì)自動(dòng)分配主設(shè)備號(hào)),這個(gè)函數(shù)的返回值為主設(shè)備號(hào),這個(gè)函數(shù)需要主設(shè)備號(hào)、驅(qū)動(dòng)名字、file_operation結(jié)構(gòu)體作為參數(shù),將驅(qū)動(dòng)注冊(cè)到內(nèi)核 說(shuō)一下:內(nèi)核會(huì)維護(hù)一個(gè)主設(shè)備號(hào)數(shù)組,一個(gè)主設(shè)備號(hào)對(duì)應(yīng)一個(gè)數(shù)組元素,驅(qū)動(dòng)注冊(cè)時(shí),會(huì)將自身實(shí)現(xiàn)的file_operation與自身主設(shè)備號(hào)對(duì)應(yīng)的數(shù)組元素對(duì)應(yīng)。一但這個(gè)對(duì)應(yīng)關(guān)系建立以后,應(yīng)用程序通過(guò)操作/dev下的設(shè)備節(jié)點(diǎn)文件,就能獲得設(shè)備文件對(duì)應(yīng)的主設(shè)備號(hào),進(jìn)而拿著這個(gè)主設(shè)備號(hào)就能找到file_operation,在其中找到自己需要的操作硬件的方法,進(jìn)而滿足應(yīng)用程序的需求。 創(chuàng)建設(shè)備節(jié)點(diǎn)的方法: (1)手動(dòng)創(chuàng)建:mknod? (2)自動(dòng)創(chuàng)建:調(diào)用class_create創(chuàng)建一個(gè)類(lèi),再調(diào)用class_device_create,屆時(shí),可以在/sys/class下看到我們所創(chuàng)建的類(lèi)以及在該類(lèi)下創(chuàng)建出的設(shè)備文件。然后mdev會(huì)在/dev下創(chuàng)建一個(gè)設(shè)備節(jié)點(diǎn)文件,這是基于mdev機(jī)制實(shí)現(xiàn)的 mdev機(jī)制:這是因?yàn)槲覀冊(cè)趇nit.d中的rcS文件中,將熱拔插守護(hù)進(jìn)程設(shè)置成了mdev,一旦有熱拔插事件發(fā)生,就會(huì)將設(shè)備描述符傳遞給mdev,進(jìn)而在/dev下創(chuàng)建出對(duì)應(yīng)的設(shè)備節(jié)點(diǎn) 一點(diǎn)點(diǎn)感悟:其實(shí)驅(qū)動(dòng)模塊可以理解為將硬件設(shè)備虛擬化為軟件模塊。操作這個(gè)軟件模塊就等于操作硬件設(shè)備。驅(qū)動(dòng)??爝€要準(zhǔn)備好維持硬件設(shè)備正常工作所需的資源,例如gpio、中斷、時(shí)鐘等。 總之:一旦設(shè)備節(jié)點(diǎn)創(chuàng)建完畢,應(yīng)用程序就有了操作硬件設(shè)備的入口