imx51 USB HUB长时间工作失效。急急急!!!

ywmen 2012-11-30 07:06:17
硬件:imx51, USB HOST:USB3317, USB HUB:USB2517

HUB上面挂有硬盘、USB盘、读卡器、USB 电容屏,当长时间播放硬盘歌曲时(24小时以上),每当把U盘拔出,触摸屏就不能用,串口没有什么消息输出,大约过一分钟串口输出CHub::HandleDetach(void)把所有设备(function)全部Detach.
... ...
for (UCHAR port = 1; port <= m_usbHubDescriptor.bNumberOfPorts; port++)
{
.. ...
if (m_ppCDeviceOnPort[port - 1] != NULL)
{
m_ppCDeviceOnPort[port - 1]->HandleDetach();
delete m_ppCDeviceOnPort[port - 1];
m_ppCDeviceOnPort[port - 1] = NULL;
}
}
... ...

同时串口发现CRootHub::WaitForPortStatusChange函数fSuccess返回值从0变为1(默认状态未0):
DEBUGMSG( 1, (TEXT("-CRootHub::WaitForPortStatusChange, rPort = %d, fSuccess = %d\n"), rPort, fSuccess) );

希望多多指教,刚接触USB。谢谢
...全文
665 29 打赏 收藏 转发到动态 举报
写回复
用AI写文章
29 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhujinqiang 2012-12-20
  • 打赏
  • 举报
回复
引用 24 楼 ywmen 的回复:
无计可施。
wince7.0 ? 还没解决啊?
ywmen 2012-12-18
  • 打赏
  • 举报
回复
引用 26 楼 gooogleman 的回复:
还没解决?不错不错。坐等分析结果。
GM,HCD buffer能不能增大一点啊,不知道这个buffer是否跟协议有关。现在是128K
gooogleman 2012-12-17
  • 打赏
  • 举报
回复
还没解决?不错不错。坐等分析结果。
ywmen 2012-12-17
  • 打赏
  • 举报
回复
今天发现一个控制寄存器一位改变了。datasheet描述如下: Run/Stop (RS) – Read/Write. Default 0b. 1=Run. 0=Stop. Host Controller: When set to a 1, the Host Controller proceeds with the execution of the schedule. The Host Controller continues execution as long as this bit is set to a one. When this bit is set to 0, the Host Controller completes the current transaction on the USB and then halts. The HC Halted bit in the status register indicates when the Host Controller has finished the transaction and has entered the stopped state. Software should not write a one to this field unless the host controller is in the Halted state (i.e. HCHalted in the USBSTS register is a one). 现在在USB中断线程增加了这个bit的检测,当发现为0时,软件写1.等待明天的测试结果。
ywmen 2012-12-12
  • 打赏
  • 举报
回复
无计可施。
ywmen 2012-12-09
  • 打赏
  • 举报
回复
引用 22 楼 brantyou 的回复:
引用 21 楼 ywmen 的回复:引用 19 楼 brantyou 的回复:wince中使用hub需要注意几点: 1、传输缓冲区要开的足够大 2、确保设置了USB休眠模式之后,能够真的进入这个休眠处理 第一点如果不满足,就会出现插上两个或以上的USB设备后无法识别或者识别到之后存在其他无法正常工作的情况。 第二点如果不满足,就会出现系统休眠唤醒多次后,出现U……
// Amount of memory to use for HCD buffer
#define gcTotalAvailablePhysicalMemory (0x20000) // 128K
#define gcHighPriorityPhysicalMemory (gcTotalAvailablePhysicalMemory/4)   // 1/4 as high priority
原来就是这个了。
一介布衣萧萧 2012-12-08
  • 打赏
  • 举报
回复
引用 21 楼 ywmen 的回复:
引用 19 楼 brantyou 的回复:wince中使用hub需要注意几点: 1、传输缓冲区要开的足够大 2、确保设置了USB休眠模式之后,能够真的进入这个休眠处理 第一点如果不满足,就会出现插上两个或以上的USB设备后无法识别或者识别到之后存在其他无法正常工作的情况。 第二点如果不满足,就会出现系统休眠唤醒多次后,出现USB挂掉的问题 第一点:传输缓冲区……
USB驱动中,修改这两个buffer:

// Amount of memory to use for HCD buffer
static const DWORD gcTotalAvailablePhysicalMemory = 64*1024;    // 64K
static const DWORD gcHighPriorityPhysicalMemory = 16*1024;        // 16K
这个大小是默认的,要改大一点。
ywmen 2012-12-08
  • 打赏
  • 举报
回复
引用 19 楼 brantyou 的回复:
wince中使用hub需要注意几点: 1、传输缓冲区要开的足够大 2、确保设置了USB休眠模式之后,能够真的进入这个休眠处理 第一点如果不满足,就会出现插上两个或以上的USB设备后无法识别或者识别到之后存在其他无法正常工作的情况。 第二点如果不满足,就会出现系统休眠唤醒多次后,出现USB挂掉的问题
第一点:传输缓冲区在哪设置? 第二点:如何判断我的设备进入了休眠模式?
ywmen 2012-12-08
  • 打赏
  • 举报
回复
引用 16 楼 jdygrdzh 的回复:
感觉你是软件问题,u盘拔出肯定会触发usb到cpu disconnect中断,现在你这个中断导致触摸屏没反应,并且cpu没有挂住,只能说明触摸屏中断由于某种原因没有得到处理。 作为规避,可以调高触摸屏的优先级试试看。 靠谱一点的方法是接个仿真器,不过估计有困难。 还有如果不是大客户,freescale是让代理商fae来支持的,可以问问你买芯片的供应商。 ……
请问U盘拔出后disconnect中断部分代码在哪?刚接触USB,很多不懂。谢了。
一介布衣萧萧 2012-12-08
  • 打赏
  • 举报
回复
wince中使用hub需要注意几点: 1、传输缓冲区要开的足够大 2、确保设置了USB休眠模式之后,能够真的进入这个休眠处理 第一点如果不满足,就会出现插上两个或以上的USB设备后无法识别或者识别到之后存在其他无法正常工作的情况。 第二点如果不满足,就会出现系统休眠唤醒多次后,出现USB挂掉的问题
jdygrdzh 2012-12-07
  • 打赏
  • 举报
回复
还可以在usb disconnect中断处理程序以及触摸屏中断处理程序打印一点东西验证一下是不是触摸屏中断没调用。
jdygrdzh 2012-12-07
  • 打赏
  • 举报
回复
或者降低usb的优先级
jdygrdzh 2012-12-07
  • 打赏
  • 举报
回复
感觉你是软件问题,u盘拔出肯定会触发usb到cpu disconnect中断,现在你这个中断导致触摸屏没反应,并且cpu没有挂住,只能说明触摸屏中断由于某种原因没有得到处理。 作为规避,可以调高触摸屏的优先级试试看。 靠谱一点的方法是接个仿真器,不过估计有困难。 还有如果不是大客户,freescale是让代理商fae来支持的,可以问问你买芯片的供应商。
ywmen 2012-12-07
  • 打赏
  • 举报
回复
毫无进展。
LouisScola 2012-12-03
  • 打赏
  • 举报
回复
邮件发到大中华区的技术支持,英文,一般会支持的
ywmen 2012-12-02
  • 打赏
  • 举报
回复
引用 10 楼 gooogleman 的回复:
mark 你的wince6.0+电容屏幕 效果怎么样?能做到多点吗?
10寸屏,效果不错。支持两点触摸,当然手势由应用层处理了,驱动只负责上报两点坐标信息。
ywmen 2012-12-02
  • 打赏
  • 举报
回复
附上串口信息:============================= 上电时USB加载情况: HCD:HCD_Init+ +CEhcd::Initialize. Entry CDeviceGlobal::Initialize+ LoadDriver(USBD.DLL) PUBLIC:USBD>HcdAttach+ +CHW::Initialize HUB Status Change (B) with ForceReAttach 0 HUB STATUS CHANGE (D) +CRootHub::CRootHub +CRootHub::EnterOperationalState -CRootHub::EnterOperationalState, returning BOOL 1 +CHW::EnterOperationalState +CRootHub::WaitForPortStatusChange HUB Status Change (B) with ForceReAttach 0 HUB STATUS CHANGE (D) -CRootHub::WaitForPortStatusChange, rPort = 1, fSuccess = 1 HUB Status Change (B) with ForceReAttach 0 HUB STATUS CHANGE (D) CHub(tier 0)::HubStatusChangeThread - device attached on port 1 +CHub(tier 0)::AttachDevice - port = 1 HUB Status Change (B) with ForceReAttach 0 HUB STATUS CHANGE (D) +CRootHub::WaitForPortStatusChange +CHW::WaitForPortStatusChange(m_hHubStatusChangeEvent) -CHW::WaitForPortStatusChange, return TRUE -CRootHub::WaitForPortStatusChange, rPort = 1, fSuccess = 0 +CRootHub::WaitForPortStatusChange +CHW::WaitForPortStatusChange(m_hHubStatusChangeEvent) +CHW::WaitForPortStatusChange>WaitForMultipleObjects+ //开始AttachDevice,测试时共接了5个设备 CHub(tier 1)::HubStatusChangeThread - device attached on port 1//硬盘 +CHub(tier 1)::AttachDevice - port = 1 UsbHost : New Function [address(2) / layer(1)] PUBLIC:USBMSC>USBDeviceAttach+ PUBLIC:USBMSC>LoadDriver(USBDISK6.DLL) USBDISK6>UsbDiskAttach+ CHub(tier 1)::HubStatusChangeThread - device attached on port 2//U盘 +CHub(tier 1)::AttachDevice - port = 2 UsbHost : New Function [address(3) / layer(1)] PUBLIC:USBMSC>USBDeviceAttach+ PUBLIC:USBMSC>LoadDriver(USBDISK6.DLL) USBDISK6>UsbDiskAttach+ CHub(tier 1)::HubStatusChangeThread - device attached on port 5//电容屏 +CHub(tier 1)::AttachDevice - port = 5 UsbHost : New Function [address(4) / layer(1)] PUBLIC:HID>USBDeviceAttach+ HIDDeviceAttach:(Pix USB touch)Start. CTP_Init + CHub(tier 1)::HubStatusChangeThread - device attached on port 6//3G模块 +CHub(tier 1)::AttachDevice - port = 6 UsbHost : New Function [address(5) / layer(1)] CHub(tier 1)::HubStatusChangeThread - device attached on port 7//读卡器 +CHub(tier 1)::AttachDevice - port = 7 UsbHost : New Function [address(6) / layer(1)] PUBLIC:USBMSC>USBDeviceAttach+ PUBLIC:USBMSC>LoadDriver(USBDISK6.DLL) USBDISK6>UsbDiskAttach+ ... ... 拔出U盘后: 正常应该是: USBHost : Detach Function [address(3) / layer (1)] USBDISK6>UsbDiskDetach+ 现在情况是过一会约一分钟打印: HUB Status Change (B) with ForceReAttach 0 HUB STATUS CHANGE (D) +CHW::WaitForPortStatusChange>WaitForMultipleObjects- -CHW::WaitForPortStatusChange, return TRUE -CRootHub::WaitForPortStatusChange, rPort = 1, fSuccess = 0 +CRootHub::WaitForPortStatusChange HUB Status Change (B) with ForceReAttach 0 HUB STATUS CHANGE (D) -CRootHub::WaitForPortStatusChange, rPort = 1, fSuccess = 1 +CHub(tier 0)::DetachDevice - port = 1 +CHub::DetachDownstreamDeviceThread +CHub(tier 1)::HandleDetach USBHost : Detach Hub [address(1) / layer(0)] -CHub(tier 1)::HubStatusChangeThread, THREAD EXITING, returning 0 USBHost : Detach Function [address(2) / layer (1)] USBDISK6>UsbDiskDetach+ USBHost : Detach Function [address(3) / layer (1)] USBDISK6>UsbDiskDetach+ USBHost : Detach Function [address(4) / layer (1)] Warning: MouseThreadProc: Exiting thread USBHost : Detach Function [address(5) / layer (1)] HUB Status Change (B) with ForceReAttach 0 HUB STATUS CHANGE (D) CHub(tier 0)::HubStatusChangeThread - device attached on port 1 +CHub(tier 0)::AttachDevice - port = 1 //HUB Detach后从新Attach,但是设备Function并没有重新加载 HUB Status Change (B) with ForceReAttach 0 HUB STATUS CHANGE (D) USBHost : Detach Function [address(6) / layer (1)] USBDISK6>UsbDiskDetach+ ===================================================== 看信息应该是HUB检查到有异常变化,把自身Detach了,接着Function也全部Detach了(tier 0就是RootHUB USB2517了) +CHub(tier 0)::DetachDevice - port = 1 但是后面+CHub(tier 0)::AttachDevice - port = 1,HUB应该重新Attach了。 下一步就是跟踪 CHW::UsbInterruptThread这个函数,为什么会导致CRootHub::WaitForPortStatusChange返回了1,HUB状态发生了改变。当然,也需要freescale给一些指引性辅导。。。
gooogleman 2012-12-02
  • 打赏
  • 举报
回复
mark 你的wince6.0+电容屏幕 效果怎么样?能做到多点吗?
gooogleman 2012-12-02
  • 打赏
  • 举报
回复
引用 12 楼 ywmen 的回复:
引用 10 楼 gooogleman 的回复:mark 你的wince6.0+电容屏幕 效果怎么样?能做到多点吗? 10寸屏,效果不错。支持两点触摸,当然手势由应用层处理了,驱动只负责上报两点坐标信息。
也不错,这样,就可以做到wince和android用一套硬件了, 就是电容屏幕太贵了。
lf_kyo 2012-12-01
  • 打赏
  • 举报
回复
mark下,等待明天的串口信息。可能我们的问题类似。 1楼只是卸载部分的代码,找找为什么会执行到这。
加载更多回复(8)

19,504

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 嵌入开发(WinCE)
社区管理员
  • 嵌入开发(WinCE)社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧