📄 usblib.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 + -