百韵网 >>  正文

浅析usbhid驱动如何源源不断的获取usb鼠标 下usb驱动也没用,HID-compliant mouse哪...

来源:www.baiyundou.net   日期:较早时间
浅析usbhid驱动如何源源不断的获取usb鼠标数据

hid_probe
==>usb_hid_configure
pipe = usb_rcvintpipe(dev, endpoint->bEndpointAddress);
usb_fill_int_urb(usbhid->urbin, dev, pipe, usbhid->inbuf, insize, // 首先申请interrupt urb内存,并填充下面的有效数据
// 后面的hid_start_in()函数会usb_submit_urb提交该urb,到
// usb host控制器,进而发送interrupt in事物到hid设备[鼠标或键盘]
hid_irq_in, hid, interval); // hid_irq_in为interrupt中断管道数据处理回调函数
// urb->complete = hid_irq_in;
// interval为usbhid driver需要每隔interval毫秒
// 产生一次in读取动作,这只是一个理论上的东西[luther.gliethttp]
// 实际上该interval数值,仅仅用来usb host管理interrupt类型总线带宽
// 时,作为调整系数之一而已,[luther.gliethttp]
// 真正通信是这样的,对该urb执行一次usb_submit_urb()操作,
// 那么usb host将等待interrupt数据返回,如果hid物理设备没有
// 向它的interrupt端点填入指定大小的数据,那么
// usb host将一直等待,直到hid物理设备将指定个数的数据填入
// 它的interrupt端点为止,于是usb host将触发中断,
// 通知usb_submit_urb提交的interrupt类型的urb有数据回来了,
// 同时该urb生命终结,如果不再执行usb_submit_urb提交动作,再次等待
// 下一次interrupt数据到来的话,那么usbhid.ko将只得到
// 一次数据,[luther.gliethttp]
// 于是hid_irq_in函数将被执行,幸运的是,
// hid_irq_in函数中确实又调用了usb_submit_urb,再次将
// 该urb添加usb host事件中,等待下一次hid设备产生数据上传,然后再次调用到这里hid_irq_in处理数据,
// 如果强行将hid_irq_in函数中的usb_submit_urb屏蔽掉,
// 我们可以通过kernel klog看到,鼠标数据只会产生一个[luther.gliethttp]
static void hid_irq_in(struct urb *urb)
{
struct hid_device *hid = urb->context;
struct usbhid_device *usbhid = hid->driver_data;
int status;

switch (urb->status) {
case 0: /* success */
usbhid->retry_delay = 0;
hid_input_report(urb->context, HID_INPUT_REPORT, // 提交到更高一级的驱动层处理urb->transfer_buffer数据
urb->transfer_buffer, // 下面是截获的urb->transfer_buffer数据内容,对于我的mouse,每次都是4个字节:
urb->actual_length, 1); // [13602.612302] 00 fe 00 00
break; // [13602.868282] 01 00 00 00
case -EPIPE: /* stall */ // [13602.964277] 00 00 00 00
clear_bit(HID_IN_RUNNING, &usbhid->iofl); // [13603.860290] 04 00 00 00
set_bit(HID_CLEAR_HALT, &usbhid->iofl); // [13604.052288] 00 00 00 00
schedule_work(&usbhid->reset_work); // [13605.332295] 02 00 00 00
return; // [13605.460297] 00 00 00 00
case -ECONNRESET: /* unlink */ // [13605.812292] 00 f9 01 00
case -ENOENT: // [13605.876280] 00 ff 00 00
case -ESHUTDOWN: /* unplug */
clear_bit(HID_IN_RUNNING, &usbhid->iofl);
return;
case -EILSEQ: /* protocol error or unplug */
case -EPROTO: /* protocol error or unplug */
case -ETIME: /* protocol error or unplug */
case -ETIMEDOUT: /* Should never happen, but... */
clear_bit(HID_IN_RUNNING, &usbhid->iofl);
hid_io_error(hid);
return;
default: /* error */
warn("input irq status %d received", urb->status);
}

status = usb_submit_urb(urb, GFP_ATOMIC); // 再次将该urb提交到usb host上,
if (status) { // 这样才能继续读取下一次鼠标数据[luther.gliethttp]
clear_bit(HID_IN_RUNNING, &usbhid->iofl); // 如果将status = usb_submit_urb(urb, GFP_ATOMIC);注释掉
if (status != -EPERM) { // 那么表示urb生命就真的终结在这次了,不会再读到mouse数据了.
err_hid("can't resubmit intr, %s-%s/input%d, status %d", // 因为没有任何urb让usb host做读取mouse的interrupt管道[luther.gliethttp].
hid_to_usb_dev(hid)->bus->bus_name,
hid_to_usb_dev(hid)->devpath,
usbhid->ifnum, status);
hid_io_error(hid);
}
}
}

那hid_irq_in什么时候被调用呢,来看看,对hid_irq_in的调用直接来自物理irq中断[luther.gliethttp]

drivers/usb/host/ohci-s3c2410.c|455| .urb_enqueue = ohci_urb_enqueue,
drivers/usb/host/ohci-ep93xx.c|132| .urb_enqueue = ohci_urb_enqueue
drivers/usb/host/ohci-at91.c|250| .urb_enqueue = ohci_urb_enqueue,
static const struct hc_driver ohci_at91_hc_driver = {
.description = hcd_name,
.product_desc = "AT91 OHCI",
.hcd_priv_size = sizeof(struct ohci_hcd),

/*
* generic hardware linkage
*/
.irq = ohci_irq,
.flags = HCD_USB11 | HCD_MEMORY,

/*
* basic lifecycle operations
*/
.start = ohci_at91_start,
.stop = ohci_stop,
.shutdown = ohci_shutdown,

/*
* managing i/o requests and associated device resources
*/
.urb_enqueue = ohci_urb_enqueue,
.urb_dequeue = ohci_urb_dequeue,
.endpoint_disable = ohci_endpoint_disable,

/*
* scheduling support
*/
.get_frame_number = ohci_get_frame,

/*
* root hub support
*/
.hub_status_data = ohci_hub_status_data,
.hub_control = ohci_hub_control,
.hub_irq_enable = ohci_rhsc_enable,
#ifdef CONFIG_PM
.bus_suspend = ohci_bus_suspend,
.bus_resume = ohci_bus_resume,
#endif
.start_port_reset = ohci_start_port_reset,
};

static struct platform_driver ohci_hcd_at91_driver = {
.probe = ohci_hcd_at91_drv_probe,
.remove = ohci_hcd_at91_drv_remove,
.shutdown = usb_hcd_platform_shutdown,
.suspend = ohci_hcd_at91_drv_suspend,
.resume = ohci_hcd_at91_drv_resume,
.driver = {
.name = "at91_ohci",
.owner = THIS_MODULE,
},
};
ohci_hcd_at91_drv_probe
==> usb_hcd_at91_probe(&ohci_at91_hc_driver, pdev);
==*> usb_add_hcd(hcd, pdev->resource[1].start, IRQF_DISABLED); // pdev->resource[1].start等于irqnum中断号[luther.gliethttp]
==**> request_irq(irqnum, &usb_hcd_irq, irqflags, hcd->irq_descr, hcd) // 注册物理中断处理函数usb_hcd_irq

所以当usb host有数据或者异常时就会产生物理irq中断,随后kernel调用到usb_hcd_irq中断处理函数
usb_hcd_irq
==> hcd->driver->irq (hcd);即ohci_irq
==> ohci_irq
==*> dl_done_list (ohci);
==**> takeback_td(ohci, td);
==***> finish_urb(ohci, urb, status); // 如果ed->td_list.next链表上没有任何控制管道,bulk等数据发送时,调用该函数[luther.gliethtt]
==****> usb_hcd_giveback_urb(ohci_to_hcd(ohci), urb, status);
==*****> urb->complete (urb);即hid_irq_in // 调用回调函数, hid_irq_in会调用usb_submit_urb(urb, GFP_ATOMIC);
// 再次让usb host等待hid硬件设备的interrupt数据到来.[luther.gliethttp]

当然是不断的读取了。

下usb驱动也没用,HID-compliant mouse哪里可以下载到 驱动精灵里识别不到usb鼠标,只显示ps/2驱动,~

直接从设备管理器中找到未知设备右键选择“更新驱动程序”,系统提示“自动搜索更新的驱动程序软件”和“浏览计算机以查找驱动程序软件”的时候,选择“浏览计算机以查找驱动程序软件”,在接下来提示的驱动程序位置填入C:\Windows\winsxs 搜索 遇到警告也不管 直接安装驱动

我的笔记本 也出项这种情况
我外接的键盘 不能用了
不知道什么原因
鼠标还能用

相关要点总结:

17345737432:浅析usbhid驱动如何源源不断的获取usb鼠标
满狗答:// 后面的hid_start_in()函数会usb_submit_urb提交该urb,到 // usb host控制器,进而发送interrupt in事物到hid设备[鼠标或键盘]hid_irq_in, hid, interval); // hid_irq_in为interrupt中断管道数据处理回调函数 // urb->complete = hid_irq_in;// interval为usbhid driver需要每隔interval...

17345737432:开机总提示安装HID-compliant mouse驱动
满狗答:HID-compliant mouse 就是指USB接口的鼠标,开机老提示有两种可能,一种是鼠标的USB接口没有接好,如果试着尝试扒下来再插一次还没解决,那应该是驱动的问题,把电脑的驱动光盘放入光驱中,接着选择 我的电脑-属性-硬件-设备管理器,再打开的窗口先查看一下“鼠标和其他指针设备”里面有没有HID-complia...

17345737432:电脑里面什么HID?
满狗答:USB HID设备的一个好处就是操作系统自带了HID类的驱动程序,而用户无需去开发驱动程序,只要使用API系统调用即可完成通信。官方的资料下载详见:http://www.usb.org/developers/hidpage 其中包含最主要的两个说明:1. 《Device Class Definition for human interface device (HID)》2. 《Universal Serial...

17345737432:hidusb.sys蓝屏
满狗答:这个蓝屏应该是驱动程序的问题。蓝屏提示的原因是驱动程序中断不符合。中断是操作系统调用硬件的控制方式,这类问题,首先怀疑是驱动程序不兼容。你可以搜索一下提示的出问题的sys文件是什么硬件的驱动,将其卸载当前,然后安装硬件官网版本的驱动,一般可以解决问题。

17345737432:系统如何关闭USB驱动自动安装?
满狗答:一、手工修改注册表 更改注册表项,包含3个途径也,禁用USB设备启动、禁用向USB设备写入数据、隐藏和禁止查看盘符,下面挨个说明。1、打开注册表编辑器:Win键+R键打开运行窗口运行regedit,或者在Windows Vista开始菜单的搜索栏中输入regedit,开启注册表编辑器。如果弹出UAC提示窗口,则点击确认。2、在注册...

17345737432:hidusb.sys引起的蓝屏是什么原因?该怎么解决?
满狗答:hidsub.sys错误:USB外接键盘接口与其他USB接口设备发生冲突。用USB接口外接键盘,会起冲突导致蓝屏。建议:把USB接口的硬件全拔掉!只留一个键盘。

17345737432:如何解决usb鼠标不能使用usb键盘
满狗答:1、首先需要右击电脑桌面的”此电脑“图标,然后在弹出的下拉菜单中找到并点击”管理“选项:2、其次在弹出的页面框中找到并右击”设备管理器“选项里的”人体输入设备“里的“HID”按钮:3、接着你需要在接下来弹出的页面框中,找到并点击名称为”更新驱动程序“按钮:4、然后需要在接下来弹出的页面框...

17345737432:请问Linux内核里,USB键盘和鼠标的驱动都是哪些文件?
满狗答:USB 驱动程序(usb driver)是如何添加到驱动链表上去的?在每个 USB 驱动程序的被注册时,USB 驱动程序即会添加到驱动链表上去。比如鼠标驱动程序,usb_mouse_init 函数将通过 usb_register(&usb_mouse_driver)将鼠标驱动程序注册到 USB core 中,然后就添加到驱动链表中去了。其中 usb_mouse_driver ...

17345737432:usb视频设备,小编教你USB视频设备驱动
满狗答:USB 鼠标的检测问题 如果未能正确检测到 USB 鼠标或鼠标不工作,请按以下步骤排除故障。1) 单击“开始”按钮或按 Ctrl-Esc 激活“开始”菜单,选择“设置”,然后选择“控制面板”。2) 选择“系统”图标并按 Enter 键打开“系统属性”。驱动下载图-3 3) 从“系统属性”,选择“设备管理器”标签。...

17345737432:如何构造一个简单的USB过滤驱动程序
满狗答:我们知道,HIDUSB.SYS是使用内部IOCTRL发出URB给USB类驱动程序(USBD)读取数据的,那么,HIDUSB首先必须构造一个IRP_MJ_INTERNAL_DEVICE_CONTROL,它的IOCTL功能码为IOCTL_INTERNAL_USB_SUBMIT_URB(发出URB的内部IOCTL)。另外,因为我们要检查并修改的是USB键盘某个接口的报告描述,那么这个URB应该是URB_FUNCTION_GET_DESCRIPT...

(编辑:本站网友)
相关推荐
关于我们 | 客户服务 | 服务条款 | 联系我们 | 免责声明 | 网站地图
@ 百韵网