Wince上USB host 中U盘兼容性问题点滴
2012-07-10 15:57
549 查看
我们现在使用的是sirfA4芯片做的产品,使用它的USB口用于U盘读播MP3和视频文件,之前发现USB口出现这样问题:有个次品U盘(标称容量16G,实际容量只有4G),在电脑上都能正常读写数据,没有什么问题,但是拿到我们机器上就出现插入U盘可以识别,但是会经常性的出现读数据失败,USB识别到断开的情况。
追踪程序发现读取Csw 长度为0,此时会重新初始化,造成USB disk重新枚举,但是怎么也不能再读到U盘的数据,只有重新拔插才能正常工作。偶然机会发现,在读U盘数据时如果没有运行其他程序,出错的几率会小很多,于是判断是对USB的响应中出现了中断去做其他事情造成不能及时相应,兼容性不好的U盘就会死机,所以出现问题,只要及时响应USB操作,应该能解决此问题。 最后在 disK.C中增加以下代码解决此问题:
case DISK_IOCTL_WRITE:
{
DEBUGMSG(ZONE_DSK_IOCTL, (TEXT("USBDISK6>DSK_IOControl>%s\r\n"),
(bRead ? TEXT("IOCTL_DISK_READ"):TEXT("IOCTL_DISK_WRITE"))));
// Sterilize the caller's SG_REQ.
if (!SterilizeIoRequest(
pDevice->pSterileIoRequest,
(PSG_REQ)pInBuf,
InBufLen)
) {
dwErr = ERROR_INVALID_PARAMETER;
break;
}
// If write, ensure that the device is not write-protected.
if (!bRead && pDevice->Flags.WriteProtect) {
dwErr = ERROR_WRITE_PROTECT;
break;
}
pDevice->Flags.MediumChanged = FALSE;
// Initiate I/O. Note that, to determine if ScsiRWSG succeeded,
// we are required to inspect the sr_status. It's safe to do so,
// because pSterileIoRequest is our safe copy of the caller's
// SG_REQ.
#if MXcompatible
dwThreadID = GetCurrentThread();
dwThreadPri = CeGetThreadPriority(dwThreadID);
dwThreadQuantum = CeGetThreadQuantum(dwThreadID);
CeSetThreadPriority(dwThreadID, 0);
CeSetThreadQuantum(dwThreadID, 0);
try
{
#endif
SafeBytesReturned = ScsiRWSG(
pDevice,
pDevice->pSterileIoRequest,
pDevice->Lun,
bRead
);
#if MXcompatible
}
except(GetExceptionCode() == EXCEPTION_ACCESS_VIOLATION ?
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH)
{
dwErr = pDevice->pSterileIoRequest->sr_status;
CeSetThreadQuantum(dwThreadID, dwThreadQuantum);
CeSetThreadPriority(dwThreadID, dwThreadPri);
break;
}
CeSetThreadQuantum(dwThreadID, dwThreadQuantum);
CeSetThreadPriority(dwThreadID, dwThreadPri);
#endif
追踪程序发现读取Csw 长度为0,此时会重新初始化,造成USB disk重新枚举,但是怎么也不能再读到U盘的数据,只有重新拔插才能正常工作。偶然机会发现,在读U盘数据时如果没有运行其他程序,出错的几率会小很多,于是判断是对USB的响应中出现了中断去做其他事情造成不能及时相应,兼容性不好的U盘就会死机,所以出现问题,只要及时响应USB操作,应该能解决此问题。 最后在 disK.C中增加以下代码解决此问题:
case DISK_IOCTL_WRITE:
{
DEBUGMSG(ZONE_DSK_IOCTL, (TEXT("USBDISK6>DSK_IOControl>%s\r\n"),
(bRead ? TEXT("IOCTL_DISK_READ"):TEXT("IOCTL_DISK_WRITE"))));
// Sterilize the caller's SG_REQ.
if (!SterilizeIoRequest(
pDevice->pSterileIoRequest,
(PSG_REQ)pInBuf,
InBufLen)
) {
dwErr = ERROR_INVALID_PARAMETER;
break;
}
// If write, ensure that the device is not write-protected.
if (!bRead && pDevice->Flags.WriteProtect) {
dwErr = ERROR_WRITE_PROTECT;
break;
}
pDevice->Flags.MediumChanged = FALSE;
// Initiate I/O. Note that, to determine if ScsiRWSG succeeded,
// we are required to inspect the sr_status. It's safe to do so,
// because pSterileIoRequest is our safe copy of the caller's
// SG_REQ.
#if MXcompatible
dwThreadID = GetCurrentThread();
dwThreadPri = CeGetThreadPriority(dwThreadID);
dwThreadQuantum = CeGetThreadQuantum(dwThreadID);
CeSetThreadPriority(dwThreadID, 0);
CeSetThreadQuantum(dwThreadID, 0);
try
{
#endif
SafeBytesReturned = ScsiRWSG(
pDevice,
pDevice->pSterileIoRequest,
pDevice->Lun,
bRead
);
#if MXcompatible
}
except(GetExceptionCode() == EXCEPTION_ACCESS_VIOLATION ?
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH)
{
dwErr = pDevice->pSterileIoRequest->sr_status;
CeSetThreadQuantum(dwThreadID, dwThreadQuantum);
CeSetThreadPriority(dwThreadID, dwThreadPri);
break;
}
CeSetThreadQuantum(dwThreadID, dwThreadQuantum);
CeSetThreadPriority(dwThreadID, dwThreadPri);
#endif
相关文章推荐
- wince用法点滴(2)-字符输入问题
- [知识点滴]CSS兼容性问题总结大全
- Virtualbox中win7虚拟机中U盘不可用问题的解决
- 总结前端的兼容性问题
- PHP扩展迁移为PHP7扩展兼容性问题记录
- 兼容性问题
- jQuery的写法不同导致的兼容性问题的解决方法
- IGMPv1与IGMPv2在同一子网兼容性问题
- CSS遇到的几个兼容性问题
- 求助 webBrowser 的兼容性问题 有偿的 500红包
- 嵌入式IOEServer终于开发完成,相应的问题作一个系统阐述(WINCE)
- WinCE应用程序开发--改变目标平台时遇到的问题。
- [问题记录]js将事件写在函数之前解决IE8的兼容性问题
- 移动web端开发字体设置问题,字体兼容性问题
- 解决input设置line-height不居中的兼容性问题
- vs2008 Web 页面切换设计视图无反应问题的解决(Office 2010 与 Visual Studio 2008 兼容性问题的解决)
- 动态加载JS文件,完美解决跨域、编码、嵌套、队列、兼容性、执行顺序等相关问题。
- js在IE和FF下的兼容性问题
- 常见兼容性问题
- DLL的向后兼容性问题——DLL Hell问题