LINUX下USB1.1设备学习小记(4)_uhci(1)
时间:2009-03-14 来源:superfight
|
这是最宏观的架构图
500)this.width=500;" border=0> 先讲解红框中的内容,先不在PDIUSBD12上写入HID等模块,等讲解完UHCI和PDIUSBD12的详细通讯过程之后,再在D12上写HID的模块内容,进行蓝框内容的讲解 首先是usb主机控制器UHCI在LINUX下的架构,关于sysfs的内容在” 个人对kobject的一点研究”中有介绍,为了减少图的大小和复杂度,sysfs中只简单的描述kobject的parent属性, kset和 ktype就不详细说了
现在看看usb设备在linux的sysfs体系下的宏观驱动框架 500)this.width=500;" border=0> 在这个架构中,展示的为基本真实的目录体系,例如在/sys s-xxxxxxx-devices中的所有目录都是连接到/sys/devices的,为什么呢个pci的框是红色的呢?因为我把pci设备和pci总线的目录合并到一起了,所以前面只说了基本........,因为我对pci的了解还不深,所以合起来,等我搞定pci总线的时候会回来修改的
对于uhci来说,重要的有3个目录,devices下的pci设备目录,重要的数据结构都挂载在这个目录所表示的设备下,bus->pci->drivers这个目录是pci设备的驱动,linux使用这些驱动管理pci总线上的设备,bus->usb->drivers这个目录是usb设备的驱动,linux使用这些驱动管理所有的usb设备
下面这个图是目录的具体数据结构组成,可以发现,和上图的结构层次是一致的
500)this.width=500;" border=0> 在这个图中,2个紫框中的数据结构是我们重点关注的内容,其它数据结构基本只在设备初始化和电源管理中使用
其中左边的紫框中的数据结构我还没画完整,因为没地方放了.....将在后面的介绍中完整的展示给大家
好,现在开始我们的UHCI源代码之旅(PS:碍于篇幅问题,注册失败所使用的释放函数和DEBUG代码将不会分析,我就不把这些代码列出来了,假定不使用DEBUG并且注册的条件总是满足的) 首先是usb几个重要驱动的加载,usbfs,usb和hub
usb_init在linux内核\drivers\usb\core\usb.c中
static int __init usb_init(void) |
int usb_register_device_driver(struct usb_device_driver *new_udriver,
500)this.width=500;" border=0> |
khubd_task = kthread_run(hub_thread, NULL, "khubd");
这条代码启动一个名为”khubd”的线程,这个线程的用途是啥现在先保密,= 3= 3个驱动挂载完毕后的结构图如下
500)this.width=500;" border=0> usb驱动注册完成后,现在到主角登场了,PCI设备UHCI驱动的注册,为什么要强调PCI呢?因为UHCI是两面的,一面使用PCI总线连接PC,一边使用USB接口连接USB设备,现在在PC上注册UHCI,当然注册UHCI要使用PCI总线的注册函数了
uhci_hcd_init在/drivers/usb/host/uhci-hcd.c中
static int __init uhci_hcd_init(void)
500)this.width=500;" border=0> |