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

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

?? usbhost.c

?? USB Host在嵌入式系統中的實現.包括所有源代碼.
?? C
?? 第 1 頁 / 共 4 頁
字號:
#include "standard.h"
#include "nucleus.h"
#include "syt.h"
#include "usbhost.h"
#include "usbpriv.h"
#include "xtime.h"
#include "usbh.h"

//#define HOSTPRINTF logprintf
#define HOSTPRINTF if(0) printf

#define PIPE_IN		0x01
#define PIPE_OUT	0x02
#define PIPE_INT	0x03

#define USBHOST_PRIORITY     10
#define FS_CTRL_PKCT_SIZE    64
#define FS_BULK_PKCT_SIZE    64
/*
 * Start-of-Frame byte-count-times threshold for starting a worst-case
 * transfer followed by ACK or NAK without colliding with next SOF.
 */
#define SOF_THRESHOLD  100
#define PTPTASK_STACKSIZE	1024
#define USBHTASK_STACKSIZE 1024


/* Insertion delay - 100ms. min USB spec.: 9.1.2, #3, pg. 243 */
#define USB_DEBOUNCE_DELAY          (105*1000)
/* Reset delay (TDRSTR) - 50ms. min, USB spec.: 7.1.7.5, pg. 153 */
#define USB_RESET_DELAY             (55*1000)
/* Reset recovery time (TRSTRCY) - 10ms. min, USB spec.: 7.1.7.5, pg. 153 */
#define USB_RESET_RECOVERY_DELAY    (15*1000)


#define MICROSECONDS_PER_TICK	(1000000 / (NU_PLUS_Ticks_Per_Second))
#define MILLISECONDS_PER_TICK	(1000 / (NU_PLUS_Ticks_Per_Second))
#define TICKS_PER_SECOND	(NU_PLUS_Ticks_Per_Second)

/*
**  Notes on time conversion:
**	    1. We round microseconds to the nearest tick.
**	    2. Max TaskSleep time is ~497 days.
*/
#define TIMEVAL_TO_TICKS(tvp) \
	(tvp->secs * TICKS_PER_SECOND + \
	 (tvp->usecs + MICROSECONDS_PER_TICK/2) / MICROSECONDS_PER_TICK)
	 
//typedef enum {
//    PTP_USB_OK,
//    PTP_USB_NAK,
//    PTP_USB_INT_DATA_ABORT,
//    PTP_USB_D_CANCEL,
//    PTP_USB_H_CANCEL,
//    PTP_USB_ERROR,
//    PTP_USB_GONE
//} PTPIO_RETN;

typedef struct {
    Boolean needClass;
    int Config;
    int iface;
    int ifaceAlt;
    int MaxLUN;
    int ep_in;
    int ep_in_pksize;
    int ep_out;
    int ep_out_pksize;
    int ep_intr;
    int ep_intr_pksize;
    int ep_intr_pollms;
} USB_CLASS;

typedef struct {
    Uint8 process;
	Uint8 istate;
	Uint8 error;
	Uint8 regstate;
	Uint32 TID;	
	Uint32 bw3;
	Uint32 bw4;
}MSG_Q;

typedef struct {
	/*Curr State Info*/
	HOST_QUEUE_HEAD	*curr_QH;
    TRANSACTION_STRUCT *curr_TD;
    TRANSACTION_STRUCT *prve_TD;
        
    /*USB Device Info DataBase*/
    Uint8 dev_total;   
	DEV_INFO *dev_info[128];
	Uint32 USB_addr;
	/*USBH HW Setting Info*/
    Boolean even_odd_OUT;
    Boolean even_odd_IN;
    int DeviceReady;
} HOST_STATE_STRUCT;


static NU_TASK TaskPTPLayerID;
static NU_TASK TaskUSBH_ID;
static NU_QUEUE USBH_CTRL_Queue;
static NU_QUEUE USBH_BIN_Queue;
static NU_QUEUE USBH_BOUT_Queue;
static NU_QUEUE USBH_INTIN_Queue;
static NU_SEMAPHORE USBH_READ_Semaphore;
static NU_SEMAPHORE USBH_WRITE_Semaphore;
static NU_SEMAPHORE USBH_INT_Semaphore;
static Uint32 TaskUSBH_stack[USBHTASK_STACKSIZE*2];
static Uint32 TaskPTPLayer_stack[PTPTASK_STACKSIZE*4];
static DEVICE_DESC DeviceDesc;    
static CONFIG_DESC ConfigDesc;    
static INTERFACE_DESC InterfaceDesc;
static ENDPOINT_DESC EndpointDesc;
static USB_CLASS MassStorage;
static USB_CLASS StillImage;
static TimeVal debounce_delay = {0, USB_DEBOUNCE_DELAY};
static TimeVal reset_delay   = {0, USB_RESET_DELAY};
static TimeVal recover_delay = {0, USB_RESET_RECOVERY_DELAY};

int *USBHOST_READY_FLAG;
Uint8 *Setup, *dev_request_buffer;
Uint32 *Ctrl_Queue_buff;
Uint32 *BulkIN_Queue_buff;
Uint32 *BulkOUT_Queue_buff;
Uint32 *IntIN_Queue_buff;
HOST_STATE_STRUCT usb_host;

extern EP_DATA *Ctrl_ep;
extern DEV_INFO *device_info;
extern HOST_QUEUE_HEAD	ISO_QH,INT_QH,CONTROL_QH,BULK_QH;


void PTP_Layer_Task(UNSIGNED argc, VOID *argv);
PTPIO_RETN PTP_USB_ReadInterrupt(Uint32 UniqueDeviceID, Uint8 *Buf, Uint32 Size, Uint32 *retCount);



///*****************************************************************************
// * Synopsis:    Sint32 TaskSleep(pTV)
// * Description: Put the task to sleep, making it ready after the time 'pTV'.
// * Arguments:   (TimeVal *) pTV -- pointer to the timeval structure.
// * Return:      0 always
// *****************************************************************************/
//Sint32 TaskSleep(TimeVal * pTV)
//{
//    /* Note: NU_Sleep(n) sleeps for between n-1 and n ticks, that's why we
//    **	     add the 1 at the end of the equation.
//    */
//    UNSIGNED ticks;
//
//    ASSERT(pTV != NULL);
//
//    ticks = TIMEVAL_TO_TICKS(pTV) + 1;
//
//    NU_Sleep(ticks);
//
//    return 0;
//}

Uint8 debug_log_workreport[400];
Uint16 debug_log_workreport_count=0;
void USBH_work_report(Uint8 code, Uint32 PROCESS_ID, Uint32 rstatus)
{
	STATUS status;
	MSG_Q Msg;

	Msg.process = code;
	Msg.istate	= (Uint8)(rstatus>>16);	
	Msg.error	= (Uint8)(rstatus>>8);
	Msg.regstate= (Uint8) rstatus;
	Msg.TID		= PROCESS_ID;
	Msg.bw3		= 0;
	Msg.bw4		= 0;
	
	if(code==USBH_DONE){
		if(debug_log_workreport_count>400)
			debug_log_workreport_count=0;
		debug_log_workreport[debug_log_workreport_count]=PROCESS_ID;
		debug_log_workreport_count++;
	}
	
	if(((PROCESS_ID&0xF0)==CTRL_TRANSACTION)||(PROCESS_ID==0)){
		status = NU_Send_To_Queue(&USBH_CTRL_Queue, &Msg, 4, NU_NO_SUSPEND);
		if(status!=NU_SUCCESS){
			while(1);
		}
		return;
	}
	if(PROCESS_ID==(BULK_TRANSACTION|PROCESS_IN)){
		status = NU_Send_To_Queue(&USBH_BIN_Queue, &Msg, 4, NU_NO_SUSPEND);
		if(status!=NU_SUCCESS){
			while(1);
		}
		return;
	}
	if(PROCESS_ID==(BULK_TRANSACTION|PROCESS_OUT)){
		status = NU_Send_To_Queue(&USBH_BOUT_Queue, &Msg, 4, NU_NO_SUSPEND);
		if(status!=NU_SUCCESS){
			while(1);
		}
		return;
	}
	if(PROCESS_ID==INT_TRANSACTION|PROCESS_IN){
		status = NU_Send_To_Queue(&USBH_INTIN_Queue, &Msg, 4, NU_NO_SUSPEND);
		if(status!=NU_SUCCESS){
			while(1);
		}
		return;
	}
//	status = NU_Broadcast_To_Queue(&USBH_CTRL_Queue, &Msg, 4,NU_NO_SUSPEND);	
//	if(status!=NU_SUCCESS){
//		while(1);
//	}
}











Sint32 IObf_2_BDT(TRANSACTION_STRUCT *TD,Uint8 *ep_iobf)
{
    Uint8  reg8;
    Uint32 reg32;
    
	reg32=(Uint32)ep_iobf;	//Get Buffer Address
	
	reg8=(Uint8)(reg32>>24);//MSB	
	TD->BUFBASEH=reg8;
	reg8=(Uint8)(reg32>>16);
	TD->BUFBASEL=reg8;
	reg8=(Uint8)(reg32>>8);	
	TD->bdt_ADDRH=reg8;	
	reg8=(Uint8)reg32;
	TD->bdt_ADDRL=reg8;	//LSB
	

}



static void reset_the_device(void)
{
    /* Disable and clear all interrupts */
    *regINT_ENB = 0;
    *regINT_STAT = 0xFF;

    /* Reset the device */
    Ctrl_ep->pksize = FS_CTRL_PKCT_SIZE;
    usb_host.USB_addr = 0;
    *regADDR = 0;

    /* Assert reset on the USB */
    *regCTL = CTRL_HOST_NO_SOF | CTRL_RESET;

    /* Delay 55 msec. for the reset process to complete */
    TaskSleep(&reset_delay);

    /* Set the ODD/EVEN BDT to even */
    usb_host.even_odd_OUT = BDT_OUT_BIT;
    usb_host.even_odd_IN  = BDT_IN_BIT;

    /*
     * Set SOF threshold so we are guaranteed to have enough time for
     * any transaction to complete (including ACK or NAK) without reaching
     * the time to send the next Start-of-frame packet.
     */
    *regSOF_THLD = SOF_THRESHOLD;

    /* End the reset , clear ODD bit and enable host */
    *regCTL = CTRL_ODD_RST | CTRL_HOST_SOF;

    /* Delay 15 msec. for the reset recovery period */
    TaskSleep(&recover_delay);


}

void TD_add2QH(HOST_QUEUE_HEAD *QH, TRANSACTION_STRUCT *TD)
{
	TRANSACTION_STRUCT *TDtail;
	
	//Disable USBH Interrupt
    *(unsigned long *)EXMSK1A &= ~(1 << USB1_INTERRUPT_BIT);
    
	if(QH->TD_tail!=NULL)
	{
		TDtail=QH->TD_tail;	//Get Tail TD
		TD->TD_next=NULL;
		TDtail->TD_next=TD;	//Add Curr TD After TD Tail
		QH->TD_tail=TD;		//Update QH Tail
		/****************************************/
		/*	QH->TD_head->TD1->TD2->TDtail->TD	*/
		/*									/|\	*/
		/*	QH->TD_tail----------------------|	*/
		/****************************************/
	}
	else
	{
		TD->TD_next=NULL;
		QH->TD_head=TD;
		QH->TD_tail=TD;
		/********************/
		/*	QH->TD_head->TD	*/
		/*				/|\	*/
		/*	QH->TD_tail--|	*/
		/********************/
	}
	//Enable USB HOST INT
    *(unsigned long *)EXMSK1A |= (1 << USB1_INTERRUPT_BIT);
}


Sint32 USBH_INTIN_FCT(DEV_INFO *dev, EP_DATA *ep, Uint8 *Buf, Uint32 Size)
{
	TRANSACTION_STRUCT *CurrTD, *Tmp_TD;
	
	ep->curr_count=0;
	//4.Create Transfer
	CurrTD=(TRANSACTION_STRUCT*)calloc(sizeof(TRANSACTION_STRUCT),1);
	
	CurrTD->state=INT_TRANSACTION|PROCESS_IN;
	CurrTD->QH=(Uint32*)&INT_QH;
	CurrTD->curr_DEV=dev;
	CurrTD->curr_EP=ep;
	CurrTD->io_bf=Buf;
	CurrTD->length=Size;
		
	//EP Transfer Setting
	CurrTD->bdt_PID		=	BDT_PID_OWN | ep->DATAx;
	CurrTD->bdt_BC		=	ep->pksize;
	
	//Data Buffer Address Setting
	IObf_2_BDT(CurrTD,CurrTD->io_bf);
	
	//USB HOST Control Register Setting
	CurrTD->EP0CTL		=	ep->type;
	CurrTD->ADDR		=	dev->addr;
	CurrTD->TOKEN		=	ep->pid_ep;
    
    TD_add2QH(&INT_QH,CurrTD);
}

Sint32 USBH_BulkIN_FCT(DEV_INFO *dev, EP_DATA *ep, Uint8 *Buf, Uint32 Size)
{
	Uint8 PROCESS_ID;
	Uint8 process_msg;
	Uint8 istate_msg;
	Uint8 regstate_msg;
	Uint8 error_msg;
	TRANSACTION_STRUCT *CurrTD, *Tmp_TD;
	
	ep->curr_count=0;
	//4.Create Transfer
	CurrTD=(TRANSACTION_STRUCT*)calloc(sizeof(TRANSACTION_STRUCT),1);
	
	CurrTD->state=BULK_TRANSACTION|PROCESS_IN;
	CurrTD->QH=(Uint32*)&BULK_QH;
	CurrTD->curr_DEV=dev;
	CurrTD->curr_EP=ep;
	CurrTD->io_bf=Buf;
	CurrTD->length=Size;
		
	//5.EP Transfer Setting
	CurrTD->bdt_PID		=	BDT_PID_OWN | ep->DATAx;
	CurrTD->bdt_BC		=	ep->pksize;
	
	//Data Buffer Address Setting
	IObf_2_BDT(CurrTD,CurrTD->io_bf);
	
	//USB HOST Control Register Setting
	CurrTD->EP0CTL		=	ep->type;
	CurrTD->ADDR		=	dev->addr;
	CurrTD->TOKEN		=	ep->pid_ep;
   
    TD_add2QH(&BULK_QH,CurrTD); 
}

Sint32 USBH_BulkOUT_FCT(DEV_INFO *dev, EP_DATA *ep, Uint8 *Buf, Uint32 Size)
{
	Uint32 left_to_send;
	TRANSACTION_STRUCT *CurrTD;
	
	ep->curr_count=0;
	//4.Create Transfer
	CurrTD=(TRANSACTION_STRUCT*)calloc(sizeof(TRANSACTION_STRUCT),1);
	
	CurrTD->state=BULK_TRANSACTION|PROCESS_OUT;
	CurrTD->QH=(Uint32*)&BULK_QH;
	CurrTD->curr_DEV=dev;
	CurrTD->curr_EP=ep;
	CurrTD->io_bf=Buf;
	CurrTD->length=Size;
		
    left_to_send = Size;
	if (left_to_send > ep->pksize)
		left_to_send = ep->pksize;
	//5.EP Transfer Setting
	CurrTD->bdt_PID		=	BDT_PID_OWN | ep->DATAx;
	CurrTD->bdt_BC		=	left_to_send;
	
	//Data Buffer Address Setting
	IObf_2_BDT(CurrTD,CurrTD->io_bf);
	
	//USB HOST Control Register Setting
	CurrTD->EP0CTL		=	ep->type;
	CurrTD->ADDR		=	dev->addr;
	CurrTD->TOKEN		=	ep->pid_ep;

    TD_add2QH(&BULK_QH,CurrTD);
}


PTPIO_RETN PTP_USB_Read(Uint32 UniqueDeviceID,Uint8* Buf,Uint32 Size,Uint32 *retCount)
{
	Uint8 i;
	Sint32 ret;
    EP_DATA *ep;
	DEV_INFO dev;
	MSG_Q RDMsg;
	Uint32 actual_size;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品456露脸| 国产乱妇无码大片在线观看| 日韩免费观看高清完整版在线观看| 国产成人综合视频| 亚洲国产中文字幕| 中日韩av电影| 久久久久久久综合狠狠综合| 精品视频在线免费观看| 99久久99久久精品免费看蜜桃 | 中文字幕精品—区二区四季| 欧美精选在线播放| 色综合网站在线| 成人午夜在线播放| 久久99蜜桃精品| 日韩中文字幕区一区有砖一区| 综合自拍亚洲综合图不卡区| 国产女人18毛片水真多成人如厕 | 国产精品视频在线看| 欧美一卡2卡三卡4卡5免费| 色拍拍在线精品视频8848| 国产成人免费av在线| 国内精品国产成人| 久草这里只有精品视频| 日韩国产欧美在线视频| 五月激情综合色| 亚洲精品国产成人久久av盗摄| 中文字幕av一区二区三区高| 久久亚洲一区二区三区明星换脸| 欧美一区二区国产| 在线电影欧美成精品| 欧美性受极品xxxx喷水| 在线免费观看日本欧美| 欧美性极品少妇| 欧美老人xxxx18| 欧美人成免费网站| 欧美日韩美女一区二区| 欧美日韩高清一区二区不卡| 欧美片网站yy| 日韩亚洲欧美中文三级| 日韩精品在线一区二区| 精品精品国产高清一毛片一天堂| 日韩欧美第一区| 精品久久国产老人久久综合| 精品国产在天天线2019| 久久久国产精华| 中文字幕一区二区三区四区| 亚洲女女做受ⅹxx高潮| 亚洲一区二区欧美| 日韩影视精彩在线| 国产自产2019最新不卡| 国产福利不卡视频| 91在线你懂得| 欧美日韩午夜影院| 精品美女被调教视频大全网站| 精品蜜桃在线看| 日本一区二区三区免费乱视频| 国产精品视频麻豆| 亚洲黄色av一区| 午夜精品免费在线观看| 精品亚洲免费视频| 懂色av中文一区二区三区| 91色在线porny| 欧美性受极品xxxx喷水| 日韩欧美一区二区视频| 国产日韩一级二级三级| 亚洲免费av观看| 免费久久99精品国产| 国产成人精品一区二| 欧美在线看片a免费观看| 欧美mv日韩mv国产网站app| 国产精品国产三级国产a| 亚洲动漫第一页| 国产一区二区三区四区五区入口| av在线这里只有精品| 777久久久精品| 国产精品麻豆久久久| 五月天一区二区| 国产不卡视频在线播放| 欧美三级资源在线| 久久综合狠狠综合久久综合88 | 夜夜精品浪潮av一区二区三区| 日韩福利视频导航| 成人黄色免费短视频| 欧美一区2区视频在线观看| 国产精品区一区二区三| 丝袜国产日韩另类美女| 不卡的av在线| 精品精品国产高清a毛片牛牛 | 国产高清在线精品| 欧美日韩高清一区| 国产精品无码永久免费888| 亚洲第一福利一区| 波多野结衣欧美| 日韩精品中文字幕一区 | 国产精品18久久久久| 欧美性大战久久| 中文字幕av一区 二区| 免费观看成人鲁鲁鲁鲁鲁视频| 91免费观看视频在线| 久久欧美一区二区| 日本伊人精品一区二区三区观看方式| 成人国产精品视频| 26uuu国产一区二区三区| 亚洲大片免费看| 91年精品国产| 欧美国产日韩一二三区| 麻豆成人91精品二区三区| 欧美偷拍一区二区| 亚洲人成网站在线| 成人av影院在线| 久久精品在这里| 青青草成人在线观看| 欧美日韩国产一区二区三区地区| 国产精品国产三级国产aⅴ无密码| 精品一区二区三区香蕉蜜桃| 欧美精品在线视频| 亚洲地区一二三色| 欧美色图天堂网| 亚洲精品视频免费观看| 成人性生交大合| 欧美高清在线一区二区| 国产精品中文字幕日韩精品| 精品免费99久久| 久久99精品国产.久久久久久 | 日本一区二区免费在线| 久久不见久久见免费视频7| 日韩午夜激情av| 日本视频在线一区| 日韩午夜av一区| 蜜桃av一区二区在线观看| 欧美一区二区网站| 青草av.久久免费一区| 欧美一级精品在线| 九九精品视频在线看| 欧美成人一区二区三区在线观看| 免费成人结看片| 精品欧美一区二区久久| 久草精品在线观看| 久久精品欧美一区二区三区不卡| 国产精品中文字幕日韩精品| 国产亚洲精品免费| 99精品久久免费看蜜臀剧情介绍| 亚洲欧洲色图综合| 色又黄又爽网站www久久| 亚洲主播在线观看| 911国产精品| 久久激情五月婷婷| 欧美va日韩va| 国产精品中文字幕一区二区三区| 国产精品少妇自拍| 91女厕偷拍女厕偷拍高清| 亚洲午夜一区二区| 日韩三区在线观看| 国产a精品视频| 亚洲精品国产无天堂网2021| 欧美日韩国产色站一区二区三区| 免费视频最近日韩| 久久久欧美精品sm网站| 99麻豆久久久国产精品免费优播| 亚洲欧美区自拍先锋| 91精品视频网| 国产成人在线观看| 亚洲欧美另类小说视频| 制服丝袜激情欧洲亚洲| 国产盗摄女厕一区二区三区| 亚洲欧美日韩中文字幕一区二区三区| 欧洲人成人精品| 美女免费视频一区| 国产精品久久三| 欧美日韩国产精品成人| 国产高清在线精品| 亚洲尤物在线视频观看| 日韩精品资源二区在线| 99热精品国产| 蜜桃在线一区二区三区| 国产精品视频你懂的| 欧美剧情片在线观看| 国产剧情在线观看一区二区| 亚洲综合色婷婷| 精品国产乱码久久久久久久久| 一本色道久久综合亚洲精品按摩| 五月天一区二区三区| 国产精品妹子av| 日韩精品一区在线| 91国内精品野花午夜精品| 国产一区二区三区美女| 亚洲成人免费视频| 国产精品久久毛片a| 欧美日本乱大交xxxxx| 99久久综合精品| 激情五月激情综合网| 一卡二卡欧美日韩| 久久亚洲一区二区三区明星换脸| 欧美三级在线播放| 成人免费视频一区二区| 蜜臀精品一区二区三区在线观看 | 国产麻豆精品95视频| 午夜精彩视频在线观看不卡| 国产精品成人网| 久久久久久久综合狠狠综合|