USB的“JoyStickMouse”工作過程詳細(xì)分析(二)_第1頁
USB的“JoyStickMouse”工作過程詳細(xì)分析(二)_第2頁
已閱讀5頁,還剩5頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、USB的JoyStickMousen工作過程詳細(xì)分析(二)1、枚舉第一步:獲取設(shè)備的描述符從USBJnit()開始(1)先要允許數(shù)據(jù)傳輸完成中斷在poweron()函數(shù)后面緊跟著幾句話:PowerOn ();這句執(zhí)行完,設(shè)備被主機(jī)檢測到,并且能夠響應(yīng)復(fù)位中斷To_SetlSTR (0);/* clear pending interrupts */wlnterrupt_Mask = IMR_MSK;SetCNTR (wlnterrupt_Mask) ; /* set interrupts mask */以上這 兩句話將允許所有的USB中斷bDeviceState = UNCONNECTED;設(shè)備

2、狀態(tài)置位為未連接狀態(tài)。這里我不太理解。這時候即使 復(fù)位中斷未發(fā)生,最起碼設(shè)備已經(jīng)算是連接入總線了,為 什么 這個狀態(tài)還要設(shè)置為“未連接”呢?(2)主機(jī)獲取描述符主機(jī)進(jìn)入控制傳輸?shù)牡谝浑A段:建立事 務(wù),發(fā)setup令牌包、發(fā)請求數(shù)據(jù)包、設(shè)備發(fā)ACK包。主機(jī)發(fā)出對地址0、端點0發(fā)出SETUP令牌包,首先端點0寄存器的第門位SETUP位置位,表明收到了setup令牌包。 由于此時端點0數(shù)據(jù)接收有效,所以接下來主機(jī)的請求數(shù)據(jù) 包被SIE保存到端點0描述附表的RxADDR里面,收到的 字 節(jié)數(shù)保存到RxCount里面。端點0寄存器的CTR_RX被置位為1 , ISTR的CTR置位為1, DIR=1 ,E

3、P_ID=0 ,表示端點0接收到主機(jī)來的請求數(shù)據(jù)。 此時設(shè)備已經(jīng)ACK主機(jī),將觸發(fā)正確傳輸完成中斷,下面 就 進(jìn)入中斷看一看。_SetlSTR(u16)CLR_CTR); /*首先清除傳輸完成標(biāo)志7 EPindex=(u8)(wlstr & ISTR_EPJD); /獲取數(shù)據(jù)傳輸針對 的端點號。if (EPindex = 0)如果是端點0,這里的確是端點0(SaveRState = _GetEPRxStatus(ENDPO); /保存端點0狀態(tài),原 本是有效狀態(tài)。SaveTState = GetEPTxStatus(ENDPO);_SetEPRxStatus(ENDPO, EP_RX_

4、NAK);/在本次數(shù)據(jù)處理 好之 前,對主機(jī)發(fā)來的數(shù)據(jù)包以NAK回應(yīng)_SetEPTxStatus(ENDPO,EP_TX_NAK);if (wlstr & ISTR_DIR) = 0) /如果是IN令牌,數(shù)據(jù)被取走_(dá)ClearEP_CTR_TX(ENDPO); lnO_Process();調(diào)用該程序處理固件數(shù)據(jù)輸出后的工作。_SetEPRxStatus(ENDPO5SaveRState); _SetEPTxStatus(ENDPO,SaveTState); return;Else/DIR=1時,要么是SETUP包,要么是OUT包這里先分析SETUP包。wEPVal = _GetENDP

5、OINT(ENDPO);獲取整個端點0狀態(tài)if (wEPVal & EP_CTR_TX) != 0) /這種情況一般不太可能, 如果出現(xiàn)表不同時TX和RX同時直位。else if (wEPVal &EP_SETUP) != 0) /我們的程序會執(zhí)行到這里_ClearEP_CTR_RX(ENDPO);SetupO_Process();主要是調(diào)用該程序來處理主機(jī)請求。_SetEPRxStatus(ENDPO5SaveRState);_SetEPTxStatus(ENDPO, SaveTState);return;else if (wEPVal & EP_CTR_RX) !=

6、 0)/暫時不執(zhí)行的代碼 先刪 除掉。/* if(EPindex = 0) 7后面處理其他端點的代碼就先不看了。/* while(.) 7(3)SetupO_Process()函數(shù)的執(zhí)行分析這個函數(shù)執(zhí)行的時候,主機(jī)發(fā)來的請求數(shù)據(jù)包已經(jīng)存在于RxADDR緩沖區(qū)了。大 部分的標(biāo)志位已經(jīng)清除,除了SETUP位,這個味將由下一個 令牌包自動清除。進(jìn)入處理函數(shù):pBuf.b = PMAAddr + (u8 *)(_GetEPRxAddr(ENDPO) * 2); /這是取 得端點0接收緩沖區(qū)的起跖地址。PMAAddr是包緩沖區(qū)起始地址,_GetEPRxAddr(ENDPO)獲得 端點0描述符表里的接收緩

7、沖區(qū)地址,為什么要乘以2呢?大 概因為描述符表里地址項為16位,使用的是相對偏 移。if (plnformation-ControlState != PAUSE)(plnformation-USBbmRequestType = *pBuf.b+; /請求類 型,表 明方向和接收對象(設(shè)備、接口還是端點)此時為80 ,表明 設(shè)備到主機(jī)plnformation-USBbRequest = *pBuf.b+; /*請求代碼,第 一次時應(yīng)該是6,表明主機(jī)要獲取設(shè)備描述符。7 pBuf.w+;plnformation-USBwValue = ByteSwap(*pBuf.w+); /* wValue *

8、/pBuf.w+;我覺得這里可能有些問題。plnformation-USBwlndex =ByteSwap(*pBuf.w+); /* wlndex */ pBuf.w+;plnformation-USBwLength = *pBuf.w; /* wLength */plnformation-ControlState = SETTING_UP;if (plnformation-USBwLength = 0)(NoData_SetupO();else(Data_SetupO();這次是有數(shù)據(jù)傳輸?shù)?,所以有進(jìn)入該該函數(shù)。return PostO_Process();(4)Data_SetupO()

9、函數(shù)的執(zhí)行分析CopyRoutine = NULL; /這是一個函數(shù)指針,由用戶提供。wOffset =0;if (Request_No = GET_DESCRIPTOR) /如果是獲取設(shè)備描述符if(Type_Recipient=(STANDARD_REQUEST|EVICE_RECIPIENT)(u8 wValuel = plnformation-USBwValue1;if (wValuel = DEVICE_DESCRIPTOR)(CopyRouti ne = pProperty-GetDeviceDescriptor;/獲取設(shè)備描述符的操作由用戶提供。if (CopyRoutine)C

10、trl _lnfoU sb_wOffset = wOffset;plnformation-Ctrl _lnfo.Copy Data = CopyRoutine;(*CopyRoutine)(0);這個函數(shù)這里調(diào)用的目的只是設(shè)置了pinformation中需要寫入的描述符的長度。Result = USB_SUCCESS;if (ValBit(plnformation-USBbmRequestType37)此時為80上面這個語句主要是判斷傳輸方向。如果為1,則是設(shè)備到主機(jī)vu32 wLength = plnformation-USBwLength;這個一般是64 if(plnformation-C

11、trl_lnfoUsb_wLength wLength)(設(shè)備描述符長度18plnformation-Ctrl _lnfo.Usb_wLe ngth = wLen gth;/有些細(xì)節(jié)暫時先放著plnformation-Ctrl_lnfo.PacketSize =pProperty-MaxPacketSize;DataStageln();最主要是調(diào)用這個函數(shù)完成描述符的輸出準(zhǔn)備(5) DataStageln()函數(shù)的執(zhí)行分析以下是主要執(zhí)行代碼:DataBuffer= (*pEPinfo-CopyData)(Length); /這個是取得 用戶 描述符緩沖區(qū)的地址。這里共18個字節(jié)Use訂oPMA

12、BufferCopy(DataBuffer,GetEPTxAddr(ENDPO), Length);/這個函數(shù)將設(shè)備描述符復(fù)制到 用戶的發(fā)送緩沖區(qū)。SetEPTxCount(ENDPO, Length); 設(shè)置發(fā)送字節(jié)的數(shù)目、18 pEPinfo-Usb_wLength -= Length;等于0pEPinfo-Usb_wOffset += Length;偏移到18vSetEPTxStatus(EP_TX_VALID); /使能端點發(fā)送,只要主 機(jī)的IN令牌包一來,SIE就會將描述符返回給主機(jī)。USB_StatusOut();/*這個實際上是使接收也有效,主機(jī)可取消IN o 7Expect_S

13、tatus_Out: plnformation-ControlState = Controlstate;(6 )執(zhí)行流程返回到CTR_LP(void) _SetEPRxStatus(ENDPO,SaveRState); _SetEPTxStatus(ENDPO3SaveTState);由于vSetEPTxStatus(EP_TX_VALID)實際改變了SaveTState ,所以此時端點發(fā)送已經(jīng)使能。return;(7)主機(jī)的IN令牌包獲取描述符的控制傳輸進(jìn)入第二階段, 主機(jī)首先發(fā)一個IN令牌包,由于端點0發(fā)送有效,SIE將數(shù) 據(jù)返回主機(jī)。主機(jī)方返回一個ACK后,主機(jī)發(fā)送數(shù)據(jù)的CTR標(biāo)志置位,

14、DIR=0 , EP_ID=0 ,表明主機(jī)正確收到了用戶發(fā) 過去的描述 符。固件程序由此進(jìn)入中斷。此時是由IN引起的。主要是調(diào)用lnO_Process()完成剩下的工作。(7)追蹤進(jìn)入函數(shù)lnO_Process()此時實際上設(shè)備返回描述符已 經(jīng)成功了。這一次還是調(diào)用DataStagelnf)函數(shù),但是目的只 是期待主 機(jī)的0狀態(tài)字節(jié)輸出了。if (Controlstate = IN_DATA) | (Controlstate = LAST_IN_DATA)第一次取設(shè)備描述符只取一次。DataStagelnf);此次調(diào)用后,當(dāng)前狀態(tài)變成WAIT_STATUS_OUT ,表明設(shè) 備等待狀態(tài)過程,主機(jī)輸出0字節(jié)。/* Contro I State may be changed outside the function */ Controlstate=plnformation-ControlState;返回時調(diào)用PostO_Process(void)函數(shù),這個函數(shù)沒做什么 事。(8)進(jìn)入狀態(tài)過程主機(jī)收到18個字節(jié)的描述符后,進(jìn)入狀態(tài)事務(wù)過程,此過程 的令牌包為OUT,字節(jié)數(shù)為0

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論