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

? 歡迎來(lái)到蟲(chóng)蟲(chóng)下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲(chóng)蟲(chóng)下載站

?? usbhost.c

?? USB Host在嵌入式系統(tǒng)中的實(shí)現(xiàn).包括所有源代碼.
?? C
?? 第 1 頁(yè) / 共 4 頁(yè)
字號(hào):
	STATUS status,sem_status;
	
	/*HOSTPRINTF("read size %d\n",Size);*/
	
    /*Get StillImage device Info*/
    dev=device_info[DEVID_STILL_IMAGE];
    if(!dev.addr)
    	return PTP_USB_ERROR;
    /*Get Endpoint*/
    for(i=0;i<dev.ep_num;i++){
    	ep=(EP_DATA *)dev.ep_list[i];
    	if(ep->pipe_type==PIPE_IN)
    		break;
	}
    //Check ep Valid or Not(if ep list no bulk in ep)
    if(ep->pipe_type!=PIPE_IN)
    	return PTP_USB_ERROR;
	//Set Semaphone for usb_read Function
    sem_status = NU_Obtain_Semaphore(&USBH_READ_Semaphore, NU_SUSPEND);
	ASSERT(sem_status >= 0);

	USBH_BulkIN_FCT(&device_info[DEVID_STILL_IMAGE], ep ,Buf, Size);
//	HOSTPRINTF("USBH read %d start\n",Size);
WaitInDone:
	status = NU_Receive_From_Queue(&USBH_BIN_Queue, &RDMsg, 4, &actual_size, NU_SUSPEND);
//	HOSTPRINTF("usb r QueueData\n");
	ASSERT(status==NU_SUCCESS);

	
	if(RDMsg.process==USBH_RESET){
		HOSTPRINTF("USBH RESET\n");
		ret= PTP_USB_GONE;
	}
	else if(RDMsg.TID!=(BULK_TRANSACTION|PROCESS_IN))
		goto WaitInDone;
		
	if(RDMsg.process==USBH_DONE){
//		HOSTPRINTF("read Done\n");
		*retCount=ep->curr_count;
		ret= PTP_USB_OK;
	}
	else if(RDMsg.process==USBH_STALL){
		HOSTPRINTF("USBH STALL\n");
		ret= PTP_USB_D_CANCEL;
	}
	else{
		HOSTPRINTF("Bulk IN Transaction NAK Timeout\n");
		HOSTPRINTF("USBH Read Fail, istate 0x%x, err 0x%x, regstate 0x%x\n",RDMsg.istate,RDMsg.error,RDMsg.regstate);
		while(1);
		ret= PTP_USB_ERROR;
	}
	
	sem_status = NU_Release_Semaphore(&USBH_READ_Semaphore);
	ASSERT(sem_status >= 0);
	/*HOSTPRINTF("read actual size %d\n",*retCount);*/
	return ret;
}


PTPIO_RETN PTP_USB_Write(Uint32 UniqueDeviceID,Uint8 *Buf,Uint32 Size)
{
	Uint8 i;
	Sint32 ret;
    EP_DATA *ep;
	DEV_INFO dev;
	MSG_Q WRMsg;
	STATUS status,sem_status;
	Uint32 actual_size;

	/*HOSTPRINTF("write size %d\n",Size);*/
		
	/*Semaphone for Protect PTP_USB_Write*/
    sem_status = NU_Obtain_Semaphore(&USBH_WRITE_Semaphore, NU_SUSPEND);
	ASSERT(sem_status >= 0);

    /*Get StillImage device Info*/
    dev=device_info[DEVID_STILL_IMAGE];
    if(!dev.addr)
    	return PTP_USB_ERROR;
    /*Get Endpoint*/
    for(i=0;i<dev.ep_num;i++){
    	ep=(EP_DATA *)dev.ep_list[i];
    	if(ep->pipe_type==PIPE_OUT)
    		break;
	}

	USBH_BulkOUT_FCT(&device_info[DEVID_STILL_IMAGE], ep ,Buf, Size);
//	HOSTPRINTF("USBH Write %d start\n",Size);
	
WaitOutDone:
	status = NU_Receive_From_Queue(&USBH_BOUT_Queue, &WRMsg, 4, &actual_size, NU_SUSPEND);
//	HOSTPRINTF("usb w QueueData\n");
	ASSERT(status==NU_SUCCESS);

	if(WRMsg.process==USBH_RESET){
		ret= PTP_USB_GONE;
	}
	else if(WRMsg.TID!=(BULK_TRANSACTION|PROCESS_OUT))
		goto WaitOutDone;
	else if(WRMsg.process==USBH_DONE){
//		HOSTPRINTF("write done\n");
		ret= PTP_USB_OK;
	}
	else if(WRMsg.process==USBH_STALL){
		ret= PTP_USB_D_CANCEL;
	}
	else{
		HOSTPRINTF("process Code %d\n",WRMsg.process);
		HOSTPRINTF("Transecation ID 0x%x\n",WRMsg.TID);
		HOSTPRINTF("USBH Write Fail, istate 0x%x, err 0x%x, regstate 0x%x\n",WRMsg.istate,WRMsg.error,WRMsg.regstate);
		ASSERT(0);
		while(1);
		ret= PTP_USB_ERROR;
	}
	sem_status = NU_Release_Semaphore(&USBH_WRITE_Semaphore);
	ASSERT(sem_status >= 0);
	
	return ret;
}


PTPIO_RETN PTP_USB_ReadInterrupt(Uint32 UniqueDeviceID, Uint8 *Buf, Uint32 Size, Uint32 *retCount)
{
	Uint8 i;
	Sint32 ret;
    EP_DATA *ep;
	DEV_INFO dev;
	MSG_Q IIMsg;
	Uint32 actual_size;
	STATUS status,sem_status;
	
	//Set Semaphone for usb_read Function
    sem_status = NU_Obtain_Semaphore(&USBH_INT_Semaphore, NU_SUSPEND);
    ASSERT(sem_status >= 0);
    
    //Get StillImage device Info
    dev=device_info[DEVID_STILL_IMAGE];
    if(!dev.addr)
    	return PTP_USB_ERROR;
    //Get Endpoint
    for(i=0;i<dev.ep_num;i++){
    	ep=(EP_DATA *)dev.ep_list[i];
    	if(ep->pipe_type==PIPE_INT)
    		break;
	}
	USBH_INTIN_FCT(&device_info[DEVID_STILL_IMAGE], ep ,Buf, Size);
//	HOSTPRINTF("USBH INT start\n");
	
WaitINTDone:
	status = NU_Receive_From_Queue(&USBH_INTIN_Queue, &IIMsg, 4, &actual_size, NU_SUSPEND);
	ASSERT(status==NU_SUCCESS);
	
		
	if(IIMsg.process==USBH_RESET){
		ret= PTP_USB_GONE;
	}
	else if(IIMsg.TID!=(INT_TRANSACTION|PROCESS_IN))
		goto WaitINTDone;
		
	else if(IIMsg.process==USBH_DONE){
		ret= PTP_USB_OK;
		*retCount=ep->curr_count;
//		HOSTPRINTF("INT Done\n");
	}
	else if(IIMsg.process==USBH_STALL){
		ret= PTP_USB_D_CANCEL;
	}
	else if(IIMsg.process==USBH_INTNAK){
		ret= PTP_USB_NAK;
	}
	else{
		HOSTPRINTF("process Code %d\n",IIMsg.process);
		HOSTPRINTF("Transecation ID 0x%x\n",IIMsg.TID);
		HOSTPRINTF("USBH Int In Fail, istate 0x%x, err 0x%x, regstate 0x%x\n",IIMsg.istate,IIMsg.error,IIMsg.regstate);
		ret= PTP_USB_ERROR;
	}
	sem_status = NU_Release_Semaphore(&USBH_INT_Semaphore);
	ASSERT(sem_status >= 0);
	
	return ret;
}

Sint16 Control_Setup_TD(Uint8 *setup)
{
	STATUS		status;
	Uint32		actual_size;
	TRANSACTION_STRUCT *CurrTD;
	MSG_Q		CtrlMsg;
	
	/*Default Pipe Data Init*/
	Ctrl_ep->DATAx 		= 0;
	Ctrl_ep->NAKcount	= 0;
	Ctrl_ep->curr_count	= 0;
	Ctrl_ep->type 		= ENDPT_CNTL_0;
	Ctrl_ep->pid_ep 	= VUSB_TOKEN_SETUP;
	
	CurrTD=(TRANSACTION_STRUCT*)calloc(sizeof(TRANSACTION_STRUCT),1);
	
	/*Init IO Buffer,Length*/
	CurrTD->state=CTRL_TRANSACTION|CNTRL_SETUP;
	CurrTD->QH=(Uint32*)&CONTROL_QH;
	CurrTD->curr_EP=Ctrl_ep;
	CurrTD->io_bf=setup;
	CurrTD->length=8;
		
	/*BDT Setting*/
	CurrTD->bdt_PID		=	BDT_PID_OWN | Ctrl_ep->DATAx;
	CurrTD->bdt_BC		=	8;
	IObf_2_BDT(CurrTD,CurrTD->io_bf);//BDT IO Buffer Address Setting
	
	/*USB HOST Control Register Setting*/
	CurrTD->ADDR		=	usb_host.USB_addr;
	CurrTD->EP0CTL		=	Ctrl_ep->type;
	CurrTD->TOKEN		=	Ctrl_ep->pid_ep;
  
    TD_add2QH(&CONTROL_QH,CurrTD);
    
WaitControlSetupMessage:
	status = NU_Receive_From_Queue(&USBH_CTRL_Queue, &CtrlMsg, 4, &actual_size, NU_SUSPEND);
	
	if(CtrlMsg.process==USBH_DONE){
		if(CtrlMsg.TID!=(CTRL_TRANSACTION|CNTRL_SETUP))
			goto WaitControlSetupMessage;
		return USBH_DONE;
	}    
	return CtrlMsg.process;
}

Sint16 Control_IN_TD(Uint8 *in_bf, Uint32 in_len)
{
	STATUS		status;
	MSG_Q	CtrlMsg;
	Uint32		actual_size;
	TRANSACTION_STRUCT *CurrTD;
	
	Ctrl_ep->DATAx		= 0;	//Init for Control IN
	Ctrl_ep->curr_count	= 0;
	Ctrl_ep->NAKcount	= 0;
	Ctrl_ep->type		= ENDPT_CNTL_0;
	Ctrl_ep->pksize		= FS_CTRL_PKCT_SIZE;
	Ctrl_ep->pid_ep		= VUSB_TOKEN_IN;
	Ctrl_ep->io_bf		= in_bf;
	  
	CurrTD=(TRANSACTION_STRUCT*)calloc(sizeof(TRANSACTION_STRUCT),1);

	//Send SetupToken
	CurrTD->state	= CTRL_TRANSACTION|PROCESS_IN;
	CurrTD->QH		= (Uint32*)&CONTROL_QH;
	CurrTD->curr_EP = Ctrl_ep;
	CurrTD->io_bf	= Ctrl_ep->io_bf;
	CurrTD->length	= in_len;
		
	/*BDT Setting*/
	CurrTD->bdt_PID	= BDT_PID_OWN | Ctrl_ep->DATAx;
	CurrTD->bdt_BC	= Ctrl_ep->pksize;
	IObf_2_BDT(CurrTD,CurrTD->io_bf);	//Data Buffer Address Setting
	
	/*USB HOST Control Register Setting*/
	CurrTD->ADDR		=	usb_host.USB_addr;
	CurrTD->EP0CTL		=	Ctrl_ep->type;
	CurrTD->TOKEN		=	Ctrl_ep->pid_ep;

    TD_add2QH(&CONTROL_QH,CurrTD);
    
WaitProcessINMessage:
	status = NU_Receive_From_Queue(&USBH_CTRL_Queue, &CtrlMsg, 4, &actual_size, NU_SUSPEND);		
	if(CtrlMsg.process==USBH_DONE){
		if(CtrlMsg.TID!=(CTRL_TRANSACTION|PROCESS_IN))
			goto WaitProcessINMessage;
		return USBH_DONE;
	}
	return CtrlMsg.process;
}
Sint16 Control_Last_TD(void)
{
	STATUS		status;
	MSG_Q	CtrlMsg;
	Uint32		actual_size;
	TRANSACTION_STRUCT *CurrTD;

	Ctrl_ep->curr_count = 0;
	Ctrl_ep->NAKcount	= 0;
	Ctrl_ep->type 		= ENDPT_CNTL_0;
	Ctrl_ep->pksize		= FS_CTRL_PKCT_SIZE;
	Ctrl_ep->pid_ep 	= VUSB_TOKEN_OUT;
	  
	//Create Transfer
	CurrTD=(TRANSACTION_STRUCT*)calloc(sizeof(TRANSACTION_STRUCT),1);
  	
	//Send SetupToken
	CurrTD->state=CTRL_TRANSACTION|CNTRL_LAST;
	CurrTD->QH=(Uint32*)&CONTROL_QH;
	CurrTD->curr_EP=Ctrl_ep;
		
	//5.EP Transfer Setting
	CurrTD->bdt_PID		=	BDT_PID_OWN | BDT_PID_DATA01;
	CurrTD->bdt_BC		=	0;	
	CurrTD->BUFBASEH	=	0;
	CurrTD->BUFBASEL	=	0;
	CurrTD->bdt_ADDRH	=	0;	
	CurrTD->bdt_ADDRL	=	0;
	
	//USB HOST Control Register Setting
	CurrTD->ADDR		=	usb_host.USB_addr;
	CurrTD->EP0CTL		=	Ctrl_ep->type;
	CurrTD->TOKEN		=	Ctrl_ep->pid_ep;

    TD_add2QH(&CONTROL_QH,CurrTD);

WaitControlLastMessage:
	status = NU_Receive_From_Queue(&USBH_CTRL_Queue, &CtrlMsg, 4, &actual_size, NU_SUSPEND);
	if(CtrlMsg.process==USBH_DONE){
		if(CtrlMsg.TID!=(CTRL_TRANSACTION|CNTRL_LAST))
			goto WaitControlLastMessage;
		return USBH_DONE;
	}
	
	return CtrlMsg.process;
}

Sint16 USB_device_request(Uint8 *setup)
{
  	Sint16 ret;
  	Uint32 setup_length;
  	
  	ret=Control_Setup_TD(setup);
	if(ret!=USBH_DONE){
		HOSTPRINTF("Control Setup Fail %d\n",ret);
		return -1;
	}
	/* Lengths are under our control; must never exceed 0x3ff */
	setup_length = ((Uint32)setup[wLength_high] << 8) | setup[wLength_low];
	ret=Control_IN_TD(dev_request_buffer,setup_length);
	if(ret!=USBH_DONE){
		HOSTPRINTF("Control IN Fail %d\n",ret);
		return -1;
	}
	/*If Length=0 Don't Do BulkOut Transaction*/
	if(setup_length==0){
		return 0;
	}
	ret=Control_Last_TD();
	if(ret!=USBH_DONE){
		HOSTPRINTF("Control LAST Fail %d\n",ret);
		return -1;
	}

	return 0;
}

static int USB_GetString(Uint8 index, Uint16 lang_id)
{
    int i, length,rstatus;
    Uint8 setup[8];


    setup[bmRequestType] = DEVICE_TO_HOST;
    setup[bRequest]      = GET_DESCRIPTOR;
    setup[wValue_low]    = index;
    setup[wValue_high]   = STRING_TYPE;
    setup[wIndex_low]    = lang_id & 255;
    setup[wIndex_high]   = lang_id >> 8;
    setup[wLength_low]   = 255;
    setup[wLength_high]  = 0;

	for (i = 0; i < 10 ; i++) {
		/* If power is off (or printer powering down) return immediately */
		rstatus=USB_device_request(setup);
		if(!rstatus)
			break;
    	HOSTPRINTF("STRING INDEX %d FAILED %d\n", index, i);
	}
	if(rstatus)
		return 0;
	
	if (dev_request_buffer[BLENGTH] > 3    &&
	    dev_request_buffer[BDESCRIPTORTYPE] == STRING_TYPE){
	    length = dev_request_buffer[BLENGTH];
	    return length;
	}
    return 0;
}


static void USB_PrintString(Uint8 index, Uint16 lang_id)
{
    int length, i;

    length = USB_GetString(index, lang_id);
    HOSTPRINTF("'");
    for (i = 2; i < length; i += 2) {
        HOSTPRINTF("%c", dev_request_buffer[i]);
    }
    HOSTPRINTF("'\n");
}

static int USB_GetDescriptor(Uint8 type, Uint8 index, void *desc, Uint16 length)
{
	int i, rstatus;
	Uint8 len;
  	Uint32 setup_length;

	HOSTPRINTF("Get Descriptor\n");

	Setup[bmRequestType] = DEVICE_TO_HOST;
	Setup[bRequest]      = GET_DESCRIPTOR;
	Setup[wValue_low]    = index;
	Setup[wValue_high]   = type;
	Setup[wIndex_low]    = 0;
	Setup[wIndex_high]   = 0;
	Setup[wLength_low]   = length & 255;
	Setup[wLength_high]  = length / 256;
	
	for (i = 1; i <= 10 ; i++) {
		/* If power is off (or printer powering down) return immediately */
		rstatus=USB_device_request(Setup);
		if(!rstatus)
			break;
    	HOSTPRINTF("USB_GetDescriptor retry %d\n", i);
	}
	if(rstatus){
		HOSTPRINTF("DEVICE DESC Get FAILED\n");
    	return 0;
    }
	
    if(dev_request_buffer[BDESCRIPTORTYPE] == type){
			memcpy((Uint8 *)desc,dev_request_buffer, length);
            return length;

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日韩精品一区国产麻豆| 一区二区三区美女| 国产精品久线在线观看| 日韩毛片视频在线看| 亚洲国产中文字幕在线视频综合| 婷婷久久综合九色综合伊人色| 久久精品免费观看| 99在线热播精品免费| 欧美日韩国产小视频| 国产精品一卡二卡在线观看| 三级久久三级久久久| 国产一区二区三区四区五区入口| 不卡一区二区在线| 欧美喷潮久久久xxxxx| 久久久99精品免费观看不卡| 亚洲另类一区二区| 九一九一国产精品| 色婷婷久久久综合中文字幕| 日韩午夜激情av| 亚洲人吸女人奶水| 精品无人区卡一卡二卡三乱码免费卡| 不卡一区二区中文字幕| 欧美一区二区三区白人| 中文字幕在线观看一区二区| 视频一区在线播放| 99久久精品国产毛片| 日韩午夜av一区| 亚洲黄网站在线观看| 国产一区二区免费视频| 欧洲色大大久久| 国产欧美一区二区精品忘忧草| 亚洲电影第三页| 成人av午夜影院| 日韩一级免费一区| 亚洲与欧洲av电影| 成人一级视频在线观看| 日韩欧美你懂的| 亚洲综合无码一区二区| 丁香啪啪综合成人亚洲小说| 欧美日本国产视频| 亚洲视频免费在线观看| 精品中文字幕一区二区| 欧美日韩一区在线| 国产精品理论在线观看| 老司机精品视频在线| 欧美日韩五月天| 亚洲免费电影在线| 国产suv精品一区二区三区| 日韩视频一区在线观看| 亚洲最新视频在线观看| 成人一区二区三区视频| 久久综合九色欧美综合狠狠| 日本不卡在线视频| 精品视频全国免费看| 亚洲美女区一区| 成人a免费在线看| 久久久影院官网| 久久99国产精品麻豆| 欧美另类z0zxhd电影| 怡红院av一区二区三区| 北条麻妃一区二区三区| 国产午夜精品福利| 国产毛片一区二区| 亚洲精品一区二区三区香蕉 | 久久黄色级2电影| 欧美日韩一区国产| 亚洲影院在线观看| 色婷婷综合久久久久中文一区二区| 国产日产欧美精品一区二区三区| 久久精品国内一区二区三区| 欧美美女一区二区在线观看| 一区二区三区电影在线播| 99精品久久99久久久久| 国产亚洲欧洲997久久综合| 国产精品亚洲第一区在线暖暖韩国| 精品人在线二区三区| 久久99精品久久久久婷婷| 91精品国产综合久久国产大片| 偷偷要91色婷婷| 欧美肥妇毛茸茸| 理论片日本一区| 精品国产1区2区3区| 国产精品白丝jk白祙喷水网站| 精品国精品自拍自在线| 国内精品写真在线观看| 久久婷婷国产综合国色天香| 久久av老司机精品网站导航| 欧美成人猛片aaaaaaa| 极品美女销魂一区二区三区免费| 精品国产污网站| 国产传媒久久文化传媒| 国产精品久久久久久久久图文区| 91在线视频官网| 亚洲愉拍自拍另类高清精品| 欧美精品在线视频| 韩国女主播成人在线| 国产农村妇女毛片精品久久麻豆| 97久久超碰国产精品| 亚洲一区二区三区自拍| 欧美一级xxx| 国产91高潮流白浆在线麻豆| 亚洲欧美偷拍卡通变态| 69堂成人精品免费视频| 国产乱码精品1区2区3区| 国产精品久久久久久久久图文区| 一本大道av伊人久久综合| 亚洲成人av电影在线| 久久综合久久综合九色| aaa亚洲精品| 午夜欧美电影在线观看| 精品国产乱码久久久久久1区2区 | 欧美成人性战久久| 成人一区二区视频| 亚洲不卡在线观看| 久久九九全国免费| 欧美写真视频网站| 韩国一区二区视频| 亚洲人成网站色在线观看| 欧美久久久久中文字幕| 国产精品91一区二区| 亚洲天天做日日做天天谢日日欢| 欧美伊人精品成人久久综合97| 午夜精品久久久久影视| 精品视频一区二区三区免费| 国产自产高清不卡| 一区二区欧美国产| 日韩一区二区在线观看视频播放| 成人免费视频播放| 亚洲综合视频在线观看| 久久久久久久久久久久久久久99| 大美女一区二区三区| 亚洲国产精品久久久久婷婷884| 久久综合狠狠综合| 91官网在线观看| 国产精品123| 夜夜嗨av一区二区三区网页| 国产亚洲欧美在线| 99精品国产91久久久久久| 日韩va亚洲va欧美va久久| 日韩美女视频一区| 日韩精品一区二区三区老鸭窝 | 久久午夜电影网| 欧美日韩亚州综合| 福利91精品一区二区三区| 日韩精品欧美精品| 国产精品久久久久一区二区三区共| 欧美一二三四在线| a在线欧美一区| 精品一区二区国语对白| 亚洲精品第一国产综合野| 精品福利一二区| 欧美美女激情18p| 成人的网站免费观看| 国产一区二区中文字幕| 亚洲电影中文字幕在线观看| 中文字幕va一区二区三区| 91精品国产福利在线观看| 91成人免费在线视频| 国模大尺度一区二区三区| 亚洲成精国产精品女| 亚洲人成影院在线观看| 欧美精品一区二区三区在线| 欧美中文字幕亚洲一区二区va在线| 狠狠色丁香婷综合久久| 亚洲18影院在线观看| 亚洲精品一卡二卡| 欧美精品一区二区精品网| 欧美蜜桃一区二区三区| 在线观看一区二区视频| 成人三级伦理片| 国产一区二区三区国产| 日韩精品乱码免费| 一片黄亚洲嫩模| 中文字幕在线播放不卡一区| 欧美国产禁国产网站cc| 久久网站热最新地址| 欧美一级二级三级蜜桃| 日韩视频在线你懂得| 欧美日韩国产天堂| 欧美日韩精品一区二区| 欧美三级韩国三级日本一级| 91色porny蝌蚪| 91精品办公室少妇高潮对白| 丰满少妇久久久久久久| 风间由美一区二区av101| 国产一区二区电影| 国产成人精品亚洲午夜麻豆| 国产米奇在线777精品观看| 黑人巨大精品欧美黑白配亚洲| 免费成人小视频| 午夜在线电影亚洲一区| 日韩成人精品在线| 亚洲大尺度视频在线观看| 亚洲成av人片在线观看| 丝袜亚洲另类欧美综合| 午夜精品福利视频网站| 蜜桃av一区二区在线观看| 奇米影视在线99精品| 奇米精品一区二区三区在线观看 | 这里只有精品视频在线观看|