- 使用者要如何去呼叫這個硬體,以便讓系統許可使用(system call, ioctl)
- 系統要怎麼初始硬體(module_init)
- 系統要怎麼脫離硬體(module_exit)
- 系統跟硬體的互動(interrupt, irq)
- 硬體跟使用者的互動(open, close, read, write, ioctl, copy_from_user, copy_to_user)
- 要如何解析硬體傳來的訊號(keyword : 傳輸協定,SPI, I2C, ...)
- 跟別的module的相依性
- 是否容許多人同時使用?如何分配資源?
以下是我自己考慮的部份:
- 盡可能用kernel已經有的支援以減少coding
- 盡可能考慮與不同系統搭配的可能性(如果你想把raspberry pi的驅動程式移植到BeagleBone Black上....)。
當使用者想要使用某個硬體時,必須要這樣做(以下為擬人化示範):
使用者:喂!那個webcam可不可以給我用一下?就是在/dev/video0的那個!(以開啟/dev/video0的方式去呼叫系統,所謂system call是也)
系 統:我先看一下你夠不夠格用(使用者是否有權限),然後我看有沒有別人在用(mutex)....嗯,應該可以讓你用,我先把設定開一開 (interrupt與irq等),這樣我想應該沒問題了,拿去用吧(使用者以mutex lock(互斥鎖)佔住/dev/video0),然後系統開始根據使用者的要求傳送畫面....
使用者:喂!我用完了,我把webcam放在那囉,你自己收一收吧(以關閉/dev/video0的方式通知系統)
系統:把設定(interrupt與irq等)關掉,互斥鎖也解掉,這樣別人就能用了。
下圖是補充擬人化敘述沒法說明的部份(圖片來源:參考資料2.)
當使用者要使用系統的一個裝置(device),系統必須有一個相應的字符裝置驅動程式(character device driver,這也就是我們現在要學的),而這個character device driver 會在虛擬檔案系統(virtual file system)創造一個字符裝置檔案(character device file),例如本文的/dev/video0或我們下一篇會建立的/dev/LED_0,使用者就能透過開啟此虛擬檔案的方式,告訴系統他想要這裝製作什麼,系統再依照字符裝置驅動程式的設定決定要怎麼回應。
參考資料:
- Linux 驅動程式觀念解析, #1: 驅動程式的大架構
http://www.jollen.org/blog/2006/05/linux_1.html - Character device drivers
http://wr.informatik.uni-hamburg.de/_media/teaching/wintersemester_2014_2015/pk1415-char_drivers-oster-koenig-presentation.pdf
沒有留言:
張貼留言