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

📄 usblib.c

📁 embedded usb protocol C program
💻 C
字号:
#include "basetype.h"
#include "regio.h"

#include "Hal_mem.h"

#include "mtd.h"

#include "uart.h"
#include "usb.h"
#include "usblib.h"
#include "usb_dsc.h"
#include "oem_gpio.h"

extern USB_Control_Block UsbCb;

void ep0_handler(void){
	volatile U8 ep_sts_L2;

	mb_CtlEDStsSet(ep_sts_L2 = mb_CtlEDStsRd());
	if(ep_sts_L2 & BIT0)
		dld_Ep0Rxhandler();
	else if(ep_sts_L2 & BIT1){
		if (UsbCb.sControl.setup.bmRequestType & USB_ENP_DIR_MASK )
			dld_Ep1TxHandler(); //In
		else{
			U8 buff[8];
			
			uprintf("Ep0Rx\n");
			Rd_ep0(buff);
			mb_CtlEDCtlBF0Set();//clear the Buffer-0
		}
	}
	else if(ep_sts_L2 & BIT2)
        mb_CtlEDCtlCXCMPLTSet(_CtlEDCtlCXCMPLT_ACK); 
}
void ep1_Tx_handler(void){
	volatile U8 ep_sts_L2 = mb_EDnSts_IERd(1);

	//uprintf("tx\n");
	if (ep_sts_L2 & BIT0){
		//PrepareEp1Fifo();
	}
	if (ep_sts_L2 & BIT1){
		mb_EDnStsBUDOVRClr(1);
		uprintf(">>> Error: End-1-IN FIFO under/overrun.\n");
	}
}
void ep2_Rx_handler(void){
    int fifoCnt;
	volatile U8 ep_sts_L2;

	ep_sts_L2 = mb_EDnSts_IERd(2);		
	if (ep_sts_L2 & BIT0){		
		fifoCnt = getFifoCnt(2); 
		if(downloadFileSize == 0){
	   	    Rd_ep_fifo(2, (U8 *)downPt, 8); 	

	   	    USBdownloadAddress = *((U8 *)(downPt+0)) + (*((U8 *)(downPt+1))<<8)
				+ (*((U8 *)(downPt+2))<<16) + (*((U8 *)(downPt+3))<<24);
		    downloadFileSize =   *((U8 *)(downPt+4)) + (*((U8 *)(downPt+5))<<8)
				+ (*((U8 *)(downPt+6))<<16) + (*((U8 *)(downPt+7))<<24);
		    downPt = (U8 *)USBdownloadAddress;

			USBdownloadAddress =(U32)USB_IMAGE_DOWNLOAD_BASE_ADDR;
			downPt = (U8 *)USB_IMAGE_DOWNLOAD_BASE_ADDR;

			checkSum = 0;
	  	    Rd_ep_fifo_CS(2, (U8 *)downPt, fifoCnt - 8);//The first 8-bytes are deleted.
	  	    downPt += fifoCnt - 8;	  	    
		}
		else{
		    Rd_ep_fifo_CS(2, (U8 *)downPt, fifoCnt); 	    
		    downPt += fifoCnt;
		}
		totalDLCnt += fifoCnt;
	}
}

void ep_clr(void){
	U32 i, dwTemp;

	for (i = 1; i <= 2; i++){
		if ((mb_EDnCtlByte3Rd(i)&_EDnCtlDBEN_ENABLE)>0){//For Double Buffer
			mb_EDnCtlBF0CLRSet(i);
			mb_EDnCtlBF1CLRSet(i);
		}
		else//For Single Buffer
			mb_EDnCtlBF0CLRSet(i);
		mdw_EDnCtlSet(i, 0);
		dwTemp = mdw_EDnCtlRd(i);
		if (dwTemp > 0)
			uprintf(">>> Clear Controller register fail ED-%d, data = %d", i, dwTemp);
	}
}
void _usb_ep0_Init(void){
	
	mb_CtlEDCtlMXPKSZSet(_CtlEDCtlMXPKSZ_64);
	mb_CtlEDCtl_IE(_CtlEDCtl_CXSTS_IE|_CtlEDCtl_CXDPKT_IE|_CtlEDCtl_CXS_IE); 
} 
void usb_reset(void){

	isUsbdSetConfiguration = 0;
	mb_StsDEVADDRSet(0);
   	ep_clr();
	mdw_MajorIntStsSet(0xffffffff);  
	mb_CtlEDStsSet(0xff);	
}
void usb_init(void){

	mdw_Ctl_IE_SWRST_SET();
	mdw_Ctl_IE(_Ctl_URST_IE|_Ctl_CXINTR_IE);
	_usb_ep0_Init();
 	usb_reset();
	dld_UsbDescInit();

	INTC_EnableSourceFIQ(INT__USB_VEC);	
}

⌨️ 快捷键说明

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