最近為了發展ICE的Device Driver,花了一些時間研究這個Topic,先前找了一些文件,的確對我助益良多,但畢竟是早期的文件,一些相關的API與資料結構都已經不一樣,無法完全套用,因此記錄一下這陣子嘗試撰寫Driver的心得!
1.以Module的型式撰寫Driver,以方便測試:
請參考前面提到如何撰寫Module程式的步驟來進行!別忘了init_module()/cleanup_module()兩個API
2.為自己的裝置定義Vendor ID及Product ID(注意!必須與裝置內的FW一致)
static struct usb_device_id danny_ids[] = {
{USB_DEVICE (Danny_ID, 0x12345)},
{ }
};
3.宣告ID Table
MODULE_DEVICE_TABLE (usb, danny_ids);
4.為自己的裝置宣告一個device driver (先定義兩個USB裝置插拔時會呼叫到的API,裡面暫時是空的)
static struct usb_driver DannyDriver = {
.name = "Danny Device",
.probe = danny_probe,
.disconnect = danny_disconnect,
.id_table = danny_ids,
};
5.在init_module()中向系統註冊Device Driver
usb_register(&DannyDriver);
6.別忘了!也要在cleanup_module()中加入從系統移除Device Driver的動作
usb_deregister(&DannyDriver);
程式撰寫到這裡,將driver掛載入系統後,插拔USB裝置,應該已有所反應,當裝置插入時,danny_probe()會被呼叫到;當移除裝置時,danny_disconnect()會被呼叫 ------- 待緒.....
沒有留言:
張貼留言