既然知道了怎麼編寫一個模組,那麼編寫裝置驅動程式自然也就不難了.我相信,每一個會寫模組的人都不會覺得寫裝置驅動有困難.對自己行不行不確定的話,可以去問一下葛優,他准說:"(神州行),我看行."
真的,我沒說假話.寫驅動不是什麼難事,你完全可以很自信的說,你已經可以寫Device Driver了.對,沒錯,飄柔,就這麼自信.
前面說了每一個模組都是以module_init開始,以module_exit結束,那麼我們就來看一下隨身碟的驅動的這個模組.在茫茫人海中,我們很容易找到這個檔案:drivers/usb/storage/usb.c,在這個檔案中又不難發現下面這段:
/***********************************************************************
1056 * Initialization and registration
1057 ***********************************************************************/
1058
1059 static int __init usb_stor_init(void)
1060 {
1061 int retval;
1062 printk(KERN_INFO "Initializing USB Mass Storage driver.../n");
1063
1064 /* register the driver, return usb_register return code if error */
1065 retval = usb_register(&usb_storage_driver);
1066 if (retval == 0)
1067 printk(KERN_INFO "USB Mass Storage support registered./n");
1068
1069 return retval;
1070 }
1071
1072 static void __exit usb_stor_exit(void)
1073 {
1074 US_DEBUGP("usb_stor_exit() called/n");
1075
1076 /* Deregister the driver
1077 * This will cause disconnect() to be called for each
1078 * attached unit
1079 */
1080 US_DEBUGP("-- calling usb_deregister()/n");
1081 usb_deregister(&usb_storage_driver) ;
1082 }
1083
1084 module_init(usb_stor_init);
1085 module_exit(usb_stor_exit);
其實,module_init/module_exit只是一個宏,通常寫模組的人為了彰顯自己的個性,會給自己的初始化函數和登出函數另外起個名字,比如這裡module_init(usb_stor_init)以及module_exit(usb_stor_exit)實際上就是告訴這個世界,真正的函數是usb_stor_init和usb_stor_exit.這種伎倆在Linux核心代碼中屢見不鮮.見多了也就不必大驚小怪了,天要下雨娘要嫁人,隨她去吧.我們下面當然就從usb_stor_init正式開始我們的探索之旅.