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

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

?? usb.c

?? 一個很穩定的C語言寫的USB controller 源代碼,注釋很詳細
?? C
?? 第 1 頁 / 共 3 頁
字號:
      Control_Data.wCount-=MAX_CONTROL_DATA_SIZE;
	  if(usb_flags.flags.set_addr)usb_flags.flags.not_end=1;
	   else usb_flags.flags.usb_endp0_in=0;
	  return;
	 }
    else
     {
	  write_endpoint_buff(1,Control_Data.wCount,Control_Data.pData);
      usb_flags.flags.setup_packet_in=0;
	  usb_flags.flags.usb_endp0_in=0;
	  return;
	 }      
}

void endp0_out(void)                            //終端點0輸出中斷處理
{
 Last_Status.Register=read_last_status(0);
 if(Last_Status.Status.setup_packet)
  {
   Control_Data.wLength=0;
   Control_Data.wCount=0;
   if(read_endpoint_buff(0,sizeof(Control_Data.DeviceRequest),(unsigned char *)(&(Control_Data.DeviceRequest)))!=sizeof(REQUESTCMD))
    {
	 set_endpoint_status(0,0);
	 set_endpoint_status(1,0);
	 return;
	}
  Control_Data.DeviceRequest.wValue=SWAP(Control_Data.DeviceRequest.wValue);
  Control_Data.DeviceRequest.wIndex=SWAP(Control_Data.DeviceRequest.wIndex);
  Control_Data.DeviceRequest.wLength=SWAP(Control_Data.DeviceRequest.wLength);

  ack_setup(0);
  ack_setup(1);
  Control_Data.wLength=Control_Data.DeviceRequest.wLength;
  usb_flags.flags.not_end=0;
  usb_flags.flags.usb_endp0_in=1;
  usb_flags.flags.setup_packet_in=0;
  usb_flags.flags.setup_packet_out=0;
  if(Control_Data.DeviceRequest.bmRequestType&0x80){usb_flags.flags.setup_packet_in=1;return;}
  else {usb_flags.flags.setup_packet_out=1;return;}
 }
 else
  {
   select_endpoint(0);
   clear_buffer();
  }
}

void endp0_in(void)                                        //終端點0輸入處理
{
 read_last_status(1);
 if(usb_flags.flags.setup_packet_in||usb_flags.flags.not_end)
  {
   if((Control_Data.DeviceRequest.bmRequestType==0xA1)&&(Control_Data.DeviceRequest.bRequest==0xFE))
    get_max_LUN();
   switch(Control_Data.DeviceRequest.bmRequestType&0x7B)
    {
	 case 0:
	   switch (Control_Data.DeviceRequest.bRequest)
	    {
	     case 0: get_status(0);break;
	     case 6: get_descriptor();break;
	     case 8: get_configuration();break;
		 default:break;
	    }
	 case 1:
	   switch (Control_Data.DeviceRequest.bRequest)
	    {
         case  0: get_status(1);break;
	     case 10: get_interface();break;
         default: break;
		}
	 case 2:
	  {
       if(Control_Data.DeviceRequest.bRequest==0)get_status(2);  
	  }
	 default: break;
    }
  return;
  }
 if(usb_flags.flags.setup_packet_out) 
  {
   if((Control_Data.DeviceRequest.bmRequestType==0x21)&&(Control_Data.DeviceRequest.bRequest==0xFF))
    mass_storage_reset();

   switch(Control_Data.DeviceRequest.bmRequestType&0x03)
    {
	 case 0:
     switch (Control_Data.DeviceRequest.bRequest)
      {
	   case     CLEAR_FEATURE: clear_feature(0);break;
	   case       SET_FEATURE: set_feature(0);break;
	   case       SET_ADDRESS: set_usb_address();break;                  //set_address	           
	   case    SET_DESCRIPTOR: set_descriptor();break;                //set_descriptor
	   case SET_CONFIGURATION: set_configuration(); break;         //set_configurat               	          
  	   default: break;
	  }break;
	 case 1:
      switch (Control_Data.DeviceRequest.bRequest)
	   {
	    case CLEAR_FEATURE:  clear_feature(1);break;
	    case   SET_FEATURE:  set_feature(1); break;
        case SET_INTERFACE: set_interface();break;
	    default: break;
        }break;
	 case 2:
	  switch (Control_Data.DeviceRequest.bRequest)
	   {
	    case CLEAR_FEATURE: clear_feature(2);break;
	    case   SET_FEATURE: set_feature(2);break;
        default: break;      
	   }break;
	 default: break;
    }
  }
}

/*void endp1_out(void)
{
 printc(0xcc);
}*/


/*void endp1_in(void)
{
 printc(0xcc);
}*/

void Return_CSW(unsigned long int DataResidue,unsigned char status)          //返回CSW數據包
{
  
  csw.dCSWTag=cbw.dCBWTag;
  csw.dCSWDataResidue=DataResidue;
  csw.bCSWStatus=status;
  while(select_endpoint(5)&0x01);
  write_endpoint_buff(5,sizeof(CSW),(unsigned char *)(&csw));
  usb_flags.flags.usb_endp2_in=0;
  usb_flags.flags.usb_endp2_out=0;
  SCSI.Status.Command=1;
  SCSI.Status.Data=0;
}

void write_10(void)                                                         //SCSI寫操作
{
 unsigned long int LBA,Byte_Count;
 unsigned char i;
  if(SCSI.Status.Data)
  {
   for(i=0;i<4;i++)
   {
    LBA<<=8;
    LBA+=cbw.CBWCB[2+i];
   }
//   pData=get_physical_addr(LBA);
   Byte_Count=0;
   Byte_Count+=cbw.CBWCB[7];
   Byte_Count<<=8;
   Byte_Count+=cbw.CBWCB[8];
   Byte_Count<<=9;
 while(usb_flags.flags.usb_endp2_out)
  {
   while(!(select_endpoint(4)&0x01));
	if(Byte_Count>64)
	 {
	  read_endpoint_buff(4,64,buffer);
	  Byte_Count-=64;
	 }
	else 
	 {
      read_endpoint_buff(4,Byte_Count,buffer);
      Return_CSW(0x00,SUCCESS);
	 }
   }
 }
}

void endp2_out(void)                                                     //主端點輸出處理
{
// printc(0xcc);
 if(SCSI.Status.Command)
  {
   if(read_endpoint_buff(4,sizeof(CBW),(unsigned char *)(&cbw))!=sizeof(CBW)){error(2);return;}
   if(cbw.dCBWSignature!=0x55534243){error(3);return;}
   SCSI.Status.Command=0;
   SCSI.Status.Data=1;
   if(cbw.bmCBWFlags&0x80)
    {
	 usb_flags.flags.usb_endp2_in=1;
	 usb_flags.flags.usb_endp2_out=0;
	}
   else
    {
	 usb_flags.flags.usb_endp2_in=0;
	 usb_flags.flags.usb_endp2_out=1;
     switch(cbw.CBWCB[0])
      {
       case        Write_10: write_10();break;
       case Test_Unit_Ready: Return_CSW(0x00,SUCCESS);break; 
       case          Verify: Return_CSW(0x00,SUCCESS);break;
	   default             : Return_CSW(cbw.dCBWDataTransgerLength,FAIL);break;
	  }
	}
  }
 else
  {
   read_last_status(4);
   select_endpoint(4);
   clear_buffer();
  }
}

unsigned char *get_physical_addr(unsigned long int LBA)                        //從LBA獲取物理地址
{
 if(LBA==0)return DBR;
 if(LBA==2)return FAT;
 if(LBA==0x40)return ZERO;
 if(LBA==0X0A)return FAT;
}


void read_10(void)                                                              //SCSI讀處理
{
 unsigned long int LBA=0,Byte_Count;
 unsigned long int count=0;
 unsigned char i;
 if(SCSI.Status.Data)
  {
   for(i=0;i<4;i++)
   {
    LBA<<=8;
    LBA+=cbw.CBWCB[2+i];
   }
   pData=get_physical_addr(LBA);
   Byte_Count=0;
   Byte_Count+=cbw.CBWCB[7];
   Byte_Count<<=8;
   Byte_Count+=cbw.CBWCB[8];
   Byte_Count<<=9;
   i=0;
  while(usb_flags.flags.usb_endp2_in)
   {
    if(LBA==0)
       if(count<512)pData=DBR+count;
	   else 
	    if(count==512)pData=FAT;
		else pData=ZERO;
	if(LBA==2)
//	   if(count<64)pData=FAT;
//	   else
 //	    if(count==512*7)pData=FAT;
 //      else
		 pData=ZERO;
 	if(LBA==8)
 //	    if(count<512)pData=ZERO;
 //		else 
 //		 if(count==512)pData=FAT;
 //		 else 
		  pData=ZERO;
     if(LBA==0x10)
	    if(count==512)pData=FAT;
	   	 else pData=ZERO;
	if(LBA==0x21)
	 if(count==0)
//	  else
       pData=ROOT_DIR;
	   else pData=ZERO;

	if(LBA==0x40)
	  if(count<240)pData=FILE_DATA+count;
	  else 
	    pData=ZERO;

   while(select_endpoint(5)&0x01);
   if(Byte_Count>MAX_BULK_DATA_SIZE)
   {
    write_endpoint_buff(5,MAX_BULK_DATA_SIZE,pData);
//    pData+=MAX_BULK_DATA_SIZE;
    Byte_Count-=MAX_BULK_DATA_SIZE;
//    SCSI.Status.Data=1;
   }
  else
   {
    write_endpoint_buff(5,Byte_Count,pData);
    Return_CSW(0x00,SUCCESS);
   }
  count+=64;
  }
 }
 else error(2);return;
}

void endp2_in(void)                                      //主端點輸入處理
{
    switch(cbw.CBWCB[0])
    {
     case              Read_10: read_10();break;
     case              Inquiry: write_endpoint_buff(5,0x24,DISK_INF);Return_CSW(0x00,SUCCESS); break;
     case        Read_Capacity: write_endpoint_buff(5,0x08,DISK_CAPACITY);Return_CSW(0x00,SUCCESS);break;
     case Read_Format_capacity: write_endpoint_buff(5,0x00,0x00);Return_CSW(cbw.dCBWDataTransgerLength,FAIL);break;
     case        Request_Sense: write_endpoint_buff(5,0x12,SENSE);Return_CSW(0x00,SUCCESS);break;
	 case       Medium_Removal: Return_CSW(0x00,SUCCESS);break;
	 case                 0x1a: write_endpoint_buff(5,0x00,0x00);Return_CSW(cbw.dCBWDataTransgerLength,FAIL);break;
     default                  : write_endpoint_buff(5,0x00,0x00);Return_CSW(cbw.dCBWDataTransgerLength,FAIL);break;
	}
}

void main(void)
{
 disconnect_usb();
// delay(1000);
// init_comport(57600);
 init_usb();
 connect_usb();
// send_to_comport('O');
// send_to_comport('K');
  
 while(1)
  { 
   if(!USB_INT)
    {
  	 read_interrupt_register();
//      delay(10);
//      printc(Interrupt_Register.Register[0]);
	 if(Interrupt_Register.Interrupt.bus_reset){usb_bus_reset();continue;}
	 if(Interrupt_Register.Interrupt.suspend_change){usb_bus_suspend();continue;}
         if(Interrupt_Register.Interrupt.control_out_port){endp0_out();continue;}
	 if(Interrupt_Register.Interrupt.control_in_port&&usb_flags.flags.usb_endp0_in){endp0_in();continue;}
//	 if(Interrupt_Register.Interrupt.port_out_1)endp1_out();
//	 if(Interrupt_Register.Interrupt.port_in_1)endp1_in();
	 if(Interrupt_Register.Interrupt.main_out_port){endp2_out();continue;}
	 if(Interrupt_Register.Interrupt.main_in_port&&usb_flags.flags.usb_endp2_in){endp2_in();continue;}
    }
  }
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲精品视频免费观看| 99视频国产精品| 尤物av一区二区| 欧美在线播放高清精品| 国产一区二区在线影院| 亚洲黄色片在线观看| 中文字幕av在线一区二区三区| 91精品国产美女浴室洗澡无遮挡| 91麻豆国产自产在线观看| 从欧美一区二区三区| 激情小说亚洲一区| 久久se精品一区二区| 亚洲成人先锋电影| 中文字幕中文字幕一区| 国产亚洲精品免费| 久久美女艺术照精彩视频福利播放| 欧美另类高清zo欧美| 99麻豆久久久国产精品免费 | 麻豆视频观看网址久久| 午夜免费久久看| 亚洲国产日韩一级| 午夜精品在线视频一区| 亚洲午夜免费电影| 亚洲成人福利片| 日韩av午夜在线观看| 一区二区三区四区五区视频在线观看| 国产精品乱子久久久久| 国产色产综合产在线视频| 日韩一级二级三级| 日韩亚洲国产中文字幕欧美| 欧美成人激情免费网| 欧美大片在线观看| 国产亚洲一区二区三区| 中文字幕精品一区二区三区精品| 国产欧美日韩不卡| 久久影院视频免费| 中文字幕制服丝袜一区二区三区| 亚洲视频你懂的| 亚洲成人综合视频| 精品亚洲aⅴ乱码一区二区三区| 日本aⅴ免费视频一区二区三区| 毛片一区二区三区| 成人一区二区在线观看| 91视频国产资源| 欧美丰满一区二区免费视频| 欧美成人激情免费网| 国产精品久久久久一区| 午夜一区二区三区视频| 免费人成黄页网站在线一区二区| 国产美女精品在线| 国产精品自在欧美一区| 成人av电影在线| 色综合久久久网| 欧美日韩一区二区三区四区 | 在线精品视频小说1| 欧美一卡在线观看| 亚洲欧美日韩成人高清在线一区| 日本三级亚洲精品| 91免费看`日韩一区二区| 欧美一区二区久久| 久久青草国产手机看片福利盒子| 亚洲成a人片综合在线| 久久99精品久久久久久国产越南 | 91国产丝袜在线播放| 91精品国产综合久久久蜜臀图片| 国产女主播一区| 日韩不卡一二三区| 91在线一区二区三区| 精品国产乱子伦一区| 亚洲综合一二区| 国产福利一区二区三区视频| av综合在线播放| 欧美丰满美乳xxx高潮www| 国产精品久久久久aaaa樱花 | 国产91丝袜在线播放九色| 欧美三级电影网站| 国产女人18毛片水真多成人如厕 | 丝袜美腿亚洲一区| 99精品欧美一区| 精品少妇一区二区三区日产乱码 | 亚洲欧美另类在线| 国产成人午夜99999| 9191久久久久久久久久久| 亚洲人成影院在线观看| 国产成人精品免费网站| 日韩一区二区三区在线视频| 亚洲成a人在线观看| 99精品视频在线播放观看| 国产精品区一区二区三| 久久精品国产免费| 欧美剧在线免费观看网站| 中文字幕欧美激情一区| 高清shemale亚洲人妖| 337p粉嫩大胆色噜噜噜噜亚洲 | 91亚洲男人天堂| 亚洲色欲色欲www| 91香蕉视频在线| 中文字幕在线播放不卡一区| 丁香婷婷综合色啪| 久久久久久久久蜜桃| 激情欧美一区二区| 精品电影一区二区三区| 国产主播一区二区| 欧美激情在线一区二区| 成人一级黄色片| 久久综合成人精品亚洲另类欧美 | 精品国产网站在线观看| 麻豆国产91在线播放| 欧美mv日韩mv| 国产精品一区二区在线看| 国产欧美精品在线观看| caoporn国产一区二区| 亚洲日本在线看| 色综合天天综合狠狠| 婷婷成人激情在线网| 日韩欧美一区二区久久婷婷| 免费欧美日韩国产三级电影| 久久久久久久久久电影| 成人黄动漫网站免费app| 综合欧美一区二区三区| 欧美日韩综合在线| 亚洲成a人片综合在线| 在线不卡免费欧美| 丁香啪啪综合成人亚洲小说| 一区二区三区在线影院| 7777精品伊人久久久大香线蕉完整版 | 17c精品麻豆一区二区免费| 欧美性色aⅴ视频一区日韩精品| 日av在线不卡| 2019国产精品| 91久久精品一区二区| 天天射综合影视| 日韩欧美电影一区| 99久久er热在这里只有精品66| 亚洲电影一区二区| 久久精品一区八戒影视| 欧美伊人久久大香线蕉综合69| 久久99久久99精品免视看婷婷| 国产精品久久久久久久蜜臀 | 久久激情综合网| 亚洲乱码精品一二三四区日韩在线| 欧美另类z0zxhd电影| 国产成人99久久亚洲综合精品| 亚洲黄一区二区三区| 久久久不卡网国产精品一区| 欧美亚洲愉拍一区二区| 国产成人啪午夜精品网站男同| 婷婷成人综合网| 日韩欧美一二三区| 成人美女在线视频| 狠狠色丁香婷综合久久| 亚洲精品国久久99热| 国产色综合一区| 久久综合九色综合欧美就去吻| 欧美日韩在线三区| 99精品热视频| 国产一区二区在线观看免费| 日韩黄色一级片| 奇米精品一区二区三区四区| 日本成人超碰在线观看| 日韩一区精品视频| 免费成人av在线播放| 九一九一国产精品| 国产制服丝袜一区| 国产成人综合亚洲91猫咪| 国产乱国产乱300精品| 国产精品中文字幕一区二区三区| 久久福利视频一区二区| 国产成人亚洲综合色影视| 99re热这里只有精品视频| 91丨porny丨户外露出| 日本韩国精品一区二区在线观看| 欧美日精品一区视频| 欧美一区二区不卡视频| 欧美mv和日韩mv的网站| 久久久久综合网| 国产精品久久久久久久岛一牛影视 | 理论片日本一区| 国产成人在线视频播放| 不卡的av在线| 欧美日韩一二区| 精品少妇一区二区三区免费观看| 国产精品免费看片| 一区二区三区蜜桃网| 麻豆国产精品官网| 91麻豆蜜桃一区二区三区| 91精品国产综合久久精品app| 久久久不卡网国产精品一区| 亚洲综合免费观看高清完整版| 麻豆精品在线看| 91性感美女视频| 久久亚洲一区二区三区四区| 亚洲另类色综合网站| 毛片一区二区三区| 在线一区二区视频| 精品蜜桃在线看| 亚洲成人精品影院| 99re热这里只有精品视频| 日韩一区二区三区av| 亚洲四区在线观看|