⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 usb_fusb150.c

📁 embedded usb protocol C program
💻 C
字号:
#include "uart.h"
#include "usb.h"
#include "usblib.h"
#include "usb_dsc.h"


void dld_ReadEndpoint_0(U32 * buf);

typedef struct
{
	usb_dev_class_setup_type	setup;
} usb_dev_class_control_buf_type;

/*=============================================================================

                  G L O B A L     V A R I A B L E S

=============================================================================*/
extern USB_Control_Block UsbCb;

/*=============================================================================

       E X T E R N A L     F U N C T I O N S  
         
=============================================================================*/
extern void dld_UsbStandardReq(void);


/*=============================================================================

       I N T E R N A L     F U N C T I O N S  
         
=============================================================================*/

void UsbControl(void){
	if((UsbCb.sControl.setup.bmRequestType & USB_REQ_TYPE_MASK) == USB_REQ_TYPE_STANDARD)
	{
		dld_UsbStandardReq();
	}
}
void dld_Ep0Rxhandler(void)
{
	U8  usbsetupflag = 0;
	
	dld_ReadEndpoint_0((U32 *)(&UsbCb.sControl.setup));

	UsbCb.sControl.wLength = UsbCb.sControl.setup.wLength;
	UsbCb.sControl.wCount  = 0;
	if (UsbCb.sControl.setup.bmRequestType & USB_ENP_DIR_MASK )//In
	{
		usbsetupflag = 1;		
	}
	else//Out
	{
		if (UsbCb.sControl.setup.wLength == 0)
		{
			usbsetupflag = 1;
		}
		mb_CtlEDCtlCXCMPLTSet(_CtlEDCtlCXCMPLT_ACK); 
	}
	if(usbsetupflag)
	{
		if((UsbCb.sControl.setup.bmRequestType & USB_REQ_TYPE_MASK) == USB_REQ_TYPE_STANDARD)
		{
			dld_UsbStandardReq();
		}
	}
}
void dld_Ep1TxHandler(void)
{
	U16	i = UsbCb.sControl.wLength - UsbCb.sControl.wCount;

	if( i >= USB_MAX_PKT_SIZE_ENP0)
	{
		Wr_ep0(UsbCb.sControl.pData + UsbCb.sControl.wCount, USB_MAX_PKT_SIZE_ENP0);
		UsbCb.sControl.wCount += USB_MAX_PKT_SIZE_ENP0;
	}
	else if( i != 0)
	{
		Wr_ep0(UsbCb.sControl.pData + UsbCb.sControl.wCount, i);
		UsbCb.sControl.wCount += i;
		mb_CtlEDCtlCXCMPLTSet(_CtlEDCtlCXCMPLT_ACK); 
	}
	else if (i == 0)
 	{
		mb_CtlEDCtlCXCMPLTSet(_CtlEDCtlCXCMPLT_ACK); 
	}
}
void dld_ReadEndpoint_0(U32 * buf){
	U32 *p = buf;

    *p++  = mw_CtlCmd120C();
    *p    = mw_CtlCmd1210();	
}
void Rd_ep_fifo(U32 endp, U8 *buf, int length){
	U32 i, Q, R, *pDWordBuf;
	U8 *bpRemainBuf;	

 	if(((U32)buf & 0x3)==0){
		Q = length >> 2;
		R = length & 0x3;
 		pDWordBuf = (U32 *)buf; 		
 		for(i=0; i<Q; i++)
	 		*pDWordBuf++ = mdw_EDnDataRd(endp);
	 	bpRemainBuf = (U8 *)pDWordBuf;	
	 	if( R ){
			for(i=0; i < R; i++) 
				bpRemainBuf[i] = mb_EDnDataRd(endp);
	 	}	
 	}
 	else{ 		
 	 	bpRemainBuf = buf;
	 	for(i=0; i<length; i++)
	 		bpRemainBuf[i] = mb_EDnDataRd(endp);
	}
}
void Rd_ep_fifo_CS(U32 endp, U8 *buf, int length){
	U32 i;

	Rd_ep_fifo(endp, buf, length);
    for(i=0; i<length; i++)
        checkSum += buf[i];
}
U32 getFifoCnt(U32 endp){
	U32 length;

	mb_EDnStsDPKTClr(endp);
	length = mw_EDnStsBF1LenRd(endp) + mw_EDnStsBF0LenRd(endp);
	return length;	
}
U16 Rd_ep(U32 endp, U8 * buf){
	U16 length;
	U32 i, Q, R;
	U32 *pDWordBuf;
	U8 *bpRemainBuf;	

	mb_EDnStsDPKTClr(endp);
	length = mw_EDnStsBF1LenRd(endp) + mw_EDnStsBF0LenRd(endp);
 	if(((U32)buf & 0x3)==0){
		Q = length >> 2;
		R = length & 0x3;
 		pDWordBuf = (U32 *)buf; 		
 		for(i=0; i<Q; i++)
	 		*pDWordBuf++ = mdw_EDnDataRd(endp);
	 	bpRemainBuf = (U8 *)pDWordBuf;	
	 	if( R ){
			for(i=0; i < R; i++) 
				bpRemainBuf[i] = mb_EDnDataRd(endp);
	 	}	
 	}
 	else{ 		
 	 	bpRemainBuf = buf;
	 	for(i=0; i<length; i++)
	 		bpRemainBuf[i] = mb_EDnDataRd(endp);
	}
	return length;
}
void Wr_ep(U32 endp, U8 * buf, U32 length){
	U32 i, Q, R, bBufferNum;
	const U32 *pDWordBuf;
	const U8 *bpRemainBuf;

	mb_EDnStsDPKTClr(endp);
	bBufferNum = mb_EDnStsBSelRd(endp);
	if(((U32)buf & 3)==0){//Aligned
		Q = length >> 2;
		R = length & 3;	
 		pDWordBuf = (U32 *)buf; 		
 		for(i=0; i<Q; i++)
			mdw_EDnDataSet(endp, *pDWordBuf++);
	 	bpRemainBuf = (const U8 *)pDWordBuf;	
		if( R ){
			for(i=0; i < R; i++)
				mb_EDnDataSet(endp, bpRemainBuf[i]);
		}
	}
	else{//not-Aligned
 	 	bpRemainBuf = buf;
	 	for(i=0; i<length; i++)
			mb_EDnDataSet(endp, bpRemainBuf[i]);
	}
	if(bBufferNum)	mb_EDnStsBF1RDYSet(endp);
	else			mb_EDnStsBF0RDYSet(endp);
}
U16 Rd_ep0(U8 * buf){
	U16 length;
	U32 i, Q, R;
	U32 *pDWordBuf;
	U8 *bpRemainBuf;	

	length = mw_CtlEDStsBF0LenRd();
 	if(((U32)buf & 0x3)==0){
		Q = length >> 2;
		R = length & 0x3;
 		pDWordBuf = (U32 *)buf; 		
 		for(i=0; i<Q; i++)
	 		*pDWordBuf++ = mdw_CtlEDDataRd();
	 	bpRemainBuf = (U8 *)pDWordBuf;	
	 	if( R ){
			for(i=0; i < R; i++) 
				bpRemainBuf[i] = mb_CtlEDDataRd();
	 	}	
 	}
 	else{ 		
 	 	bpRemainBuf = buf;
	 	for(i=0; i<length; i++)
	 		bpRemainBuf[i] = mb_CtlEDDataRd();
	}
	return length;
}
void Wr_ep0(U8 * buf, U32 length){
	U32 i, Q, R;
	const U32 *pDWordBuf;
	const U8 *bpRemainBuf;

	if(((U32)buf & 3)==0){//Aligned
		Q = length >> 2;
		R = length & 3;	
 		pDWordBuf = (U32 *)buf; 		
 		for(i=0; i<Q; i++)
 			mdw_CtlEDDataSet(*pDWordBuf++);
	 	bpRemainBuf = (const U8 *)pDWordBuf;	
		if( R ){
			for(i=0; i < R; i++)
				mb_CtlEDDataSet(bpRemainBuf[i]);
		}
	}
	else{//not-Aligned
 	 	bpRemainBuf = buf;
	 	for(i=0; i<length; i++)
			mb_CtlEDDataSet(bpRemainBuf[i]);
	}
}
void vUsbFIFO_EPxCfg_FS(void){

	mb_EDnCtlByte3(EP1, EP1_CFG);
    mb_EDnCtlBF0CLRSet(EP1);
    mb_EDnCtlBF1CLRSet(EP1);
    mb_EDnStsTHOD(EP1,0);
    mb_EDnCtlByte1(EP1, DPKT_IE);                             
	mw_Ctl_ED_IESet(EP1);

	mb_EDnCtlByte3(EP2, EP2_CFG);
    mb_EDnCtlBF0CLRSet(EP2);
    mb_EDnCtlBF1CLRSet(EP2);
    mb_EDnStsTHOD(EP2,0);
    mb_EDnCtlByte1(EP2, DPKT_IE);                             
	mw_Ctl_ED_IESet(EP2);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -