void stm32_usb_cancel_IN_transfers(unsigned int wdEndP); void stm32_usb_dequeue_IN_transfers(unsigned int wdEndP); void stm32_usb_queue_IN_transfers(unsigned int wdEndP,\ unsigned char *ptrBuffer,\ unsigned int wdSize); /* ********************************************************************** *#define constants for USB enumeration ********************************************************************** */ struct STR_USB_PKT_XFER{ unsigned char *ptrCtrlBuf; int wdCtrlSize; unsigned char *ptrUserBuf; int wdUserSize; }strUsbPktXfer;
/* ********************************************************************** *description: tx transfer cancel routine *input: unsigned int wdEndP = endpoint number *note: called at post_reset and whenever the need arises ********************************************************************** */ void stm32_usb_cancel_IN_transfers(unsigned int wdEndP) { if(wdEndP == STMUSB_ENDP_USER_NUM) strUsbPktXfer.wdUserSize = -1; else strUsbPktXfer.wdCtrlSize = -1; } /* ********************************************************************** *description: tx transfer dequeue routine *input: unsigned int wdEndP = endpoint number *note: be prepared to deal with zero length packets ********************************************************************** */ void stm32_usb_dequeue_IN_transfers(unsigned int wdEndP) { unsigned char *ptrBuf, **ptrPtrBuf; int *ptrCount, wdCount, wdEndPSize; if(wdEndP == STMUSB_ENDP_USER_NUM) { ptrBuf = strUsbPktXfer.ptrUserBuf; ptrPtrBuf = (unsigned char **)&strUsbPktXfer.ptrUserBuf; ptrCount = &strUsbPktXfer.wdUserSize; wdCount = *ptrCount; wdEndPSize= STMUSB_ENDP_USER_SIZE; } else { ptrBuf = (unsigned char *)strUsbPktXfer.ptrCtrlBuf; ptrPtrBuf = (unsigned char **)&strUsbPktXfer.ptrCtrlBuf; ptrCount = &strUsbPktXfer.wdCtrlSize; wdCount = *ptrCount; wdEndPSize= STMUSB_ENDP_CTRL_SIZE; } /*check if xfer is >= 0, return if its -1*/ if(wdCount < 0) /*check xfer == -1 or xfer >=0 */ return; else { if(wdCount == 0) /*should we generate a zero length packet*/ { *ptrCount = -1; /*end future xfers*/ stm32_usb_endp_send_packet(wdEndP,\ ptrBuf,\ wdEndPSize,\ 0); } else { if(wdCount >= wdEndPSize) wdCount = wdEndPSize; stm32_usb_endp_send_packet(wdEndP,\ ptrBuf,\ wdEndPSize,\ wdCount); /*update variables*/ *(ptrPtrBuf) = (unsigned char *)(ptrBuf + wdCount); *(ptrCount) -= wdCount; /* ******************************************************* *prep for a zlp on the next interrupt if *this is the last transfer (wdCount == 0) and *the transfer size matches the endpoint buffer size ******************************************************* */ if(wdCount == wdEndPSize &&\ (*ptrCount) == 0) ; /*do nothing here*/ else (*ptrCount) = -1; } } } /* ********************************************************************** *description: tx transfer queue routine *input: unsigned int wdEndP = endpoint number * unsigned char *ptrBuffer = pointer to buffer * unsigned int wdSize = buffer size in bytes *notes: store pointers to the global record. stores count of * records ********************************************************************** */ void stm32_usb_queue_IN_transfers(unsigned int wdEndP,\ unsigned char *ptrBuffer,\ unsigned int wdSize) { if(wdEndP == STMUSB_ENDP_USER_NUM) { strUsbPktXfer.ptrUserBuf = ptrBuffer; strUsbPktXfer.wdUserSize = wdSize; } else { strUsbPktXfer.ptrCtrlBuf = ptrBuffer; strUsbPktXfer.wdCtrlSize = wdSize; } }
No comments:
Post a Comment