📄 usb_function.c
字号:
usbflag = USB_CTRL0_READ;
CtrlDataLen = USB0_SetupPkt.wLength;
break;
default:
break;
}
}
/****************************************************************/
/* 函数名: InPackage_Hndler() */
/* 功能: 对输出设置包中断事件进行处理 */
/* 参数: */
/* 无 */
/****************************************************************/
void InPackage_Hndler(void)
{
Uint16 i,j;
switch (USB0_SetupPkt.bRequest)
{
case 01: // CLEAR_FEATURE
break;
case 02: // RESERVED
break;
case 04: // RESERVED
USB_stallEndpt(&EndptObjOut0); // 系统未定义,取消
break;
case 06: // GET_DESCRIPTION
switch((USB0_SetupPkt.wValue >>8) & 0xFF)
{
case 01: // DEVICE
j = 0;
for(i = 0;i<20;)
{
usbbuffer[j] = (Device_Description[i]<<8) + Device_Description[i=i+1];
j=j+1;
i=i+1;
}
USB_postTransaction(&EndptObjIn0,0x12,(Uint16 *)&usbbuffer,USB_IOFLAG_SWAP);
/* 结束数据传送状态,发出一个OUT型的数据包 */
USB_postTransaction( &EndptObjOut0,0,NULL,USB_IOFLAG_NONE);
break;
case 02: // CONFIGURATION
if(USB0_SetupPkt.wLength<=DSCR_CONFIG_LEN)
{
/* 发送Device_config描述表 */
USB_postTransaction( &EndptObjIn0,DSCR_CONFIG_LEN,
(Uint16 *)&usb_configuration_link,USB_IOFLAG_LNK);
/* 结束数据传送状态,发出一个OUT型的数据包 */
USB_postTransaction( &EndptObjOut0,0,NULL,USB_IOFLAG_NONE);
}
if(USB0_SetupPkt.wLength > DSCR_CONFIG_LEN)
{
/* 发送Device_Allconfig描述表 */
USB_postTransaction( &EndptObjIn0,DSCR_CONFIG_LEN,(Uint16 *)&usb_configuration_link,
USB_IOFLAG_LNK |USB_IOFLAG_CAT |USB_IOFLAG_EOLL);
/* 结束数据传送状态,发出一个OUT型的数据包 */
USB_postTransaction( &EndptObjOut0,0,NULL,USB_IOFLAG_NONE);
}
break;
case 03: // 自举的时候系统自动获取字符描述表
/* 发送描述表 */
if((USB0_SetupPkt.wValue & 0xff) ==0)
{
/* 发送Device_String描述表 */
USB_postTransaction( &EndptObjIn0,0x4,(Uint16 *)&String_descriptor_langid,USB_IOFLAG_NONE );
/* 结束数据传送状态,发出一个OUT型的数据包 */
USB_postTransaction( &EndptObjOut0,0,NULL,USB_IOFLAG_NONE);
}
else
{
/* 编辑发送描述表 */
j = 0;
for(i = 0;i<40;)
{
usbbuffer[j] = (String_descriptor1[i]<<8) + String_descriptor1[i=i+1];
j=j+1;
i=i+1;
}
/* 发送Device_String描述表 */
USB_postTransaction( &EndptObjIn0,38,(Uint16 *)&usbbuffer,USB_IOFLAG_SWAP );
/* 结束数据传送状态,发出一个OUT型的数据包 */
USB_postTransaction( &EndptObjOut0,0,NULL,USB_IOFLAG_NONE);
}
break;
case 04: // INTERFACE
break;
case 05: // ENDPOINT
break;
case 06: // DEVICE_QUALIFIER
j = 0;
for(i = 0;i<11;)
{
usbbuffer[j] = (Device_Qualifier[i]<<8) + Device_Qualifier[i=i+1];
j=j+1;
i=i+1;
}
USB_postTransaction(&EndptObjIn0,0x12,(Uint16 *)&usbbuffer,USB_IOFLAG_SWAP);
/* 结束数据传送状态,发出一个OUT型的数据包 */
USB_postTransaction( &EndptObjOut0,0,NULL,USB_IOFLAG_NONE);
break;
default:
break;
}
break;
case 0x8: // GET_CONFIGURATION
usbbuffer[0] = 0;
usbbuffer[1] = 1;
/* 发送Device_Allconfig描述表 */
USB_postTransaction( &EndptObjIn0,1,(Uint16 *)&usbbuffer,USB_IOFLAG_NONE);
/* 结束数据传送状态,发出一个OUT型的数据包 */
USB_postTransaction( &EndptObjOut0,0,NULL,USB_IOFLAG_NONE);
break;
case 0xa: // GET_INTERFACE
usbbuffer[0] = 0;
usbbuffer[1] = 1;
/* 发送Device_Allconfig描述表 */
USB_postTransaction( &EndptObjIn0,1,(Uint16 *)&usbbuffer,USB_IOFLAG_NONE);
/* 结束数据传送状态,发出一个OUT型的数据包 */
USB_postTransaction( &EndptObjOut0,0,NULL,USB_IOFLAG_NONE);
break;
case 0xb0: // 用户自定义的Setup包
/* 用户自定义的Setup包,用于测试 */
if(USB0_SetupPkt.wValue == 0x1)
{
usbbuffer[0] =0x0;
usbbuffer[1] =0x0301;
usbbuffer[2] =0x0705;
usbbuffer[3] =0x0b09;
usbbuffer[4] =0x0f0d;
}
if(USB0_SetupPkt.wValue == 0x2)
{
usbbuffer[0] =0x0;
usbbuffer[1] =0x0200;
usbbuffer[2] =0x0604;
usbbuffer[3] =0x0a08;
usbbuffer[4] =0x0e0c;
}
/* 发送数据 */
USB_postTransaction( &EndptObjIn0,8,(Uint16 *)&usbbuffer,USB_IOFLAG_NONE);
/* 结束数据传送状态,发出一个OUT型的数据包 */
USB_postTransaction( &EndptObjOut0,0,NULL,USB_IOFLAG_NONE);
break;
case 0xb3: // 为用户开辟
usbflag = USB_CTRL0_WRITE;
CtrlDataLen = USB0_SetupPkt.wLength;
break;
default :
break;
}
}
/****************************************************************/
/* 函数名: Endpt0EvHndler() */
/* 功能: 对控制节点的中断事件进行处理 */
/* 参数: */
/* 无 */
/****************************************************************/
void Endpt0EvHndler(void)
{
/* 获取当前的中断状态,即判断中断类型 */
USB_EVENT_MASK mask = 0;
mask = USB_getEvents((USB_EpHandle)&EndptObjOut0);
if(mask & USB_EVENT_RESET) // 如果是USB总线复位
{
/* 终止所有的数据传输 */
while(!(USB_TRUE ==USB_abortAllTransaction(USB0)))
{
USB_abortAllTransaction(USB0);
};
/* 重新进行USB的初始化 */
while(!(USB_init(USB0,hEpObjArray,0) == USB_TRUE)){};
/* 调用使能USB单元的函数 */
USB_connectDev(USB0);
/* 使能块输出节点中断 */
USB_EnableDInt(hEpObjArray);
}
if(mask & USB_EVENT_SETUP) // 如果接收到Setup包
{
/* 接收新的Setup包 */
if(USB_getSetupPacket(USB0, &USB0_SetupPkt) != USB_TRUE)
{
// 失败马上返回
return;
}
/* OUT类型的Setup包 */
if((USB0_SetupPkt.bmRequestType & 0x80) == 0x0)
{
// OUT型的输出处理
OutPackage_Hndler();
}
/* IN类型的Setup包 */
if((USB0_SetupPkt.bmRequestType & 0x80) == 0x80)
{
// IN型的设置包处理
InPackage_Hndler();
}
}
if(mask & USB_EVENT_RESUME) // 如果是唤醒总线
{
/* 设置中断标志,进行USB状态的处理 */
usbflag = USB_EVENT_RESUME;
}
if(mask & USB_EVENT_SUSPEND) // 如果是挂起总线
{
usbflag = USB_EVENT_SUSPEND;
/* 设置中断标志,进行USB状态的处理 */
}
if(mask & USB_EVENT_SOF) // 如果是帧开始
{
/* 设置中断标志,进行USB状态的处理 */
usbflag = USB_EVENT_SOF;
}
}
/****************************************************************/
/* 函数名: EndptIn1EvHndler() */
/* 功能: 对5509片上的USB节点In1的中断事件进行处理 */
/* 参数: */
/* 无 */
/****************************************************************/
void EndptIn1EvHndler(void)
{
/* 获取当前的中断状态 */
//USB_EVENT_MASK mask;
//mask = USB_getEvents((USB_EpHandle)&EndptObjIn1);
// 没有使能中断,如果用户使能了块输入节点中断,那么可以在这添加中断处理函数
}
/****************************************************************/
/* 函数名: EndptOut1EvHndler() */
/* 功能: 对5509片上的USB节点Out1的中断事件进行处理 */
/* 参数: */
/* 无 */
/****************************************************************/
void EndptOut1EvHndler(void)
{
USB_EVENT_MASK mask;
mask = USB_getEvents((USB_EpHandle)&EndptObjOut1);
if(mask & USB_EVENT_EOT)
{
mask = 0;
usbflag = USB_BULK1_READ;
}
}
/****************************************************************/
/* 函数名: EndptIn2EvHndler() */
/* 功能: 对5509片上的USB节点In2的中断事件进行处理 */
/* 参数: */
/* 无 */
/****************************************************************/
void EndptIn2EvHndler(void)
{
/* 获取当前的中断状态 */
//USB_EVENT_MASK mask;
//mask = USB_getEvents((USB_EpHandle)&EndptObjIn2);
// 没有使能中断,如果用户使能了块输入节点中断,那么可以在这添加中断处理函数
}
/****************************************************************/
/* 函数名: EndptOut2EvHndler() */
/* 功能: 对5509片上的USB节点Out2的中断事件进行处理 */
/* 参数: */
/* 无 */
/****************************************************************/
void EndptOut2EvHndler(void)
{
USB_EVENT_MASK mask;
mask = USB_getEvents((USB_EpHandle)&EndptObjOut2);
if(mask & USB_EVENT_EOT)
{
mask = 0;
usbflag = USB_BULK2_READ;
}
}
/****************************************************************/
/* 函数名: EndptIn3EvHndler() */
/* 功能: 对5509片上的USB节点In3的中断事件进行处理 */
/* 参数: */
/* 无 */
/****************************************************************/
void EndptIn3EvHndler(void)
{
/* 获取当前的中断状态 */
//USB_EVENT_MASK mask;
//mask = USB_getEvents((USB_EpHandle)&EndptObjIn3);
// 没有使能中断,如果用户使能了块输入节点中断,那么可以在这添加中断处理函数
}
/****************************************************************/
/* 函数名: EndptOut3EvHndler() */
/* 功能: 对5509片上的USB节点Out3的中断事件进行处理 */
/* 参数: */
/* 无 */
/****************************************************************/
void EndptOut3EvHndler(void)
{
USB_EVENT_MASK mask;
mask = USB_getEvents((USB_EpHandle)&EndptObjOut3);
if(mask & USB_EVENT_EOT)
{
mask = 0;
usbflag = USB_BULK3_READ;
}
}
/****************************************************************/
/* 函数名: EndptIn4EvHndler() */
/* 功能: 对5509片上的USB节点In4的中断事件进行处理 */
/* 参数: */
/* 无 */
/****************************************************************/
void EndptIn4EvHndler(void)
{
/* 获取当前的中断状态 */
//USB_EVENT_MASK mask;
//mask = USB_getEvents((USB_EpHandle)&EndptObjIn4);
// 没有使能中断,如果用户使能了块输入节点中断,那么可以在这添加中断处理函数
}
/****************************************************************/
/* 函数名: EndptOut4EvHndler() */
/* 功能: 对5509片上的USB节点Out4的中断事件进行处理 */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -