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

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

?? usbcore.c

?? 基于AT91SAM7S64單片機的UsbHid的實現
?? C
?? 第 1 頁 / 共 3 頁
字號:
 0x74, 0x00, //t
 0x74, 0x00, //t
 0x70, 0x00, //p
 0x3a, 0x00, //:
 0x2f, 0x00, ///
 0x2f, 0x00, ///
 0x67, 0x00, //g
 0x72, 0x00, //r
 0x6f, 0x00, //o
 0x75, 0x00, //u
 0x70, 0x00, //p
 0x2e, 0x00, //.
 0x65, 0x00, //e
 0x64, 0x00, //d
 0x6e, 0x00, //n
 0x63, 0x00, //c
 0x68, 0x00, //h
 0x69, 0x00, //i
 0x6e, 0x00, //n
 0x61, 0x00, //a
 0x2e, 0x00, //.
 0x63, 0x00, //c
 0x6f, 0x00, //o
 0x6d, 0x00, //m
 0x2f, 0x00, ///
 0x39, 0x00, //9
 0x33, 0x00, //3
 0x2f, 0x00  ///
};
/////////////////////////廠商字符串結束/////////////////////////////

//字符串“21IC DIY U盤學習板 之用戶自定義HID設備”的Unicode編碼”的Unicode編碼
//8位小端格式
const uint8 ProductStringDescriptor[54]={
 54,         //該描述符的長度為54字節
 0x03,       //字符串描述符的類型編碼為0x03
 0x32, 0x00, //2
 0x31, 0x00, //1
 0x49, 0x00, //I
 0x43, 0x00, //C
 0x20, 0x00, // 
 0x44, 0x00, //D
 0x49, 0x00, //I
 0x59, 0x00, //Y
 0x20, 0x00, // 
 0x55, 0x00, //U
 0xd8, 0x76, //盤
 0x66, 0x5b, //學
 0x60, 0x4e, //習
 0x7f, 0x67, //板
 0x20, 0x00, // 
 0x4b, 0x4e, //之
 0x28, 0x75, //用
 0x37, 0x62, //戶
 0xea, 0x81, //自
 0x9a, 0x5b, //定
 0x49, 0x4e, //義
 0x48, 0x00, //H
 0x49, 0x00, //I
 0x44, 0x00, //D
 0xbe, 0x8b, //設
 0x07, 0x59  //備
};
////////////////////////產品字符串結束////////////////////////////

//字符串“2009-03-12”的Unicode編碼
//8位小端格式
const uint8 SerialNumberStringDescriptor[22]={
22,         //該描述符的長度為22字節
0x03,       //字符串描述符的類型編碼為0x03
0x32, 0x00, //2
0x30, 0x00, //0
0x30, 0x00, //0
0x39, 0x00, //9
0x2d, 0x00, //-
0x30, 0x00, //0
0x33, 0x00, //3
0x2d, 0x00, //-
0x31, 0x00, //1
0x32, 0x00  //2
};
//////////////////////產品序列號字符串結束/////////////////////////

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

/********************************************************************
函數功能:總線復位中斷處理函數。
入口參數:無。
返    回:無。
備    注:無。
********************************************************************/
void UsbBusReset(void)
{
#ifdef DEBUG0
 Prints("USB總線復位。\r\n");
#endif
 UsbChipResetEndpoint(); //復位端點
 ConfigValue=0; //配置值初始化為0
 UsbChipSetConfig(0);  //設置芯片的配置值為0
 
 Ep1InIsBusy=0;  //復位后端點1輸入緩沖區空閑。
 Ep3InIsBusy=0;  //復位后端點3輸入緩沖區空閑。
}
////////////////////////End of function//////////////////////////////

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

/********************************************************************
函數功能:USB端點0數據過程數據處理函數。
入口參數:無。
返    回:無。
備    注:該函數用來處理0端點控制傳輸的數據或狀態過程。
********************************************************************/
void UsbEp0DataOut(void)
{
 UsbChipReadEndpointBuffer(0,16,Buffer);
 UsbChipClearBuffer(0);
}
////////////////////////End of function//////////////////////////////

/********************************************************************
函數功能:端點0輸出中斷處理函數。
入口參數:無。
返    回:無。
備    注:無。
********************************************************************/
void UsbEp0Out(void)
{
 int32 L;
#ifdef DEBUG0
 Prints("USB端點0輸出中斷。\r\n");
#endif
 //判斷是否是建立包
 if(UsbChipIsSetup(0))
 {
  L=UsbChipReadEndpointBuffer(0,16,Buffer); //讀建立過程數據
  UsbChipAcknowledgeSetup(0); //應答建立包
  UsbChipClearBuffer(0);      //清緩沖區
  if(L!=8) //不是8字節的標準請求,直接返回
   return;
  
  //將緩沖數據填到設備請求的各字段中
  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=(uint8)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=(uint8 *)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=(uint8 *)LanguageId;
            SendLength=LanguageId[0];
           break;
           
           case 1:  //廠商字符串的索引值為1,所以這里為廠商字符串
           #ifdef DEBUG0
             Prints("(廠商描述)。\r\n");
            #endif
            pSendData=(uint8 *)ManufacturerStringDescriptor;
            SendLength=ManufacturerStringDescriptor[0];
           break;
           
           case 2:  //產品字符串的索引值為2,所以這里為產品字符串
           #ifdef DEBUG0
             Prints("(產品描述)。\r\n");
            #endif
            pSendData=(uint8 *)ProductStringDescriptor;
            SendLength=ProductStringDescriptor[0];
           break;
           
           case 3:  //產品序列號的索引值為3,所以這里為序列號
           #ifdef DEBUG0
             Prints("(產品序列號)。\r\n");
            #endif
            pSendData=(uint8 *)SerialNumberStringDescriptor;
            SendLength=SerialNumberStringDescriptor[0];
           break;
           
           default :
            #ifdef DEBUG0
             Prints("(未知的索引值)。\r\n");
            #endif
            //對于未知索引值的請求,返回一個0長度的包
            SendLength=0;
            NeedZeroPacket=1;
           break;
          }
          //判斷請求的字節數是否比實際需要發送的字節數多
          //如果請求的比實際的長,那么只返回實際長度的數據
          if(wLength>SendLength)
          {
           if(SendLength%DeviceDescriptor[7]==0) //并且剛好是整數個數據包時
           {
            NeedZeroPacket=1; //需要返回0長度的數據包
           }
          }
          else
          {
           SendLength=wLength;
          }
          //將數據通過EP0返回
          UsbEp0SendData();         
         break;

         case REPORT_DESCRIPTOR:  //報告描述符
          #ifdef DEBUG0
           Prints("報告描述符。\r\n");
          #endif
          pSendData=(uint8 *)ReportDescriptor; //需要發送的數據為報告描述符
          SendLength=sizeof(ReportDescriptor); //需要返回的數據長度        
          //判斷請求的字節數是否比實際需要發送的字節數多
          //如果請求的比實際的長,那么只返回實際長度的數據
          if(wLength>SendLength)
          {
           if(SendLength%DeviceDescriptor[7]==0) //并且剛好是整數個數據包時
           {

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
精品久久久久久亚洲综合网| 99久久久免费精品国产一区二区| 亚洲一卡二卡三卡四卡| 国产精品视频yy9299一区| 久久久久久日产精品| 精品国产一区二区亚洲人成毛片| 日韩精品专区在线影院观看| 日韩免费看的电影| 日韩欧美色综合| 久久亚洲一级片| 日本一区二区免费在线| 国产精品理伦片| 亚洲午夜电影在线| 蜜臀av性久久久久av蜜臀妖精| 日本网站在线观看一区二区三区| 麻豆一区二区99久久久久| 久久99精品网久久| 国产激情91久久精品导航| 大尺度一区二区| 91精品国产一区二区人妖| 欧美一区二区三区色| 久久综合资源网| 亚洲欧美综合另类在线卡通| 一区二区国产视频| 美国毛片一区二区| 成人久久视频在线观看| 欧美性欧美巨大黑白大战| 欧美一区二区三区公司| 国产精品乱人伦一区二区| 亚洲午夜免费福利视频| 久久99精品久久久久久动态图 | 成人激情黄色小说| 色综合天天性综合| 日韩一区二区在线观看视频| 国产偷国产偷亚洲高清人白洁 | 一区二区三区日韩在线观看| 午夜天堂影视香蕉久久| 国产激情一区二区三区| 色88888久久久久久影院按摩| 日韩精品一区二区三区在线观看 | 国产精品丝袜91| 亚洲图片欧美色图| 国产不卡在线一区| 欧洲精品中文字幕| 国产欧美日韩视频在线观看| 午夜激情一区二区| av日韩在线网站| 日韩免费成人网| 亚洲国产aⅴ天堂久久| 国产91精品精华液一区二区三区| 欧美日韩国产高清一区| 国产精品国产三级国产aⅴ原创 | 日本精品视频一区二区| 欧美精品一区二区三区久久久| 亚洲自拍与偷拍| www.欧美日韩| 国产亚洲欧美中文| 麻豆精品视频在线观看免费| 在线精品视频免费播放| 国产精品久久久久久户外露出| 久久99热国产| 91精品国产色综合久久不卡电影 | 成人性生交大片免费看在线播放 | 久久婷婷综合激情| 蜜臀91精品一区二区三区| 欧美中文一区二区三区| 亚洲精品国产一区二区三区四区在线| 国产一区二三区| 亚洲精品在线一区二区| 老司机午夜精品| 91精品国产色综合久久| 视频一区二区三区中文字幕| 欧美体内she精高潮| 亚洲黄色免费电影| 色噜噜狠狠色综合欧洲selulu | 91麻豆福利精品推荐| 亚洲欧美综合色| 色伊人久久综合中文字幕| 中文字幕日韩欧美一区二区三区| 成人h精品动漫一区二区三区| 国产欧美一区二区三区沐欲| 高清在线不卡av| 国产精品色婷婷| jizzjizzjizz欧美| 亚洲蜜臀av乱码久久精品蜜桃| 91老司机福利 在线| 一二三区精品福利视频| 欧美私模裸体表演在线观看| 日韩中文字幕亚洲一区二区va在线| 制服丝袜成人动漫| 精品一区二区免费在线观看| 国产日韩欧美一区二区三区乱码| 成人黄色电影在线| 亚洲乱码日产精品bd| 欧美色图在线观看| 裸体健美xxxx欧美裸体表演| 久久久亚洲欧洲日产国码αv| 东方aⅴ免费观看久久av| 综合av第一页| 91精品婷婷国产综合久久 | 日本一区二区视频在线| 91麻豆免费观看| 视频一区在线播放| 国产拍欧美日韩视频二区| 91福利国产成人精品照片| 午夜精品久久久久久不卡8050| 日韩美一区二区三区| 国产成人精品三级| 亚洲国产成人va在线观看天堂| xnxx国产精品| 在线亚洲人成电影网站色www| 久久精品国产99| 一区二区三区在线播放| 欧美白人最猛性xxxxx69交| 成人黄色在线视频| 免费高清在线一区| 中文字幕综合网| 欧美变态tickling挠脚心| 91精品国产手机| 99国产精品久久久久久久久久 | 欧美成人r级一区二区三区| 成人成人成人在线视频| 麻豆91精品视频| 亚洲一区免费在线观看| 国产欧美日韩不卡| 欧美一区欧美二区| 日本韩国一区二区| 国产福利一区二区三区在线视频| 午夜视频久久久久久| 国产精品免费观看视频| 亚洲精品一区二区三区精华液 | 亚洲第一搞黄网站| 国产精品国产三级国产普通话99 | 日韩高清不卡在线| 亚洲欧洲www| 国产欧美日韩视频在线观看| 精品日韩欧美在线| 91精品午夜视频| 欧美性xxxxxx少妇| 一本色道久久综合精品竹菊| 成人黄色免费短视频| 国产精一品亚洲二区在线视频| 久久精品免费观看| 日本成人在线电影网| 午夜精品久久一牛影视| 亚洲国产成人tv| 亚洲国产欧美日韩另类综合| 亚洲综合免费观看高清在线观看| 国产精品女主播av| 国产精品久久久久一区二区三区共| 久久精品亚洲精品国产欧美kt∨| 精品国产91九色蝌蚪| 亚洲一区二区欧美激情| 亚洲色欲色欲www在线观看| 国产精品妹子av| **性色生活片久久毛片| 日韩一区有码在线| 一区二区三区不卡视频| 一区二区三区四区在线| 樱花影视一区二区| 亚洲一区二区三区不卡国产欧美| 亚洲香蕉伊在人在线观| 日韩主播视频在线| 久久国产精品一区二区| 国产一区二区三区| av在线不卡电影| 91精品91久久久中77777| 欧日韩精品视频| 日韩精品一区二区三区中文精品| 久久久久久免费网| 亚洲人成亚洲人成在线观看图片 | caoporen国产精品视频| 97精品久久久久中文字幕 | 日韩三级免费观看| 久久日韩精品一区二区五区| 国产精品网站导航| 亚洲观看高清完整版在线观看| 青青草国产精品97视觉盛宴| 国产乱子伦视频一区二区三区| 99精品视频在线播放观看| 欧美性感一区二区三区| 精品国产伦一区二区三区免费 | 国产精品一区二区果冻传媒| av影院午夜一区| 欧美精品丝袜中出| 国产色产综合色产在线视频| 亚洲男人天堂av网| 另类小说视频一区二区| 成人午夜视频在线观看| 欧美性感一类影片在线播放| 久久午夜国产精品| 亚洲在线中文字幕| 国产在线播精品第三| 色94色欧美sute亚洲线路二 | 久久国产精品99久久人人澡| 成人免费视频一区| 欧美精品视频www在线观看| 中文字幕成人网| 全国精品久久少妇| 在线免费观看日韩欧美|