📄 usbtransfer.c
字号:
}
ucTryCount++;
uiTotalTran = 0;
break;
} else { /* 其它类型错误,创造条件退出 */
ucTryCount = (USB_INT8U)(ucMaxTryCount + 1); /* ...do..while 循环 */
break;
}
} while (uiTotalTran < uiLength); /* 直到所有的数据传输完成 */
__usbFreeAllGenBuffer();
} while ((uiTotalTran < uiLength) && (ucTryCount <= ucMaxTryCount));
OSSemPost(__GevtUsbDataTranSem);
OS_ENTER_CRITICAL();
__GusbHostEvtCnt.ucDataTranCnt--;
OS_EXIT_CRITICAL();
return __USBLSB(uiCode, 3);
}
#ifdef __cplusplus
}
#endif
/*********************************************************************************************************
** Function name: __usbCtrlTranPhase_Setup
** Descriptions: 标准请求的 SETUP 阶段
** input parameters: pusbDevReq 标准请求数据
** output parameters: None
** Returned value: 错误码
*********************************************************************************************************/
USB_INT8U __usbCtrlTranPhase_Setup (PUSB_DEV_REQ pusbDevReq)
{
USB_INT8U ucErr;
USB_INT8U ucTryCount;
USB_INT32U uiCode;
USB_INT8U *pucBufReq = (USB_INT8U *)pusbDevReq;
__HC_GEN_TD_PARAM tdParam;
__PHC_GEN_TRANSFER_DESCRIPTOR ptdAddTd;
__ED_INFO edInfo;
/*
* 控制传输: SETUP 阶段
*/
tdParam.pucCBP = pucBufReq;
tdParam.usBufLen = 8;
tdParam.ucBufferRound = 1;
tdParam.ucDirect_PID = __OHCI_TD_TYPE_SETUP;
tdParam.ucDelayIntr = 0;
tdParam.ucDataToggle = __OHCI_TD_T_DATA0;
tdParam.pucCBP = __usbAllocCtrlBuffer(tdParam.usBufLen);
usbMemCopy(tdParam.pucCBP, pucBufReq, tdParam.usBufLen);
__hcdGetEdInfo(USB_TRAN_TYPE_CONTROL, &edInfo);
ucTryCount = 0;
do {
__usbEdSetSkipAndWaitNextFrame(USB_TRAN_TYPE_CONTROL); /* 设置sKip=1,并等待一下帧开始 */
ptdAddTd = __hcdAllocTd(&edInfo); /* 申请 TD */
__hcdAddTd(&tdParam, ptdAddTd, &edInfo); /* 增加 SETUP TD */
__usbEdClearSkip(USB_TRAN_TYPE_CONTROL); /* 清除sKip位 */
__hcStartSchedule(USB_TRAN_TYPE_CONTROL); /* 启动传输 */
uiCode = (USB_INT32U)OSMboxPend(__GevtUsbCtrlMbox, USB_TIMEOUT_TICK, &ucErr);
if (ucErr != OS_NO_ERR) { /* 超时退出 */
uiCode = (USB_INT32U)(USB_ERR_TIMEOUT << 24);
__hcdEdLetHeadEquTail(&edInfo); /* 强制 使HeadP = TailP */
__hcdFreeAllTd(&edInfo); /* 释放所有 TD 资源 */
break;
}
if (uiCode == __USB_TRANDEAL_OK) { /* 传输成功 */
break;
} else if (__USBLSB(uiCode, 0) == __USB_TRANDEAL_ERR_TRY) { /* 需要重试传输 */
break;
} else {
break;
}
} while (++ucTryCount <= 3);
__usbFreeCtrlBuffer(tdParam.usBufLen); /* 释放所占的USB RAM缓冲区 */
return __USBLSB(uiCode, 3);
}
/*********************************************************************************************************
** Function name: __usbCtrlTranPhase_In
** Descriptions: 标准请求的 IN 阶段
** input parameters: usLength 要传输的数据长度
** output parameters: pucBuf 用于接收读取到的数据的缓冲区
** Returned value: 错误码
*********************************************************************************************************/
USB_INT8U __usbCtrlTranPhase_In (USB_INT16U usLength, USB_INT8U *pucBuf)
{
USB_INT8U ucErr;
USB_INT32U uiCode;
USB_INT8U *pucBufTmp;
USB_INT8U *pucFristBuf;
USB_INT16U usCurTran; /* 当前 TD 所要传输的数据长度 */
USB_INT16U usTotalTran; /* 所有 TD 传输的数据长度 */
USB_INT16U usBufLen; /* 一轮传输的数据长度 */
USB_INT8U ucToggle; /* 触发位(DATA0 or DATA1) */
__HC_GEN_TD_PARAM tdParam; /* TD 参数列表 */
__PHC_GEN_TRANSFER_DESCRIPTOR ptdAddTd;
__ED_INFO edInfo;
tdParam.ucBufferRound = 1;
tdParam.ucDirect_PID = __OHCI_TD_TYPE_IN;
tdParam.ucDelayIntr = 0;
/*
* 控制传输: IN 阶段
*/
ucToggle = 0;
usCurTran = 0;
usTotalTran = 0;
__hcdGetEdInfo(USB_TRAN_TYPE_CONTROL, &edInfo); /* 获取端点信息 */
pucBufTmp = pucBuf;
do {
usBufLen = 0;
__usbEdSetSkipAndWaitNextFrame(USB_TRAN_TYPE_CONTROL);
do {
ptdAddTd = __hcdAllocTd(&edInfo); /* 申请 TD */
if (ptdAddTd == NULL) {
break;
}
if (usLength - usTotalTran <= edInfo.usMaxPktSize) {
usCurTran = (USB_INT16U)(usLength - usTotalTran);
} else {
usCurTran = edInfo.usMaxPktSize;
}
tdParam.pucCBP = __usbAllocCtrlBuffer(usCurTran);
if (tdParam.pucCBP == NULL) { /* 如果现在无缓冲区可用,则, */
/* ...跳出本循环 */
__hcdFreeTd(&edInfo, ptdAddTd);
break;
}
if (usBufLen == 0) {
pucFristBuf = tdParam.pucCBP; /* 保存第一次的缓冲区位置, */
} /* ...usbMemCopy时要用 */
tdParam.usBufLen = usCurTran;
if (++ucToggle & 0x01) {
tdParam.ucDataToggle = __OHCI_TD_T_DATA1;
} else {
tdParam.ucDataToggle = __OHCI_TD_T_DATA0;
}
usTotalTran = (USB_INT16U)(usTotalTran + usCurTran);
usBufLen = (USB_INT8U)(usBufLen + usCurTran);
__hcdAddTd(&tdParam, ptdAddTd, &edInfo);
} while (usTotalTran < usLength);
__usbEdClearSkip(USB_TRAN_TYPE_CONTROL);
__hcStartSchedule(USB_TRAN_TYPE_CONTROL);
uiCode = (USB_INT32U)OSMboxPend(__GevtUsbCtrlMbox, USB_TIMEOUT_TICK, &ucErr);
if (ucErr != OS_NO_ERR) {
uiCode = (USB_INT32U)(USB_ERR_TIMEOUT << 24);
__hcdEdLetHeadEquTail(&edInfo);
__hcdFreeAllTd(&edInfo);
break;
}
if (uiCode == __USB_TRANDEAL_OK) {
usbMemCopy(pucBufTmp, pucFristBuf, usBufLen);
pucBufTmp = pucBufTmp + usBufLen;
__usbFreeCtrlBuffer(usBufLen);
} else if (__USBLSB(uiCode, 0) == __USB_TRANDEAL_ERR_TRY) {
break;
} else {
break;
}
} while (usTotalTran < usLength);
__usbFreeAllCtrlBuffer();
return __USBLSB(uiCode, 3);
}
/*********************************************************************************************************
** Function name: __usbCtrlTranPhase_Out
** Descriptions: 标准请求的 OUT 阶段
** input parameters: None
** output parameters: None
** Returned value: 错误码
*********************************************************************************************************/
USB_INT8U __usbCtrlTranPhase_Out (void)
{
USB_INT8U ucErr;
USB_INT32U uiCode;
__HC_GEN_TD_PARAM tdParam;
__PHC_GEN_TRANSFER_DESCRIPTOR ptdAddTd;
__ED_INFO edInfo;
tdParam.pucCBP = NULL;
tdParam.usBufLen = 0;
tdParam.ucDataToggle = __OHCI_TD_T_DATA1;
tdParam.ucBufferRound = 1;
tdParam.ucDirect_PID = __OHCI_TD_TYPE_OUT;
tdParam.ucDelayIntr = 0;
__hcdGetEdInfo(USB_TRAN_TYPE_CONTROL, &edInfo);
__usbEdSetSkipAndWaitNextFrame(USB_TRAN_TYPE_CONTROL);
ptdAddTd = __hcdAllocTd(&edInfo); /* 申请 TD */
__hcdAddTd(&tdParam, ptdAddTd, &edInfo); /* 增加 SETUP TD */
__usbEdClearSkip(USB_TRAN_TYPE_CONTROL);
__hcStartSchedule(USB_TRAN_TYPE_CONTROL);
uiCode = (USB_INT32U)OSMboxPend(__GevtUsbCtrlMbox, USB_TIMEOUT_TICK, &ucErr);
if (ucErr != OS_NO_ERR) {
uiCode = (USB_INT32U)(USB_ERR_TIMEOUT << 24);
__hcdEdLetHeadEquTail(&edInfo);
__hcdFreeAllTd(&edInfo);
}
return __USBLSB(uiCode, 3);
}
/*********************************************************************************************************
END FILE
*********************************************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -