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

📄 otgdriver.c

📁 smartARM2400 USB OTG例程
💻 C
📖 第 1 页 / 共 3 页
字号:
    __GsOtgInfo.ucOtgDevice_AB = ucDeviceAB;
    OS_EXIT_CRITICAL();
}

/*********************************************************************************************************
** Function name:       otgGetCurRole
** Descriptions:        获取当前设备角色(主机或从机)
** input parameters:    None
** output parameters:   None
** Returned value:      OTG_ROLE_HOST(3): 主机,  OTG_ROLE_DEVICE(4): 从机, OTG_ROLE_UNKNOW(5): 未知
*********************************************************************************************************/
USB_INT8U otgGetCurRole (void)
{
    USB_INT8U ucStat;
    
    OS_ENTER_CRITICAL();
    ucStat = __GsOtgInfo.ucOTGRole;
    OS_EXIT_CRITICAL();
    
    return ucStat;
}

/*********************************************************************************************************
** Function name:       __otgSetCurRole
** Descriptions:        设置当前设备角色(主机或从机)
** input parameters:    当前设备状态
** output parameters:   None
** Returned value:      None
*********************************************************************************************************/
static void __otgSetCurRole (USB_INT8U ucRole)
{
    OS_ENTER_CRITICAL();
    __GsOtgInfo.ucOTGRole = ucRole;
    OS_EXIT_CRITICAL();
}

/*********************************************************************************************************
** Function name:       otgDeInit
** Descriptions:        USB OTG驱动卸载
** input parameters:    None
** output parameters:   None
** Returned value:      None
*********************************************************************************************************/
#if 0

此函数需要修改:
需要能卸载ZLG/USB HOST或ZLG/USB DEVICE
可以在此处向调度任务发送消息,由调度任务负责卸载操作

void otgDeInit (void)
{
    USB_INT8U ucErr;
    
    __otgIntDeInit();                                                   /*  禁止OTG中断                 */
    OSQPost(__GevtOtgMsgQeue, (void *)(__OTG_MSG_SHED_TASK_DEL << 24)); /*  删除OTG调度任务             */
    __GevtOtgMsgQeue = OSQDel(__GevtOtgMsgQeue, OS_DEL_NO_PEND, &ucErr);/*  删除OTG使用的消息队列       */
}

#endif

#ifdef __cplusplus
 }
#endif

/*********************************************************************************************************
** Function name:       __taskOtgShed
** Descriptions:        uC/OS-II任务, OTG协议栈的调度任务
** input parameters:    pdata uC/OS-II要求的参数
** output parameters:   None
** Returned value:      None
*********************************************************************************************************/
void __taskOtgShed (void *pdata)
{
    INT8U  ucErr;
    INT32U uiMsgCode;
    
    while (1) {
        uiMsgCode = (INT32U)OSQPend(__GevtOtgMsgQeue, 0, &ucErr);
        switch (__USBLSB(uiMsgCode, 3)) {                               /*  BIT31~24为事件类型          */
        
        case __OTG_MSG_HNP_START:                                       /*  启动 HNP                    */
            if (__GsOtgInfo.ucOTGRole == OTG_ROLE_HOST) {
                usbHostNotifyExitDataOpera();
            }
            __otgHNPStart();                                        
            USBDEBUG_SENDSTR("\r\nStart HNP!\r\n");
            break;
            
        case __OTG_MSG_HNP_SUCESS:                                      /*  HNP sucess 处理             */
            if (__GsOtgInfo.ucOTGRole == OTG_ROLE_DEVICE) {
                OTGStCtrl |= (1 << 0);                                  /*  set PORTC[0],U1 connect host*/
                usbBusReset();                                          /*  reset bus                   */
                __otgChangeRoleToHost();                                /*  切换至主机                  */
                USBDEBUG_SENDSTR("\r\nB device switches roles from peripheral to host sucess!\r\n");
            } else {
                __otgChangeRoleToDevice();                              /*  切换至从机                  */
                USBDEBUG_SENDSTR("\r\nA device switches roles from host to peripheral sucess!\r\n");
            }
            __otgIntDeInit();
            break;
        
        case __OTG_MSG_HNP_FAILED:                                      /*  HNP failed 处理             */
            __otgHNPFailure();
            USBDEBUG_SENDSTR("\r\nHNP failed!\r\n");
            break;
            
        case __OTG_MSG_HNP_TMR:                                         /*  HNP time out 处理           */
            __otgHNPTmrOut();
            __otgIntDeInit();
            __ohciEnableInt(__USB_INT_RHSC);
            USBDEBUG_SENDSTR("\r\ntime out!\r\n");
            break;

        case __OTG_MSG_REMOVE_PU:                                       /*  REMOVE_PU 处理              */
            if (__GsOtgInfo.ucOTGRole == OTG_ROLE_DEVICE) {
                __isp1301DPPURRemove();                                 /*  remove DP PULL UP           */
                OTGStCtrl |= (1 << 10);                                 /*  set PU_REMOVED              */
            }
            USBDEBUG_SENDSTR("\r\nREMOVE_PU!\r\n");
            break;
             
       case __OTG_MSG_ATX_INT:                                          /*  外部收发器中断              */
            __usbIDChange();                                            /*  外部收发器中断处理          */
            break;
       
       case __OTG_MSG_SHED_BUS_SUSP:                                    /*  A设备在a_peripheral时总线   */
            OSTimeDly(1);                                               /*  挂起处理                    */
            __otgBusSuspDeal();                                         
            break;
       
       case __OTG_MSG_SHED_TASK_DEL:                                    /*  删除调度任务                */
            USBDEBUG_SENDSTR("\r\n__taskOtgShed delete!\r\n");
            OSTaskDel(OS_PRIO_SELF);
            break;
            
        default:
            USBDEBUG_SENDSTR("\r\n!!OTG : Unknow MsgCode!\r\n\r\n");
            break;
        }
    }
}

#define __USB_INT_ID_GND        (1 << 3)                                
#define __USB_INT_ID_FLOAT      (1 << 5)

/*********************************************************************************************************
** Function name:       __usbIDChange
** Descriptions:        外部收发器(ISP1301)中断处理,注意只开启了ID_GND从0-->1中断和ID_FLOAT从0-->1中断
** input parameters:    ucIntSrc: 中断源,从ISP1301的interrupt Latch register读取得到
** output parameters:   None
** Returned value:      TRUE:成功, FALSE: 失败
*********************************************************************************************************/
USB_BOOL __usbIDChange (void)
{
    USB_INT32U i;
    USB_INT8U  ucIntSrc;
    
    i = 0;
    OSTimeDly(5);                                                       /*  此处延时和后面的延时都是去抖*/
    do {
        ucIntSrc = __isp1301IntSrcRead();
        if (ucIntSrc & __USB_INT_ID_GND) {
            if (otgGetCurRole() == OTG_ROLE_HOST) {
                OSTimeDly(1);
            } else {                                                    /*  ID接地,表示A插头插入,成A设备*/
                USBDEBUG_SENDSTR("\r\nmust change to host!\r\n");
                __otgSetDeviceAB(OTG_DEVICE_A);                         /*  切换为A设备                 */
                __usbVbusDrv();                                         /*  驱动总线电源                */
                __otgChangeRoleToHost();                                /*  切换至主机                  */
                break;
            }
        }
        if (ucIntSrc & __USB_INT_ID_FLOAT) {
            if (otgGetCurRole() == OTG_ROLE_DEVICE) {
                OSTimeDly(1);
            } else {                                                    /*  ID浮空,表示B插头插入,成B设备*/
                USBDEBUG_SENDSTR("\r\nmust change to Device!\r\n");
                __otgSetDeviceAB(OTG_DEVICE_B);                         /*  B设备                       */
                __otgChangeRoleToDevice();                              /*  切换至从机                  */
                break;
            }
        }
    } while (i++ < 100);
    
    __usbAtxIntInit();                                                  /*  重新初始化外部收发器中断    */
    
    if (i >= 100) {
        USBDEBUG_SENDSTR("\r\nchange role failed\r\n");
        return FALSE;
    } else {
        return TRUE;
    }
}

/*********************************************************************************************************
** Function name:       __otgChangeRoleToHost
** Descriptions:        切换为主机
** input parameters:    None
** output parameters:   None
** Returned value:      TRUE : 成功  FALSE : 失败
*********************************************************************************************************/
USB_BOOL __otgChangeRoleToHost (void)
{
    USB_BOOL  bRet = FALSE;
    
    __otgSetCurRole(OTG_ROLE_UNKNOW);                                   /*  在角色转换前先标志当前角色  */
                                                                        /*  为未知                      */
    if (!usbFunctionDeInit()) {                                         /*  卸载USB设备驱动程序         */
        USBDEBUG_SENDSTR("\r\nusbFunctionDeInit failed\r\n");
        return FALSE;
    }
    usbDevDeInit();                                                     /*  usb device协议栈卸载        */
    
    bRet = usbHostInitialize(__GsOtgInfo.ucHostDevShedPrio, __GsOtgInfo.ucHostEnumPrio, NULL, NULL);    
    if (!bRet) {                                                        /*  初始化为主机                */
        USBDEBUG_SENDSTR("\r\nusbHostInitialize failed!\r\n__otgChangeRoleToHost failed!\r\n");
        return FALSE;
    }
    
    __otgSetCurRole(OTG_ROLE_HOST);                                     /*  标志当前角色为主机          */
    
    USBDEBUG_SENDSTR("\r\n__otgChangeRoleToHost sucess!\r\n");
    return TRUE;
}

/*********************************************************************************************************
** Function name:       __otgChangeRoleToDevice
** Descriptions:        切换为从机
** input parameters:    None
** output parameters:   None
** Returned value:      TRUE : 成功  FALSE : 失败
*********************************************************************************************************/
USB_BOOL __otgChangeRoleToDevice (void)
{
    INT8U   ucErr;
    
    __isp1301DisEnPswOE();                                              /*  关闭VBUS电源                */
    __ohciDisEnIntAll();                                                /*  先关闭所有主机中断          */
    __otgSetCurRole(OTG_ROLE_UNKNOW);                                   /*  在角色转换前先标志当前角色  */
                                                                        /*  为未知                      */
    if (!usbHostClientDeInit()) {                                       /*  卸载USB主机设备驱动程序     */
        USBDEBUG_SENDSTR("\r\nmsHostDeInit failed!\r\n__otgChangeRoleToDevice failed!\r\n");
        return FALSE;
    }
        
    if (!usbHostDeInit()) {                                             /*  卸载USB主机协议栈           */
        USBDEBUG_SENDSTR("\r\nusbHostDeInit failed!\r\n__otgChangeRoleToDevice failed!\r\n");
        return FALSE;
    }
    
    ucErr = usbDevInitialize(__GsOtgInfo.ucHostDevShedPrio);            /*  USB从机初始化               */
 	if (ucErr != OS_NO_ERR) {
        USBDEBUG_SENDSTR("\r\n__otgChangeRoleToDevice failed! : Create usbDevTaskSetup failed\r\n");
        return FALSE;
    }

    __otgSetCurRole(OTG_ROLE_DEVICE);                                   /*  标志当前角色为主机          */
    
    if (!usbFunctionInit()) {                                           /*  USB从机设备驱动初始化       */
        USBDEBUG_SENDSTR("\r\nusbFunctionInit failed\r\n");
    }
     
    USBDEBUG_SENDSTR("\r\n__otgChangeRoleToDevice sucess!\r\n");
    return TRUE;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -