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

📄 linux设备驱动之usb主机控制器驱动分析-(5)_linux技术文章_linux_操作系统5.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_5.html -->
<HTML><HEAD><TITLE>linux设备驱动之USB主机控制器驱动分析-(5)_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技术文章_IOS off this hardware and reset if the controller&nbsp;&nbsp;&nbsp;&nbsp; &amp;#.." 
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主机控制器驱动分析-(5)_Linux技术文章_Linux_操作系统5.files/article2.css" 
type=text/css rel=stylesheet>
<SCRIPT src="linux设备驱动之USB主机控制器驱动分析-(5)_Linux技术文章_Linux_操作系统5.files/article.js" 
type=text/javascript></SCRIPT>

<SCRIPT src="linux设备驱动之USB主机控制器驱动分析-(5)_Linux技术文章_Linux_操作系统5.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主机控制器驱动分析-(5)_Linux技术文章_Linux_操作系统5.files/logo.gif" 
      width=200></A></DIV>
      <DIV class=ad_f1 id=ad_f1>
      <SCRIPT 
      src="linux设备驱动之USB主机控制器驱动分析-(5)_Linux技术文章_Linux_操作系统5.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/81b8tksdftk.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主机控制器驱动分析-(5)_Linux技术文章_Linux_操作系统5.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/81b8tksdftk.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主机控制器驱动分析-(5)_Linux技术文章_Linux_操作系统5.files/p_count.htm" 
lanuage="javascript"></SCRIPT>
 </SPAN> <A 
href="http://www.diybl.com/course/6_system/linux/Linuxjs/2008923/144940_5.html#comment">[ 
评论 ]</A></DIV>
<DIV class=artibody>
<DIV class=ad_f2 id=ad_f2>
<SCRIPT 
src="linux设备驱动之USB主机控制器驱动分析-(5)_Linux技术文章_Linux_操作系统5.files/ad_f2.js"></SCRIPT>
</DIV>
<DIV class=ad_f3 id=ad_f3>
<SCRIPT 
src="linux设备驱动之USB主机控制器驱动分析-(5)_Linux技术文章_Linux_操作系统5.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主机控制器驱动分析-(5)_Linux技术文章_Linux_操作系统5.files/art_top.js"></SCRIPT>
 
<P>IOS off this hardware and reset if the controller<BR>&nbsp;&nbsp;&nbsp;&nbsp; 
&nbsp;* isn't already safely quiescent.<BR>&nbsp;&nbsp;&nbsp;&nbsp; 
&nbsp;*/<BR>&nbsp;&nbsp;&nbsp;&nbsp; 
check_and_reset_hc(uhci);<BR>&nbsp;&nbsp;&nbsp;&nbsp; return 
0;<BR>}<BR>代码中hcd_to_uhci()的操作就不做详细分析了.在分配usb_hcd的内存时就已经分析过.<BR>结合UHCI 
spec来理解这段代码.spec中规定.从I/O空间的0x10处开始,为端口控制状态寄存器(PORTSC).占有两个字节.这个端口也是指UHCI控制器的root 
hub端口.该寄存器用来表示端口的状态,和操作相应端口.协议中并没有规定一个UHCI有多少个端口,但规定不能够超过8个.另外,协议中规定,PORTSC的bit7始终为1.因此可以根据这个特征来判断端口是否存在.另外,寄存器中的位全为1也是不正常的.<BR>这样就可以计算出UHCI的root 
hub有多少个端口.然后将值存放到uhci的rh_numports中.<BR>注意代码中取寄存器值的*2操作.这是因为每个PORTSC占两个字节.<BR>剩下的代码就只有check_and_reset_hc( 
)了.该函数用来检查UHCI是否需要重置.如果需要重置.那就进行UHCI的重置操作.代码如下:<BR>static void 
check_and_reset_hc(struct uhci_hcd *uhci)<BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp; if 
(uhci_check_and_reset_hc(to_pci_dev(uhci_dev(uhci)), 
uhci-&gt;io_addr))<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
finish_reset(uhci);<BR>}<BR>先来分析uhci_check_and_reset_hc()的代码.如下所示:<BR>int 
uhci_check_and_reset_hc(struct pci_dev *pdev, unsigned long 
base)<BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp; u16 legsup;<BR>&nbsp;&nbsp;&nbsp;&nbsp; 
unsigned int cmd, intr;<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp; 
/*<BR>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;* When restarting a suspended controller, 
we expect all the<BR>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;* settings to be the same as 
we left them:<BR>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;*<BR>&nbsp;&nbsp;&nbsp;&nbsp; 
&nbsp;*&nbsp;&nbsp; PIRQ and SMI disabled, no R/W bits set in 
USBLEGSUP;<BR>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;*&nbsp;&nbsp; Controller is stopped 
and configured with EGSM set;<BR>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;*&nbsp;&nbsp; No 
interrupts enabled except possibly Resume Detect.<BR>&nbsp;&nbsp;&nbsp;&nbsp; 
&nbsp;*<BR>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;* If any of these conditions are 
violated we do a complete reset.<BR>&nbsp;&nbsp;&nbsp;&nbsp; 
&nbsp;*/<BR>&nbsp;&nbsp;&nbsp;&nbsp; pci_read_config_word(pdev, UHCI_USBLEGSUP, 
&amp;legsup);<BR>&nbsp;&nbsp;&nbsp;&nbsp; if (legsup &amp; ~(UHCI_USBLEGSUP_RO | 
UHCI_USBLEGSUP_RWC)) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
dev_dbg(&amp;pdev-&gt;dev, "%s: legsup = 
0x%04x\n",<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
__FUNCTION__, legsup);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; goto 
reset_needed;<BR>&nbsp;&nbsp;&nbsp;&nbsp; 
}<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp; cmd = inw(base + 
UHCI_USBCMD);<BR>&nbsp;&nbsp;&nbsp;&nbsp; if ((cmd &amp; UHCI_USBCMD_RUN) || 
!(cmd &amp; UHCI_USBCMD_CONFIGURE) 
||<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
!(cmd &amp; UHCI_USBCMD_EGSM)) 
{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dev_dbg(&amp;pdev-&gt;dev, 
"%s: cmd = 
0x%04x\n",<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
__FUNCTION__, cmd);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; goto 
reset_needed;<BR>&nbsp;&nbsp;&nbsp;&nbsp; 
}<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp; intr = inw(base + 
UHCI_USBINTR);<BR>&nbsp;&nbsp;&nbsp;&nbsp; if (intr &amp; 
(~UHCI_USBINTR_RESUME)) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
dev_dbg(&amp;pdev-&gt;dev, "%s: intr = 
0x%04x\n",<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
__FUNCTION__, intr);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; goto 
reset_needed;<BR>&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp; return 
0;<BR>&nbsp;<BR>reset_needed:<BR>&nbsp;&nbsp;&nbsp;&nbsp; 
dev_dbg(&amp;pdev-&gt;dev, "Performing full 
reset\n");<BR>&nbsp;&nbsp;&nbsp;&nbsp; uhci_reset_hc(pdev, 
base);<BR>&nbsp;&nbsp;&nbsp;&nbsp; return 
1;<BR>}<BR>该函数的第一个参数为UHCI对应的pci_dev.第二个参数是I/O区间的起始地址.从代码中看来,有三种情况是需要重置的.这三种情况分别为:<BR>1:如果LEGACY 
SUPPORT REGISTER寄存器中R/W属性位被置,那就需要重启. LEGACY SUPPORT REGISTER通常是用于legacy 
键盘和鼠标.UHCI spec上对其有详细的定义.对照spec.所有R/W属性的位都是某种能力的使能开关.例如,bit13表示USB PIRQ 
Enable.如果该位被置,表示设备能够产生中断.否则就不可以.<BR>因此,对于这样的位,应该将其初始化.也即将设备的功能关闭.这也很容易理解,为了R/W属性位被置就需要重启UHCI<BR>&nbsp;<BR>2:USB 
CMD寄存器的UHCI_USBCMD_RUN被置为1, 
UHCI_USBCMD_CONFIGURE和UHCI_USBCMD_EGSM位为0的时候需要重启.<BR>UHCI_USBCMD_RUN表示UHCI正在调度数据,处于运行状态.显然,这个时候是应该被重启的<BR>UHCI_USBCMD_CONFIGURE:这个位是由软件控制的,只是起一个标识作用,不会对硬件产生任何影响.如果该位为了1,表示UHCI正处于配置状态.没有处于配置状态,当然就可以重启了.<BR>UHCI_USBCMD_EGSM表示UHCI是否处于Global 
Suspend mode.在这种模式下,是不会产生数据交互的.显然.如果该位为0.则表示该位不是Global Suspend 
mode模式,当然就需要重启了.<BR>&nbsp;<BR>3:USB 
INTR寄存器中除UHCI_USBINTR_RESUME如果其它位为1.则重启UHCI.<BR>在USB INTR寄存器中,bit4~bit15是保留的,始终为0.其它四位对应了UHCI的四种不同类型的中断,除了bit1表示的Resume 
interrupt外,其它类型的应该全部都被关掉.<BR>&nbsp;<BR>如果不需要重启UHCI,直接返回0即可.如果需要重启,则会调转到uhci_reset_hc().代码如下:<BR>void 
uhci_reset_hc(struct pci_dev *pdev, unsigned long 
base)<BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp; /* Turn off PIRQ enable and SMI 
enable.&nbsp; (This also turns off the<BR>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;* 
BIOS's USB Legacy Support.)&nbsp; Turn off all the R/WC bits 
too.<BR>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;*/<BR>&nbsp;&nbsp;&nbsp;&nbsp; 
pci_write_config_word(pdev, UHCI_USBLEGSUP, 
UHCI_USBLEGSUP_RWC);<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp; /* Reset the HC - 
this will force us to get a<BR>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;* new notification 
of any already connected<BR>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;* ports due to the 
virtual disconnect that it<BR>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;* 
implies.<BR>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;*/<BR>&nbsp;&nbsp;&nbsp;&nbsp; 
outw(UHCI_USBCMD_HCRESET, base + UHCI_USBCMD);<BR>&nbsp;&nbsp;&nbsp;&nbsp; 
mb();<BR>&nbsp;&nbsp;&nbsp;&nbsp; udelay(5);<BR>&nbsp;&nbsp;&nbsp;&nbsp; if 
(inw(base + UHCI_USBCMD) &amp; 

⌨️ 快捷键说明

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