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

📄 usbtransfer.c

📁 smartARM2400 USB host例程
💻 C
📖 第 1 页 / 共 2 页
字号:
                }
                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 + -