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

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

?? usb.c

?? 一個以PDIUSBD12為USB控制器件的應用例程。
?? C
字號:

void stall_ep0(void)
{
  D12_SetEndpointStatus(0, 1);
  D12_SetEndpointStatus(1, 1);
}

void init_unconfig(void)
{
  //unsigned char i;

  D12_SetEndpointEnable(0);	/* Disable all endpoints but EPP0. */
}

void init_config(void)
{
  D12_SetEndpointEnable(1);	/* Enable  generic/iso endpoints. */
}

void single_transmit(unsigned char * buf, unsigned char len)
{
  if( len <= EP0_PACKET_SIZE) 
  {
    D12_WriteEndpoint(1, len, buf);
  }
}

void code_transmit(unsigned char code * pRomData, unsigned short len)
{
  ControlData.wCount = 0;
  if(ControlData.wLength > len)
    ControlData.wLength = len;

  ControlData.pData = pRomData;
  if( ControlData.wLength >= EP0_PACKET_SIZE) 
  {
    D12_WriteEndpoint(1, EP0_PACKET_SIZE, ControlData.pData);
    ControlData.wCount += EP0_PACKET_SIZE;

    DISABLE;
    B_Conrol_Stat = USB_TRANSMIT;
    ENABLE;
  }
  else 
  {
    D12_WriteEndpoint(1, ControlData.wLength, pRomData);
    ControlData.wCount += ControlData.wLength;
    DISABLE;
    B_Conrol_Stat = USB_IDLE;
    ENABLE;
  }
}

void get_status(void)
{
  unsigned char endp, txdat[2];
  unsigned char bRecipient = ControlData.DeviceRequest.bmRequestType & USB_RECIPIENT;
  unsigned char c;

  if (bRecipient == USB_RECIPIENT_DEVICE) 
  {
    if(B_D12_Lb & WAKEUP)
      txdat[0] = 3;
    else
      txdat[0] = 1;
    txdat[1]=0;
    single_transmit(txdat, 2);
  }
  else if (bRecipient == USB_RECIPIENT_INTERFACE) 
  {
    txdat[0]=0;
    txdat[1]=0;
    single_transmit(txdat, 2);
  } 
  else if (bRecipient == USB_RECIPIENT_ENDPOINT) 
  {
    endp = (unsigned char)(ControlData.DeviceRequest.wIndex & MAX_ENDPOINTS);
    if (ControlData.DeviceRequest.wIndex & (unsigned char)USB_ENDPOINT_DIRECTION_MASK)
      c = D12_SelectEndpoint(endp*2 + 1);	/* Control-in */
    else
      c = D12_SelectEndpoint(endp*2);	/* Control-out */
    if(c & D12_STALL)
      txdat[0] = 1;
    else
      txdat[0] = 0;
    txdat[1] = 0;
    single_transmit(txdat, 2);
  } 
  else
    stall_ep0();
}

void clear_feature(void)
{
  unsigned char endp;
  unsigned char bRecipient = ControlData.DeviceRequest.bmRequestType & USB_RECIPIENT;

  if((bRecipient == USB_RECIPIENT_DEVICE) && (ControlData.DeviceRequest.wValue == USB_FEATURE_REMOTE_WAKEUP)) 
  {
    DISABLE;
    B_D12_Lb &= ~WAKEUP;
    ENABLE;
    single_transmit(0, 0);
  }
  else if((bRecipient == USB_RECIPIENT_ENDPOINT) && (ControlData.DeviceRequest.wValue == USB_FEATURE_ENDPOINT_STALL)) 
  {
    endp = (unsigned char)(ControlData.DeviceRequest.wIndex & MAX_ENDPOINTS);
    if (ControlData.DeviceRequest.wIndex & (unsigned char)USB_ENDPOINT_DIRECTION_MASK)
	/* clear TX stall for IN on EPn. */
      D12_SetEndpointStatus(endp*2 + 1, 0);
    else
        /* clear RX stall for OUT on EPn. */
      D12_SetEndpointStatus(endp*2, 0);
    single_transmit(0, 0);
  } 
  else
    stall_ep0();
}

void reserved(void)
{
	stall_ep0();
}

void set_feature(void)
{
  unsigned char endp;
  unsigned char bRecipient = ControlData.DeviceRequest.bmRequestType & USB_RECIPIENT;

  if ((bRecipient == USB_RECIPIENT_DEVICE) && (ControlData.DeviceRequest.wValue == USB_FEATURE_REMOTE_WAKEUP)) 
  {
    DISABLE;
    B_D12_Lb |= WAKEUP;
    ENABLE;
    single_transmit(0, 0);
  }
  else if ((bRecipient == USB_RECIPIENT_ENDPOINT) && (ControlData.DeviceRequest.wValue == USB_FEATURE_ENDPOINT_STALL)) 
  {
    endp = (unsigned char)(ControlData.DeviceRequest.wIndex & MAX_ENDPOINTS);
    if (ControlData.DeviceRequest.wIndex & (unsigned char)USB_ENDPOINT_DIRECTION_MASK)
	/* clear TX stall for IN on EPn. */
      D12_SetEndpointStatus(endp*2 + 1, 1);
    else
	/* clear RX stall for OUT on EPn. */
    D12_SetEndpointStatus(endp*2, 1);
    single_transmit(0, 0);
  } 
  else
    stall_ep0();
}

void set_address(void)
{
  D12_SetAddressEnable((unsigned char)(ControlData.DeviceRequest.wValue & DEVICE_ADDRESS_MASK), 1);
  single_transmit(0, 0);
}

void get_descriptor(void)
{
  unsigned char bDescriptor;
  bDescriptor = (unsigned char)(ControlData.DeviceRequest.wValue >> 8);

  if (bDescriptor == USB_DEVICE_DESCRIPTOR_TYPE) 	//設備描述符
  {
    code_transmit((unsigned char code *)&DeviceDescr, sizeof(USB_DEVICE_DESCRIPTOR));
  } 
  else if (bDescriptor == USB_CONFIGURATION_DESCRIPTOR_TYPE) 	//配置,接口,四個端點,0端點除外
  {
    if (ControlData.DeviceRequest.wLength > CONFIG_DESCRIPTOR_LENGTH) 
       ControlData.DeviceRequest.wLength = CONFIG_DESCRIPTOR_LENGTH;
    code_transmit((unsigned char code *)&ConfigDescr, ControlData.DeviceRequest.wLength);
  } 
  else
    stall_ep0();
}

void get_configuration(void)	 //其實返回ConfigDescr.bConfigurationValue的值;這里只有一種配置
{
  unsigned char c;

  c = B_D12_Lb & CONFIGURE;

  single_transmit(&c, 1);
}

void set_configuration(void)			//配置表中是1,若要選中配置1,則發送參數1。
{
  if (ControlData.DeviceRequest.wValue == 0) 
  {
    /* put device in unconfigured state */
    single_transmit(0, 0);
    DISABLE;
    B_D12_Lb &= ~CONFIGURE;
    ENABLE;
    init_unconfig();
  } 
  else if (ControlData.DeviceRequest.wValue == 1) 
  {
    /* Configure device */
    single_transmit(0, 0);

    init_unconfig();
    init_config();
		
    DISABLE;
    B_D12_Lb |= CONFIGURE;
    ENABLE;
  } 
  else
    stall_ep0();
}

void get_interface(void)
{
  unsigned char txdat = 0;        /* Only/Current interface = 0 */
  single_transmit(&txdat, 1);
}

void set_interface(void)
{
  if (ControlData.DeviceRequest.wValue == 0 && ControlData.DeviceRequest.wIndex == 0)
    single_transmit(0, 0);
  else
    stall_ep0();
}


//USB標準設備請求入口地址指針表
code void (*StandardDeviceRequest[])(void) =
{
	get_status,
	clear_feature,
	reserved,
	set_feature,
	reserved,
	set_address,
	get_descriptor,
	reserved,
	get_configuration,
	set_configuration,
	get_interface,
	set_interface,
	reserved,
	reserved,
	reserved,
	reserved
};

void get_firmware_version()
{
	unsigned char i;

	i = 0x30; // firmware version number
	single_transmit((unsigned char *)&i, 1);
}

void get_buffer_size()
{
	unsigned char i[4];

	i[0] = EP2_PACKET_SIZE;
	i[1] = 0;
	i[2] = 0;
	i[3] = 0;
	single_transmit((unsigned char *)&i, 4);
}

void read_write_register(void)
{
  if(ControlData.DeviceRequest.bmRequestType & (unsigned char)USB_ENDPOINT_DIRECTION_MASK) 
  {
    if(ControlData.DeviceRequest.wIndex == GET_FIRMWARE_VERSION &&
			ControlData.DeviceRequest.wValue == 0 &&
			ControlData.DeviceRequest.wLength == 1)
      get_firmware_version();
    else
      if(ControlData.DeviceRequest.wIndex == GET_BUFFER_SIZE &&
			ControlData.DeviceRequest.wValue == 0 &&
			ControlData.DeviceRequest.wLength == 4)
        get_buffer_size();
      else
 	stall_ep0();

  }	// if read register
  else
  {
    if(ControlData.DeviceRequest.wIndex == SETUP_DMA_REQUEST &&
			ControlData.DeviceRequest.wValue == 0 &&
			ControlData.DeviceRequest.wLength == 6)
    {
      if(ControlData.dataBuffer[5]==0x81)
 	D12_WriteEndpoint(5, ControlData.dataBuffer[3], EpBuf);
      single_transmit(0, 0);
    }
    else
      stall_ep0();
  }	// if write register
}

//廠商請求入口地址
code void (*VendorDeviceRequest[])(void) =
{
	reserved,
	reserved,
	reserved,
	reserved,
	reserved,
	reserved,
	reserved,
	reserved,
	reserved,
	reserved,
	reserved,
	reserved,
	read_write_register,
	reserved,
	reserved,
	reserved
};



?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美视频三区在线播放| 久热成人在线视频| 国产精品三级久久久久三级| 欧美一级高清大全免费观看| 欧美伦理电影网| 精品视频在线免费观看| 欧美精品一二三四| 91精品国产入口| 欧美一区二区三区在线观看视频| 欧美精品亚洲一区二区在线播放| 欧美日韩国产高清一区二区| 欧美另类高清zo欧美| 日韩三级在线免费观看| 日韩一区二区在线免费观看| 日韩精品专区在线| 久久天天做天天爱综合色| 国产欧美精品一区| 中文字幕亚洲区| 一区二区三区在线视频免费| 亚洲va欧美va人人爽午夜 | 欧美一级爆毛片| 精品区一区二区| 欧美国产一区二区| 亚洲精品久久嫩草网站秘色| 午夜精品福利一区二区蜜股av| 秋霞午夜鲁丝一区二区老狼| 国产在线精品一区在线观看麻豆| 国产成人av电影| 欧亚洲嫩模精品一区三区| 欧美一级理论片| 国产精品久久久99| 日本不卡一区二区| 懂色av一区二区三区免费观看| 91香蕉国产在线观看软件| 欧美伊人久久久久久午夜久久久久| 在线电影一区二区三区| 国产午夜精品一区二区三区嫩草| 亚洲精品日产精品乱码不卡| 亚洲不卡av一区二区三区| 国产精品69毛片高清亚洲| 日本韩国欧美三级| 久久午夜羞羞影院免费观看| 一区二区三区精密机械公司| 热久久久久久久| 99r精品视频| 精品欧美久久久| 一区二区三区免费网站| 国产精品综合二区| 欧美日韩国产中文| 国产视频一区在线观看| 日本不卡在线视频| 在线观看国产精品网站| 国产三区在线成人av| 亚洲电影你懂得| 岛国精品在线播放| 欧美成人高清电影在线| 午夜精品一区二区三区免费视频| www.亚洲在线| 欧美激情综合五月色丁香| 亚洲电影中文字幕在线观看| 99国产精品久久久久| 中文字幕乱码一区二区免费| 精一区二区三区| 91精品国产综合久久福利软件 | 欧美日韩国产美| 亚洲欧美国产77777| 成人高清在线视频| 精品免费国产一区二区三区四区| 婷婷成人激情在线网| 在线免费观看日本欧美| 亚洲精品一二三四区| a4yy欧美一区二区三区| 国产日韩精品久久久| 韩国精品主播一区二区在线观看 | 91精品国产综合久久精品app| 亚洲欧美日本在线| 一本大道久久精品懂色aⅴ| 国产精品乱码一区二区三区软件| 国产精品一区二区久久精品爱涩| 精品毛片乱码1区2区3区| 韩国三级电影一区二区| 久久精品人人做人人综合| 国产aⅴ精品一区二区三区色成熟| www久久精品| 国产成人精品一区二区三区网站观看| 26uuu亚洲婷婷狠狠天堂| 国产乱理伦片在线观看夜一区| 精品少妇一区二区三区在线视频| 精品一区二区av| 国产农村妇女毛片精品久久麻豆 | 日韩欧美一区二区久久婷婷| 久草中文综合在线| 国产日韩视频一区二区三区| 不卡视频在线观看| 亚洲激情校园春色| 538prom精品视频线放| 狠狠久久亚洲欧美| 中文字幕在线观看一区| 欧美日韩一区二区三区不卡| 日日骚欧美日韩| 久久亚洲捆绑美女| 91在线观看成人| 日产欧产美韩系列久久99| 久久久久国产免费免费| 99国产精品久久久久久久久久 | 欧美区在线观看| 国产在线观看一区二区| 亚洲婷婷在线视频| 91精品国产综合久久香蕉的特点| 国产美女一区二区| 亚洲一区在线观看视频| 精品久久久久99| 91极品视觉盛宴| 国产呦精品一区二区三区网站| 中文字幕视频一区二区三区久| 欧洲精品中文字幕| 国产成人综合自拍| 五月激情综合网| 国产欧美日韩视频一区二区| 欧美日韩一区二区三区不卡 | 国产精品无人区| 在线成人小视频| 91丨porny丨在线| 久久精品国内一区二区三区| 亚洲欧美日韩人成在线播放| 精品国产乱码久久久久久闺蜜| 色婷婷av一区二区| 国产激情一区二区三区四区| 视频一区视频二区中文| 亚洲精品少妇30p| 国产欧美日韩综合精品一区二区| 欧美一卡2卡3卡4卡| 成人ar影院免费观看视频| 免费成人在线观看| 亚洲主播在线播放| 日韩理论片在线| 中文字幕av免费专区久久| 精品欧美乱码久久久久久1区2区| 在线亚洲精品福利网址导航| 成人一区在线看| 国产精品1区2区| 久久精品国产亚洲高清剧情介绍| 亚洲高清不卡在线| 亚洲精品自拍动漫在线| 亚洲素人一区二区| 国产精品激情偷乱一区二区∴| 久久综合九色欧美综合狠狠| 日韩欧美国产系列| 欧美一区二区网站| 欧美美女喷水视频| 欧美男生操女生| 欧美疯狂做受xxxx富婆| 这里是久久伊人| 欧美肥妇bbw| 日韩一区二区三区免费观看| 91精品国产综合久久久蜜臀图片| 欧美日韩精品福利| 91精品国产综合久久久蜜臀粉嫩| 制服丝袜成人动漫| 日韩欧美一卡二卡| 欧美大胆一级视频| 久久久久久夜精品精品免费| 日本一区二区三区在线观看| 国产精品久久久爽爽爽麻豆色哟哟| 国产欧美日韩在线看| 亚洲人成影院在线观看| 亚洲综合色噜噜狠狠| 亚洲大片免费看| 美女被吸乳得到大胸91| 黄网站免费久久| 国产电影精品久久禁18| 99综合影院在线| 欧美日韩亚洲综合在线 | 久久国产精品色婷婷| 国内精品写真在线观看| 成人不卡免费av| 欧美午夜影院一区| 精品国产成人系列| 日本一区二区三区dvd视频在线| 国产精品久久国产精麻豆99网站 | 欧美日韩国产美| 26uuu国产日韩综合| 亚洲丝袜另类动漫二区| 日韩有码一区二区三区| 国产河南妇女毛片精品久久久| 高潮精品一区videoshd| 欧美综合天天夜夜久久| 精品国产伦理网| 伊人色综合久久天天| 国产在线精品一区二区夜色| 91在线精品一区二区| 日韩欧美黄色影院| 亚洲乱码国产乱码精品精小说| 美女在线一区二区| 91色乱码一区二区三区| 日韩美一区二区三区| 一区二区在线观看视频| 国产精品12区| 91精品国产91热久久久做人人| 国产精品天干天干在观线|