📄 usbdevdriver.c
字号:
while(1) {
OS_ENTER_CRITICAL();
pstUsb->bTaskWaiting = 0; /* 任务未进入等待发送状态 */
for(i = 0;i < ucBufNum;i++) {
if ((__usbDevSelectEndpoint(ucEpIndex) & 0x60) == 0x60) { /* 端点缓冲区满 */
break;
}
ulTmp = ulSendLen - ulSendCnt; /* 计算未发送字节数 */
if (ulTmp >= ulPacketSize) {
ulTmp = __usbDevWriteEndpoint(ucEpIndex,
pucSendBuf + ulSendCnt,
(INT8U)ulPacketSize); /* 发送一包数据 */
} else {
ulTmp = __usbDevWriteEndpoint(ucEpIndex,
pucSendBuf + ulSendCnt,
(INT8U)ulTmp); /* 发送不足一包数据 */
}
ulSendCnt = ulSendCnt + ulTmp; /* 累加已发送字节数 */
if (ulSendCnt >= ulSendLen) { /* 发送完成 */
OS_EXIT_CRITICAL();
goto USB_WRITE_END;
}
}
OS_EXIT_CRITICAL();
ucErr = __usbDevWaitEpReady(pstUsb,usWaitTime); /* 等待FIFO中的数据发送到USB主机*/
if (ucErr != USB_NO_ERR) {
__usbDevRwResult(ucEpIndex,
ucBufNum,
pstUsb,
0,
1);
return USB_ERR_WR_TIMEOUT; /* 返回操作超时错误码 */
}
}
USB_WRITE_END:
ucErr = __usbDevWaitEpReady(pstUsb,usWaitTime); /* 等待FIFO中的数据发送到USB主机*/
__usbDevRwResult(ucEpIndex,
ucBufNum,
pstUsb,
0,
0); /* 传输结束处理 */
if (ucErr == OS_TIMEOUT) {
return USB_ERR_WR_TIMEOUT; /* 返回操作超时错误码 */
} else {
return USB_NO_ERR; /* 发送成功 */
}
}
#endif
/*********************************************************************************************************
** Function name: usbDevInit
** Descriptions: 初始化 USB 设备控制器
** input parameters: ucDevTaskSetupPrio: SETUP包处理任务优先级
** output parameters: 无
** Returned value: 初始化成功 0
** 初始化失败 错误码
*********************************************************************************************************/
INT8U usbDevInit (INT8U ucDevTaskSetupPrio)
{
INT8U i = 0;
INT8U ucErr = 0;
OS_ENTER_CRITICAL();
__usbDevHardwareInit(); /* 初始化硬件 */
bEPPflags.value = 0; /* 置USB事件标志为0 */
if (__usbDevReadTestRegister() != 0xA50F) { /* 读测试寄存器 */
OS_EXIT_CRITICAL();
return USB_ERR_READ_TESTREG; /* 初始化失败 */
}
__usbDevIntConfig(); /* 配置中断 */
__usbDevConfigEndpoint(); /* 配置端点 */
#if DMA_ENGINE_EN
__usbDevDMAInit(); /* 初始化USB DMA */
__usbDevSetMode(0x28);
#else
__usbDevSetMode(0x00); /* 成功传输才产生中断 */
#endif
pSetup_Event = OSMboxCreate(NULL); /* SETUP包处理任务信号量 */
if (pSetup_Event == NULL) {
OS_EXIT_CRITICAL();
return USB_ERR_CREATE_SEM; /* 创建失败,返回错误码 */
}
for(i = 0; i < NUM_ENDPOINTS; i++) {
Ctrl_Usb[i].bEpReady = 0;
Ctrl_Usb[i].bTaskWaiting = 0;
Ctrl_Usb[i].Ep_Sem = OSSemCreate(0);
if (Ctrl_Usb[i].Ep_Sem == NULL) {
OS_EXIT_CRITICAL();
return USB_ERR_CREATE_SEM; /* 创建信号量失败 */
}
}
ucErr = OSTaskCreate(usbDevTaskSetup,
(void *)0,
&usbDevTaskSetupStk[127],
ucDevTaskSetupPrio); /* 创建SETUP包处理任务 */
if (ucErr != OS_NO_ERR) {
__GucDevTaskSetUpPrio = 0;
OS_EXIT_CRITICAL();
return USB_ERR_CREATETASK_FAIL;
}
__usbDevHadwareReconnect();
__usbDevSoftReconnect(); /* 重新连接USB */
OS_EXIT_CRITICAL();
__GucDevTaskSetUpPrio = ucDevTaskSetupPrio; /* 记录SETUP处理任务的优先级 */
return USB_NO_ERR; /* 初始化USB成功 */
}
/*********************************************************************************************************
** Function name: usbDevDeInit
** Descriptions: USB 设备控制器反初始化
** input parameters: 无
** output parameters: 无
** Returned value: TRUE:反初始化成功
*********************************************************************************************************/
INT8U usbDevDeInit (void)
{
INT8U i = 0;
INT8U ucErr = 0;
INT8U ucPrio = 0;
OS_TCB *ptcb = NULL;
OS_ENTER_CRITICAL();
ucPrio = __GucDevTaskSetUpPrio;
OS_EXIT_CRITICAL();
i = 0;
if (ucPrio) {
ptcb = OSTCBPrioTbl[ucPrio]; /* 查询枚举任务是否已经存在 */
if (ptcb != NULL) {
OSMboxPost(pSetup_Event,
(void *)__USB_DEV_SETUP_DELTASK); /* 调度任务已存在,申请删除 */
while (OSTCBPrioTbl[ucPrio] != NULL) { /* 等待任务删除完毕 */
OSTimeDly(1);
if (i++ > 200) {
i = 0;
}
}
__GucDevTaskSetUpPrio = 0;
}
}
pSetup_Event = OSMboxDel(pSetup_Event,
OS_DEL_ALWAYS,
&ucErr); /* 删除SETUP包处理任务信号量 */
for(i = 0; i < NUM_ENDPOINTS; i++) {
Ctrl_Usb[i].Ep_Sem = OSSemDel(Ctrl_Usb[i].Ep_Sem,
OS_DEL_ALWAYS,
&ucErr); /* 删除端点控制传输信号量 */
}
return TRUE;
}
/*********************************************************************************************************
** Function name: usbDevTaskSetup
** Descriptions: USB 设备控制器控制传输处理
** input parameters: 无
** output parameters: 无
** Returned value: 该任务的优先级应高于其它任务,才能在任何情况下传输SETUP包
*********************************************************************************************************/
void usbDevTaskSetup(void *pdata)
{
INT8U ucErr = 0;
INT32U uiMsgCode =0;
#if OS_CRITICAL_METHOD == 3
OS_CPU_SR cpu_sr;
#endif
pdata = pdata;
for (;;) {
uiMsgCode = (INT32U)OSMboxPend(pSetup_Event,
0,
&ucErr); /* 等待Setup包 */
if (ucErr == OS_NO_ERR){ /* 接收到Setup包 */
if (uiMsgCode == __USB_DEV_SETUP_NORMAL) {
OS_ENTER_CRITICAL(); /* 关中断 */
__usbDevControlHandler(); /* 进行控制传输处理 */
OS_EXIT_CRITICAL(); /* 开中断 */
} else if (uiMsgCode == __USB_DEV_SETUP_DELTASK) {
OSTaskDel(OS_PRIO_SELF); /* 删除SETUP包处理任务 */
}
}
}
}
/*********************************************************************************************************
** Function name: USB_Exception
** Descriptions: USB 中断服务程序
** input parameters: 无
** output parameters: 无
** Returned value: 无
*********************************************************************************************************/
void usbDevException (void)
{
INT32U ulUsbIntState = 0;
INT32U ulDevIntState = 0;
INT32U ulDevState = 0;
OS_ENTER_CRITICAL();
ulDevIntState = (INT32U)USBDevIntSt; /* 读设备中断状态寄存器 */
if (ulDevIntState & DEVINT_STATUS_DEVSTAT) {
ulDevState = __usbDevGetDevStatus();
if ((ulDevState & 0x10) != 0) {
__usbDevBusReset(); /* 总线复位处理 */
}
if ((ulDevState & 0x08) != 0) {
__usbDevSuspendChange(); /* 挂起改变处理 */
}
if ((ulDevState & 0x02) != 0) {
__usbDevConnectChange(); /* 连接改变处理 */
}
USBDevIntClr = DevStatusInterrupt;
goto USB_ISR_EXIT; /* 退出中断服务程序 */
}
ulUsbIntState = (INT32U)(USBIntSt & 0x7);
if (ulUsbIntState != 0) {
if (ulUsbIntState & USBINT_STATUS_HP) {
__usbDevHpService(); /* 高优先级中断处理 */
}
if (ulUsbIntState & USBINT_STATUS_LP) {
__usbDevLpService(); /* 低优先级中断处理 */
}
#if DMA_ENGINE_EN
if (ulUsbIntState & USBINT_STATUS_DMA)
__usbDevDMAService(); /* DMA中断处理 */
#endif
}
USB_ISR_EXIT:
OS_EXIT_CRITICAL();
VICVectAddr = 0x00; /* 通知LPC23xx中断结束 */
}
/*********************************************************************************************************
** Function name: usbDevReadPort1
** Descriptions: 从USB Device的逻辑端点1读取数据
** input parameters: ulReadLen 待读取字节数
** usWaitTime 等待超时时间,单位Clock Tick
** output parameters: pucRcvBuf 接收数据缓冲区指针
** Returned value: 0:操作成功;>0:操作失败
*********************************************************************************************************/
INT8U usbDevReadPort1 (INT8U *pucRcvBuf,
INT32U ulReadLen,
INT16U usWaitTime)
{
#if DMA_ENGINE_EN
return (__usbDevDMAReadPort (2,
1,
&Ctrl_Usb[0],
pucRcvBuf,
ulReadLen,
usWaitTime)); /* DMA方式读取数据 */
#else
return (__usbDevReadPort(2,
1,
16,
&Ctrl_Usb[0],
pucRcvBuf,
ulReadLen,
usWaitTime)); /* 非DMA方式读取数据 */
#endif
}
/*********************************************************************************************************
** Function name: usbDevReadPort2
** Descriptions: 从USB Device的逻辑端点2读取数据
** input parameters: ulReadLen 待读取字节数
** usWaitTime 等待超时时间,单位Clock Tick
** output parameters: pucRcvBuf 接收数据缓冲区指针
** Returned value: 0:操作成功;>0:操作失败
*********************************************************************************************************/
INT8U usbDevReadPort2 (INT8U *pucRcvBuf,
INT32U ulReadLen,
INT16U usWaitTime)
{
#if DMA_ENGINE_EN
return (__usbDevDMAReadPort (4,
2,
&Ctrl_Usb[2],
pucRcvBuf,
ulReadLen,
usWaitTime)); /* DMA方式读取数据 */
#else
return (__usbDevReadPort(4,
2,
64,
&Ctrl_Usb[2],
pucRcvBuf,
ulReadLen,
usWaitTime)); /* 非DMA方式读取数据 */
#endif
}
/*********************************************************************************************************
** Function name: usbDevWritePort1
** Descriptions: 向USB Device的逻辑端点1写入数据
** input parameters: pucSendBuf: 待发送数据缓冲区指针
** ulSendLen: 待发送字节数
** usWaitTime: 等待超时时间,单位Clock Tick
** output parameters: 无
** Returned value: 0:操作成功;>0:操作失败
*********************************************************************************************************/
INT8U usbDevWritePort1(INT8U *pucSendBuf,
INT32U ulSendLen,
INT16U usWaitTime)
{
#if DMA_ENGINE_EN
return (__usbDevDMAWritePort(3,
1,
&Ctrl_Usb[1],
pucSendBuf,
ulSendLen,
usWaitTime)); /* DMA方式写入数据 */
#else
return (__usbDevWritePort(3,
1,
16,
&Ctrl_Usb[1],
pucSendBuf,
ulSendLen,
usWaitTime)); /* 非DMA方式写入数据 */
#endif
}
/*********************************************************************************************************
** Function name: usbDevWritePort2
** Descriptions: 向USB Device的逻辑端点1写入数据
** input parameters: pucSendBuf: 待发送数据缓冲区指针
** ulSendLen: 待发送字节数
** usWaitTime: 等待超时时间,单位Clock Tick
** output parameters: 无
** Returned value: 0:操作成功;>0:操作失败
*********************************************************************************************************/
INT8U usbDevWritePort2(INT8U *pucSendBuf,
INT32U ulSendLen,
INT16U usWaitTime)
{
#if DMA_ENGINE_EN
return (__usbDevDMAWritePort(5,
2,
&Ctrl_Usb[3],
pucSendBuf,
ulSendLen,
usWaitTime)); /* DMA方式写入数据 */
#else
return (__usbDevWritePort(5,
2,
64,
&Ctrl_Usb[3],
pucSendBuf,
ulSendLen,
usWaitTime)); /* 非DMA方式写入数据 */
#endif
}
/*********************************************************************************************************
END FILE
*********************************************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -