?? linux設(shè)備驅(qū)動之usb主機(jī)控制器驅(qū)動分析-(5)_linux技術(shù)文章_linux_操作系統(tǒng)5.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_5.html -->
<HTML><HEAD><TITLE>linux設(shè)備驅(qū)動之USB主機(jī)控制器驅(qū)動分析-(5)_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ū)動之USB主機(jī)控制器驅(qū)動分析_Linux技術(shù)文章_Linux_操作系統(tǒng) name=keywords>
<META
content="linux設(shè)備驅(qū)動之USB主機(jī)控制器驅(qū)動分析_Linux技術(shù)文章_IOS off this hardware and reset if the controller &#.."
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ū)動之USB主機(jī)控制器驅(qū)動分析-(5)_Linux技術(shù)文章_Linux_操作系統(tǒng)5.files/article2.css"
type=text/css rel=stylesheet>
<SCRIPT src="linux設(shè)備驅(qū)動之USB主機(jī)控制器驅(qū)動分析-(5)_Linux技術(shù)文章_Linux_操作系統(tǒng)5.files/article.js"
type=text/javascript></SCRIPT>
<SCRIPT src="linux設(shè)備驅(qū)動之USB主機(jī)控制器驅(qū)動分析-(5)_Linux技術(shù)文章_Linux_操作系統(tǒng)5.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)站首頁</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/">網(wǎng)頁設(shè)計(jì)</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/">網(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ù)庫</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ū)動之USB主機(jī)控制器驅(qū)動分析-(5)_Linux技術(shù)文章_Linux_操作系統(tǒng)5.files/logo.gif"
width=200></A></DIV>
<DIV class=ad_f1 id=ad_f1>
<SCRIPT
src="linux設(shè)備驅(qū)動之USB主機(jī)控制器驅(qū)動分析-(5)_Linux技術(shù)文章_Linux_操作系統(tǒng)5.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/81b8tksdftk.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>會員注冊</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ū)動之USB主機(jī)控制器驅(qū)動分析-(5)_Linux技術(shù)文章_Linux_操作系統(tǒng)5.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/81b8tksdftk.html">Linux技術(shù)文章</A>
>> 正文</SPAN></DIV>
<DIV class=split></DIV>
<DIV class=main>
<DIV class=lc_blue>
<DIV class=lcBlk>
<H1>linux設(shè)備驅(qū)動之USB主機(jī)控制器驅(qū)動分析</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ū)動之USB主機(jī)控制器驅(qū)動分析-(5)_Linux技術(shù)文章_Linux_操作系統(tǒng)5.files/p_count.htm"
lanuage="javascript"></SCRIPT>
</SPAN> <A
href="http://www.diybl.com/course/6_system/linux/Linuxjs/2008923/144940_5.html#comment">[
評論 ]</A></DIV>
<DIV class=artibody>
<DIV class=ad_f2 id=ad_f2>
<SCRIPT
src="linux設(shè)備驅(qū)動之USB主機(jī)控制器驅(qū)動分析-(5)_Linux技術(shù)文章_Linux_操作系統(tǒng)5.files/ad_f2.js"></SCRIPT>
</DIV>
<DIV class=ad_f3 id=ad_f3>
<SCRIPT
src="linux設(shè)備驅(qū)動之USB主機(jī)控制器驅(qū)動分析-(5)_Linux技術(shù)文章_Linux_操作系統(tǒng)5.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ū)動之USB主機(jī)控制器驅(qū)動分析-(5)_Linux技術(shù)文章_Linux_操作系統(tǒng)5.files/art_top.js"></SCRIPT>
<P>IOS off this hardware and reset if the controller<BR>
* isn't already safely quiescent.<BR>
*/<BR>
check_and_reset_hc(uhci);<BR> return
0;<BR>}<BR>代碼中hcd_to_uhci()的操作就不做詳細(xì)分析了.在分配usb_hcd的內(nèi)存時(shí)就已經(jīng)分析過.<BR>結(jié)合UHCI
spec來理解這段代碼.spec中規(guī)定.從I/O空間的0x10處開始,為端口控制狀態(tài)寄存器(PORTSC).占有兩個(gè)字節(jié).這個(gè)端口也是指UHCI控制器的root
hub端口.該寄存器用來表示端口的狀態(tài),和操作相應(yīng)端口.協(xié)議中并沒有規(guī)定一個(gè)UHCI有多少個(gè)端口,但規(guī)定不能夠超過8個(gè).另外,協(xié)議中規(guī)定,PORTSC的bit7始終為1.因此可以根據(jù)這個(gè)特征來判斷端口是否存在.另外,寄存器中的位全為1也是不正常的.<BR>這樣就可以計(jì)算出UHCI的root
hub有多少個(gè)端口.然后將值存放到uhci的rh_numports中.<BR>注意代碼中取寄存器值的*2操作.這是因?yàn)槊總€(gè)PORTSC占兩個(gè)字節(jié).<BR>剩下的代碼就只有check_and_reset_hc(
)了.該函數(shù)用來檢查UHCI是否需要重置.如果需要重置.那就進(jìn)行UHCI的重置操作.代碼如下:<BR>static void
check_and_reset_hc(struct uhci_hcd *uhci)<BR>{<BR> if
(uhci_check_and_reset_hc(to_pci_dev(uhci_dev(uhci)),
uhci->io_addr))<BR>
finish_reset(uhci);<BR>}<BR>先來分析uhci_check_and_reset_hc()的代碼.如下所示:<BR>int
uhci_check_and_reset_hc(struct pci_dev *pdev, unsigned long
base)<BR>{<BR> u16 legsup;<BR>
unsigned int cmd, intr;<BR> <BR>
/*<BR> * When restarting a suspended controller,
we expect all the<BR> * settings to be the same as
we left them:<BR> *<BR>
* PIRQ and SMI disabled, no R/W bits set in
USBLEGSUP;<BR> * Controller is stopped
and configured with EGSM set;<BR> * No
interrupts enabled except possibly Resume Detect.<BR>
*<BR> * If any of these conditions are
violated we do a complete reset.<BR>
*/<BR> pci_read_config_word(pdev, UHCI_USBLEGSUP,
&legsup);<BR> if (legsup & ~(UHCI_USBLEGSUP_RO |
UHCI_USBLEGSUP_RWC)) {<BR>
dev_dbg(&pdev->dev, "%s: legsup =
0x%04x\n",<BR>
__FUNCTION__, legsup);<BR> goto
reset_needed;<BR>
}<BR> <BR> cmd = inw(base +
UHCI_USBCMD);<BR> if ((cmd & UHCI_USBCMD_RUN) ||
!(cmd & UHCI_USBCMD_CONFIGURE)
||<BR>
!(cmd & UHCI_USBCMD_EGSM))
{<BR> dev_dbg(&pdev->dev,
0x%04x\n",<BR>
__FUNCTION__, cmd);<BR> goto
reset_needed;<BR>
}<BR> <BR> intr = inw(base +
UHCI_USBINTR);<BR> if (intr &
(~UHCI_USBINTR_RESUME)) {<BR>
dev_dbg(&pdev->dev, "%s: intr =
0x%04x\n",<BR>
__FUNCTION__, intr);<BR> goto
reset_needed;<BR> }<BR> return
0;<BR> <BR>reset_needed:<BR>
dev_dbg(&pdev->dev, "Performing full
reset\n");<BR> uhci_reset_hc(pdev,
base);<BR> return
1;<BR>}<BR>該函數(shù)的第一個(gè)參數(shù)為UHCI對應(yīng)的pci_dev.第二個(gè)參數(shù)是I/O區(qū)間的起始地址.從代碼中看來,有三種情況是需要重置的.這三種情況分別為:<BR>1:如果LEGACY
SUPPORT REGISTER寄存器中R/W屬性位被置,那就需要重啟. LEGACY SUPPORT REGISTER通常是用于legacy
鍵盤和鼠標(biāo).UHCI spec上對其有詳細(xì)的定義.對照spec.所有R/W屬性的位都是某種能力的使能開關(guān).例如,bit13表示USB PIRQ
Enable.如果該位被置,表示設(shè)備能夠產(chǎn)生中斷.否則就不可以.<BR>因此,對于這樣的位,應(yīng)該將其初始化.也即將設(shè)備的功能關(guān)閉.這也很容易理解,為了R/W屬性位被置就需要重啟UHCI<BR> <BR>2:USB
CMD寄存器的UHCI_USBCMD_RUN被置為1,
UHCI_USBCMD_CONFIGURE和UHCI_USBCMD_EGSM位為0的時(shí)候需要重啟.<BR>UHCI_USBCMD_RUN表示UHCI正在調(diào)度數(shù)據(jù),處于運(yùn)行狀態(tài).顯然,這個(gè)時(shí)候是應(yīng)該被重啟的<BR>UHCI_USBCMD_CONFIGURE:這個(gè)位是由軟件控制的,只是起一個(gè)標(biāo)識作用,不會對硬件產(chǎn)生任何影響.如果該位為了1,表示UHCI正處于配置狀態(tài).沒有處于配置狀態(tài),當(dāng)然就可以重啟了.<BR>UHCI_USBCMD_EGSM表示UHCI是否處于Global
Suspend mode.在這種模式下,是不會產(chǎn)生數(shù)據(jù)交互的.顯然.如果該位為0.則表示該位不是Global Suspend
mode模式,當(dāng)然就需要重啟了.<BR> <BR>3:USB
INTR寄存器中除UHCI_USBINTR_RESUME如果其它位為1.則重啟UHCI.<BR>在USB INTR寄存器中,bit4~bit15是保留的,始終為0.其它四位對應(yīng)了UHCI的四種不同類型的中斷,除了bit1表示的Resume
interrupt外,其它類型的應(yīng)該全部都被關(guān)掉.<BR> <BR>如果不需要重啟UHCI,直接返回0即可.如果需要重啟,則會調(diào)轉(zhuǎn)到uhci_reset_hc().代碼如下:<BR>void
uhci_reset_hc(struct pci_dev *pdev, unsigned long
base)<BR>{<BR> /* Turn off PIRQ enable and SMI
enable. (This also turns off the<BR> *
BIOS's USB Legacy Support.) Turn off all the R/WC bits
too.<BR> */<BR>
pci_write_config_word(pdev, UHCI_USBLEGSUP,
UHCI_USBLEGSUP_RWC);<BR> <BR> /* Reset the HC -
this will force us to get a<BR> * new notification
of any already connected<BR> * ports due to the
virtual disconnect that it<BR> *
implies.<BR> */<BR>
outw(UHCI_USBCMD_HCRESET, base + UHCI_USBCMD);<BR>
mb();<BR> udelay(5);<BR> if
(inw(base + UHCI_USBCMD) &
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -