阿扁"辞职"了,kde4发布了,更让我激动的是,英雄志过两天又有更新了,这部连载长达8年的小说,终于要进入精彩的大结局。卢云的命运究竟如何?观海云远,四个性格理念完全不同的人,谁是好,谁是坏,谁是对,谁是错?何谓正道?
接着上回说,usb_hcd_pci_probe这个函数在"我是UHCI"中也有讨论,不过我想按照我的思路写下去。
46/**//**
47*usb_hcd_pci_probe-initializePCI-basedHCDs
48*@dev:USBHostControllerbeingprobed
49*@id:pcihotplugidconnectingcontrollertoHCDframework
50*Context:!in_interrupt()
51*
52*AllocatesbasicPCIresourcesforthisUSBhostcontroller,and
53*theninvokesthestart()methodfortheHCDassociatedwithit
54*throughthehotplugentry'sdriver_data.
55*
56*StorethisfunctionintheHCD'sstructpci_driverasprobe().
57*/
58intusb_hcd_pci_probe(structpci_dev*dev,conststructpci_device_id*id)
59...{
60structhc_driver*driver;
61structusb_hcd*hcd;
62intretval;
63
64if(usb_disabled())
65return-ENODEV;
66
67if(!id||!(driver=(structhc_driver*)id->driver_data))
68return-EINVAL;
69
70if(pci_enable_device(dev)<0)
71return-ENODEV;
72dev->current_state=PCI_D0;
73dev->dev.power.power_state=PMSG_ON;
74
75if(!dev->irq)...{
76dev_err(&dev->dev,
77"FoundHCwithnoIRQ.CheckBIOS/PCI%ssetup! ",
78pci_name(dev));
79retval=-ENODEV;
80gotoerr1;
81}
82
83hcd=usb_create_hcd(driver,&dev->dev,pci_name(dev));
84if(!hcd)...{
85retval=-ENOMEM;
86gotoerr1;
87}
88
89if(driver->flags&HCD_MEMORY)...{//EHCI,OHCI
90hcd->rsrc_start=pci_resource_start(dev,0);
91hcd->rsrc_len=pci_resource_len(dev,0);
92if(!request_mem_region(hcd->rsrc_start,hcd->rsrc_len,
93driver->description))...{
94dev_dbg(&dev->dev,"controlleralreadyinuse ");
95retval=-EBUSY;
96gotoerr2;
97}
98hcd->regs=ioremap_nocache(hcd->rsrc_start,hcd->rsrc_len);
99if(hcd->regs==NULL)...{
100dev_dbg(&dev->dev,"errormappingmemory ");
101retval=-EFAULT;
102gotoerr3;
103}
104
105}else...{//UHCI
106intregion;
107
108for(region=0;region<PCI_ROM_RESOURCE;region++)...{
109if(!(pci_resource_flags(dev,region)&
110IORESOURCE_IO))
111continue;
112
113hcd->rsrc_start=pci_resource_start(dev,region);
114hcd->rsrc_len=pci_resource_len(dev,region);
115if(request_region(hcd->rsrc_start,hcd->rsrc_len,
116driver->description))
117break;
118}
119if(region==PCI_ROM_RESOURCE)...{
120dev_dbg(&dev->dev,"noi/oregionsavailable ");
121retval=-EBUSY;
122gotoerr1;
123}
124}
125
126pci_set_master(dev);
127
128retval=usb_add_hcd(hcd,dev->irq,IRQF_SHARED);
129if(retval!=0)
130gotoerr4;
131returnretval;
132
133err4:
134if(driver->flags&HCD_MEMORY)...{
135iounmap(hcd->regs);
136err3:
137release_mem_region(hcd->rsrc_start,hcd->rsrc_len);
138}else
139release_region(hcd->rsrc_start,hcd->rsrc_len);
140err2:
141usb_put_hcd(hcd);
142err1:
143pci_disable_device(dev);
144dev_err(&dev->dev,"init%sfail,%d ",pci_name(dev),retval);
145returnretval;
146}
64行,usb_disabled()判断内核有没有开启支持usb,要是这都不支持,一切都免谈。
70行,pci_enable_device()这是对ehci三类接口中的pci configuration space进行操作,设置其中某个寄存器的值,使设备处于工作状态。调用pci_read_config_word()和pci_write_config_word来读写pci配置空间的寄存器。pci_enable_device -> pci_enable_device_bars -> do_pci_enable_device ... 原理不难,只要对照spec可以看懂。
72,73是电源管理的内容。75判断设备的中断号是否为空。
83,usb_create_hcd() 创建一个usb_hcd机构体。
1480/**//**
1481*usb_create_hcd-createandinitializeanHCDstructure
1482*@driver:HCdriverthatwillusethishcd
1483*@dev:deviceforthisHC,storedinhcd->self.controller
1484*@bus_name:valuetostoreinhcd->self.bus_name
1485*Context:!in_interrupt()
1486*
1487*Allocateastructusb_hcd,withextraspaceattheendforthe
1488*HCdriver'sprivatedata.Initializethegenericmembersofthe
1489*hcdstructure.
1490*
1491*Ifmemoryisunavailable,returnsNULL.
1492*/
1493structusb_hcd*usb_create_hcd(conststructhc_driver*driver,
1494structdevice*dev,char*bus_name)
1495...{
1496structusb_hcd*hcd;
1497
1498hcd=kzalloc(sizeof(*hcd)+driver->hcd_priv_size,GFP_KERNEL);
1499if(!hcd)...{
1500dev_dbg(dev,"hcdallocfailed ");
1501returnNULL;
1502}
1503dev_set_drvdata(dev,hcd);
1504kref_init(&hcd->kref);
1505
1506usb_bus_init(&hcd->self);
1507hcd->self.controller=dev;
1508hcd->self.bus_name=bus_name;
1509hcd->self.uses_dma=(dev->dma_mask!=NULL);
1510
1511init_timer(&hcd->rh_timer);
1512hcd->rh_timer.function=rh_timer_func;
1513hcd->rh_timer.data=(unsignedlong)hcd;
1514#ifdefCONFIG_PM
1515INIT_WORK(&hcd->wakeup_work,hcd_resume_work);
1516#endif
1517
1518hcd->driver=driver;
1519hcd->product_desc=(driver->product_desc)?driver->product_desc:
1520"USBHostController";
1521
1522returnhcd;
1523}
一下子出现了很多数据结构,现在有必要捋一捋它们之间的关系。
(1)描述驱动的数据结构
ehci主控器的驱动程序需要包括些什么东西?站在pci总线的角度来说,ehci是一个pci的设备,驱动程序里面必须提供操作ehci设备,比如开启(start),关闭(stop),重启(reset),中断的函数。另外,站在usb控制器的角度来说,驱动程序里面还要与底层usb系统交互的函数,如插入/删除urb(rb_enqueue, urb_dequeue)。
pci_driver ehci_pci_driver{
.........
.id_table = pci_ids, ------------>driver_data =(unsigned long) &ehci_pci_hc_driver,
.probe = usb_hcd_pci_probe
}
hc_driver ehci_pci_hc_driver{
........
.hcd_priv_size =sizeof(struct ehci_hcd),
.irq =ehci_irq,
.reset =ehci_pci_setup,
.start =ehci_run,
.stop =ehci_stop,
.shutdown =ehci_shutdown,
.urb_enqueue =ehci_urb_enqueue,
.urb_dequeue =ehci_urb_dequeue,
}
(2)描述设备的数据结构
usb_hcd{
........
usb_bus .self
.hcd_priv = ehci_hcd
}
usb_hcd注释上说USB Host Controller Driver,但我更愿意认为它是一个描述一个usb主控制器设备的数据结构。usb_hcd描述了usb主控制器共有的属性,usb_hcd.hcd_priv指向了特定的主控制器数据结构,它描述各自特有的属性。对ehci,是ehci_hcd,对uhci,是uhci_hcd。usb_hcd的成员usb_bus self 是HCD bus-glue layer,usb主控器与总线之间粘合剂。
这样,1498就好理解了。1506行usb_bus_init初始化usb_hcd.self。 1511-1513初始化 root harbor 计时器。然后就有返回到usb_hcd_pci_probe()
分享到:
相关推荐
Linux那些事儿之 系列 之 我是EHCI主机控制器 很不错的教程。通俗易懂。 全系列: Linux那些事儿 系列之2 Block+EHCI+PCI+SCSI http://download.csdn.net/source/1369471
Linux那些事儿之我是EHCI主机控制器.pdf Linux那些事儿之我是PCI.pdf Linux那些事儿之我是SCSI硬盘.pdf 注: 之前有人已经上传了《Linux那些事儿 系列》,其已经包含了:hub,sysfs,UHCI,usb core,U盘,此处,先...
Linux那些事儿之我是EHCI控制器 Linux那些事儿之我是PCI Linux那些事儿之我是SCSI硬盘 Linux那些事儿之我是Block层 Linux那些事儿之我是Sysfs 今天本人将9个单独的文档整理出来,做成了一个单独的文档,配有书签,...
由复旦fudan_abc写的,风趣的文笔,深入浅出地讲解了Linux内核相关...Linux那些事儿之我是EHCI主机控制器 Linux那些事儿之我是PCI Linux那些事儿之我是SCSI硬盘 Linux那些事儿之我是Block层 linux那些事儿之我是Sysfs
Linux那些事儿之我是EHCI主机控制器.pdf Linux那些事儿之我是Block层.pdf Linux那些事儿之我是SCSI硬盘.pdf Linux那些事儿之我是Sysfs.pdf Linux那些事儿之我是PCI.pdf Linux那些事儿之我是USB core.pdf Linux 那些...
导读.doc Linux那些事儿之我是Block层.pdf Linux那些事儿之我是EHCI主机控制器.pdf Linux那些事儿之我是Hub.pdf Linux那些事儿之我是USB_core.pdf Linux那些事儿之我是U盘.pdf等等 Linux那些事儿系列全在这里了
Linux那些事儿之我是EHCI主机控制器 Linux那些事儿之我是Hub Linux那些事儿之我是PCI Linux那些事儿之我是SCSI硬盘 Linux那些事儿之我是Sysfs Linux那些事儿之我是UHCI Linux那些事儿之我是USB core Linux那些事儿之...
Linux那些事儿之我是U盘 Linux那些事儿之我是USB_core Linux那些事儿之我是UHCI Linux那些事儿之我是Sysfs Linux那些事儿之我是SCSI硬盘 ...Linux那些事儿之我是EHCI主机控制器 Linux那些事儿之我是Block层
包括:Linux那些Linux那些事儿之我是SCSI硬盘,Linux那些事儿之我是Block层,Linux那些事儿之我是EHCI主机控制器,Linux那些事儿之我是HUB,Linux那些事儿之我是PCI,Linux那些事儿之我是Sysfs,Linux那些事儿之我是...
Linux那些事儿之我是XXX全集 包含USB core U盘 UHCI PCI SCSI硬盘 Block Hub EHCI 。 想学驱动的童鞋,不妨看看。该书主要是进行源代码的分析
2 Linux那些事儿之我是EHCI主机控制器 3 Linux那些事儿之我是HUB 4 Linux那些事儿之我是PCI 5 Linux那些事儿之我是SCSI硬盘 6 Linux那些事儿之我是Sysfs 7 Linux那些事儿之我是UHCI 8 Linux那些事儿之我是USB+core 9...
包括:Linux那些Linux那些事儿之我是SCSI硬盘,Linux那些事儿之我是Block层,Linux那些事儿之我是EHCI主机控制器,Linux那些事儿之我是HUB,Linux那些事儿之我是PCI,Linux那些事儿之我是Sysfs,Linux那些事儿之我是...
ehci文档,较全,linux驱动,详细的讲解
我是U盘 说的是2.6.10的内核 我是Sysfs 说的是2.6.10的内核 戏说USB 说的是2.6.22的内核 我是Hub/UHCI/EHCI 说的是2.6.22.1的内核
USB EHCI HCA DATE SHEET
我是Hub/UHCI/EHCI 说的是2.6.22.1的内核 其中我是U盘属于基础性的.这一阶段会遇到一些问题.比如urb提交之后究竟怎么处理的?用户空间究竟是如何访问U盘的?DMA究竟怎么回事. 这之后可以开始看Hub.这一阶段你会明白一...
linux那些事儿,Block层,EHCI主机控制器,Hub,PCI,SCSI硬盘,Sysfs,UHCI,USB core,U盘等文档。
EHCI HCD (Host Controller Driver) for USB.
linux系统上,EHCI USB主机控制器驱动程序(HCD)。