📄 usbd.c
字号:
((ucEpNum & 0x0F) << 7) | __GucUsbDevAddr;
GusbHostFlags.ucIntrOutPipe = 1;
__hcEnableSchedule(ucTranType);
}
break;
case USB_TRAN_TYPE_INTR_IN: /* 中断 IN 传输 */
if (GusbHostFlags.ucIntrInPipe == 0) {
__GpohciEd->edsIntrIn.uiControl = (usMaxPktSize << 16) | (1 << 14) | (__GucUsbSpeed << 13) |
((ucEpNum & 0x0F) << 7) | __GucUsbDevAddr;
GusbHostFlags.ucIntrInPipe = 1;
__hcEnableSchedule(ucTranType);
}
break;
default:
return FALSE;
}
return TRUE;
}
/*********************************************************************************************************
** Function name: usbPipeClose
** Descriptions: 关闭传输管道
** input parameters: ucTranType 传输类型
** output parameters: None
** Returned value: TRUE : 成功 FALSE : 失败
*********************************************************************************************************/
USB_BOOL usbPipeClose (USB_INT8U ucTranType)
{
__hcDisEnSchedAndWaitNextFrame(ucTranType);
OS_ENTER_CRITICAL();
switch (ucTranType) {
case USB_TRAN_TYPE_CONTROL:
__GpohciEd->edsControl.uiControl |= 1 << 14;
GusbHostFlags.ucCtrlPipe = 0;
break;
case USB_TRAN_TYPE_BULK_OUT:
__GpohciEd->edsBulkOut.uiControl |= 1 << 14;
GusbHostFlags.ucBulkOutPipe = 0;
break;
case USB_TRAN_TYPE_BULK_IN:
__GpohciEd->edsBulkIn.uiControl |= 1 << 14;
GusbHostFlags.ucBulkInPipe = 0;
break;
case USB_TRAN_TYPE_INTR_OUT:
__GpohciEd->edsIntrOut.uiControl |= 1 << 14;
GusbHostFlags.ucIntrOutPipe = 0;
break;
case USB_TRAN_TYPE_INTR_IN:
__GpohciEd->edsIntrIn.uiControl |= 1 << 14;
GusbHostFlags.ucIntrInPipe = 0;
break;
default:
break;
}
OS_EXIT_CRITICAL();
return TRUE;
}
void __usbGetDevString (void);
/*********************************************************************************************************
** Function name: __taskUsbEnum
** Descriptions: uC/OS-II任务,负责对插入的设备进行枚举
** input parameters: pdata uC/OS-II参数
** output parameters: None
** Returned value: None
*********************************************************************************************************/
void __taskUsbEnum (void *pdata)
{
USB_INT8U i, ucRet;
USB_INT8U ucBuf[22] = {0};
USB_INT16U usConfigDescLen;
USB_INT8U *pucTmp;
i = 0;
do {
do {
/*
* USB规范规定在检测到设备插入后至少要等待100ms才能开始枚举,此处等待350ms 左右
*/
OSTimeDly(70);
if (GusbHostFlags.ucAttached == 0) {
break;
}
usbBusReset(); /* 复位USB总线 */
OSTimeDly(10);
__ohciEnableInt(__USB_INT_RHSC); /* 复位总线将会禁止连接改变中断*/
/* 故在复位后就重新使能该中断 */
USBDEBUG_SENDSTR("\r\n usbEnumerate...\r\n\r\n");
__hcDisEnSchedAndWaitNextFrame(USB_TRAN_TYPE_CONTROL);
__GpohciEd->edsControl.uiControl = (__GpohciEd->edsControl.uiControl & ~(1 << 13)) |
(__GucUsbSpeed << 13); /* 配置端点速度(全速或低速) */
__hcEnableSchedule(USB_TRAN_TYPE_CONTROL);
ucRet = usbGetDeviceDescription(0x08, ucBuf); /* 获取设备描述符的前8字节 */
if (ucRet != USB_ERR_SUCESS) {
if (ucRet == USB_ERR_STALL) {
usbClearFeature_EP(0);
}
break;
}
pucTmp = (USB_INT8U *)&GusbDeviceDescr;
usbMemCopy(pucTmp, ucBuf, 0x08); /* 将获取到的数据填充到设备 */
/* ...描述符的结构体变量中 */
if ((GusbDeviceDescr.bLength != 0x12) || (GusbDeviceDescr.bDescriptorType != 0x01)) {
break; /* 获取到的设备描述符错误 */
}
__hcDisEnSchedAndWaitNextFrame(USB_TRAN_TYPE_CONTROL);
__GpohciEd->edsControl.uiControl = (__GpohciEd->edsControl.uiControl & ~(0x7f << 16)) |
(GusbDeviceDescr.bMaxPacketSize0 << 16);
__hcEnableSchedule(USB_TRAN_TYPE_CONTROL);
ucRet = usbSetAddress(0x01); /* 设置从机地址: 0x01 */
if (ucRet == USB_ERR_SUCESS) {
__GucUsbDevAddr = 0x01;
__hcDisEnSchedAndWaitNextFrame(USB_TRAN_TYPE_CONTROL);
__GpohciEd->edsControl.uiControl = (__GpohciEd->edsControl.uiControl & ~0xff) | __GucUsbDevAddr;
__hcEnableSchedule(USB_TRAN_TYPE_CONTROL);
} else {
if (ucRet == USB_ERR_STALL) {
usbClearFeature_EP(0);
}
break;
}
ucRet = usbGetDeviceDescription(0x12, ucBuf); /* 重新获取0x12字节的设备描述符*/
if (ucRet != USB_ERR_SUCESS) {
if (ucRet == USB_ERR_STALL) {
usbClearFeature_EP(0);
}
break;
}
pucTmp = (USB_INT8U *)&GusbDeviceDescr;
usbMemCopy(pucTmp, ucBuf, 0x12); /* 将获取到的数据填充到设备 */
/* ...描述符的结构体变量中 */
__usbGetDevString(); /* 获取产商字符串描述符和产品字*/
/* 符串描述符,并发送到调试接口 */
ucRet = usbGetConfigDescription(0, 0, 9, ucBuf); /* 获取9字节的配置描述符 */
if (ucRet != USB_ERR_SUCESS) {
if (ucRet == USB_ERR_STALL) {
usbClearFeature_EP(0);
}
break;
}
pucTmp = (USB_INT8U *)&GusbConfigDescr;
usbMemCopy(pucTmp, ucBuf, 0x09); /* 将获取到的数据填充到配置 */
/* ...描述符的结构体变量中 */
usConfigDescLen = (USB_INT16U)(GusbConfigDescr.wTotalLength1 << 8);
usConfigDescLen = (USB_INT16U)(usConfigDescLen + GusbConfigDescr.wTotalLength0);
/* 计算总配置描述符长度 */
pucTmp = NULL;
pucTmp = (USB_INT8U *)malloc(usConfigDescLen);
if (pucTmp == NULL) {
break;
}
ucRet = usbGetConfigDescription(0, 0, usConfigDescLen, pucTmp);
/* 获取所有的设备描述符 */
if (ucRet != USB_ERR_SUCESS) {
if (ucRet == USB_ERR_STALL) {
usbClearFeature_EP(0);
}
break;
} else{
usbInterfaceEpConfig(pucTmp, usConfigDescLen); /* 获取到的配置描述符中的接口 */
} /* ..描述符和端点描述符进行整理*/
free(pucTmp); /* 释放缓冲区 */
ucRet = usbSetConfiguratiton(); /* 设置配置 */
if (ucRet != USB_ERR_SUCESS) {
if (ucRet == USB_ERR_STALL) {
usbClearFeature_EP(0);
}
break;
}
GusbHostFlags.ucEnumed = 1; /* 标志枚举成功 */
USBDEBUG_SENDSTR("\r\n usbEnumerate sucess!\r\n");
usbPipeOpen(USB_TRAN_TYPE_INTR_OUT);
usbPipeOpen(USB_TRAN_TYPE_INTR_IN);
usbPipeOpen(USB_TRAN_TYPE_BULK_OUT);
usbPipeOpen(USB_TRAN_TYPE_BULK_IN);
} while (0);
if (GusbHostFlags.ucEnumed) {
if (__GpEnumSucessCallBack) {
(*__GpEnumSucessCallBack)(); /* 执行枚举成功回调函数 */
}
break;
}
} while (i++ < 3);
if (GusbHostFlags.ucEnumed == 0) {
USBDEBUG_SENDSTR("\r\n usbEnumerate failed!\r\n");
}
USBDEBUG_SENDSTR("\r\n Delete usbEnumerate task!\r\n\r\n");
OSTaskDel(OS_PRIO_SELF);
while (1) {
;
}
}
/*********************************************************************************************************
** Function name: __usbGetDevString
** Descriptions: 获取供应商描述符和产品描述符,并发送到调试接口上
** input parameters: None
** output parameters: None
** Returned value: None
*********************************************************************************************************/
void __usbGetDevString (void)
{
USB_INT8U ucBuf[44];
USB_INT16U usLanID, usLen;
INT8U i, ucRet;
ucRet = usbGetStringDescription(0, 0, 4, ucBuf); /* 获取4字节语言ID */
if (ucRet != USB_ERR_SUCESS) {
if (ucRet == USB_ERR_STALL) {
usbClearFeature_EP(0);
}
return;
} else {
usLanID = (USB_INT16U)(ucBuf[3] << 8);
usLanID = (USB_INT16U)(usLanID | ucBuf[2]); /* 语言ID */
}
if (GusbDeviceDescr.iManufacturer) {
ucBuf[1] = 0;
ucRet = usbGetStringDescription(GusbDeviceDescr.iManufacturer,
usLanID, 2, ucBuf); /* 获取供应商字符串描述符前两字节*/
if (ucBuf[1] != 0x03) {
return;
}
usLen = ucBuf[0]; /* 获取供应商字符串描述符长度 */
if (usLen > sizeof(ucBuf)) {
usLen = sizeof(ucBuf);
}
ucRet = usbGetStringDescription(GusbDeviceDescr.iManufacturer,
usLanID, usLen, ucBuf); /* 获取供应商字符串描述符 */
if (ucRet != USB_ERR_SUCESS) {
if (ucRet == USB_ERR_STALL) {
usbClearFeature_EP(0);
} else {
return;
}
} else {
USBDEBUG_SENDSTR("\r\nManufacturer : ");
if (usLanID == 0x0409) {
for (i = 2; i < usLen; i+=2) {
USBDEBUG_SENDCHAR(ucBuf[i]);
}
} else {
for (i = 2; i < usLen; i++) {
USBDEBUG_SENDCHAR(ucBuf[i]);
}
}
}
}
if (GusbDeviceDescr.iProduct) {
ucBuf[1] = 0;
ucRet = usbGetStringDescription(GusbDeviceDescr.iProduct,
usLanID, 2, ucBuf); /* 获取产品字符串描述符前两字节*/
if (ucBuf[1] != 0x03) {
return;
}
usLen = ucBuf[0]; /* 获取产品字符串描述符长度 */
if (usLen > sizeof(ucBuf)) {
usLen = sizeof(ucBuf);
}
ucRet = usbGetStringDescription(GusbDeviceDescr.iProduct,
usLanID, usLen, ucBuf); /* 获取供应商字符串描述符 */
if (ucRet != USB_ERR_SUCESS) {
if (ucRet == USB_ERR_STALL) {
usbClearFeature_EP(0);
} else {
return;
}
} else {
USBDEBUG_SENDSTR("\r\nProduct : ");
if (usLanID == 0x0409) {
for (i = 2; i < usLen; i+=2) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -