📄 otgdriver.c
字号:
__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 + -