本人現在學習驅動,所寫僅是筆記作用。
驅動,簡單來說,就是溝通上層和物理層的中間媒介。
打個比方,上層想要打開個led燈,上層的想法就是:我調用了一個類似open_on()的API函數,就能明顯看到開發板的燈就亮了。他不管底層是怎麼實現的,他理所當然認爲,是他調用這個API函數就足夠完成LED燈亮的任務了。
下層呢,它只知道,初始化寄存器,配置輸出模式,你給它寫一個低電平(假設低電平亮),LED燈就亮了,你給它寫一個寫個高電平,它就滅了。
驅動的作用呢,就是給上層屏蔽下層的差異,無論你今天拿到的是什麼板子,只需要調用的是同樣的一個函數,LED燈就能夠亮了(假如板子都有LED燈)。驅動接收上層的指令,轉化成物理層認識的指令。完成驅動底層設備正常運行,這就是驅動存在的必要性。
說完了原理,說說驅動的實現代碼邏輯(傳統操作驅動的方法)。
1、分配/設置/註冊file_operations
2、入口函數led_init()
3、出口函數led_exit()
4、module_init(led_init)
module_exit(led_exit)
5、申明遵循GPL協議MODULE_LICENSE("GPL")
以上5步是傳統驅動的基本框架。搭好了上層和對下層的媒介,後面只需要往框架裏面填補對物理成的具體操作和接受上層的數據處理這些邏輯即可。
之後呢,在file_oprations 結構體中的open、write、read等函數真正對物理層的操作。
至此,簡單地實現了一個驅動。原理是這樣,但其他的驅動程序和邏輯會比這個複雜很多。
參考資料,來自韋東山的個人博客
https://blog.csdn.net/thisway_diy/article/details/84336346