210. /*
211. * 填充鼠标设备结构体中的节点名。usb_make_path 用来获取 USB 设备在 Sysfs 中的路径,格式
212. * 为:usb-usb 总线号-路径名。
213. */
214. usb_make_path(dev, mouse->phys, sizeof(mouse->phys));
215. strlcat(mouse->phys, "/input0", sizeof(mouse->phys));
216. /* 将鼠标设备的名称赋给鼠标设备内嵌的输入子系统结构体 */
217. input_dev->name = mouse->name;
218. /* 将鼠标设备的设备节点名赋给鼠标设备内嵌的输入子系统结构体 */
219. input_dev->phys = mouse->phys;
220. /*
221. * input_dev 中的 input_id 结构体,用来存储厂商、设备类型和设备的编号,这个函数是将设备描述符
222. * 中的编号赋给内嵌的输入子系统结构体
223. */
224. usb_to_input_id(dev, &input_dev->id);
225. /* cdev 是设备所属类别(class device) */
226. input_dev->cdev.dev = &intf->dev;
227. /* evbit 用来描述事件,EV_KEY 是按键事件,EV_REL 是相对坐标事件 */
228. input_dev->evbit[0] = BIT(EV_KEY) | BIT(EV_REL);
229. /* keybit 表示键值,包括左键、右键和中键 */
230. input_dev->keybit[LONG(BTN_MOUSE)] = BIT(BTN_LEFT) | BIT(BTN_RIGHT) | BIT(BTN_MIDDLE);
231. /* relbit 用于表示相对坐标值 */
232. input_dev->relbit[0] = BIT(REL_X) | BIT(REL_Y);
233. /* 有的鼠标还有其它按键 */
234. input_dev->keybit[LONG(BTN_MOUSE)] |= BIT(BTN_SIDE) | BIT(BTN_EXTRA);
235. /* 中键滚轮的滚动值 */
236. input_dev->relbit[0] |= BIT(REL_WHEEL);
237. /* input_dev 的 private 数据项用于表示当前输入设备的种类,这里将鼠标结构体对象赋给它 */
238. input_dev->private = mouse;
239. /* 填充输入设备打开函数指针 */
240. input_dev->open = usb_mouse_open;
241. /* 填充输入设备关闭函数指针 */
242. input_dev->close = usb_mouse_close;
243. /*
244. * 填充构建 urb,将刚才填充好的 mouse 结构体的数据填充进 urb 结构体中,在 open 中递交 urb。
245. * 当 urb 包含一个即将传输的 DMA 缓冲区时应该设置 URB_NO_TRANSFER_DMA_MAP。USB核心使用
246. * transfer_dma变量所指向的缓冲区,而不是transfer_buffer变量所指向的。
247. * URB_NO_SETUP_DMA_MAP 用于 Setup 包,URB_NO_TRANSFER_DMA_MAP 用于所有 Data 包。
248. */
249. usb_fill_int_urb(mouse->irq, dev, pipe, mouse->data,
250. (maxp > 8 ? 8 : maxp),
251. usb_mouse_irq, mouse, endpoint->bInterval);
252. mouse->irq->transfer_dma = mouse->data_dma;
253. mouse->irq->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
254. /* 向系统注册输入设备 */
255. input_register_device(mouse->dev);
256. /*
257. * 一般在 probe 函数中,都需要将设备相关信息保存在一个 usb_interface 结构体中,以便以后通过
258. * usb_get_intfdata 获取使用。这里鼠标设备结构体信息将保存在 intf 接口结构体内嵌的设备结构体中
259. * 的 driver_data 数据成员中,即 intf->dev->dirver_data = mouse。
260. */
261. usb_set_intfdata(intf, mouse);
262. return 0;
263. fail2: usb_buffer_free(dev, 8, mouse->data, mouse->data_dma);
264. fail1: input_free_device(input_dev);
265. kfree(mouse);
266. return -ENOMEM;
267. }
责任编辑:小草