📄 linux设备驱动之usb主机控制器驱动分析-(7)_linux技术文章_linux_操作系统7.htm
字号:
retval = usb_new_device (usb_dev);<BR> if (retval)
{<BR> dev_err (parent_dev,
"can't register root hub for %s,
%d\n",<BR>
usb_dev->dev.bus_id, retval);<BR>
}<BR>
mutex_unlock(&usb_bus_list_lock);<BR> <BR> if
(retval == 0) {<BR>
spin_lock_irq
(&hcd_root_hub_lock);<BR>
//root
hub注册成功,将rh_registered设为1<BR>
hcd->rh_registered = 1;<BR>
spin_unlock_irq
(&hcd_root_hub_lock);<BR> <BR>
/* Did the HC die before the root hub was registered?
*/<BR>
//如果hcd被人为置为了HALT<BR> if
(hcd->state ==
HC_STATE_HALT)<BR>
usb_hc_died (hcd); /* This time clean up */<BR>
}<BR> <BR> return
retval;<BR>}<BR>对于代码中较简单部份,结合注释应该就能看懂了.详细分析一下里面涉及到的几个子函数.<BR>第一个是usb_set_device_state().<BR>在分析代码之前,先来看一下USB设备的状态机.在USB2.0的spec上.有一副这样的图:<BR><IMG
src="linux设备驱动之USB主机控制器驱动分析-(7)_Linux技术文章_Linux_操作系统7.files/080909094606.jpg"
onload="javascript:if(this.width>500)this.width=500;"
border=0><BR> <BR>上图表示USB设备的各种状态的转变.<BR>1:如果设备末连接,对应状态为USB_STATE_NOTATTACHED.
这个状态在spec上末表示.是linux中自定义的.实际上它就是表示Attached的一个对立状态.<BR>2:如果设备连上了,但是没有打开电源,处于Attached状态.USB检测到一个设备的时候,会将它初始化这个状态(道理很简单,因为要连上才能检测到
^_^).可以查看下usb_alloc_dev()函数对状态的初始化.在代码,这个状态对应为:<FONT
size=3> </FONT>USB_STATE_ATTACHED.<BR>3:如果在上个状态中打开了设备此时打开了电源,设备处于Rowered.在代码中对应USB_STATE_POWERED.<BR>4:如果在上一个状态中,设备被重置,也即初始化,就会转入Default.代码中对应USB_STATE_DEFAULT.<BR>5:如果在上一个状态中,USB为设备分配了地址,就会转入到Address.代码中对应USB_STATE_ADDRESS.<BR>6:如果在上一个状态中,USB完成了设备的配置.就会转入Configured.代码中对应USB_STATE_CONFIGURED.<BR>7:上面除NoAttached和Attached外的所有状态,如果设备被挂起,就会转入Suspended.代码中对应USB_STATE_SUSPENDED.<BR>特别说明:UHCI本身带有root
hub功能.hub是一个特殊的USB设备.它的设备地址被固定为1.<BR> <BR>对应到上面的代码中:<BR>指定root
hub的devnum之后,就将其状态设为Address.这个devnum也即设备的地址.设备状态函数为usb_set_device_state().代码如下:<BR>void
usb_set_device_state(struct usb_device
*udev,<BR> enum usb_device_state
new_state)<BR>{<BR> unsigned long
flags;<BR> <BR>
spin_lock_irqsave(&device_state_lock, flags);<BR>
//如果设备末连接.不做任何处理<BR> if (udev->state ==
USB_STATE_NOTATTACHED)<BR>
; /* do nothing */<BR> else if
(new_state != USB_STATE_NOTATTACHED)
{<BR> <BR> /* root hub
wakeup capabilities are managed
out-of-band<BR> * and may
involve silicon errata ... ignore them
here.<BR>
*/<BR> //如果不是root
hub<BR> if (udev->parent)
{<BR>
if (udev->state ==
USB_STATE_SUSPENDED<BR>
|| new_state ==
USB_STATE_SUSPENDED)<BR>
; /* No change to wakeup settings
*/<BR>
else if (new_state ==
USB_STATE_CONFIGURED)<BR>
device_init_wakeup(&udev->dev,<BR>
(udev->actconfig->desc.bmAttributes<BR>
&
USB_CONFIG_ATT_WAKEUP));<BR>
else<BR> &</P>
<DIV class=ad_f10 id=ad_f10>
<SCRIPT
src="linux设备驱动之USB主机控制器驱动分析-(7)_Linux技术文章_Linux_操作系统7.files/ad_f10.js"></SCRIPT>
</DIV>
<DIV class=ad_f11 id=ad_f11>
<SCRIPT
src="linux设备驱动之USB主机控制器驱动分析-(7)_Linux技术文章_Linux_操作系统7.files/ad_f11.js"></SCRIPT>
</DIV>
<DIV class=sfd>欢迎光临<A href="http://www.diybl.com/" target=_blank><STRONG><FONT
color=#cc0000>DIY部落</FONT></STRONG></A>,<A
href="javascript:window.external.addFavorite(window.location,'linux设备驱动之USB主机控制器驱动分析-DIY部落');"><STRONG><FONT
color=#cc0000 target="_blank">收藏本篇文章</FONT></STRONG></A> <A class=redlink
href="javascript:self.location='/user/chm/rar.asp?c_id=144940'">【点击打包该文章】</A></DIV>
<DIV class=lcko><A
href="http://www.diybl.com/course/6_system/linux/Linuxjs/2008923/144940.html">[1]</A><A
href="http://www.diybl.com/course/6_system/linux/Linuxjs/2008923/144940_2.html">
[2]</A><A
href="http://www.diybl.com/course/6_system/linux/Linuxjs/2008923/144940_3.html">
[3]</A><A
href="http://www.diybl.com/course/6_system/linux/Linuxjs/2008923/144940_4.html">
[4]</A><A
href="http://www.diybl.com/course/6_system/linux/Linuxjs/2008923/144940_5.html">
[5]</A><A
href="http://www.diybl.com/course/6_system/linux/Linuxjs/2008923/144940_6.html">
[6]</A><A
href="http://www.diybl.com/course/6_system/linux/Linuxjs/2008923/course/6_system/linux/Linuxjs/2008923/144939.html"><SPAN
style="DISPLAY: none">'lcko'</SPAN></A> [7] <A
href="http://www.diybl.com/course/6_system/linux/Linuxjs/2008923/144940_8.html">[8]</A><A
href="http://www.diybl.com/course/6_system/linux/Linuxjs/2008923/144940_9.html">
[9]</A><A
href="http://www.diybl.com/course/6_system/linux/Linuxjs/2008923/144940_10.html">
[10]</A><A
href="http://www.diybl.com/course/6_system/linux/Linuxjs/2008923/144940_11.html">
[11]</A><A
href="http://www.diybl.com/course/6_system/linux/Linuxjs/2008923/144940_12.html">
[12]</A><A
href="http://www.diybl.com/course/6_system/linux/Linuxjs/2008923/144940_13.html">
[13]</A></DIV></DIV>
<DIV class=ad_f4 id=ad_f4>
<SCRIPT
src="linux设备驱动之USB主机控制器驱动分析-(7)_Linux技术文章_Linux_操作系统7.files/ad_f4.js"></SCRIPT>
</DIV>
<DIV class=mediacontent>如果图片或页面不能正常显示请<A class=redlink
onmouseover="this.style.cursor='hand';"
onclick="openerror('144940','linux设备驱动之USB主机控制器驱动分析');">点击这里</A> 站内搜索: <INPUT
maxLength=255 size=25 name=wd3> <INPUT onclick=tosearch(document.all.wd3); type=button value=千寻搜索></DIV>
<DIV style="CLEAR: both" align=center></DIV>
<DIV class=toollinks>【<A
href="javascript:window.external.addFavorite(window.location,'linux设备驱动之USB主机控制器驱动分析-DIY部落');">收藏此页</A>】【<A
href="http://www.diybl.com/course/6_system/linux/Linuxjs/7076ftksdtk.html"
target=_blank>栏目页面</A>】【<A
href="http://www.diybl.com/course/6_system/linux/Linuxjs/2008923/144940_7.html#comment">发表评论</A>】【<A
href="http://www.diybl.com/course/6_system/linux/Linuxjs/2008923/144940_7.html#">返回顶部</A>】【<A
href="javascript:window.close()">关闭</A>】 </DIV>
<DIV class=p_bottom>上一篇文章:<A
href="http://www.diybl.com/course/6_system/linux/Linuxjs/2008923/144941.html">
Linux 启动脚本 完全注释2 --- rc脚本注释</A><BR>下一篇文章:<A
href="http://www.diybl.com/course/6_system/linux/Linuxjs/2008923/144939.html">Rsync命令参数详解</A></DIV></DIV>
<DIV style="CLEAR: both; BACKGROUND: #fff; OVERFLOW: hidden; HEIGHT: 8px"></DIV>
<DIV id=links align=center>
<TABLE class=xgzt cellSpacing=0 cellPadding=0 width=687>
<TBODY>
<TR>
<TD style="PADDING-LEFT: 5px" bgColor=#e1effa>
<H3>推荐文章</H3></TD></TR>
<TR>
<TD bgColor=#fcfeff>
<DIV class="tj_l tj"><NOBR><A
href="http://www.diybl.com/course/6_system/linux/Linuxjs/200861/119231.html"
target=_blank>Pidgin 2.0.2</A><BR><A
href="http://www.diybl.com/course/6_system/linux/Linuxjs/2008829/138602.html"
target=_blank>RPM子包创建</A><BR><A
href="http://www.diybl.com/course/6_system/linux/Linuxjs/2007104/76178.html"
target=_blank>丑化GPL 不批不行</A><BR><A
href="http://www.diybl.com/course/6_system/linux/Linuxjs/200899/141115.html"
target=_blank>rsync使用</A><BR><A
href="http://www.diybl.com/course/6_system/linux/Linuxjs/200873/129899.html"
target=_blank>安装xine播放器 无名谢过</A><BR><A
href="http://www.diybl.com/course/6_system/linux/Linuxjs/200865/122451.html"
target=_blank>USB上的Linux(三)</A><BR><A
href="http://www.diybl.com/course/6_system/linux/Linuxjs/200888/135085.html"
target=_blank>Debian: E: ttf-opensymbol: 子进程程·post-removal
script</A><BR><A
href="http://www.diybl.com/course/6_system/linux/Linuxjs/20071129/88919.html"
target=_blank>Linux下用gdb检测内核rootkit</A></DIV>
<DIV class="tj_r tj"><NOBR><A
href="http://www.diybl.com/course/6_system/linux/Linuxjs/2008821/136826.html"
target=_blank>模块</A><BR><A
href="http://www.diybl.com/course/6_system/linux/Linuxjs/20071129/88831.html"
target=_blank>LPC2220启动编程的一些感想</A><BR><A
href="http://www.diybl.com/course/6_system/linux/Linuxjs/2008919/143521.html"
target=_blank>linux 学习笔记整理</A><BR><A
href="http://www.diybl.com/course/6_system/linux/Linuxjs/2008819/136503.html"
target=_blank>LINUX下搭建SAMBA文件共享服务</A><BR><A
href="http://www.diybl.com/course/6_system/linux/Linuxjs/20071027/80163.html"
target=_blank>到底谁牛 Linux邮件服务器软件比较</A><BR><A
href="http://www.diybl.com/course/6_system/linux/Linuxjs/2008716/133245.html"
target=_blank>FTP服务的用法(vsftp的使用)for Linux</A><BR><A
href="http://www.diybl.com/course/6_system/linux/Linuxjs/2007926/73890.html"
target=_blank>(1)套接口地址结构和数据类型</A><BR><A
href="http://www.diybl.com/course/6_system/linux/Linuxjs/20071129/88880.html"
target=_blank>私有软件 风光不在</A></DIV></NOBR></TD></TR></TBODY></TABLE></DIV>
<DIV style="CLEAR: both; BACKGROUND: #fff; OVERFLOW: hidden; HEIGHT: 8px"></DIV>
<DIV class=cleanblock2
style="BORDER-RIGHT: #dedfde 1px solid; BORDER-TOP: #dedfde 1px solid; BACKGROUND: #ededed; BORDER-LEFT: #dedfde 1px solid; BORDER-BOTTOM: #dedfde 1px solid">
<H3>文章评论</H3></DIV>
<DIV class=cleanblock3><IFRAME class=comm_index name=pindex
src="linux设备驱动之USB主机控制器驱动分析-(7)_Linux技术文章_Linux_操作系统7.files/CAKFQDUR.htm"
frameBorder=false width="100%" scrolling=no
onload="window.setTimeout('iframe_resize()',1000)" height=0></IFRAME></DIV>
<DIV style="CLEAR: both; BACKGROUND: #fff; OVERFLOW: hidden; HEIGHT: 8px"></DIV>
<FORM style="MARGIN-TOP: 0px"
action=/user/comment.asp?id=144940&url=http://www.diybl.com/course/6_system/linux/Linuxjs/2008923/144940.html
method=post>
<DIV class=comment_1>
<DIV class=cleanblock2><A name=comment></A>
<H3>请您留言</H3></DIV>
<DIV class=cleanblock style="PADDING-RIGHT: 20px; PADDING-LEFT: 20px"><LABEL
for=label>昵称: <INPUT onclick=this.focus();this.select() maxLength=20 size=15
value=DIY部落网友 name=hypocorism> <A
href="http://www.diybl.com/user/register.asp" target=_blank><FONT
color=red>注册会员</FONT></A> <A href="http://www.diybl.com/user/login.asp"
target=_blank>会员登陆</A> <BR><SPAN style="LINE-HEIGHT: 25px"><A
href="http://www.diybl.com/user/chgpage/cata.asp?num=1060103"
target=_blank><FONT color=#990000><STRONG>点击这里</STRONG></FONT></A></SPAN>
自己制作打包的chm电子书教程 <TEXTAREA style="VERTICAL-ALIGN: text-top; WIDTH: 100%; HEIGHT: 7em" onfocus=showchk(); name=content rows=6></TEXTAREA>
<LABEL id=checkCode style="DISPLAY: none">验证: <INPUT maxLength=5 size=8
name=loginnum> <IMG id=codeImg
style="VERTICAL-ALIGN: middle; CURSOR: pointer; HEIGHT: 18px"
onclick="this.src='/user/getcode.asp?t='+Math.random()" alt=验证码,看不清楚?请点击刷新验证码
src=""> </LABEL> <INPUT class=btn_2k3 style="MARGIN-TOP: 8px" type=submit value=发表评论>
</DIV></DIV>
<DIV class=comment_1
style="FLOAT: left; MARGIN-LEFT: 6px; WIDTH: 313px; HEIGHT: 90px">
<DIV class=cleanblock2>
<H3>网友推荐文章</H3></DIV>
<DIV class=cleanblock>
<TABLE cellSpacing=0 cellPadding=0 width="100%">
<TBODY>
<TR>
<TD style="PADDING-RIGHT: 15px">
<UL>
<LI><A
href="http://www.diybl.com/course/6_system/linux/Linuxjs/2007921/72474.html"
target=_blank>make规则</A></LI>
<LI><A
href="http://www.diybl.com/course/6_system/linux/Linuxjs/200888/135036.html"
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -