亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? usbcore.c

?? 此源代碼為雙接口法USB鍵盤鼠標開發源代碼
?? C
?? 第 1 頁 / 共 4 頁
字號:
0x39, 0x00, //9
0x33, 0x00, //3
0x2f, 0x00  ///
};
/////////////////////////廠商字符串結束/////////////////////////////

//字符串“《圈圈教你玩USB》之帶鼠標的USB鍵盤”的Unicode編碼
//8位小端格式
code uint8 ProductStringDescriptor[56]={
56,         //該描述符的長度為56字節
0x03,       //字符串描述符的類型編碼為0x03
0x0a, 0x30, //《
0x08, 0x57, //圈
0x08, 0x57, //圈
0x59, 0x65, //教
0x60, 0x4f, //你
0xa9, 0x73, //玩
0x55, 0x00, //U
0x53, 0x00, //S
0x42, 0x00, //B
0x0b, 0x30, //》
0x4b, 0x4e, //之
0x26, 0x5e, //帶
0x20, 0x9f, //鼠
0x07, 0x68, //標
0x84, 0x76, //的
0x55, 0x00, //U
0x53, 0x00, //S
0x42, 0x00, //B
0x2e, 0x95, //鍵
0xd8, 0x76, //盤
0x08, 0xff, //(
0xcc, 0x53, //雙
0xa5, 0x63, //接
0xe3, 0x53, //口
0x9e, 0x5b, //實
0xb0, 0x73, //現
0x09, 0xff //)
};
////////////////////////產品字符串結束////////////////////////////

//字符串“2008-07-16”的Unicode編碼
//8位小端格式
code uint8 SerialNumberStringDescriptor[22]={
22,         //該描述符的長度為22字節
0x03,       //字符串描述符的類型編碼為0x03
0x32, 0x00, //2
0x30, 0x00, //0
0x30, 0x00, //0
0x38, 0x00, //8
0x2d, 0x00, //-
0x30, 0x00, //0
0x37, 0x00, //7
0x2d, 0x00, //-
0x31, 0x00, //1
0x36, 0x00  //6
};
//////////////////////產品序列號字符串結束/////////////////////////

/********************************************************************
函數功能:延時x毫秒函數。
入口參數:x:延時的毫秒數。
返    回:無。
備    注:無。
********************************************************************/
void DelayXms(uint16 x)                
{
 uint16 i;
 uint16 j;
 for(i=0;i<x;i++)
 for(j=0;j<227;j++); //循環語句延時
}
////////////////////////End of function//////////////////////////////

/********************************************************************
函數功能:USB斷開連接函數。
入口參數:無。
返    回:無。
備    注:無。
********************************************************************/
void UsbDisconnect(void)
{
#ifdef DEBUG0
 Prints("斷開USB連接。\r\n");
#endif
 D12WriteCommand(D12_SET_MODE);  //寫設置模式命令
 D12WriteByte(0x06); //設置模式的第一字節
 D12WriteByte(0x47); //設置模式的第二字節
 DelayXms(1000);  //延遲1秒
}
////////////////////////End of function//////////////////////////////

/********************************************************************
函數功能:USB連接函數。
入口參數:無。
返    回:無。
備    注:無。
********************************************************************/
void UsbConnect(void)
{
#ifdef DEBUG0
 Prints("連接USB。\r\n");
#endif
 D12WriteCommand(D12_SET_MODE);  //寫設置模式命令
 D12WriteByte(0x16); //設置模式的第一字節
 D12WriteByte(0x47); //設置模式的第二字節
}
////////////////////////End of function//////////////////////////////

/********************************************************************
函數功能:總線掛起中斷處理函數。
入口參數:無。
返    回:無。
備    注:無。
********************************************************************/
void UsbBusSuspend(void)
{
#ifdef DEBUG0
 Prints("USB總線掛起。\r\n");
#endif
}
////////////////////////End of function//////////////////////////////

/********************************************************************
函數功能:總線復位中斷處理函數。
入口參數:無。
返    回:無。
備    注:無。
********************************************************************/
void UsbBusReset(void)
{
#ifdef DEBUG0
 Prints("USB總線復位。\r\n");
#endif
 Ep1InIsBusy=0; //復位后端點1輸入緩沖區空閑。
 Ep2InIsBusy=0; //復位后端點2輸入緩沖區空閑。
}
////////////////////////End of function//////////////////////////////

/********************************************************************
函數功能:根據pData和SendLength將數據發送到端點0的函數。
入口參數:無。
返    回:無。
備    注:無。
********************************************************************/
void UsbEp0SendData(void)
{
 //將數據寫到端點中去準備發送
 //寫之前要先判斷一下需要發送的數據是否比端點0
 //最大長度大,如果超過端點大小,則一次只能發送
 //最大包長的數據。端點0的最大包長在DeviceDescriptor[7]
 if(SendLength>DeviceDescriptor[7])
 {
  //按最大包長度發送
  D12WriteEndpointBuffer(1,DeviceDescriptor[7],pSendData);
  //發送后剩余字節數減少最大包長
  SendLength-=DeviceDescriptor[7];
  //發送一次后指針位置要調整
  pSendData+= DeviceDescriptor[7];
 }
 else
 {
  if(SendLength!=0)
  {
   //不夠最大包長,可以直接發送
   D12WriteEndpointBuffer(1,SendLength,pSendData);
   //發送完畢后,SendLength長度變為0
   SendLength=0;
  }
  else //如果要發送的數據包長度為0
  {
   if(NeedZeroPacket==1) //如果需要發送0長度數據
   {
    D12WriteEndpointBuffer(1,0,pSendData); //發送0長度數據包
    NeedZeroPacket=0; //清需要發送0長度數據包標志
   }
  }
 }
}
////////////////////////End of function//////////////////////////////

/********************************************************************
函數功能:端點0輸出中斷處理函數。
入口參數:無。
返    回:無。
備    注:無。
********************************************************************/
void UsbEp0Out(void)
{
#ifdef DEBUG0
 Prints("USB端點0輸出中斷。\r\n");
#endif
 //讀取端點0輸出最后傳輸狀態,該操作清除中斷標志
 //并判斷第5位是否為1,如果是,則說明是建立包
 if(D12ReadEndpointLastStatus(0)&0x20)
 {
  D12ReadEndpointBuffer(0,16,Buffer); //讀建立過程數據
  D12AcknowledgeSetup(); //應答建立包
  D12ClearBuffer(); //清緩沖區
  //將緩沖數據填到設備請求的各字段中
  bmRequestType=Buffer[0];
  bRequest=Buffer[1];
  wValue=Buffer[2]+(((uint16)Buffer[3])<<8);
  wIndex=Buffer[4]+(((uint16)Buffer[5])<<8);
  wLength=Buffer[6]+(((uint16)Buffer[7])<<8);
  //下面的代碼判斷具體的請求,并根據不同的請求進行相關操作
  //如果D7位為1,則說明是輸入請求
  if((bmRequestType&0x80)==0x80)
  {
   //根據bmRequestType的D6~5位散轉,D6~5位表示請求的類型
   //0為標準請求,1為類請求,2為廠商請求。
   switch((bmRequestType>>5)&0x03)
   {
    case 0:  //標準請求
     #ifdef DEBUG0
      Prints("USB標準輸入請求:");
     #endif
     //USB協議定義了幾個標準輸入請求,我們實現這些標準請求即可
     //請求的代碼在bRequest中,對不同的請求代碼進行散轉
     //事實上,我們還需要對接收者進行散轉,因為不同的請求接收者
     //是不一樣的。接收者在bmRequestType的D4~D0位中定義。
     //我們這里為了簡化操作,有些就省略了對接收者的判斷。
     //例如獲取描述符的請求,只根據描述符的類型來區別。
     switch(bRequest)
     {
      case GET_CONFIGURATION: //獲取配置
       #ifdef DEBUG0
        Prints("獲取配置。\r\n");
       #endif
      break;
      
      case GET_DESCRIPTOR:  //獲取描述符
       #ifdef DEBUG0
        Prints("獲取描述符——");
       #endif
       //對描述符類型進行散轉,對于全速設備,
       //標準請求只支持發送到設備的設備、配置、字符串三種描述符
       switch((wValue>>8)&0xFF)
        {
         case DEVICE_DESCRIPTOR: //設備描述符
          #ifdef DEBUG0
           Prints("設備描述符。\r\n");
          #endif
          pSendData=DeviceDescriptor;  //需要發送的數據
          //判斷請求的字節數是否比實際需要發送的字節數多
          //這里請求的是設備描述符,因此數據長度就是
          //DeviceDescriptor[0]。如果請求的比實際的長,
          //那么只返回實際長度的數據
          if(wLength>DeviceDescriptor[0])
          {
           SendLength=DeviceDescriptor[0];
           if(SendLength%DeviceDescriptor[7]==0) //并且剛好是整數個數據包時
           {
            NeedZeroPacket=1; //需要返回0長度的數據包
           }
          }
          else
          {
           SendLength=wLength;
          }
          //將數據通過EP0返回
          UsbEp0SendData();
         break;
         
         case CONFIGURATION_DESCRIPTOR:  //配置描述符
          #ifdef DEBUG0
           Prints("配置描述符。\r\n");
          #endif
          pSendData=ConfigurationDescriptor; //需要發送的數據為配置描述符
          //判斷請求的字節數是否比實際需要發送的字節數多
          //這里請求的是配置描述符集合,因此數據長度就是
          //ConfigurationDescriptor[3]*256+ConfigurationDescriptor[2]。
          //如果請求的比實際的長,那么只返回實際長度的數據
          SendLength=ConfigurationDescriptor[3];
          SendLength=SendLength*256+ConfigurationDescriptor[2];
          if(wLength>SendLength)
          {
           if(SendLength%DeviceDescriptor[7]==0) //并且剛好是整數個數據包時
           {
            NeedZeroPacket=1; //需要返回0長度的數據包
           }
          }
          else
          {
           SendLength=wLength;
          }
          //將數據通過EP0返回
          UsbEp0SendData();
         break;
         
         case STRING_DESCRIPTOR:  //字符串描述符
          #ifdef DEBUG0
           Prints("字符串描述符");
          #endif
          switch(wValue&0xFF)  //根據wValue的低字節(索引值)散轉
          {
           case 0:  //獲取語言ID
            #ifdef DEBUG0
             Prints("(語言ID)。\r\n");
            #endif
            pSendData=LanguageId;
            SendLength=LanguageId[0];
           break;
           
           case 1:  //廠商字符串的索引值為1,所以這里為廠商字符串
           #ifdef DEBUG0
             Prints("(廠商描述)。\r\n");
            #endif
            pSendData=ManufacturerStringDescriptor;
            SendLength=ManufacturerStringDescriptor[0];
           break;
           
           case 2:  //產品字符串的索引值為2,所以這里為產品字符串
           #ifdef DEBUG0
             Prints("(產品描述)。\r\n");
            #endif
            pSendData=ProductStringDescriptor;
            SendLength=ProductStringDescriptor[0];
           break;
           
           case 3:  //產品序列號的索引值為3,所以這里為序列號
           #ifdef DEBUG0
             Prints("(產品序列號)。\r\n");
            #endif
            pSendData=SerialNumberStringDescriptor;
            SendLength=SerialNumberStringDescriptor[0];
           break;
           
           default :
            #ifdef DEBUG0
             Prints("(未知的索引值)。\r\n");
            #endif
            //對于未知索引值的請求,返回一個0長度的包
            SendLength=0;
            NeedZeroPacket=1;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日本亚洲免费观看| 色婷婷香蕉在线一区二区| 成人av综合在线| 欧美浪妇xxxx高跟鞋交| 国产精品久久久久久久久免费相片| 亚洲电影激情视频网站| 成人午夜视频免费看| 91精品国产色综合久久| 一区二区三区免费在线观看| 国产精品夜夜爽| 制服.丝袜.亚洲.中文.综合| 椎名由奈av一区二区三区| 在线免费观看日本一区| 亚洲婷婷综合久久一本伊一区 | 国产喷白浆一区二区三区| 五月天视频一区| 欧洲精品一区二区三区在线观看| 国产午夜精品一区二区三区嫩草| 蜜桃免费网站一区二区三区| 在线视频一区二区三区| 亚洲乱码国产乱码精品精小说 | 精品午夜一区二区三区在线观看| 在线综合亚洲欧美在线视频| 夜夜嗨av一区二区三区| 99re视频精品| 日韩理论片在线| 色婷婷激情久久| 亚洲精品福利视频网站| 欧美在线视频全部完| 一区二区三区在线视频观看| 色综合久久久久久久久久久| 亚洲欧美电影一区二区| 日本久久电影网| 亚洲最新在线观看| 久久午夜老司机| 国产精品原创巨作av| 国产无人区一区二区三区| 国产宾馆实践打屁股91| 中文字幕一区免费在线观看 | 国产成人免费视频网站高清观看视频| 日韩欧美国产不卡| 国产一区二区中文字幕| 亚洲国产岛国毛片在线| 不卡av电影在线播放| 亚洲激情av在线| 欧美军同video69gay| 国产福利一区二区| 国产精品久久久久桃色tv| 91原创在线视频| 午夜天堂影视香蕉久久| 在线播放中文字幕一区| 国产在线不卡视频| 国产精品国产三级国产有无不卡 | 欧美一区二区啪啪| 一本大道久久a久久综合婷婷| 亚洲色图色小说| 欧洲视频一区二区| 日韩av一区二区三区四区| 精品国产乱码久久久久久1区2区| 激情av综合网| 亚洲精品视频在线看| 欧美高清精品3d| 国产在线精品免费| 亚洲精品视频观看| 欧美不卡一二三| 本田岬高潮一区二区三区| 一区二区三区国产豹纹内裤在线| 国产精品美日韩| 色偷偷久久人人79超碰人人澡| 亚洲国产cao| 国产日韩欧美一区二区三区乱码 | 天天综合网 天天综合色| 337p日本欧洲亚洲大胆精品 | 波多野洁衣一区| 蜜乳av一区二区| 青娱乐精品在线视频| 国产欧美一区二区精品忘忧草 | 国产精品免费丝袜| 欧美一级黄色大片| 成人app下载| 久久成人精品无人区| 夜夜嗨av一区二区三区中文字幕| 精品入口麻豆88视频| 91国偷自产一区二区三区成为亚洲经典| 久久精品国产亚洲aⅴ| 亚洲一区在线看| 亚洲国产一区二区三区青草影视| 久久精品人人爽人人爽| 正在播放亚洲一区| 91国偷自产一区二区三区成为亚洲经典 | 久久精品国产亚洲aⅴ| 亚洲美女区一区| 亚洲国产成人高清精品| 日本一区二区三区久久久久久久久不| 欧美福利一区二区| 91黄视频在线观看| 99久久久久久| caoporen国产精品视频| 国产高清亚洲一区| 久久不见久久见免费视频7| 天天射综合影视| 亚洲成人av免费| 亚洲宅男天堂在线观看无病毒| 国产精品久久久久久久久免费相片| 精品国产91乱码一区二区三区| 日韩一区二区三区免费观看| 国产日产精品1区| 精品国产乱码久久久久久夜甘婷婷 | 日韩精品一区二区三区在线观看 | 秋霞影院一区二区| 日韩精品国产精品| 亚洲成人av一区二区| 五月激情丁香一区二区三区| 亚洲国产wwwccc36天堂| 日韩精品乱码av一区二区| 亚洲小少妇裸体bbw| 亚洲电影激情视频网站| 国产精品系列在线观看| 国产麻豆精品theporn| 免费视频最近日韩| 久久国产精品72免费观看| 久久国产精品99久久人人澡| 裸体在线国模精品偷拍| 韩国三级在线一区| 国产成人小视频| 99re8在线精品视频免费播放| 本田岬高潮一区二区三区| 91理论电影在线观看| 色综合天天综合狠狠| 欧美性做爰猛烈叫床潮| 日韩一区二区三区av| 精品久久久久久综合日本欧美 | 日韩精品一级中文字幕精品视频免费观看 | 精品久久99ma| 国产午夜亚洲精品理论片色戒 | 亚洲成人在线免费| 蜜桃av一区二区在线观看| 国产一区二区成人久久免费影院| 岛国一区二区在线观看| 91福利区一区二区三区| 7777精品伊人久久久大香线蕉经典版下载| 欧美精品丝袜中出| 26uuu亚洲综合色欧美| 国产精品久久久久久久蜜臀| 亚洲一区二区三区四区五区黄| 日韩高清一级片| 国产98色在线|日韩| 91国产免费看| 中文字幕一区二区三中文字幕| 亚洲人成伊人成综合网小说| 亚洲成a人片综合在线| 久久精品国产99国产精品| www.色综合.com| 日韩一区二区三区免费看 | 精品粉嫩超白一线天av| 国产女人aaa级久久久级| 亚洲影院在线观看| 国产精品夜夜爽| 欧美日韩精品一区二区三区蜜桃 | 欧美一区二区三区免费视频 | 一区二区三区久久久| 国产精品一区专区| 欧美日韩精品专区| 国产欧美日韩在线视频| 日韩和欧美一区二区| 99这里只有久久精品视频| 91精品国产综合久久久久| 中文字幕电影一区| 久久精品72免费观看| 91免费看视频| 国产拍揄自揄精品视频麻豆| 天堂va蜜桃一区二区三区漫画版 | 尤物视频一区二区| 在线亚洲一区二区| 日本一区免费视频| 老司机精品视频在线| 欧美日韩中文字幕一区二区| 亚洲国产高清在线观看视频| 美女视频网站黄色亚洲| 欧美日韩午夜在线| 亚洲在线视频一区| 不卡一卡二卡三乱码免费网站| 精品粉嫩超白一线天av| 奇米影视7777精品一区二区| 欧美在线免费播放| 亚洲日韩欧美一区二区在线| 国产成人精品一区二区三区四区| 日韩午夜av电影| 日本系列欧美系列| 亚洲色大成网站www久久九九| 狠狠色综合日日| 日韩欧美www| 精品中文字幕一区二区小辣椒 | 国产精品私人影院| 国产精品一区二区x88av| 久久久久久久久99精品| 久久99热狠狠色一区二区| 精品成人佐山爱一区二区| 久久精品国产99久久6| 欧美大片一区二区三区|