📄 linux设备驱动之usb主机控制器驱动分析-(8)_linux技术文章_linux_操作系统8.htm
字号:
<!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_8.html -->
<HTML><HEAD><TITLE>linux设备驱动之USB主机控制器驱动分析-(8)_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; device_init_wakeup(&ud.."
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主机控制器驱动分析-(8)_Linux技术文章_Linux_操作系统8.files/article2.css"
type=text/css rel=stylesheet>
<SCRIPT src="linux设备驱动之USB主机控制器驱动分析-(8)_Linux技术文章_Linux_操作系统8.files/article.js"
type=text/javascript></SCRIPT>
<SCRIPT src="linux设备驱动之USB主机控制器驱动分析-(8)_Linux技术文章_Linux_操作系统8.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主机控制器驱动分析-(8)_Linux技术文章_Linux_操作系统8.files/logo.gif"
width=200></A></DIV>
<DIV class=ad_f1 id=ad_f1>
<SCRIPT
src="linux设备驱动之USB主机控制器驱动分析-(8)_Linux技术文章_Linux_操作系统8.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/e5b2pysdsd.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主机控制器驱动分析-(8)_Linux技术文章_Linux_操作系统8.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> >> <A
href="http://www.diybl.com/course/6_system/">操作系统</A> >> <A
href="http://www.diybl.com/course/6_system/linux/">Linux</A> >> <A
href="http://www.diybl.com/course/6_system/linux/Linuxjs/e5b2pysdsd.html">Linux技术文章</A>
>> 正文</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主机控制器驱动分析-(8)_Linux技术文章_Linux_操作系统8.files/p_count.htm"
lanuage="javascript"></SCRIPT>
</SPAN> <A
href="http://www.diybl.com/course/6_system/linux/Linuxjs/2008923/144940_8.html#comment">[
评论 ]</A></DIV>
<DIV class=artibody>
<DIV class=ad_f2 id=ad_f2>
<SCRIPT
src="linux设备驱动之USB主机控制器驱动分析-(8)_Linux技术文章_Linux_操作系统8.files/ad_f2.js"></SCRIPT>
</DIV>
<DIV class=ad_f3 id=ad_f3>
<SCRIPT
src="linux设备驱动之USB主机控制器驱动分析-(8)_Linux技术文章_Linux_操作系统8.files/ad_f3.js"></SCRIPT>
</DIV>文章搜索: <INPUT maxLength=255 size=30 name=wd2> <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主机控制器驱动分析-(8)_Linux技术文章_Linux_操作系统8.files/art_top.js"></SCRIPT>
<P>#160;
device_init_wakeup(&udev->dev,
0);<BR>
}<BR>
//如果是从Suspended转到其它状态或者是转到Suspended状态<BR>
//更新active_duration计数<BR> if
(udev->state == USB_STATE_SUSPENDED
&&<BR>
new_state !=
USB_STATE_SUSPENDED)<BR>
udev->active_duration -=
jiffies;<BR> else if (new_state
== USB_STATE_SUSPENDED
&&<BR>
udev->state !=
USB_STATE_SUSPENDED)<BR>
udev->active_duration +=
jiffies;<BR> <BR>
//设置状态<BR> udev->state =
new_state;<BR> }<BR>
else<BR>
//这里是多余的吧?<BR>
recursively_mark_NOTATTACHED(udev);<BR>
spin_unlock_irqrestore(&device_state_lock,
flags);<BR>}<BR>这段代码没有什么好多讲的.就是设置状态而已.对于不是root
hub的情况,还涉及到了电源管理的情况,在这里不做分析.<BR> <BR>设置完设备状态之后,调用usb_get_device_descriptor()来取得设备描述符.这个函数涉及到数据的传输实现.在接下来的章节中再做详细分析.在这里只需知道,完成之后会将设备描述符存放在usb_dev->descriptor.<BR>获取到设备描述符之后,就可以获得设备的详细信息了.具体的详细可考阅USB2.0
spec.在这些信息里会包括设备的配置项数目.因此在接下来的操作中,就会将设备所支持的所有配置取出来.这是在usb_new_device()中完成的.代码如下所示:<BR>int
usb_new_device(struct usb_device *udev)<BR>{<BR> int
err;<BR> <BR>
//一些设备的fixup<BR>
usb_detect_quirks(udev); /*
Determine quirks */<BR>
//取得配置描述符<BR> err =
usb_configure_device(udev); /* detect & probe dev/intfs
*/<BR> if (err <
0)<BR> goto
fail;<BR> /* export the usbdev device-node for libusb
*/<BR> //指定设备的设备号<BR>
udev->dev.devt =
MKDEV(USB_DEVICE_MAJOR,<BR>
(((udev->bus->busnum-1) * 128) +
(udev->devnum-1)));<BR> <BR> /* Increment the
parent's count of unsuspended children */<BR> if
(udev->parent)<BR>
usb_autoresume_device(udev->parent);<BR> <BR> /*
Register the device. The device driver is
responsible<BR> * for adding the device files to
sysfs and for configuring<BR> * the
device.<BR> */<BR>
//注册usb_dev中内嵌的struct device<BR> err =
device_add(&udev->dev);<BR> if (err)
{<BR> dev_err(&udev->dev,
"can't device_add, error %d\n",
err);<BR> goto
fail;<BR> }<BR> <BR> /*
Tell the world! */<BR>
//输出一些该设备的信息<BR>
announce_device(udev);<BR> return
err;<BR> <BR>fail:<BR> usb_set_device_state(udev,
USB_STATE_NOTATTACHED);<BR> return
err;<BR>}<BR>这个代码的逻辑比较清淅.首先是usb_detect_quirks()函数,为个函数较简单,不打算进行详细分析,只是简单提一下.有些设备可能在设计存在一些问题.比如说,有的设备在Reset的时候会出现问题,或者在取string描述符的时候对buffer长度有要求.这样的设备都会在linux内核中形成一个链表,即usb_quirk_list.然后将设备的厂商ID,版本等信息与usb_quirk_list上的设备匹配.如果匹配到了,就在usb_dev添上相应的标识,不允许设备进行限制的功能.或者是设备驱动根据修改信息调整相关的操作.<BR>然后是usb_configure_device()函数.这个函数比较重要,跟踪进去分析一下 :<BR>static
int usb_configure_device(struct usb_device
*udev)<BR>{<BR> int
err;<BR> <BR> //取得设备的配置<BR>
if (udev->config == NULL)
{<BR> err =
usb_get_configuration(udev);<BR>
if (err < 0)
{<BR>
dev_err(&udev->dev, "can't read configurations, error
%d\n",<BR>
err);<BR>
goto fail;<BR>
}<BR> }<BR>
//如果是无线设备<BR> if (udev->wusb == 1 &&
udev->authorized == 0) {<BR>
udev->product = kstrdup("n/a (unauthorized)",
GFP_KERNEL);<BR>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -