中文字幕理论片,69视频免费在线观看,亚洲成人app,国产1级毛片,刘涛最大尺度戏视频,欧美亚洲美女视频,2021韩国美女仙女屋vip视频

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費(fèi)電子書(shū)等14項(xiàng)超值服

開(kāi)通VIP
USB固件開(kāi)發(fā)總結(jié)(二)

3.2 固件在USB設(shè)備設(shè)別階段的編程思路

一般地,USB設(shè)備接口芯片會(huì)產(chǎn)生一些中斷來(lái)通知程序員特定事件的發(fā)生。譬如說(shuō),EP0(缺省控制端點(diǎn)) SETUP包的到達(dá),EP0 INOUT事務(wù)的發(fā)生等等??刂苽鬏斒欠秩齻€(gè)階段的:建立階段,數(shù)據(jù)階段,狀態(tài)階段。所以對(duì)于一次控制傳輸,設(shè)備固件必須要正確控制其執(zhí)行流程,不能顛倒。當(dāng)收到EP0 SETUP包到達(dá)的信息之后,固件要分析其請(qǐng)求的具體內(nèi)容,這里假定為讀取描述符,然后進(jìn)入數(shù)據(jù)階段向主機(jī)發(fā)送相應(yīng)描述符的具體內(nèi)容,發(fā)送完成后,進(jìn)入狀態(tài)階段。狀態(tài)階段結(jié)束后,一次控制傳輸就此完成。要注意的是,就算是進(jìn)入各個(gè)階段,也要等待主機(jī)發(fā)送事務(wù)請(qǐng)求后才能響應(yīng)具體操作。也就是,假定固件分析了EP0 SETUP包得到主機(jī)的請(qǐng)求是讀取某個(gè)描述符,固件隨后應(yīng)該進(jìn)入數(shù)據(jù)階段,但只是流程邏輯上的進(jìn)入,具體的操作還要等待主機(jī)的控制IN令牌到達(dá)后,才能開(kāi)始數(shù)據(jù)階段真正的數(shù)據(jù)傳輸,之后進(jìn)入狀態(tài)階段。一般地,狀態(tài)階段只需設(shè)定一個(gè)寄存器通知芯片開(kāi)始狀態(tài)階段即可,無(wú)需干預(yù)其細(xì)節(jié)。主機(jī)對(duì)設(shè)備的識(shí)別最初是通過(guò)控制管道來(lái)進(jìn)行的,一系列控制傳輸(主機(jī)識(shí)別設(shè)備的請(qǐng)求)完成之后,主機(jī)就能識(shí)別到USB設(shè)備了,在設(shè)備管理器中會(huì)顯示出來(lái)(但是不一定能完全正常地使用設(shè)備,因?yàn)榭赡苓€有一些協(xié)議并未完成,例如Mass Storage設(shè)備還需對(duì)SCSI命令正確響應(yīng),文檔的第3部分會(huì)有具體講述)。下面舉一個(gè)例子說(shuō)明固件處理控制傳輸?shù)乃悸罚?dāng)然實(shí)際應(yīng)用中并不限于這樣的思路。

 

這個(gè)例子的思路是,在響應(yīng)USB產(chǎn)生的中斷時(shí),會(huì)用全局變量記錄下中斷的發(fā)生,然后在主循環(huán)里面進(jìn)行具體處理。

 

/* USB服務(wù)程序偽代碼 */

void USB_Service(void)

{    

       /*處理控制傳輸?shù)?/span>3個(gè)階段*/

       switch (EP.EP0.Stage)

       {

              case C_STAGE_EP0_SETUP:  /*處在建立階段*/

                     if (!USB_Setup ())  /*如果請(qǐng)求是被支持的*/

                            EP.EP0.Stage = C_STAGE_EP0_DATA;       /*轉(zhuǎn)入數(shù)據(jù)階段*/

                     break;

             

              case C_STAGE_EP0_DATA:  /*處在數(shù)據(jù)階段*/

                     if (EP.EP0.Status == C_STATUS_EP0_IN_NACK)  /*收到了IN令牌*/

                     {

                            USB_WriteEP0FIFO();  /*通過(guò)控制端點(diǎn)發(fā)送數(shù)據(jù)給主機(jī)*/

                            EP.EP0.Status = C_STATUS_RESET;  /*已處理完畢,所以復(fù)位此狀態(tài)*/

                            EP.EP0.Stage = C_STAGE_EP0_STATUS;  /*轉(zhuǎn)入狀態(tài)階段*/

                            重新使能EP0_IN_NACK中斷;  /*ISR中會(huì)關(guān)掉此中斷*/

                     }

                     break;

             

              case C_STAGE_EP0_STATUS:

                     使能EP0_STATUS寄存器;

                     break;

             

              default:

                     break;

       }

}

 

/*USB中斷服務(wù)程序偽代碼(部分)*/

void USB_ISR(void)

{

       if (SETUP包到達(dá))

       {

              清中斷;

              EP.EP0.Stage = C_STAGE_EP0_SETUP;

              EP.EP0.Status = C_STATUS_EP0_SETUP_ARRIVAL;

       }

       else if (EP0 IN令牌到達(dá)但是芯片自動(dòng)回復(fù)了NAK)

       {

              清中斷;

              關(guān)閉此中斷;

              EP.EP0.Status = C_STATUS_EP0_IN_NACK;

       }

}

 

/*USB控制傳輸?shù)慕㈦A段處理程序偽代碼*/

int USB_Setup (void)

{

       通過(guò)各寄存器的值來(lái)得到請(qǐng)求的類型和相關(guān)數(shù)據(jù);

 

       if (請(qǐng)求類型是讀取描述符)

       {

              switch (描述符值)

              {

                     case 設(shè)備描述符值:

                     將全局的發(fā)送數(shù)據(jù)的指針指向設(shè)備描述符buffer;

                     break;

                     ......

                     default: break;

              }

       }

       else if (設(shè)備還需處理的其他請(qǐng)求)

       {

              處理;

       }

       else  /*不支持的請(qǐng)求*/

       {

              發(fā)送STALL信號(hào);

              return 1;  /*返回錯(cuò)誤*/

       }

 

       return 0;  /*返回正確*/

}

 

/*通過(guò)端點(diǎn)0發(fā)送數(shù)據(jù)*/

void USB_WriteEP0FIFO(void)

{

       取得全局的發(fā)送數(shù)據(jù)的指針;

       利用指針讀取描述符的數(shù)據(jù)并填充至端點(diǎn)0FIFO;

       通知芯片EP0 IN數(shù)據(jù)包已準(zhǔn)備好;

}

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開(kāi)APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
USB枚舉過(guò)程分析
USB相關(guān)知識(shí)
USB協(xié)議深入分析 1
采用PDIUSBD12的USB系統(tǒng)固件程序設(shè)計(jì)
USB的“JoyStickMouse”工作過(guò)程詳細(xì)分析 (三)
USB設(shè)備驅(qū)動(dòng)之設(shè)備初始化(設(shè)備枚舉)
更多類似文章 >>
生活服務(wù)
熱點(diǎn)新聞
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服