268. /*
269. * 鼠标设备拔出时的处理函数
270. */
271. static void usb_mouse_disconnect(struct usb_interface *intf)
272. {
273. /* 获取鼠标设备结构体 */
274. struct usb_mouse *mouse = usb_get_intfdata (intf);
275. /* intf->dev->dirver_data = NULL,将接口结构体中的鼠标设备指针置空。*/
276. usb_set_intfdata(intf, NULL);
277. if (mouse)
278. {
279. /* 结束 urb 生命周期 */
280. usb_kill_urb(mouse->irq);
281. /* 将鼠标设备从输入子系统中注销 */
282. input_unregister_device(mouse->dev);
283. /* 释放 urb 存储空间 */
284. usb_free_urb(mouse->irq);
285. /* 释放存放鼠标事件的 data 存储空间 */
286. usb_buffer_free(interface_to_usbdev(intf), 8, mouse->data, mouse->data_dma);
287. /* 释放存放鼠标结构体的存储空间 */
288. kfree(mouse);
289. }
290. }
291. /*
292. * usb_device_id 结构体用于表示该驱动程序所支持的设备,USB_INTERFACE_INFO 可以用来匹配特定类型的接口,
293. * 这个宏的参数意思为 (类别, 子类别, 协议)。
294. * USB_INTERFACE_CLASS_HID 表示是一种 HID (Human Interface Device),即人机交互设备类别;
295. * USB_INTERFACE_SUBCLASS_BOOT 是子类别,表示是一种 boot 阶段使用的 HID;
296. * USB_INTERFACE_PROTOCOL_MOUSE 表示是鼠标设备,遵循鼠标的协议。
297. */
298. static struct usb_device_id usb_mouse_id_table [] = {
299. { USB_INTERFACE_INFO(USB_INTERFACE_CLASS_HID, USB_INTERFACE_SUBCLASS_BOOT,
300. USB_INTERFACE_PROTOCOL_MOUSE) },
301. { } /* Terminating entry */
302. };
303. /*
304. * 这个宏用来让运行在用户空间的程序知道这个驱动程序能够支持的设备,对于 USB 驱动程序来说,第一个参数必须
305. * 是 usb。
306. */
307. MODULE_DEVICE_TABLE (usb, usb_mouse_id_table);
308. /*
309. * 鼠标驱动程序结构体
310. */
311. static struct usb_driver usb_mouse_driver = {
312. .name = "usbmouse",
313. .probe = usb_mouse_probe,
314. .disconnect = usb_mouse_disconnect,
315. .id_table = usb_mouse_id_table,
316. };
317. /*
318. * 驱动程序生命周期的开始点,向 USB core 注册这个鼠标驱动程序。
319. */
320. static int __init usb_mouse_init(void)
321. {
322. int retval = usb_register(&usb_mouse_driver);
323. if (retval == 0)
324. info(DRIVER_VERSION ":" DRIVER_DESC);
325. return retval;
326. }
327. /*
328. * 驱动程序生命周期的结束点,向 USB core 注销这个鼠标驱动程序。
329. */
330. static void __exit usb_mouse_exit(void)
331. {
332. usb_deregister(&usb_mouse_driver);
333. }
334. module_init(usb_mouse_init);
335. module_exit(usb_mouse_exit);
责任编辑:小草