📄 linux设备驱动之usb主机控制器驱动分析-(12)_linux技术文章_linux_操作系统12.htm
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- saved from url=(0073)http://www.diybl.com/course/6_system/linux/Linuxjs/2008923/144940_12.html -->
<HTML><HEAD><TITLE>linux设备驱动之USB主机控制器驱动分析-(12)_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; alt->endpoint = kzalloc(len, GFP_KERNEL); .."
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主机控制器驱动分析-(12)_Linux技术文章_Linux_操作系统12.files/article2.css"
type=text/css rel=stylesheet>
<SCRIPT
src="linux设备驱动之USB主机控制器驱动分析-(12)_Linux技术文章_Linux_操作系统12.files/article.js"
type=text/javascript></SCRIPT>
<SCRIPT
src="linux设备驱动之USB主机控制器驱动分析-(12)_Linux技术文章_Linux_操作系统12.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主机控制器驱动分析-(12)_Linux技术文章_Linux_操作系统12.files/logo.gif"
width=200></A></DIV>
<DIV class=ad_f1 id=ad_f1>
<SCRIPT
src="linux设备驱动之USB主机控制器驱动分析-(12)_Linux技术文章_Linux_操作系统12.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/49d5sdf.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主机控制器驱动分析-(12)_Linux技术文章_Linux_操作系统12.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/49d5sdf.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主机控制器驱动分析-(12)_Linux技术文章_Linux_操作系统12.files/p_count.htm"
lanuage="javascript"></SCRIPT>
</SPAN> <A
href="http://www.diybl.com/course/6_system/linux/Linuxjs/2008923/144940_12.html#comment">[
评论 ]</A></DIV>
<DIV class=artibody>
<DIV class=ad_f2 id=ad_f2>
<SCRIPT
src="linux设备驱动之USB主机控制器驱动分析-(12)_Linux技术文章_Linux_操作系统12.files/ad_f2.js"></SCRIPT>
</DIV>
<DIV class=ad_f3 id=ad_f3>
<SCRIPT
src="linux设备驱动之USB主机控制器驱动分析-(12)_Linux技术文章_Linux_操作系统12.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主机控制器驱动分析-(12)_Linux技术文章_Linux_操作系统12.files/art_top.js"></SCRIPT>
<P>160; alt->endpoint = kzalloc(len,
GFP_KERNEL);<BR> if
(!alt->endpoint)<BR>
return -ENOMEM;<BR>
}<BR> <BR> /* Parse all the endpoint descriptors
*/<BR> n = 0;<BR> while (size
> 0) {<BR> if (((struct
usb_descriptor_header *)
buffer)->bDescriptorType<BR>
==
USB_DT_INTERFACE)<BR>
break;<BR> retval =
usb_parse_endpoint(ddev, cfgno, inum, asnum,
alt,<BR>
num_ep, buffer, size);<BR> if
(retval <
0)<BR>
return retval;<BR>
++n;<BR> <BR> buffer +=
retval;<BR> size -=
retval;<BR> }<BR> <BR> if
(n != num_ep_orig)<BR>
dev_warn(ddev, "config %d interface %d altsetting %d has %d
"<BR>
"endpoint descriptor%s, different from the interface
"<BR>
"descriptor's value: %d\n",<BR>
cfgno, inum, asnum, n, plural(n),
num_ep_orig);<BR> return buffer -
buffer0;<BR> <BR>skip_to_next_interface_descriptor:<BR>
i = find_next_descriptor(buffer, size,
USB_DT_INTERFACE,<BR>
USB_DT_INTERFACE, NULL);<BR> return buffer - buffer0 +
i;<BR>}<BR>usb_parse_endpoint()代码如下:<BR>static int usb_parse_endpoint(struct
device *ddev, int cfgno, int inum,<BR> int asnum, struct
usb_host_interface *ifp, int num_ep,<BR> unsigned char
*buffer, int size)<BR>{<BR> unsigned char *buffer0 =
buffer;<BR> struct usb_endpoint_descriptor
*d;<BR> struct usb_host_endpoint
*endpoint;<BR> int n, i,
j;<BR> <BR> d = (struct usb_endpoint_descriptor *)
buffer;<BR> buffer +=
d->bLength;<BR> size -=
d->bLength;<BR> <BR>
//判断长度是否合法<BR> if (d->bLength >=
USB_DT_ENDPOINT_AUDIO_SIZE)<BR>
n = USB_DT_ENDPOINT_AUDIO_SIZE;<BR> else if
(d->bLength >=
USB_DT_ENDPOINT_SIZE)<BR> n =
USB_DT_ENDPOINT_SIZE;<BR> else
{<BR> dev_warn(ddev, "config %d
interface %d altsetting %d has an
"<BR>
"invalid endpoint descriptor of length %d,
skipping\n",<BR>
cfgno, inum, asnum,
d->bLength);<BR> goto
skip_to_next_endpoint_or_interface_descriptor;<BR>
}<BR> <BR>
//取得端点的地址,也就是端口号<BR> i = d->bEndpointAddress &
~USB_ENDPOINT_DIR_MASK;<BR>
//不可能会超16个端点,也不可能<BR> if (i >= 16 || i == 0)
{<BR> dev_warn(ddev, "config %d
interface %d altsetting %d has an
"<BR>
"invalid endpoint with address 0x%X,
skipping\n",<BR>
cfgno, inum, asnum,
d->bEndpointAddress);<BR>
goto skip_to_next_endpoint_or_interface_descriptor;<BR>
}<BR> <BR> /* Only store as many endpoints as we
have room for */<BR>
//注意在前面调用函数中已经将ifp->desc.bNumEndpoints清0了,以后每处理<BR>
//一个端点描述符,都会将这个成员值+1<BR> if (ifp->desc.bNumEndpoints
>= num_ep)<BR> goto
skip_to_next_endpoint_or_interface_descriptor;<BR> <BR>
//保存端点描述符信息,并更新端点数目<BR> endpoint =
&ifp->endpoint[ifp->desc.bNumEndpoints];<BR>
++ifp->desc.bNumEndpoints;<BR> <BR>
memcpy(&endpoint->desc, d, n);<BR>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -