Chinaunix首页 | 论坛 | 博客
  • 博客访问: 930439
  • 博文数量: 55
  • 博客积分: 400
  • 博客等级: 一等列兵
  • 技术积分: 2779
  • 用 户 组: 普通用户
  • 注册时间: 2010-03-30 13:08
个人简介

一个人的差异在于业余时间

文章分类

全部博文(55)

文章存档

2019年(1)

2018年(1)

2017年(1)

2016年(2)

2015年(20)

2014年(10)

2013年(7)

2012年(12)

2011年(1)

分类: 嵌入式

2012-03-31 23:20:15

这里我们先讲讲USB热插拔事件的处理工作。---Khubd守护进程。
-Khubd守护进程它是一个守护进程,来检查usb port的事件通知HCD和usb core,然后做相应的处理。
驱动目录drivers/usb/*
usb/serial  usb 串行设备驱动 (例如usb 3G卡、蓝牙等)
usb/storage  usb 大储量磁盘驱动(u盘)  
usb/host usb host usb主机控制器驱动(嵌入式otg:dwc_otg)
usb/core   usb 核心一些处理代码,所有的驱动相关处理都在这里,也都注册到它里面。
usb/usb-skeleton.c 经典的usb客户驱动框架,可以参考。
当然还有其他这里不再说明。

下面贴出USB的整体驱动框架:

这里我们主要分析khub的工作原理: 硬件层次是hub的工作,如何和host及其设备间通信及相应事件
看usb/core/hub.c  

int usb_hub_init(void)
{
if (usb_register(&hub_driver) < 0) {
printk(KERN_ERR "%s: can't register hub driver\n",
usbcore_name);
return -1;
}

khubd_task = kthread_run(hub_thread, NULL, "khubd");
if (!IS_ERR(khubd_task))
return 0;

/* Fall through if kernel_thread failed */
usb_deregister(&hub_driver);
printk(KERN_ERR "%s: can't start khubd\n", usbcore_name);

return -1;
}
这里我们只关心kthread_run(hub_thread, NULL, "khubd"); 然后我们看hub_thread函数
static int hub_thread(void *__unused)
{
do {
hub_events();
wait_event_interruptible(khubd_wait,
!list_empty(&hub_event_list) ||
kthread_should_stop());
try_to_freeze();
} while (!kthread_should_stop() || !list_empty(&hub_event_list));

pr_debug("%s: khubd exiting\n", usbcore_name);
return 0;
}
这里我们看到了hub_events()函数。然后设置运行状态,如果有事件就加入hub_event_list。
自此khubd运行起来了。
这里我们同样贴出它的函数调用流程图(这里懒得自己画了,就剪切了个^^)

通过流程图我们可以清晰的明白,当usb设备插入usb接口后,khubd运行,它检测到port状态的变化
调用hub_port_connect_change(),如果是新设备那么usb_allco_dev,然后调用usb_new_device来进行配置使usb设备可以正常工作。详细流程请看源码。

阅读(8133) | 评论(2) | 转发(9) |
1

上一篇:新开博

下一篇:USB 3G卡热插拔那些事2

给主人留下些什么吧!~~

背包包1112012-04-04 22:05:13

喜欢热插拔\(^o^)/~