120. /*
121. * 打开鼠标设备时,开始提交在 probe 函数中构建的 urb,进入 urb 周期。
122. */
123. static int usb_mouse_open(struct input_dev *dev)
124. {
125. struct usb_mouse *mouse = dev->private;
126. mouse->irq->dev = mouse->usbdev;
127. if (usb_submit_urb(mouse->irq, GFP_KERNEL))
128. return -EIO;
129. return 0;
130. }
131. /*
132. * 关闭鼠标设备时,结束 urb 生命周期。
133. */
134. static void usb_mouse_close(struct input_dev *dev)
135. {
136. struct usb_mouse *mouse = dev->private;
137. usb_kill_urb(mouse->irq);
138. }
139. /*
140. * 驱动程序的探测函数
141. */
142. static int usb_mouse_probe(struct usb_interface *intf, const struct usb_device_id *id)
143. {
144. /*
145. * 接口结构体包含于设备结构体中,interface_to_usbdev 是通过接口结构体获得它的设备结构体。
146. * usb_host_interface 是用于描述接口设置的结构体,内嵌在接口结构体 usb_interface 中。
147. * usb_endpoint_descriptor 是端点描述符结构体,内嵌在端点结构体 usb_host_endpoint 中,而端点
148. * 结构体内嵌在接口设置结构体中。
149. */
150. struct usb_device *dev = interface_to_usbdev(intf);
151. struct usb_host_interface *interface;
152. struct usb_endpoint_descriptor *endpoint;
153. struct usb_mouse *mouse;
154. struct input_dev *input_dev;
155. int pipe, maxp;
156. interface = intf->cur_altsetting;
157. /* 鼠标仅有一个 interrupt 类型的 in 端点,不满足此要求的设备均报错 */
158. if (interface->desc.bNumEndpoints != 1)
159. return -ENODEV;
160. endpoint = &interface->endpoint[0].desc;
161. if (!usb_endpoint_is_int_in(endpoint))
162. return -ENODEV;
163. /*
164. * 返回对应端点能够传输的最大的数据包,鼠标的返回的最大数据包为4个字节,数据包具体内容在 urb
165. * 回调函数中有详细说明。
166. */
167. pipe = usb_rcvintpipe(dev, endpoint->bEndpointAddress);
168. maxp = usb_maxpacket(dev, pipe, usb_pipeout(pipe));
169. /* 为 mouse 设备结构体分配内存 */
170. mouse = kzalloc(sizeof(struct usb_mouse), GFP_KERNEL);
171. /* input_dev */
172. input_dev = input_allocate_device();
173. if (!mouse || !input_dev)
174. goto fail1;
175. /*
176. * 申请内存空间用于数据传输,data 为指向该空间的地址,data_dma 则是这块内存空间的 dma 映射,
177. * 即这块内存空间对应的 dma 地址。在使用 dma 传输的情况下,则使用 data_dma 指向的 dma 区域,
178. * 否则使用 data 指向的普通内存区域进行传输。
179. * GFP_ATOMIC 表示不等待,GFP_KERNEL 是普通的优先级,可以睡眠等待,由于鼠标使用中断传输方式,
180. * 不允许睡眠状态,data 又是周期性获取鼠标事件的存储区,因此使用 GFP_ATOMIC 优先级,如果不能
181. * 分配到内存则立即返回 0。
182. */
183. mouse->data = usb_buffer_alloc(dev, 8, GFP_ATOMIC, &mouse->data_dma);
184. if (!mouse->data)
185. goto fail1;
186. /*
187. * 为 urb 结构体申请内存空间,第一个参数表示等时传输时需要传送包的数量,其它传输方式则为0。
188. * 申请的内存将通过下面即将见到的 usb_fill_int_urb 函数进行填充。
189. */
190. mouse->irq = usb_alloc_urb(0, GFP_KERNEL);
191. if (!mouse->irq)
192. goto fail2;
193. /* 填充 usb 设备结构体和输入设备结构体 */
194. mouse->usbdev = dev;
195. mouse->dev = input_dev;
196. /* 获取鼠标设备的名称 */
197. if (dev->manufacturer)
198. strlcpy(mouse->name, dev->manufacturer, sizeof(mouse->name));
199. if (dev->product)
200. {
201. if (dev->manufacturer)
202. strlcat(mouse->name, " ", sizeof(mouse->name));
203. strlcat(mouse->name, dev->product, sizeof(mouse->name));
204. }
205. if (!strlen(mouse->name))
206. snprintf(mouse->name, sizeof(mouse->name),
207. "USB HIDBP Mouse %04x:%04x",
208. le16_to_cpu(dev->descriptor.idVendor),
209. le16_to_cpu(dev->descriptor.idProduct));
责任编辑:小草