⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 linux设备驱动之usb主机控制器驱动分析-(2)_linux技术文章_linux_操作系统2.htm

📁 linux设备驱动之USB主机控制器驱动分析
💻 HTM
📖 第 1 页 / 共 3 页
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- saved from url=(0072)http://www.diybl.com/course/6_system/linux/Linuxjs/2008923/144940_2.html -->
<HTML><HEAD><TITLE>linux设备驱动之USB主机控制器驱动分析-(2)_Linux技术文章_Linux_操作系统</TITLE>
<META http-equiv=Content-Type content=text/html;charset=gb2312>
<META content=www.diybl.com,DIY部落版权所有 name=Copyright>
<META content=linux设备驱动之USB主机控制器驱动分析_Linux技术文章_Linux_操作系统 name=keywords>
<META 
content="linux设备驱动之USB主机控制器驱动分析_Linux技术文章_160;&nbsp;&nbsp;&nbsp; goto err4;&nbsp;&nbsp;&nbsp;&nbsp; return retval;.." 
name=description>
<META content=index,follow name=robots>
<META content=INDEX,FOLLOW name=GOOGLEBOT><LINK href="article2.css" 
type=text/css rel=stylesheet><LINK 
href="linux设备驱动之USB主机控制器驱动分析-(2)_Linux技术文章_Linux_操作系统2.files/article2.css" 
type=text/css rel=stylesheet>
<SCRIPT src="linux设备驱动之USB主机控制器驱动分析-(2)_Linux技术文章_Linux_操作系统2.files/article.js" 
type=text/javascript></SCRIPT>

<SCRIPT src="linux设备驱动之USB主机控制器驱动分析-(2)_Linux技术文章_Linux_操作系统2.files/1060103.js" 
type=text/javascript></SCRIPT>

<META content="MSHTML 6.00.2900.3395" name=GENERATOR></HEAD>
<BODY><INPUT type=hidden value=144940 name=passage_id><INPUT type=hidden 
value=1060103 name=catalog_id> 
<DIV id=wrap>
<DIV class=top_bar align=center>
<TABLE cellSpacing=0 width=935>
  <TBODY>
  <TR>
    <TD><A href="http://www.diybl.com/">网站首页</A></TD>
    <TD class=top_bar_sline></TD>
    <TD><A href="http://news.diybl.com/" target=_blank>新闻首页</A></TD>
    <TD class=top_bar_sline></TD>
    <TD><A href="http://www.diybl.com/course/1_web/">网页设计</A></TD>
    <TD class=top_bar_sline></TD>
    <TD><A href="http://www.diybl.com/course/2_picdesign/">图形动画</A></TD>
    <TD class=top_bar_sline></TD>
    <TD><A href="http://www.diybl.com/course/3_program/">软件编程</A></TD>
    <TD class=top_bar_sline></TD>
    <TD><A href="http://www.diybl.com/course/4_webprogram/">网站开发</A></TD>
    <TD class=top_bar_sline></TD>
    <TD><A href="http://www.diybl.com/course/5_office/">办公软件</A></TD>
    <TD class=top_bar_sline></TD>
    <TD><A href="http://www.diybl.com/course/6_system/">操作系统</A></TD>
    <TD class=top_bar_sline></TD>
    <TD><A href="http://www.diybl.com/course/7_databases/">数据库</A></TD>
    <TD class=top_bar_sline></TD>
    <TD><A href="http://www.diybl.com/course/webjsh/">网络技术</A></TD>
    <TD class=top_bar_sline></TD>
    <TD><A href="http://www.diybl.com/course/comshiti/">认证考试</A></TD>
    <TD class=top_bar_sline></TD>
    <TD><A href="http://www.diybl.com/course/fwzl/">范文资料</A></TD>
    <TD class=top_bar_sline></TD>
    <TD><A href="http://www.diybl.com/course/hack/">黑客攻防</A></TD>
    <TD class=top_bar_sline></TD>
    <TD><A href="http://www.diybl.com/chm/" target=_blank><FONT 
      color=red>书籍教程</FONT></A></TD>
    <TD class=top_bar_sline></TD>
    <TD><A href="http://bbs.diybl.com/" 
target=_blank>进入论坛</A></TD></TR></TBODY></TABLE></DIV>
<TABLE class=adNone id=PublicRelation cellSpacing=0 cellPadding=0 width=950 
border=0>
  <TBODY>
  <TR>
    <TD vAlign=top width=864>
      <DIV class=logo><A href="http://www.diybl.com/" target=_blank><IMG 
      height=60 
      src="linux设备驱动之USB主机控制器驱动分析-(2)_Linux技术文章_Linux_操作系统2.files/logo.gif" 
      width=200></A></DIV>
      <DIV class=ad_f1 id=ad_f1>
      <SCRIPT 
      src="linux设备驱动之USB主机控制器驱动分析-(2)_Linux技术文章_Linux_操作系统2.files/ad_f1.js"></SCRIPT>
      </DIV><!--<div class="top_bar2">-->
      <UL class=menu>
        <LI><A href="http://www.diybl.com/course/6_system/linux/" 
        target=_blank><SPAN>Linux</SPAN></A>
        <LI><A href="http://www.diybl.com/course/6_system/linux/Linuxxl/" 
        target=_blank><SPAN>Linux系列教程</SPAN></A>
        <LI><A href="http://www.diybl.com/course/6_system/linux/linuxjq/" 
        target=_blank><SPAN>Linux应用技巧</SPAN></A>
        <LI><A 
        href="http://www.diybl.com/course/6_system/linux/Linuxjs/6a44sdetjoktk.html" 
        target=_blank><SPAN>Linux技术文章</SPAN></A></LI></UL><!--</div>--></TD>
    <TD width=6></TD>
    <TD vAlign=top align=middle width=100>
      <DIV class=hotNCout>
      <DIV class=hotNC>
      <UL>
        <LI><A 
        href="javascript:window.external.addFavorite('http://www.diybl.com/','DIY部落');">加入收藏</A> 

        <LI><A href="http://www.diybl.com/map.html" target=_blank>网站地图</A> 
        <LI><A href="http://www.diybl.com/chm/" target=_blank>书籍教程</A> 
        <LI><A href="http://www.diybl.com/user/register.asp" 
        target=_blank>会员注册</A> </LI></UL></DIV></DIV></TD></TR></TBODY></TABLE>
<DIV class=split style="HEIGHT: 3px"></DIV>
<DIV class=ad_ftop id=ad_ftop>
<SCRIPT 
src="linux设备驱动之USB主机控制器驱动分析-(2)_Linux技术文章_Linux_操作系统2.files/ad_ftop.js"></SCRIPT>
</DIV>
<DIV class=subNav>
<DIV style="FLOAT: right"><INPUT name=wd1> <INPUT onclick=tosearch(document.all.wd1); type=button value=" 千寻搜索 "></DIV><SPAN><A 
href="http://www.diybl.com/">DIY部落</A> &gt;&gt; <A 
href="http://www.diybl.com/course/6_system/">操作系统</A> &gt;&gt; <A 
href="http://www.diybl.com/course/6_system/linux/">Linux</A> &gt;&gt; <A 
href="http://www.diybl.com/course/6_system/linux/Linuxjs/6a44sdetjoktk.html">Linux技术文章</A> 
&gt;&gt; 正文</SPAN></DIV>
<DIV class=split></DIV>
<DIV class=main>
<DIV class=lc_blue>
<DIV class=lcBlk>
<H1>linux设备驱动之USB主机控制器驱动分析</H1>
<DIV class=from_info>http://www.diybl.com/ 2008-9-23  网络 点击:<SPAN 
style="FONT-WEIGHT: bold; COLOR: #ff0000">
<SCRIPT src="linux设备驱动之USB主机控制器驱动分析-(2)_Linux技术文章_Linux_操作系统2.files/p_count.htm" 
lanuage="javascript"></SCRIPT>
 </SPAN> <A 
href="http://www.diybl.com/course/6_system/linux/Linuxjs/2008923/144940_2.html#comment">[ 
评论 ]</A></DIV>
<DIV class=artibody>
<DIV class=ad_f2 id=ad_f2>
<SCRIPT 
src="linux设备驱动之USB主机控制器驱动分析-(2)_Linux技术文章_Linux_操作系统2.files/ad_f2.js"></SCRIPT>
</DIV>
<DIV class=ad_f3 id=ad_f3>
<SCRIPT 
src="linux设备驱动之USB主机控制器驱动分析-(2)_Linux技术文章_Linux_操作系统2.files/ad_f3.js"></SCRIPT>
</DIV>文章搜索: <INPUT maxLength=255 size=30 name=wd2> &nbsp;&nbsp; <INPUT onclick=tosearch(document.all.wd2); type=button value=千寻搜索><A 
class=redlink 
href="javascript:self.location='/user/chm/rar.asp?c_id=48375'">【点击打包该文章】</A>
<SCRIPT 
src="linux设备驱动之USB主机控制器驱动分析-(2)_Linux技术文章_Linux_操作系统2.files/art_top.js"></SCRIPT>
 
<P>160;&nbsp;&nbsp;&nbsp; goto err4;<BR>&nbsp;&nbsp;&nbsp;&nbsp; return 
retval;<BR>&nbsp;<BR>&nbsp;err4:<BR>&nbsp;&nbsp;&nbsp;&nbsp; if 
(driver-&gt;flags &amp; HCD_MEMORY) 
{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
iounmap(hcd-&gt;regs);<BR>&nbsp;err3:<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
release_mem_region(hcd-&gt;rsrc_start, 
hcd-&gt;rsrc_len);<BR>&nbsp;&nbsp;&nbsp;&nbsp; } 
else<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
release_region(hcd-&gt;rsrc_start, 
hcd-&gt;rsrc_len);<BR>&nbsp;err2:<BR>&nbsp;&nbsp;&nbsp;&nbsp; 
usb_put_hcd(hcd);<BR>&nbsp;err1:<BR>&nbsp;&nbsp;&nbsp;&nbsp; 
pci_disable_device(dev);<BR>&nbsp;&nbsp;&nbsp;&nbsp; dev_err(&amp;dev-&gt;dev, 
"init %s fail, %d\n", pci_name(dev), retval);<BR>&nbsp;&nbsp;&nbsp;&nbsp; return 
retval;<BR>}<BR>这段代码位于linux-2.6.25/drivers/usb/core下的hcd-pci.c中.该路径下的代码是被所有USB控制器共享的.因此,我们在代码中可以看到usb_hcd_pci_probe()会有区别UHCI还是其它类型的控制器的操作.在USB驱动架构中,有很多代码是关于电源管理的.在这里我们先忽略电源管理的部份.之后再以单独章节的形式来分析linux上的电源管理子系统.<BR>首先,会调用&nbsp;pci_enable_device()来启用PCI设备.正如在分析PCI设备的时候.初始化之后的PCI设备很多功能都是被禁用的.例如I/O/内存空间,IRQ等.其次,OHCI必须要使用中断.如果对应中断号不存在,说明此设备不是一个UHCI.或者出现了错误.直接跳出.不进行后续操作.然后,OHCI必须要使用DMA.所以会调用pci_set_master()将开启设备的DMA传输能力.另外,OHCI 
SPEC上有定义.在PCI的配置空间中,0x20~0x23定义了OHCI的I/O区间和大小.也就是说OHCI对应的pci_dev中,只有一个I/O资源区间是有效的.<BR>对应到上面的代码:<BR>id-&gt;driver_data的赋值在uhci_hcd_init()中被特别指出过.被赋值为uhci_driver.它的结构如下:<BR>static 
const struct hc_driver uhci_driver = {<BR>&nbsp;&nbsp;&nbsp;&nbsp; .description 
=&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
hcd_name,<BR>&nbsp;&nbsp;&nbsp;&nbsp; .product_desc 
=&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "UHCI Host 
Controller",<BR>&nbsp;&nbsp;&nbsp;&nbsp; .hcd_priv_size =&nbsp;&nbsp; 
sizeof(struct uhci_hcd),<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp; /* Generic 
hardware linkage */<BR>&nbsp;&nbsp;&nbsp;&nbsp; .irq 
=&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
uhci_irq,<BR>&nbsp;&nbsp;&nbsp;&nbsp; .flags =&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
HCD_USB11,<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp; /* Basic lifecycle operations 
*/<BR>&nbsp;&nbsp;&nbsp;&nbsp; .reset =&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
uhci_init,<BR>&nbsp;&nbsp;&nbsp;&nbsp; .start =&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
uhci_start,<BR>#ifdef CONFIG_PM<BR>&nbsp;&nbsp;&nbsp;&nbsp; .suspend 
=&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
uhci_suspend,<BR>&nbsp;&nbsp;&nbsp;&nbsp; .resume =&nbsp;&nbsp;&nbsp;&nbsp; 
uhci_resume,<BR>&nbsp;&nbsp;&nbsp;&nbsp; .bus_suspend 
=&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
uhci_rh_suspend,<BR>&nbsp;&nbsp;&nbsp;&nbsp; .bus_resume 
=&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
uhci_rh_resume,<BR>#endif<BR>&nbsp;&nbsp;&nbsp;&nbsp; .stop 
=&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; 
uhci_stop,<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp; .urb_enqueue 
=&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
uhci_urb_enqueue,<BR>&nbsp;&nbsp;&nbsp;&nbsp; .urb_dequeue 
=&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
uhci_urb_dequeue,<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp; .endpoint_disable 
=&nbsp;&nbsp;&nbsp; uhci_hcd_endpoint_disable,<BR>&nbsp;&nbsp;&nbsp;&nbsp; 
.get_frame_number =&nbsp;&nbsp;&nbsp; 
uhci_hcd_get_frame_number,<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp; 
.hub_status_data = uhci_hub_status_data,<BR>&nbsp;&nbsp;&nbsp;&nbsp; 
.hub_control =&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
uhci_hub_control,<BR>};<BR>可以看到,在的结构为struct hc_driver. Hc就是host 
control的意思.即为主机控制器驱动.该结构包函了很多函数指针,具体的操作我们等能后涉及的时候再回过来分析.另外,从里面可以看到,它的flags被定义成了HCD_USB1.1.<BR>特别说明一下:UHCI是一个基于usb1.1的设备.USB1.1和USB2.0的最大区别就是USB2.0中定义有高速设备.因此,UHCI是一个不支持高速的USB控制器.只有EHCI才会支持高速.因此,在配置kernel的时候,UHCI和EHCI通常都会选上.如果只选用UHCI或者只选用EHCI.有很多设备都是不能够工作的.<BR>因为flags被定义成HCD_USB1.1.所以代码中的if(driver-&gt;flags 
&amp; HCD_MEMORY) … else 
…流程就转入到else下面.<BR>&nbsp;<BR>然后,我们目光注视到usb_create_hcd()和usb_add_hcd()这两个函数.看函数名称,一个是产生struct 
usb_hcd.另外的一个是将这个hcd添加到系统.hcd就是host control 
driver的意思.先来分析一下usb_create_hcd的代码:<BR>struct usb_hcd *usb_create_hcd (const 
struct hc_driver *driver,<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
struct device *dev, char *bus_name)<BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp; struct 
usb_hcd *hcd;<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp; hcd = kzalloc(sizeof(*hcd) + 
driver-&gt;hcd_priv_size, GFP_KERNEL);<BR>&nbsp;&nbsp;&nbsp;&nbsp; if (!hcd) 
{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dev_dbg (dev, "hcd alloc 
failed\n");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 
NULL;<BR>&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp; 
dev_set_drvdata(dev, hcd);<BR>&nbsp;&nbsp;&nbsp;&nbsp; 
kref_init(&amp;hcd-&gt;kref);<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp; 
usb_bus_init(&amp;hcd-&gt;self);<BR>&nbsp;&nbsp;&nbsp;&nbsp; 
hcd-&gt;self.controller = dev;<BR>&nbsp;&nbsp;&nbsp;&nbsp; hcd-&gt;self.bus_name 
= bus_name;<BR>&nbsp;&nbsp;&nbsp;&nbsp; hcd-&gt;self.uses_dma = 
(dev-&gt;dma_mask != NULL);<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp; 
init_timer(&amp;hcd-&gt;rh_timer);<BR>&nbsp;&nbsp;&nbsp;&nbsp; 
hcd-&gt;rh_timer.function = rh_timer_func;<BR>&nbsp;&nbsp;&nbsp;&nbsp; 
hcd-&gt;rh_timer.data = (unsigned long) hcd;<BR>#ifdef 
CONFIG_PM<BR>&nbsp;&nbsp;&nbsp;&nbsp; INIT_WORK(&amp;hcd-&gt;wakeup_work, 
hcd_resume_work);<BR>#endif<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp; hcd-&gt;driver 
= driver;<BR>&nbsp;&nbsp;&nbsp;&nbsp; hcd-&gt;product_desc = 
(driver-&gt;product_desc) ? driver-&gt;product_desc 
:<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
"USB Host Controller";<BR>&nbsp;&nbsp;&nbsp;&nbsp; return 
hcd;<BR>}<BR>函数的三个参数:<BR>1: 
driver:也就是上面分析的pci_driver的id_table的driver_data项.即struct hc_driver<BR>2: dev: 
OHCI所对应的pci_dev中内嵌的struct device结构<BR>3: 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -