📄 usbd.c
字号:
/*********************************************************************************************************
** Function name: usbSunchFrame
** Descriptions: 同步帧请求,用于设置并报告端点的同步帧号
** input parameters: wIndex 端点号
** output parameters: pucData 返回的帧号
** Returned value: TRUE : 成功 FALSE : 失败
*********************************************************************************************************/
USB_INT8U usbSunchFrame (USB_INT16U wIndex, USB_INT8U *pucData)
{
return USB_ERR_SOFT_NOT_SUPPORT; /* 当前版本不支持同步传输 */
}
/*********************************************************************************************************
** Function name: usbInterfaceEpConfig
** Descriptions: 根据获取到的配置描述符数据找出接口描述符及其端点描述符,
** 并将其填充到相应的描述符结构体中
** input parameters: pucBuf 获取到的配置描述符数据缓冲区
** usConfigDescLen 配置描述符总长度
** output parameters: None
** Returned value: TRUE : 成功 FALSE : 失败
*********************************************************************************************************/
USB_BOOL usbInterfaceEpConfig (USB_INT8U *pucBuf, USB_INT16U usConfigDescLen)
{
USB_INT8U ucEpNum;
USB_INT16U usTmp;
USB_INT16U usCount;
USB_INT16U usMaxPktSize;
USB_INT8U *pucTmp;
USB_INT8 cInterfaceIndex;
USB_INT8U ucBulkInIndex, ucBulkOutIndex;
USB_INT8U ucIntrInIndex, ucIntrOutIndex;
USB_INT8U ucIsoInIndex, ucIsoOutIndex;
USBDEBUG_SENDSTR("\t...usbInterfaceEpConfig\r\n");
/*
* 获取接口和端点的描述符信息
*/
cInterfaceIndex = -1;
usCount = 9; /* 跳过9字节基本的配置描述符 */
do {
usTmp = *(pucBuf + usCount + 1); /* 描述符类型 */
if (usTmp == __USB_INTERFACE_DESCRIPTOR_TYPE) { /* 接口描述符 */
cInterfaceIndex++;
GusbInterEpDescr[cInterfaceIndex].ucInterfaceIndex = cInterfaceIndex;
if (cInterfaceIndex >= __USB_MAX_INTERFACE) { /* 含有的接口描述符已超过了 */
break; /* ...预定的接口描述符数 */
}
/*
* 找到第cInterfaceIndex个接口
*/
pucTmp = (USB_INT8U *)&(GusbInterEpDescr[cInterfaceIndex].usbInterfaceDescr);
usbMemCopy(pucTmp, pucBuf + usCount, sizeof(USB_INTERFACE_DESCRIPTOR));
/*
* 清零该接口的各端点计数器,以方便对下一接口的端点数进行计数
*/
ucBulkInIndex = 0;
ucBulkOutIndex = 0;
ucIntrInIndex = 0;
ucIntrOutIndex = 0;
ucIsoInIndex = 0;
ucIsoOutIndex = 0;
} else if (usTmp == __USB_ENDPOINT_DESCRIPTOR_TYPE) { /* 端点描述符 */
if (cInterfaceIndex < 0) { /* 尚未找到接口描述符 */
return FALSE;
}
if ( (*(pucBuf + usCount + 3) & 0x03) == 0x01) { /* 同步传输 */
if ( (*(pucBuf + usCount + 2) & (USB_INT8U)0x80) != 0) {/* IN 端点 */
pucTmp = (USB_INT8U *)&GusbInterEpDescr[cInterfaceIndex].\
usbIsoInEpDescr[ucIsoInIndex++];
GusbInterEpDescr[cInterfaceIndex].ucIsoInEpNum++;
} else { /* OUT 端点 */
pucTmp = (USB_INT8U *)&GusbInterEpDescr[cInterfaceIndex].\
usbIsoOutEpDescr[ucIsoOutIndex++];
GusbInterEpDescr[cInterfaceIndex].ucIsoOutEpNum++;
}
} else if ( (*(pucBuf + usCount + 3) & 0x03) == 0x02) { /* 块传输 */
if ( (*(pucBuf + usCount + 2) & (USB_INT8U)0x80) != 0) {/* IN 端点 */
pucTmp = (USB_INT8U *)&GusbInterEpDescr[cInterfaceIndex].\
usbBulkInEpDescr[ucBulkInIndex++];
GusbInterEpDescr[cInterfaceIndex].ucBulkInEpNum++;
} else { /* OUT 端点 */
pucTmp = (USB_INT8U *)&GusbInterEpDescr[cInterfaceIndex].\
usbBulkOutEpDescr[ucBulkOutIndex++];
GusbInterEpDescr[cInterfaceIndex].ucBulkOutEpNum++;
}
} else if ( (*(pucBuf + usCount + 3) & 0x03) == 0x03) { /* 中断传输 */
if ( (*(pucBuf + usCount + 2) & (USB_INT8U)0x80) != 0) {/* IN 端点 */
pucTmp = (USB_INT8U *)&GusbInterEpDescr[cInterfaceIndex].\
usbIntrInEpDescr[ucIntrInIndex++];
GusbInterEpDescr[cInterfaceIndex].ucIntrInEpNum++;
} else { /* OUT 端点 */
pucTmp = (USB_INT8U *)&GusbInterEpDescr[cInterfaceIndex].\
usbIntrOutEpDescr[ucIntrOutIndex++];
GusbInterEpDescr[cInterfaceIndex].ucIntrOutEpNum++;
}
}
usbMemCopy(pucTmp, pucBuf + usCount, sizeof(USB_ENDPOINT_DESCRIPTOR));
/* 将数据填充到相应的端点描述符*/
/* ...结构体变量 */
ucEpNum = *(pucBuf + usCount + 2);
ucEpNum = (USB_INT8U)(((ucEpNum >> 3) | ucEpNum) & 0x1F);
usMaxPktSize = (USB_INT16U)(*(pucBuf + usCount + 5) << 8);
usMaxPktSize = (USB_INT16U)(usMaxPktSize + *(pucBuf + usCount + 4));
__GusEpMaxPktSize[cInterfaceIndex][ucEpNum] = usMaxPktSize;
} else if (usTmp == __USB_OTG_DESCRIPTOR_TYPE) { /* OTG描述符 */
pucTmp = (USB_INT8U *)&GusbOtgDescr;
usbMemCopy(pucTmp, pucBuf + usCount, sizeof(USB_OTG_DESCRIPTOR));
} else { /* 对其它类型描述符跳过,不关心 */
;
}
usCount = (USB_INT16U)(usCount + *(pucBuf + usCount)); /* 更新计数器 */
} while (usCount < usConfigDescLen);
if (cInterfaceIndex < 0) { /* 未找到接口描述符 */
return FALSE;
}
/*
* 将所具有的接口描述符总数写到每个接口描述符结构体变量的ucInterfaceNum字段中
*/
for (usCount = 0; usCount <= cInterfaceIndex; usCount++) {
GusbInterEpDescr[usCount].ucInterfaceNum = (USB_INT8U)(cInterfaceIndex + 1);
}
return TRUE;
}
/*********************************************************************************************************
** Function name: usbGetEpMaxPktSize
** Descriptions: 获取端点的最大包大小
** input parameters: ucInterfaceIndex 接口索引
** ucEpNum 端点号
** output parameters: None
** Returned value: > 0 : 所要端点的最大包大小, 0 : 失败,表示端点ucEpNum不存在
*********************************************************************************************************/
USB_INT16U usbGetEpMaxPktSize (USB_INT8U ucInterfaceIndex, USB_INT8U ucEpNum)
{
ucEpNum = (USB_INT8U)(((ucEpNum >> 3) | ucEpNum) & 0x1F);
return __GusEpMaxPktSize[ucInterfaceIndex][ucEpNum];
}
/*********************************************************************************************************
** Function name: usbIsDeviceReady
** Descriptions: 判断设备是否准备好
** input parameters: None
** output parameters: None
** Returned value: TRUE : 设备准备好 FALSE : 设备未准备好
*********************************************************************************************************/
USB_BOOL usbIsDeviceReady (void)
{
return (USB_BOOL)(GusbHostFlags.ucEnumed == 1);
}
/*********************************************************************************************************
** Function name: usbIsDeviceAttach
** Descriptions: 判断设备是否插入
** input parameters: None
** output parameters: None
** Returned value: TRUE : 设备已插入 FALSE : 设备未准备插入
*********************************************************************************************************/
USB_BOOL usbIsDeviceAttach (void)
{
return (USB_BOOL)(GusbHostFlags.ucAttached == 1);
}
/*********************************************************************************************************
** Function name: usbGetDeviceType
** Descriptions: 获取设备类型信息,包括设备类型,所支持协议等
** input parameters: ucInterfaceIndex 接口号
** output parameters: pusbDeviceType 设备类型
** Returned value: TRUE : 成功 FALSE : 失败
*********************************************************************************************************/
USB_BOOL usbGetDeviceType (USB_INT8U ucInterfaceIndex, PUSB_DEVICE_TYPE pusbDeviceType)
{
if (!usbIsDeviceReady()) {
return FALSE;
}
pusbDeviceType->bDeviceClass = GusbDeviceDescr.bDeviceClass;
pusbDeviceType->bDeviceProtocol = GusbDeviceDescr.bDeviceProtocol;
pusbDeviceType->bInterfaceClass = GusbInterEpDescr[ucInterfaceIndex].\
usbInterfaceDescr.bInterfaceClass;
pusbDeviceType->bInterfaceProtocol = GusbInterEpDescr[ucInterfaceIndex].\
usbInterfaceDescr.bInterfaceProtocol;
pusbDeviceType->bInterfaceSubClass = GusbInterEpDescr[ucInterfaceIndex].\
usbInterfaceDescr.bInterfaceSubClass;
return TRUE;
}
/*********************************************************************************************************
** Function name: usbGetEp
** Descriptions: 获取非控制端点的端点号
** input parameters: ucInterface 接口号
** ucTranType 传输类型
** output parameters: None
** Returned value: > 0 : 端点号, = 0 : 获取失败,可能是设备不存在该类型端点
*********************************************************************************************************/
USB_INT8U usbGetEp (USB_INT8U ucInterface, USB_INT8U ucTranType)
{
USB_INT8U ucEpNum = 0;
switch (ucTranType) {
case USB_TRAN_TYPE_BULK_OUT: /* Bulk OUT 传输 */
ucEpNum = GusbInterEpDescr[ucInterface].usbBulkOutEpDescr[0].bEndpointAddress;
break;
case USB_TRAN_TYPE_BULK_IN: /* Bulk IN 传输 */
ucEpNum = GusbInterEpDescr[ucInterface].usbBulkInEpDescr[0].bEndpointAddress;
break;
case USB_TRAN_TYPE_INTR_OUT: /* Intrrupt OUT 传输 */
ucEpNum = GusbInterEpDescr[ucInterface].usbIntrOutEpDescr[0].bEndpointAddress;
break;
case USB_TRAN_TYPE_INTR_IN: /* Intrrupt IN 传输 */
ucEpNum = GusbInterEpDescr[ucInterface].usbIntrInEpDescr[0].bEndpointAddress;
break;
default: /* 不支持的传输类型 */
ucEpNum = 0;
}
return ucEpNum;
}
/*********************************************************************************************************
** Function name: usbGetVer
** Descriptions: 取得USB协议栈的版本号
** input parameters: None
** output parameters: None
** Returned value: 32位版本号
*********************************************************************************************************/
INT32U usbGetVer (void)
{
#define __CPU_TYPE 2468
#define __USB_TYPE_DEVICE 0
#define __USB_TYPE_HOST 1U
#define __USB_TYPE_OTG 2U
#define __USB_TYPE __USB_TYPE_HOST
#define __USB_VERSION 0x0100
return (__USB_TYPE_HOST << 30) | (__CPU_TYPE << 16) | __USB_VERSION;/* 主机协议栈,for LPC2468, */
/* ...版本 0x0100 */
}
#ifdef __cplusplus
}
#endif
/*********************************************************************************************************
** Function name: __usbdInit
** Descriptions: USBD层的环境初始化
** input parameters: pEnumSucessCallBack: 枚举成功时回调函数
** pDevDisconCallBack: 设备拨出时回调函数
** output parameters: None
** Returned value: None
*********************************************************************************************************/
void __usbdInit (void (*pEnumSucessCallBack)(void), void (*pDevDisconCallBack)(void))
{
__GucUsbDevAddr = 0;
__GusbHostEvtCnt.ucDataTranCnt = 0;
__GusbHostEvtCnt.ucStdTranCnt = 0;
GusbHostFlags.bExitDataOperaReq = FALSE;
GusbHostFlags.bExitStdOperaReq = FALSE;
__GpEnumSucessCallBack = pEnumSucessCallBack;
__GpDevDisconCallBack = pDevDisconCallBack;
usbMemSet(&GusbDeviceDescr, 0, sizeof(GusbDeviceDescr));
usbMemSet(&GusbConfigDescr, 0, sizeof(GusbConfigDescr));
usbMemSet(&GusbOtgDescr, 0, sizeof(GusbOtgDescr));
usbMemSet(&GusbInterEpDescr, 0, sizeof(GusbInterEpDescr));
usbMemSet(&__GusEpMaxPktSize, 0, sizeof(__GusEpMaxPktSize));
}
/*********************************************************************************************************
END FILE
*********************************************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -