?? linux設(shè)備驅(qū)動(dòng)之usb主機(jī)控制器驅(qū)動(dòng)分析-(2)_linux技術(shù)文章_linux_操作系統(tǒng)2.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_2.html -->
<HTML><HEAD><TITLE>linux設(shè)備驅(qū)動(dòng)之USB主機(jī)控制器驅(qū)動(dòng)分析-(2)_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ù)文章_160; goto err4; return retval;.."
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設(shè)備驅(qū)動(dòng)之USB主機(jī)控制器驅(qū)動(dòng)分析-(2)_Linux技術(shù)文章_Linux_操作系統(tǒng)2.files/article2.css"
type=text/css rel=stylesheet>
<SCRIPT src="linux設(shè)備驅(qū)動(dòng)之USB主機(jī)控制器驅(qū)動(dòng)分析-(2)_Linux技術(shù)文章_Linux_操作系統(tǒng)2.files/article.js"
type=text/javascript></SCRIPT>
<SCRIPT src="linux設(shè)備驅(qū)動(dòng)之USB主機(jī)控制器驅(qū)動(dòng)分析-(2)_Linux技術(shù)文章_Linux_操作系統(tǒng)2.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)畫</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)站開發(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>書籍教程</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)分析-(2)_Linux技術(shù)文章_Linux_操作系統(tǒng)2.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)分析-(2)_Linux技術(shù)文章_Linux_操作系統(tǒng)2.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/6a44sdetjoktk.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>書籍教程</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)分析-(2)_Linux技術(shù)文章_Linux_操作系統(tǒng)2.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/6a44sdetjoktk.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)分析-(2)_Linux技術(shù)文章_Linux_操作系統(tǒng)2.files/p_count.htm"
lanuage="javascript"></SCRIPT>
</SPAN> <A
href="http://www.diybl.com/course/6_system/linux/Linuxjs/2008923/144940_2.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)分析-(2)_Linux技術(shù)文章_Linux_操作系統(tǒng)2.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)分析-(2)_Linux技術(shù)文章_Linux_操作系統(tǒng)2.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)分析-(2)_Linux技術(shù)文章_Linux_操作系統(tǒng)2.files/art_top.js"></SCRIPT>
<P>160; goto err4;<BR> return
retval;<BR> <BR> err4:<BR> if
(driver->flags & HCD_MEMORY)
{<BR>
iounmap(hcd->regs);<BR> err3:<BR>
release_mem_region(hcd->rsrc_start,
hcd->rsrc_len);<BR> }
else<BR>
release_region(hcd->rsrc_start,
hcd->rsrc_len);<BR> err2:<BR>
usb_put_hcd(hcd);<BR> err1:<BR>
pci_disable_device(dev);<BR> dev_err(&dev->dev,
"init %s fail, %d\n", pci_name(dev), retval);<BR> return
retval;<BR>}<BR>這段代碼位于linux-2.6.25/drivers/usb/core下的hcd-pci.c中.該路徑下的代碼是被所有USB控制器共享的.因此,我們?cè)诖a中可以看到usb_hcd_pci_probe()會(huì)有區(qū)別UHCI還是其它類型的控制器的操作.在USB驅(qū)動(dòng)架構(gòu)中,有很多代碼是關(guān)于電源管理的.在這里我們先忽略電源管理的部份.之后再以單獨(dú)章節(jié)的形式來分析linux上的電源管理子系統(tǒng).<BR>首先,會(huì)調(diào)用 pci_enable_device()來啟用PCI設(shè)備.正如在分析PCI設(shè)備的時(shí)候.初始化之后的PCI設(shè)備很多功能都是被禁用的.例如I/O/內(nèi)存空間,IRQ等.其次,OHCI必須要使用中斷.如果對(duì)應(yīng)中斷號(hào)不存在,說明此設(shè)備不是一個(gè)UHCI.或者出現(xiàn)了錯(cuò)誤.直接跳出.不進(jìn)行后續(xù)操作.然后,OHCI必須要使用DMA.所以會(huì)調(diào)用pci_set_master()將開啟設(shè)備的DMA傳輸能力.另外,OHCI
SPEC上有定義.在PCI的配置空間中,0x20~0x23定義了OHCI的I/O區(qū)間和大小.也就是說OHCI對(duì)應(yīng)的pci_dev中,只有一個(gè)I/O資源區(qū)間是有效的.<BR>對(duì)應(yīng)到上面的代碼:<BR>id->driver_data的賦值在uhci_hcd_init()中被特別指出過.被賦值為uhci_driver.它的結(jié)構(gòu)如下:<BR>static
const struct hc_driver uhci_driver = {<BR> .description
=
hcd_name,<BR> .product_desc
= "UHCI Host
Controller",<BR> .hcd_priv_size =
sizeof(struct uhci_hcd),<BR> <BR> /* Generic
hardware linkage */<BR> .irq
=
uhci_irq,<BR> .flags =
HCD_USB11,<BR> <BR> /* Basic lifecycle operations
*/<BR> .reset =
uhci_init,<BR> .start =
uhci_start,<BR>#ifdef CONFIG_PM<BR> .suspend
=
uhci_suspend,<BR> .resume =
uhci_resume,<BR> .bus_suspend
=
uhci_rh_suspend,<BR> .bus_resume
=
uhci_rh_resume,<BR>#endif<BR> .stop
=
uhci_stop,<BR> <BR> .urb_enqueue
=
uhci_urb_enqueue,<BR> .urb_dequeue
=
uhci_urb_dequeue,<BR> <BR> .endpoint_disable
= uhci_hcd_endpoint_disable,<BR>
.get_frame_number =
uhci_hcd_get_frame_number,<BR> <BR>
.hub_status_data = uhci_hub_status_data,<BR>
.hub_control =
uhci_hub_control,<BR>};<BR>可以看到,在的結(jié)構(gòu)為struct hc_driver. Hc就是host
control的意思.即為主機(jī)控制器驅(qū)動(dòng).該結(jié)構(gòu)包函了很多函數(shù)指針,具體的操作我們等能后涉及的時(shí)候再回過來分析.另外,從里面可以看到,它的flags被定義成了HCD_USB1.1.<BR>特別說明一下:UHCI是一個(gè)基于usb1.1的設(shè)備.USB1.1和USB2.0的最大區(qū)別就是USB2.0中定義有高速設(shè)備.因此,UHCI是一個(gè)不支持高速的USB控制器.只有EHCI才會(huì)支持高速.因此,在配置kernel的時(shí)候,UHCI和EHCI通常都會(huì)選上.如果只選用UHCI或者只選用EHCI.有很多設(shè)備都是不能夠工作的.<BR>因?yàn)閒lags被定義成HCD_USB1.1.所以代碼中的if(driver->flags
& HCD_MEMORY) … else
…流程就轉(zhuǎn)入到else下面.<BR> <BR>然后,我們目光注視到usb_create_hcd()和usb_add_hcd()這兩個(gè)函數(shù).看函數(shù)名稱,一個(gè)是產(chǎn)生struct
usb_hcd.另外的一個(gè)是將這個(gè)hcd添加到系統(tǒng).hcd就是host control
driver的意思.先來分析一下usb_create_hcd的代碼:<BR>struct usb_hcd *usb_create_hcd (const
struct hc_driver *driver,<BR>
struct device *dev, char *bus_name)<BR>{<BR> struct
usb_hcd *hcd;<BR> <BR> hcd = kzalloc(sizeof(*hcd) +
driver->hcd_priv_size, GFP_KERNEL);<BR> if (!hcd)
{<BR> dev_dbg (dev, "hcd alloc
failed\n");<BR> return
NULL;<BR> }<BR>
dev_set_drvdata(dev, hcd);<BR>
kref_init(&hcd->kref);<BR> <BR>
usb_bus_init(&hcd->self);<BR>
hcd->self.controller = dev;<BR> hcd->self.bus_name
= bus_name;<BR> hcd->self.uses_dma =
(dev->dma_mask != NULL);<BR> <BR>
init_timer(&hcd->rh_timer);<BR>
hcd->rh_timer.function = rh_timer_func;<BR>
hcd->rh_timer.data = (unsigned long) hcd;<BR>#ifdef
CONFIG_PM<BR> INIT_WORK(&hcd->wakeup_work,
hcd_resume_work);<BR>#endif<BR> <BR> hcd->driver
= driver;<BR> hcd->product_desc =
(driver->product_desc) ? driver->product_desc
:<BR>
"USB Host Controller";<BR> return
hcd;<BR>}<BR>函數(shù)的三個(gè)參數(shù):<BR>1:
driver:也就是上面分析的pci_driver的id_table的driver_data項(xiàng).即struct hc_driver<BR>2: dev:
OHCI所對(duì)應(yīng)的pci_dev中內(nèi)嵌的struct device結(jié)構(gòu)<BR>3:
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -