您的位置:首页 > 编程语言

基于OHCI的USB主机 —— UFI命令监视代码

2010-05-20 11:38 399 查看
在调用完上面的UFI命令后,ufiCmdRunning.state就被设置为UFI_STATE_BEGIN态,在主循环中调用本函数,用来判断UFI命令是否执行完毕,以及是否执行成功。
[align=left]/**[/align]
[align=left] * UFI命令监视函数,判断命令是否执行完毕,底层有错误则进行容错处理[/align]
[align=left] */[/align]
[align=left]short funUfiRunning(void)[/align]
[align=left]{[/align]
[align=left] switch(ufiCmdRunning.state)[/align]
[align=left] {[/align]
[align=left] //开始运行命令[/align]
[align=left] case UFI_STATE_BEGIN:[/align]
[align=left] usbTimer = 0;[/align]
[align=left] ufiCmdRunning.count = 0;[/align]
[align=left] ufiCmdRunning.state = UFI_STATE_RUNNING;[/align]
[align=left] break;[/align]
[align=left] [/align]
[align=left] //命令运行中[/align]
[align=left] case UFI_STATE_RUNNING:[/align]
[align=left] //检查命令是否执行完毕[/align]
[align=left] if(usbIsCmdOver() == USB_CMD_OVER)[/align]
[align=left] {[/align]
[align=left] //USB协议层命令执行失败[/align]
[align=left] if (usbGetCmdResult() != 0)[/align]
[align=left] {[/align]
[align=left] //底层命令执行失败后,对端口复位后重新执行,重新执行超过150次则认为失败[/align]
[align=left] ufiCmdRunning.count++;[/align]
[align=left] [/align]
[align=left] if (ufiCmdRunning.count > 150)[/align]
[align=left] {[/align]
ufiCmdRunning.error =
UFI_ERR_MUCH_ERR;
ufiCmdRunning.state =
UFI_STATE_OVER;
[align=left] }[/align]
[align=left] else[/align]
[align=left] {[/align]
[align=left] //复位BulkOut端口[/align]
[align=left] usbClearBulkOut();[/align]
ufiCmdRunning.state =
UFI_STATE_RESET_OUT;
[align=left] }[/align]
[align=left] break;[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] //UFI命令执行成功[/align]
if ((ufiCmdRunning.csw.bCSW_Status) == 0x00 && (ufiCmdRunning.csw.dCSW_Signature ==
0x53425355))
[align=left] {[/align]
[align=left] ufiCmdRunning.error = 0;[/align]
[align=left] }[/align]
[align=left] //UFI命令执行失败[/align]
[align=left] else[/align]
[align=left] {[/align]
[align=left] ufiCmdRunning.error = UFI_ERR_CSW;[/align]
[align=left] }[/align]
ufiCmdRunning.state =
UFI_STATE_OVER;
[align=left] }[/align]
[align=left] //底层命令超时,返回失败[/align]
[align=left] else if (usbTimer >= 200)[/align]
[align=left] {[/align]
ufiCmdRunning.error =
UFI_ERR_TIMEOUT;
ufiCmdRunning.state =
UFI_STATE_OVER;
[align=left] }[/align]
[align=left] break;[/align]
[align=left] [/align]
[align=left] //BulkOut端口复位结束[/align]
[align=left] case UFI_STATE_RESET_OUT:[/align]
[align=left] if(usbIsCmdOver() == USB_CMD_OVER)[/align]
[align=left] {[/align]
[align=left] //复位BulkIn端口[/align]
[align=left] usbClearBulkIn();[/align]
ufiCmdRunning.state =
UFI_STATE_RESET_IN;
[align=left] }[/align]
[align=left] break;[/align]
[align=left] [/align]
[align=left] //BulkIn端口复位结束[/align]
[align=left] case UFI_STATE_RESET_IN:[/align]
[align=left] if(usbIsCmdOver() == USB_CMD_OVER)[/align]
[align=left] {[/align]
[align=left] //读取端口错误原因[/align]
[align=left] ufiRequestSense(bulkDataBuf);[/align]
ufiCmdRunning.state =
UFI_STATE_REQUEST_SENSE;
[align=left] }[/align]
[align=left] break;[/align]
[align=left] [/align]
[align=left] //端口错误原因读取完毕[/align]
[align=left] case UFI_STATE_REQUEST_SENSE:[/align]
[align=left] if(usbIsCmdOver() == USB_CMD_OVER)[/align]
[align=left] {[/align]
[align=left] //重新执行底层Bulk命令[/align]
ufiCmdRunning.funUfiCmd((unsigned char
*)&ufiCmdRunning.cbw, ufiCmdRunning.pBuf, (unsigned char *)&ufiCmdRunning.csw);
[align=left] [/align]
[align=left] usbTimer = 0;[/align]
ufiCmdRunning.state =
UFI_STATE_RUNNING;
[align=left] }[/align]
[align=left] break;[/align]
[align=left] }[/align]
[align=left] return ufiCmdRunning.state;[/align]
[align=left]}[/align]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息