📄 linux设备驱动之usb主机控制器驱动分析-(6)_linux技术文章_linux_操作系统6.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_6.html -->
<HTML><HEAD><TITLE>linux设备驱动之USB主机控制器驱动分析-(6)_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技术文章_create_debug_entry; }.."
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主机控制器驱动分析-(6)_Linux技术文章_Linux_操作系统6.files/article2.css"
type=text/css rel=stylesheet>
<SCRIPT src="linux设备驱动之USB主机控制器驱动分析-(6)_Linux技术文章_Linux_操作系统6.files/article.js"
type=text/javascript></SCRIPT>
<SCRIPT src="linux设备驱动之USB主机控制器驱动分析-(6)_Linux技术文章_Linux_操作系统6.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主机控制器驱动分析-(6)_Linux技术文章_Linux_操作系统6.files/logo.gif"
width=200></A></DIV>
<DIV class=ad_f1 id=ad_f1>
<SCRIPT
src="linux设备驱动之USB主机控制器驱动分析-(6)_Linux技术文章_Linux_操作系统6.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/3b70sdsdpytk.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主机控制器驱动分析-(6)_Linux技术文章_Linux_操作系统6.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/3b70sdsdpytk.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主机控制器驱动分析-(6)_Linux技术文章_Linux_操作系统6.files/p_count.htm"
lanuage="javascript"></SCRIPT>
</SPAN> <A
href="http://www.diybl.com/course/6_system/linux/Linuxjs/2008923/144940_6.html#comment">[
评论 ]</A></DIV>
<DIV class=artibody>
<DIV class=ad_f2 id=ad_f2>
<SCRIPT
src="linux设备驱动之USB主机控制器驱动分析-(6)_Linux技术文章_Linux_操作系统6.files/ad_f2.js"></SCRIPT>
</DIV>
<DIV class=ad_f3 id=ad_f3>
<SCRIPT
src="linux设备驱动之USB主机控制器驱动分析-(6)_Linux技术文章_Linux_操作系统6.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主机控制器驱动分析-(6)_Linux技术文章_Linux_操作系统6.files/art_top.js"></SCRIPT>
<P>create_debug_entry;<BR>
}<BR> uhci->dentry =
dentry;<BR> }<BR>建立fsbr_timer定时器.
这个定时器跟USB的高速传输有关.在后面再给出详细的分析.忽略选择调试的部份.<BR> <BR>
//1024个frame 指针<BR> uhci->frame =
dma_alloc_coherent(uhci_dev(uhci),<BR>
UHCI_NUMFRAMES *
sizeof(*uhci->frame),<BR>
&uhci->frame_dma_handle, 0);<BR> if
(!uhci->frame) {<BR>
dev_err(uhci_dev(uhci), "unable to allocate
"<BR>
"consistent memory for frame
list\n");<BR> goto
err_alloc_frame;<BR> }<BR>
memset(uhci->frame, 0, UHCI_NUMFRAMES *
sizeof(*uhci->frame));<BR> <BR> //cpu
的frame指针<BR> uhci->frame_cpu =
kcalloc(UHCI_NUMFRAMES,
sizeof(*uhci->frame_cpu),<BR>
GFP_KERNEL);<BR> if (!uhci->frame_cpu)
{<BR> dev_err(uhci_dev(uhci),
"unable to allocate
"<BR>
"memory for frame
pointers\n");<BR> goto
err_alloc_frame_cpu;<BR> }<BR>按照UHCI
SPEC的要求,初始化1024个frame
list.在这里,UHCI都是使用DMA进行数据交互的.因此调用了dma_alloc_coherent的接口分配DMA内存.物理地址会保存在uhci->frame_dma_handle中.<BR>然后再初始化了1024上cpu
frame.这个结构是用来做辅助的,并不会影响具体的硬件<BR> <BR>
//创建uhci_td的pool<BR> uhci->td_pool =
dma_pool_create("uhci_td",
uhci_dev(uhci),<BR>
sizeof(struct uhci_td), 16, 0);<BR> if
(!uhci->td_pool) {<BR>
dev_err(uhci_dev(uhci), "unable to create td
dma_pool\n");<BR> goto
err_create_td_pool;<BR>
}<BR> <BR>
//创建uhci_qh的pool<BR> uhci->qh_pool =
dma_pool_create("uhci_qh",
uhci_dev(uhci),<BR>
sizeof(struct uhci_qh), 16, 0);<BR> if
(!uhci->qh_pool) {<BR>
dev_err(uhci_dev(uhci), "unable to create qh
dma_pool\n");<BR> goto
err_create_qh_pool;<BR>
}<BR> <BR> uhci->term_td =
uhci_alloc_td(uhci);<BR> if (!uhci->term_td)
{<BR> dev_err(uhci_dev(uhci),
"unable to allocate terminating
TD\n");<BR> goto
err_alloc_term_td;<BR>
}<BR>因为以后要经常分配TD和QH结构.为其建立一个POLL.最后,我们还可以看到.初始化了uhci->term_td<BR> <BR>
//创建11个skelqh<BR> for (i = 0; i < UHCI_NUM_SKELQH;
i++) {<BR> uhci->skelqh[i] =
uhci_alloc_qh(uhci, NULL,
NULL);<BR> if
(!uhci->skelqh[i])
{<BR>
dev_err(uhci_dev(uhci), "unable to allocate
QH\n");<BR>
goto err_alloc_skelqh;<BR>
}<BR> }<BR>初始化11个QH,即uhci->skeqh[
]数组<BR> /*<BR> * 8
Interrupt queues; link all higher int queues to int1 =
async<BR> */<BR>
//skel_async_qh = skelqh[9]<BR> for (i = SKEL_ISO
+ 1; i < SKEL_ASYNC; ++i)<BR>
uhci->skelqh[i]->link =
LINK_TO_QH(uhci->skel_async_qh);<BR>
//int1后面没有跟TD或者QH了<BR> uhci->skel_async_qh->link =
UHCI_PTR_TERM;<BR>然后uhci->skelqh[]的2到8项的后续指针都指向了skelqh[9].skelqh[9]指向了UHCI_PTR_TERM.<BR>其实uhci->skelqh[2]~
uhci->skelqh[9].代表8个时间间隔的调度队列.依次被称为int128,int64,int32,int16,int8,int4,int2,int1.即对于int128,即每隔128ms调度一次.int1.即每隔1ms调度一次,<BR>LINK_TO_QH定义如下:<BR>#define
LINK_TO_QH(qh) (UHCI_PTR_QH |
cpu_to_le32((qh)->dma_handle))<BR>UHCI_PTR_QH表示链接的是一个QH.然后加上QH的物理地址.相关的部份在UHCI
spec上都有详细的描述.请自行查阅有关定义.<BR>UHCI_PTR_TERM定义如下:<BR>#define
UHCI_PTR_TERM
__constant_cpu_to_le32(0x0001)<BR>即它的bit0 =1.表示” Empty Frame (pointer is
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -