?? linux設(shè)備驅(qū)動(dòng)之usb主機(jī)控制器驅(qū)動(dòng)分析-(3)_linux技術(shù)文章_linux_操作系統(tǒng)3.htm
字號(hào):
<!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_3.html -->
<HTML><HEAD><TITLE>linux設(shè)備驅(qū)動(dòng)之USB主機(jī)控制器驅(qū)動(dòng)分析-(3)_Linux技術(shù)文章_Linux_操作系統(tǒng)</TITLE>
<META http-equiv=Content-Type content=text/html;charset=gb2312>
<META content=www.diybl.com,DIY部落版權(quán)所有 name=Copyright>
<META content=linux設(shè)備驅(qū)動(dòng)之USB主機(jī)控制器驅(qū)動(dòng)分析_Linux技術(shù)文章_Linux_操作系統(tǒng) name=keywords>
<META content="linux設(shè)備驅(qū)動(dòng)之USB主機(jī)控制器驅(qū)動(dòng)分析_Linux技術(shù)文章_ " name=description err_..? goto
setup\n?);         can?t>
<META content=index,follow name=robots>
<META content=INDEX,FOLLOW name=GOOGLEBOT><LINK href="article2.css"
type=text/css rel=stylesheet><LINK
href="linux設(shè)備驅(qū)動(dòng)之USB主機(jī)控制器驅(qū)動(dòng)分析-(3)_Linux技術(shù)文章_Linux_操作系統(tǒng)3.files/article2.css"
type=text/css rel=stylesheet>
<SCRIPT src="linux設(shè)備驅(qū)動(dòng)之USB主機(jī)控制器驅(qū)動(dòng)分析-(3)_Linux技術(shù)文章_Linux_操作系統(tǒng)3.files/article.js"
type=text/javascript></SCRIPT>
<SCRIPT src="linux設(shè)備驅(qū)動(dòng)之USB主機(jī)控制器驅(qū)動(dòng)分析-(3)_Linux技術(shù)文章_Linux_操作系統(tǒng)3.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/">網(wǎng)站首頁(yè)</A></TD>
<TD class=top_bar_sline></TD>
<TD><A href="http://news.diybl.com/" target=_blank>新聞首頁(yè)</A></TD>
<TD class=top_bar_sline></TD>
<TD><A href="http://www.diybl.com/course/1_web/">網(wǎng)頁(yè)設(shè)計(jì)</A></TD>
<TD class=top_bar_sline></TD>
<TD><A href="http://www.diybl.com/course/2_picdesign/">圖形動(dòng)畫(huà)</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/">網(wǎng)站開(kāi)發(fā)</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/">操作系統(tǒng)</A></TD>
<TD class=top_bar_sline></TD>
<TD><A href="http://www.diybl.com/course/7_databases/">數(shù)據(jù)庫(kù)</A></TD>
<TD class=top_bar_sline></TD>
<TD><A href="http://www.diybl.com/course/webjsh/">網(wǎng)絡(luò)技術(shù)</A></TD>
<TD class=top_bar_sline></TD>
<TD><A href="http://www.diybl.com/course/comshiti/">認(rèn)證考試</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>書(shū)籍教程</FONT></A></TD>
<TD class=top_bar_sline></TD>
<TD><A href="http://bbs.diybl.com/"
target=_blank>進(jìn)入論壇</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設(shè)備驅(qū)動(dòng)之USB主機(jī)控制器驅(qū)動(dòng)分析-(3)_Linux技術(shù)文章_Linux_操作系統(tǒng)3.files/logo.gif"
width=200></A></DIV>
<DIV class=ad_f1 id=ad_f1>
<SCRIPT
src="linux設(shè)備驅(qū)動(dòng)之USB主機(jī)控制器驅(qū)動(dòng)分析-(3)_Linux技術(shù)文章_Linux_操作系統(tǒng)3.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應(yīng)用技巧</SPAN></A>
<LI><A
href="http://www.diybl.com/course/6_system/linux/Linuxjs/351fsdfetjtk.html"
target=_blank><SPAN>Linux技術(shù)文章</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>網(wǎng)站地圖</A>
<LI><A href="http://www.diybl.com/chm/" target=_blank>書(shū)籍教程</A>
<LI><A href="http://www.diybl.com/user/register.asp"
target=_blank>會(huì)員注冊(cè)</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設(shè)備驅(qū)動(dòng)之USB主機(jī)控制器驅(qū)動(dòng)分析-(3)_Linux技術(shù)文章_Linux_操作系統(tǒng)3.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/">操作系統(tǒng)</A> >> <A
href="http://www.diybl.com/course/6_system/linux/">Linux</A> >> <A
href="http://www.diybl.com/course/6_system/linux/Linuxjs/351fsdfetjtk.html">Linux技術(shù)文章</A>
>> 正文</SPAN></DIV>
<DIV class=split></DIV>
<DIV class=main>
<DIV class=lc_blue>
<DIV class=lcBlk>
<H1>linux設(shè)備驅(qū)動(dòng)之USB主機(jī)控制器驅(qū)動(dòng)分析</H1>
<DIV class=from_info>http://www.diybl.com/ 2008-9-23 網(wǎng)絡(luò) 點(diǎn)擊:<SPAN
style="FONT-WEIGHT: bold; COLOR: #ff0000">
<SCRIPT src="linux設(shè)備驅(qū)動(dòng)之USB主機(jī)控制器驅(qū)動(dòng)分析-(3)_Linux技術(shù)文章_Linux_操作系統(tǒng)3.files/p_count.htm"
lanuage="javascript"></SCRIPT>
</SPAN> <A
href="http://www.diybl.com/course/6_system/linux/Linuxjs/2008923/144940_3.html#comment">[
評(píng)論 ]</A></DIV>
<DIV class=artibody>
<DIV class=ad_f2 id=ad_f2>
<SCRIPT
src="linux設(shè)備驅(qū)動(dòng)之USB主機(jī)控制器驅(qū)動(dòng)分析-(3)_Linux技術(shù)文章_Linux_操作系統(tǒng)3.files/ad_f2.js"></SCRIPT>
</DIV>
<DIV class=ad_f3 id=ad_f3>
<SCRIPT
src="linux設(shè)備驅(qū)動(dòng)之USB主機(jī)控制器驅(qū)動(dòng)分析-(3)_Linux技術(shù)文章_Linux_操作系統(tǒng)3.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'">【點(diǎn)擊打包該文章】</A>
<SCRIPT
src="linux設(shè)備驅(qū)動(dòng)之USB主機(jī)控制器驅(qū)動(dòng)分析-(3)_Linux技術(shù)文章_Linux_操作系統(tǒng)3.files/art_top.js"></SCRIPT>
<P>"can't setup\n");<BR> goto
err_hcd_driver_setup;<BR>
}<BR> <BR> /* NOTE: root hub and controller
capabilities may not be the same */<BR> if
(device_can_wakeup(hcd->self.controller)<BR>
&&
device_can_wakeup(&hcd->self.root_hub->dev))<BR>
dev_dbg(hcd->self.controller, "supports USB remote
wakeup\n");<BR> <BR> /* enable irqs just before we
start the controller */<BR> if (hcd->driver->irq)
{<BR>
snprintf(hcd->irq_descr, sizeof(hcd->irq_descr),
"%s:usb%d",<BR>
hcd->driver->description,
hcd->self.busnum);<BR> if
((retval = request_irq(irqnum, &usb_hcd_irq,
irqflags,<BR>
hcd->irq_descr, hcd)) != 0)
{<BR>
dev_err(hcd->self.controller,<BR>
"request interrupt %d failed\n",
irqnum);<BR>
goto err_request_irq;<BR>
}<BR> hcd->irq =
irqnum;<BR>
dev_info(hcd->self.controller, "irq %d, %s 0x%08llx\n",
irqnum,<BR>
(hcd->driver->flags & HCD_MEMORY)
?<BR>
"io mem" : "io
base",<BR>
(unsigned long long)hcd->rsrc_start);<BR> } else
{<BR> hcd->irq =
-1;<BR> if
(hcd->rsrc_start)<BR>
dev_info(hcd->self.controller, "%s
0x%08llx\n",<BR>
(hcd->driver->flags & HCD_MEMORY)
?<BR>
"io mem" : "io
base",<BR>
(unsigned long long)hcd->rsrc_start);<BR>
}<BR> <BR> if ((retval =
hcd->driver->start(hcd)) < 0)
{<BR>
dev_err(hcd->self.controller, "startup error %d\n",
retval);<BR> goto
err_hcd_driver_start;<BR>
}<BR>調(diào)用hc_driver的rese函數(shù)來(lái)初始化OHCI.
device_can_wakeup()那一段是屬于電源管理的,忽略吧.然后為OHCI的中斷號(hào)注冊(cè)中斷處理函數(shù).然后再調(diào)用hc_driver的start函數(shù)來(lái)啟動(dòng)OHCI.在這里,提醒一下,注冊(cè)中斷處理函數(shù)時(shí)所帶的標(biāo)志是usb_add_hcd()函數(shù)的第三個(gè)參數(shù),也就是IRQF_DISABLED
|
IRQF_SHARED.也就是說(shuō),在進(jìn)入到中斷處理的時(shí)候,要禁用本地中斷.中斷處理函數(shù)的參數(shù)就是hcd<BR> <BR>
/* starting here, usbcore will pay attention to this root hub
*/<BR> rhdev->bus_mA = min(500u,
hcd->power_budget);<BR> if ((retval =
register_root_hub(hcd)) !=
0)<BR> goto
err_register_root_hub;<BR> <BR> retval =
sysfs_create_group(&rhdev->dev.kobj,
&usb_bus_attr_group);<BR> if (retval < 0)
{<BR> printk(KERN_ERR "Cannot
register USB bus sysfs attributes:
%d\n",<BR>
retval);<BR> goto
error_create_attr_group;<BR>
}<BR> if (hcd->uses_new_polling &&
hcd->poll_rh)<BR>
usb_hcd_poll_rh_status(hcd);<BR> return
retval;<BR>rhdev->bus_mA表示該HUB當(dāng)前可用電流限制.在前面的流程中,我們并末對(duì)hcd->power_budget進(jìn)行賦值,也就是說(shuō),并沒(méi)有對(duì)roo
hub限制電流.<BR>之后,會(huì)調(diào)用register_root_hub()來(lái)對(duì)根集線(xiàn)器進(jìn)行操作,這個(gè)函數(shù)很重要,以后再單獨(dú)給出分析.<BR> <BR> <BR>error_create_attr_group:<BR>
mutex_lock(&usb_bus_list_lock);<BR>
usb_disconnect(&hcd->self.root_hub);<BR>
mutex_unlock(&usb_bus_list_lock);<BR>err_register_root_hub:<BR>
hcd->driver->stop(hcd);<BR>err_hcd_driver_start:<BR>
if (hcd->irq >= 0)<BR>
free_irq(irqnum,
hcd);<BR>err_request_irq:<BR>err_hcd_driver_setup:<BR>
hcd->self.root_hub = NULL;<BR>
usb_put_dev(rhdev);<BR>err_allocate_root_hub:<BR>
usb_deregister_bus(&hcd->self);<BR>err_register_bus:<BR>
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -