133 // set_bit(BTN_MIDDLE, uk_dev->keybit);
134
135 // set_bit(REL_X,uk_dev->keybit);
136 // set_bit(REL_Y,uk_dev->keybit);
137 // set_bit(REL_WHEEL,uk_dev->keybit);
138
139 uk_dev->evbit[0] = BIT(EV_KEY) | BIT(EV_REL);
140 uk_dev->keybit[LONG(BTN_MOUSE)] = BIT(BTN_LEFT) | BIT(BTN_RIGHT) | BIT(BTN_MIDDLE);
141 uk_dev->relbit[0] = BIT(REL_X) | BIT(REL_Y);
142 uk_dev->keybit[LONG(BTN_MOUSE)] |= BIT(BTN_SIDE) | BIT(BTN_EXTRA);
143 uk_dev->relbit[0] |= BIT(REL_WHEEL);
144
145 /* c. 注册 */
146 input_register_device(uk_dev);
147
148 /* d. 硬件相关操作 */
149 /* 数据传输3要素: 源,目的,长度 */
150 /* 源: USB设备的某个端点 */
151 pipe = usb_rcvintpipe(dev,endpoint->bEndpointAddress);
152 /* 长度: */
153 len = endpoint->wMaxPacketSize;
154 /* 目的: */
155 usb_buf = usb_buffer_alloc(dev,len,GFP_ATOMIC,&usb_data_dma);
156 /* 使用'3要素' */
157 /* 分配usb request block */
158 uk_urb = usb_alloc_urb(0, GFP_KERNEL);
159
160 /* 使用'3要素设置urb' */
161 usb_fill_int_urb(uk_urb, dev, pipe,usb_buf,len,usb_mouse_irq, NULL, endpoint->bInterval);
162 uk_urb->transfer_dma = usb_data_dma;
163 uk_urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
164
165 /* 使用URB */
166 usb_submit_urb(uk_urb, GFP_KERNEL);
167
168
169 printk('found usbmouse!n');
170
171 printk('bcdUSB = %xn', dev->descriptor.bcdUSB);
172 printk('VID = 0x%xn', dev->descriptor.idVendor);
173 printk('PID = 0x%xn', dev->descriptor.idProduct);
174
175 return 0;
176 }
177
178 static void usbmouse_key_disconnect(struct usb_interface *interface)
179 {
180 struct usb_device *dev = interface_to_usbdev(interface);
181
182 printk('usbmouse_key_disconnectn');
183 input_unregister_device(uk_dev);
184 input_free_device(uk_dev);
185 usb_buffer_free(dev,len,usb_buf,usb_data_dma);
186 usb_kill_urb(uk_urb);
187 usb_free_urb(uk_urb);
188
189 }
190
191 MODULE_DEVICE_TABLE (usb, usbmouse_key_table);
192
193 /*usbmouse_key_probe usbmouse_key_disconnect 函数指针
194 *当设备与在id_table 中变量信息匹配时,此函数被调用
195 */
196 static struct usb_driver usbmouse_key_driver = {
197 .name = 'usbmouse_key',
198 .probe = usbmouse_key_probe,
199 .disconnect = usbmouse_key_disconnect,
200 .id_table = usbmouse_key_table,
201
202 };
203
204 /*
205 *USB骨架 最基本的usb驱动模板
206 */
207 static int __init usb_usbmouse_key_init(void)
208 {
209 int result;
210
211 printk('usb_usbmouse_key_initn');
212
213 /* register this driver with the USB subsystem */
214 result = usb_register(&usbmouse_key_driver);
215 if (result)
216 err('usb_register failed. Error number %d', result);
217
218 return result;
219 }
220
221 static void __exit usb_usbmouse_key_exit(void)
222 {
223 printk('usb_usbmouse_key_exitn');
224 /* deregister this driver with the USB subsystem */
225 usb_deregister(&usbmouse_key_driver);
226 }
227
228 module_init(usb_usbmouse_key_init);
229 module_exit(usb_usbmouse_key_exit);
230 MODULE_LICENSE('GPL');
上一篇:s3c2440的IIS的控制模块
下一篇:s3c2440启动代码学习笔记
推荐阅读最新更新时间:2026-02-21 21:55
- 使用 ROHM Semiconductor 的 BU4946 的参考设计
- L7805A 高输入电压电路的典型应用(配置 2)
- LT8610 的典型应用 - 具有 2.5 uA 静态电流的 42V、2.5A 同步降压型稳压器
- 具有固定输出电压、1.5V 的典型应用电路,适用于 ADP1740 2A 低 VIN、低压差线性稳压器
- ADA4505-1ARJZ-R7 脉搏血氧计红色和红外电流源的典型应用电路,使用电压基准器件的缓冲器
- LTC3890IUH 高效双路 12V/5V 降压转换器的典型应用电路
- L7885C 功率 AM 调制器的典型应用(单位电压增益,IO = 0.5)
- L7812A 具有短路保护的高输出电流的典型应用
- 使用 MaxLinear, Inc 的 SPX2840 的参考设计
- LT3957IUHE、5V 至 16V 输入、-12V 输出反相转换器的典型应用电路



Linux技术手册
【2025 DigiKey创意大赛】 学伴智盒 - 代码
智能机械臂
非常经典的关于LLC的杨波博士论文
ASM10DTBD-S664






京公网安备 11010802033920号