📄 usbser.c
字号:
static
ContinueTxTransfer(
DWORD epNum
)
{
BOOL fTransferComplete = FALSE;
DWORD cbLeft;
DWORD transferStatus = 0;
EPTransfer* pTransfer = &m_epTransfers[epNum];
USBDBGMSG(USBDBG_ZONE_FUNC, (
L"usbdbg:+ContinueTxTransfer. ep%d\r\n", epNum));
// quit if transfer has already been aborted
if (pTransfer->status & USBDBG_TRANSFER_STATUS_ABORTED)
goto clean;
// quit with an error message if transfer was never started
if (!(pTransfer->status & USBDBG_TRANSFER_STATUS_INPROGRESS))
{
USBDBGMSG(USBDBG_ZONE_WARN, (
L"WARN!:usbdbg:Tx xfer not in progress on ep=%d\r\n",
epNum));
goto clean;
}
// a packet transferred on epNum
pTransfer->cbTransferred += pTransfer->cbToTransfer;
cbLeft = pTransfer->cbTransferSize - pTransfer->cbTransferred;
// if data left to send transfer not finished yet
if (cbLeft > 0)
fTransferComplete = FALSE;
// if null packet not sent yet transfer not finished
else if (pTransfer->SendRecvNULL && (pTransfer->cbToTransfer != 0))
fTransferComplete = FALSE;
else
fTransferComplete = TRUE;
// mark xfer complete
if (fTransferComplete)
{
pTransfer->status = USBDBG_TRANSFER_STATUS_COMPLETE;
}
// xfer not finished. send more data
else
{
pTransfer->cbToTransfer = m_pddIfc.pfnSendData(
epNum,
pTransfer->pbBuffer + pTransfer->cbTransferred,
cbLeft,
pTransfer->transferFlags,
&transferStatus);
// if transfer is aborted, mark it
if (pTransfer->cbToTransfer == -1)
pTransfer->status = USBDBG_TRANSFER_STATUS_ABORTED;
// mark xfer complete if PDD signalled transfer complete
else if (transferStatus & USBDBG_PDD_TRANSFER_COMPLETE)
pTransfer->status = USBDBG_TRANSFER_STATUS_COMPLETE;
}
clean:
USBDBGMSG(USBDBG_ZONE_FUNC, (L"usbdbg:-ContinueTxTransfer.\r\n"));
}
// abort transfer
static
void
AbortTransfer(
DWORD epNum,
DWORD dir
)
{
EPTransfer* pTransfer = &m_epTransfers[epNum];
//disable transfer
m_pddIfc.pfnSendCmd(USBDBG_CMD_TRANSFER_ABORT, epNum, dir);
pTransfer->status = USBDBG_TRANSFER_STATUS_ABORTED;
}
static
void
AbortTransfers(
BOOL abortEp0Transfers,
BOOL abortEpxTransfers
)
{
if (abortEp0Transfers)
{
AbortTransfer(CONTROL_ENDPT, ENDPT_DIR_IN);
AbortTransfer(CONTROL_ENDPT, ENDPT_DIR_OUT);
}
if (abortEpxTransfers)
{
// AbortTransfer(INTIN_ENDPT, ENDPT_DIR_IN);
AbortTransfer(BULKIN_ENDPT, ENDPT_DIR_IN);
AbortTransfer(BULKOUT_ENDPT, ENDPT_DIR_OUT);
}
}
// blocking call starts a rx or tx transaction
static
DWORD
SendRecvData(
UINT32 epNum,
DWORD dir,
UINT8 *pData,
UINT32 cbDataLen,
DWORD flags
)
{
DWORD dwStartSec, dwSec;
DWORD dwRet;
EPTransfer* pTransfer = &m_epTransfers[epNum];
USBDBGMSG(USBDBG_ZONE_FUNC, (L"usbdbg:+SendRecvData. ep%d\r\n", epNum));
dwStartSec = OEMKitlGetSecs();
// start rx or tx transfer
StartTransfer(epNum, dir, pData, cbDataLen, flags);
// loop until all data sent
while(pTransfer->status & USBDBG_TRANSFER_STATUS_INPROGRESS)
{
UsbSerial_EventHandler();
dwSec = OEMKitlGetSecs();
// timed out sending data?
if ((INT32)(dwSec - dwStartSec) > SEND_RECV_TIME_OUT)
{
USBDBGMSG(USBDBG_ZONE_ERROR, (
L"ERROR!UsbDbg: ep%d dir=%d timed out tx/rx data."
L"dwSec=%d, dwStartSec=%d\r\n",
epNum, dir, dwSec, dwStartSec));
dwRet = ERROR_TIMEOUT;
goto clean;
}
}
if (pTransfer->status & USBDBG_TRANSFER_STATUS_COMPLETE)
dwRet = ERROR_SUCCESS;
else
dwRet = E_FAIL;
clean:
USBDBGMSG(USBDBG_ZONE_FUNC, (L"usbdbg:-SendRecvData. ep%d\r\n", epNum));
return dwRet;
}
static
DWORD
SendControlStatusHandshake(
)
{
DWORD dwRet;
USBDBGMSG(USBDBG_ZONE_FUNC, (L"usbdbg:+SendControlStatusHandshake\r\n"));
// Send an empty packet to ACK the transfer
dwRet = SendRecvData(CONTROL_ENDPT,
ENDPT_DIR_TX,
m_ep0MsgRxBuffer,
0,
USBDBG_MDD_EP0_STATUS_STAGE);
USBDBGMSG(USBDBG_ZONE_FUNC, (L"usbdbg:-SendControlStatusHandshake\r\n"));
return dwRet;
}
static
DWORD
RecvControlStatusHandshake(
)
{
DWORD dwRet;
USBDBGMSG(USBDBG_ZONE_FUNC, (L"usbdbg:+RecvControlStatusHandshake\r\n"));
// receive an empty packet
dwRet = SendRecvData(CONTROL_ENDPT,
ENDPT_DIR_RX,
m_ep0MsgRxBuffer,
0,
USBDBG_MDD_EP0_STATUS_STAGE);
USBDBGMSG(USBDBG_ZONE_FUNC, (L"usbdbg:-RecvControlStatusHandshake\r\n"));
return dwRet;
}
// for a GET_DESCRIPTOR setup request sends the descriptor
static
BOOL
SendDescriptor(
USB_DEVICE_REQUEST* pUdr
)
{
UCHAR *pucData;
WORD wLength;
WORD wType = pUdr->wValue;
BOOL fRet = TRUE;
switch (HIBYTE(wType)) {
case USB_DEVICE_DESCRIPTOR_TYPE:
USBDBGMSG(USBDBG_ZONE_VERBOSE, (
L"UsbDbg:Setup request [USB_REQUEST_GET_DESCRIPTOR: "
L"USB_DEVICE_DESCRIPTOR_TYPE] Len:%d\r\n",
pUdr->wLength));
pucData = m_pucUSBDescriptors;
wLength = m_pucUSBDescriptors[0];
break;
case USB_CONFIGURATION_DESCRIPTOR_TYPE:
USBDBGMSG(USBDBG_ZONE_VERBOSE, (
L"UsbDbg:Setup request [USB_REQUEST_GET_DESCRIPTOR: "
L"USB_CONFIGURATION_DESCRIPTOR_TYPE] Len:%d\r\n",
pUdr->wLength
));
pucData = (UCHAR *)m_configDesc1.pUsbConfigDescriptor;
// return the full descriptor if host asked for it
if (pUdr->wLength > m_configDesc1.pUsbConfigDescriptor->bLength)
wLength = CONFIGDESC_LEN;
else
wLength = m_configDesc1.pUsbConfigDescriptor->bLength;
break;
case USB_STRING_DESCRIPTOR_TYPE:
USBDBGMSG(USBDBG_ZONE_VERBOSE, (
L"UsbDbg:Setup request [USB_REQUEST_GET_DESCRIPTOR: "
L"USB_STRING_DESCRIPTOR_TYPE] Len:%d\r\n",
pUdr->wLength));
switch (LOBYTE(wType))
{
case 0x00:
pucData = (UCHAR *) &m_SupportedLang;
wLength = m_SupportedLang.bLength;
break;
case 0x01:
{
USB_STRING* pManufacturer = NULL;
if (m_pddIfc.pfnIoctl(
USBDBG_PDD_IOCTL_MANUFACTURER_STRING,
NULL,
0,
(LPVOID) &pManufacturer,
sizeof(pManufacturer),
0))
{
pucData = (UCHAR *)pManufacturer;
wLength = pManufacturer->ucbLength;
}
else
{
USBDBGMSG(USBDBG_ZONE_VERBOSE, (
L"UsbDbg: Using default manufacturer"
L" string.\r\n"));
pucData = (UCHAR *) &m_Manufacturer;
wLength = m_Manufacturer.ucbLength;
}
}
break;
case 0x02:
{
USB_STRING* pProductString = NULL;
if (m_pddIfc.pfnIoctl(
USBDBG_PDD_IOCTL_PRODUCT_STRING,
NULL,
0,
(LPVOID) &pProductString,
sizeof(pProductString),
0))
{
pucData = (UCHAR *)pProductString;
wLength = pProductString->ucbLength;
}
else
{
USBDBGMSG(USBDBG_ZONE_VERBOSE, (
L"UsbDbg:Using default product string.\r\n"
));
pucData = (UCHAR *) &m_Product;
wLength = m_Product.ucbLength;
}
}
break;
case 0x03:
{
USB_STRING* pucSerialNumString = NULL;
if (m_pddIfc.pfnIoctl(
USBDBG_PDD_IOCTL_SERIALNUM_STRING,
NULL,
0,
(LPVOID) &pucSerialNumString,
sizeof(pucSerialNumString),
0))
{
pucData = (UCHAR *)pucSerialNumString;
wLength = pucSerialNumString->ucbLength;
}
else
{
USBDBGMSG(USBDBG_ZONE_VERBOSE, (
L"UsbDbg:Using default implementation of "
L"UsbSerialNumber generation.\r\n"
));
pucData = (UCHAR *) &m_UsbSerialNum;
wLength = m_UsbSerialNum.ucbLength;
}
}
break;
default:
USBDBGMSG(USBDBG_ZONE_ERROR, (
L"ERROR!UsbDbg:*** Unknown STRING index %d\r\n",
LOBYTE(wType)
));
fRet = FALSE;
break;
}
break;
default:
USBDBGMSG(USBDBG_ZONE_ERROR, (
L"ERROR!UsbDbg:*** Unknown GET_DESCRIPTOR request:0x%x\r\n",
HIBYTE(wType)
));
fRet = FALSE;
break;
}
if (fRet)
{
fRet = (SendRecvData(CONTROL_ENDPT, ENDPT_DIR_TX, pucData, wLength, 0)
== ERROR_SUCCESS);
return fRet;
}
else
return TRUE; //status stage should still happen
}
//Process GetStatus request from host side
static
BOOL
ProcessGetStatus(
USB_DEVICE_REQUEST* pUdr
)
{
UCHAR pucData[2] = {0};
if(pUdr->bmRequestType == (USB_REQUEST_DEVICE_TO_HOST | USB_REQUEST_FOR_DEVICE))
{
//is this device selfpowered?
if(((m_configDesc1.pUsbConfigDescriptor)->bmAttributes & USB_CONFIG_SELF_POWERED) != 0)
pucData[0] |= USB_GETSTATUS_SELF_POWERED;
//is this device configured as remote wakeup resource?
if(((m_configDesc1.pUsbConfigDescriptor)->bmAttributes & USB_CONFIG_REMOTE_WAKEUP) != 0)
pucData[0] |= USB_GETSTATUS_REMOTE_WAKEUP_ENABLED;
}
return (SendRecvData(CONTROL_ENDPT, ENDPT_DIR_TX, pucData, sizeof(pucData), 0) == ERROR_SUCCESS);
}
static
void
ProcessSetupPacket(
USB_DEVICE_REQUEST* pUdr
)
{
BOOL fSendRecvStatusACK = TRUE;
USBDBGMSG(USBDBG_ZONE_FUNC, (L"usbdbg: +ProcessSetupPacket\r\n"));
// class/vendor request
//
if (pUdr->bmRequestType & (USB_REQUEST_CLASS | USB_REQUEST_VENDOR))
{
switch (pUdr->bRequest) {
case SET_CONTROL_LINE_STATE:
USBDBGMSG(USBDBG_ZONE_INFO, (
L"UsbDbg:Setup request [SET_CONTROL_LINE_STATE] %d\r\n",
pUdr->wValue));
if (pUdr->wValue)
m_fConnected = TRUE;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -