none
Wince 5.0(S3C2440平台)休眠唤醒后USB异常 RRS feed

  • 问题

  • 我的系统在休眠唤醒后USB不能使用

    现象:
    1,正常启动,插入usb同步线,连接正常;但是此时再休眠,唤醒后死机
    2,正常启动,休眠再唤醒,后插入USB同步线,同步不上,死机
     其他未发现异常,串口唤醒后能用

    不知道冷启动和休眠唤醒后USB配置有什么不同,我在休眠前把usb设置成suspend了,唤醒后恢复,目前的症状好像休眠唤醒后一直占用中断?请各位老师指点迷津,如何排除故障

    2010年6月11日 9:10

答案

  • 如果我的理解没错的话,你应该是把你的板子作为USB function device和PC进行activesync连接。这种情况下,你的板子休眠之后,USB就不对PC host那边来的消息做相应了(应该来说在休眠状态下,你的USB clock是关掉的)。但是PC并不知道这点,所以它会继续尝试连接你的板子,具体怎么做就要看具体的PC主板芯片了。至于为什么你的板子会挂掉,有可能就是PC USB host那边发过来的packet让你的USB function硬件的状态机出问题了。

    而一般来说USB connection主要通过DP, DM两根线的差分信号,进行数据传输的。其中DP线一般情况下会被用来通知Host 有USB function device接上来了。DP线,你看你板子的schematic应该可以找到。

    通过拉低DP线,可以让host认为你的板子已经被拔掉了,也就不会再发packet给你的板子了。而板子唤醒之后再拉高DP,Host就会认为又有新的device接上来了,就会重新做initialization。至于如何拉低DP线,有些MCU有内置的拉低功能,通过设置特定的register可以控制DP的电位。如果没有的话,就只有通过外接电路,用GPIO来控制了。

    至于你说的MCU_RESUME和SUSPEND_MODE,我不太了解你的MCU,所以不好做猜测。不过你可以参考一下你的USB driver的初始化函数,Reset做的事情应该跟初始化差不多。

    至于suspend mode,一般是Host会发个一个Suspend或者是reset之类的信号,然后device就会进入suspend mode。是自动还是需要软件控制,就要看具体的MCU了。

    2010年6月12日 14:53
    版主

全部回复

  • 我没记错的话,USB suspend应该是由USB Host来触发的,不应该是USB Device主动进入Suspend mode。

    你可以试一下在休眠前把DP线拉低,这样Host会认为你得USB Device已经断开了。然后再Reset整个USB device peripheral,在关掉clock之类的。

    唤醒后,在开Clock, enable USB device peripheral, 然后拉高DP线,应该一切就会跟冷启动一样了。

    2010年6月11日 9:43
    版主
  • 我没记错的话,USB suspend应该是由USB Host来触发的,不应该是USB Device主动进入Suspend mode。

    你可以试一下在休眠前把DP线拉低,这样Host会认为你得USB Device已经断开了。然后再Reset整个USB device peripheral,在关掉clock之类的。

    唤醒后,在开Clock, enable USB device peripheral, 然后拉高DP线,应该一切就会跟冷启动一样了。


    今天测试了下USB HOST,也是休眠唤醒后不能使用,我查看了BSP休眠唤醒前后关于USB的操作,除了设置USB进入SUSPEND模式外没有别的操作(即MISCCR的12,13位置位),另外弱弱的问下,如何拉低DP呢,是HOST的DP么?reset device是不是PWR_REG寄存器的MCU_RESUME置位?

    MCU_RESUME  :Set by the MCU for MCU Resume.
    The USB generates the resume signaling during
    10ms, if this bit is set in suspend mode.   意思是说MCU Set该位后USB会产生一个控制器复位?

    SUSPEND_MODE :Set by USB automatically when the device enter
    into suspend mode.
    It is cleared under the following conditions:
    1) The MCU clears the MCU_RESUME bit by
    writing ‘0’, in order to end remote resume
    signaling.
    2) The resume signal from host is received.   该位应该是USB device收到HOST的reset信号后对自己复位,不知道我的理解对不

     

    2010年6月12日 13:49
  • 问题补充:休眠唤醒后插入usb同步线,wince显示已验证的连接……然后挂掉,说明usb响应中断了
    2010年6月12日 13:52
  • 如果我的理解没错的话,你应该是把你的板子作为USB function device和PC进行activesync连接。这种情况下,你的板子休眠之后,USB就不对PC host那边来的消息做相应了(应该来说在休眠状态下,你的USB clock是关掉的)。但是PC并不知道这点,所以它会继续尝试连接你的板子,具体怎么做就要看具体的PC主板芯片了。至于为什么你的板子会挂掉,有可能就是PC USB host那边发过来的packet让你的USB function硬件的状态机出问题了。

    而一般来说USB connection主要通过DP, DM两根线的差分信号,进行数据传输的。其中DP线一般情况下会被用来通知Host 有USB function device接上来了。DP线,你看你板子的schematic应该可以找到。

    通过拉低DP线,可以让host认为你的板子已经被拔掉了,也就不会再发packet给你的板子了。而板子唤醒之后再拉高DP,Host就会认为又有新的device接上来了,就会重新做initialization。至于如何拉低DP线,有些MCU有内置的拉低功能,通过设置特定的register可以控制DP的电位。如果没有的话,就只有通过外接电路,用GPIO来控制了。

    至于你说的MCU_RESUME和SUSPEND_MODE,我不太了解你的MCU,所以不好做猜测。不过你可以参考一下你的USB driver的初始化函数,Reset做的事情应该跟初始化差不多。

    至于suspend mode,一般是Host会发个一个Suspend或者是reset之类的信号,然后device就会进入suspend mode。是自动还是需要软件控制,就要看具体的MCU了。

    2010年6月12日 14:53
    版主
  • 如果我的理解没错的话,你应该是把你的板子作为USB function device和PC进行activesync连接。这种情况下,你的板子休眠之后,USB就不对PC host那边来的消息做相应了(应该来说在休眠状态下,你的USB clock是关掉的)。但是PC并不知道这点,所以它会继续尝试连接你的板子,具体怎么做就要看具体的PC主板芯片了。至于为什么你的板子会挂掉,有可能就是PC USB host那边发过来的packet让你的USB function硬件的状态机出问题了。

    而一般来说USB connection主要通过DP, DM两根线的差分信号,进行数据传输的。其中DP线一般情况下会被用来通知Host 有USB function device接上来了。DP线,你看你板子的schematic应该可以找到。

    通过拉低DP线,可以让host认为你的板子已经被拔掉了,也就不会再发packet给你的板子了。而板子唤醒之后再拉高DP,Host就会认为又有新的device接上来了,就会重新做initialization。至于如何拉低DP线,有些MCU有内置的拉低功能,通过设置特定的register可以控制DP的电位。如果没有的话,就只有通过外接电路,用GPIO来控制了。

    至于你说的MCU_RESUME和SUSPEND_MODE,我不太了解你的MCU,所以不好做猜测。不过你可以参考一下你的USB driver的初始化函数,Reset做的事情应该跟初始化差不多。

    至于suspend mode,一般是Host会发个一个Suspend或者是reset之类的信号,然后device就会进入suspend mode。是自动还是需要软件控制,就要看具体的MCU了。


    首先非常感想你的关注和回复,从中受到不少启发;但是我的USB host休眠唤醒后也不能使用(正常启动的话可以使用);对于HOST我该如何处理呢?只是复位一下?明天仔细看下BSP中USB驱动部分;USB部分使用了电源管理功能,即休眠前进入D4状态,唤醒时回到D0,USB驱动利用PowerOn和PowerOff来进行相关处理;

    我的平台是三星s3c2440+wince5.0 ,我利用usb device进行与pc同步,利用host读取u盘;

    2010年6月12日 15:04
  • 哦,我的确实拉低DP了,我现在的USB device的DP是通过一个IO接1.5K电阻拉低的,休眠前拉低,唤醒后拉高;休眠前后调用UfnPdd_IOControl来设置

    2010年6月13日 0:45
  • 这样的话,PC那边应该不会发生乱发包的情况。问提应该出在你的USB Device 这边。可以尝试一下这样做:

    唤醒后,先enable USB Device clock,在clear所有的local buffer,Disable除了Endpoint0之外的所有Endpoint,Clear所有Endpoint的status,Clear掉所有pending interrupt,Reset所有的endpoint和整个USB Device(如果没有reset bit的话,可以通过先Disable 再Enable的方法)。最后在拉高DP。

    这个方法应该可以彻底地把USB Device port Reset掉。这样,不管是PC还是你的板子,都会处于跟刚刚power up一样的状态。

    2010年6月13日 2:00
    版主
  • 如果reset usb控制器的话是不是要再次调用一下UfnPdd_Init;?复位后如何初始化用到的寄存器?

    2010年6月13日 8:15
  • 另外USB host是不是也reset一下,因为现在host口也是唤醒后不能用,如果唤醒后插入u盘的话也死机;此时我按下关机按键都不响应,利用的外部中断,说明此时cpu连外部中断都不响应了
    2010年6月13日 8:17
  • 如何Reset要看你得MCU的datasheet了,我对三星的芯片不是很了解。不过,一般初始化的时候都会作一下reset,所以UfnPdd_Init的代码很有参考意义。

    至于你得USB Host唤醒后导致死机,很有可能是USB Host发了无数的interrupt给Processor,导致它不堪重负。验证这点,只要在休眠前,disable USB Host所有的interrupt, 在唤醒后,也不要enable这些interrupt,看MCU还会不会死。

     

    2010年6月13日 8:34
    版主
  • 谢谢gyren的指点,用reset再init的方法或许能行,但是动作太大了,目前我的bsp对休眠这一块是支持的,我不想改的面目全非,我估计应该是卡在哪一点了,我BSP关于休眠唤醒对USB的处理:

    休眠前:设置usb为suspend,拉低usb从口DP,停止usb时钟
    唤醒后:恢复上述工作
    好像关于休眠唤醒所作的工作就这么多啊,唤醒后一插入usb同步线显示正在连接到主机,然后显示通过验证的用户,然后就挂掉了

    哪位有2440的BSP能不能参考下?我的代码太长,没法贴啊

    2010年6月19日 6:26
  • 网上看到类似的问题,说是在唤醒后未初始化NAND Flash,唤醒后需要重新初始化nand吗,所有寄存器的值和堆栈的内容不是都恢复了么?如果真是NAND flash初始化不正确倒是会导致同步不了,因为同步肯定要读取NAND flash的!我在我的BSP里找不到唤醒后重新初始化NAND的代码?请问各位老师我如何重新初始化NAND?需要重新把NAND BOOTPART下吗?
    2010年6月21日 1:39
  • 为了验证是不是nand初始化的问题,我唤醒后直接在NAND上新建个文件夹,马上挂掉,基本可以确定是nand初始化的问题了,问下各位如何初始化nand?有时间的话讲解下为什么要重新初始化呢?唤醒后所有的东西不是都恢复了么?包括nand控制寄存器……

    2010年6月21日 2:20
  • 问题解决,在FMD_POWER_UP里重新调用FMD_Init就好了,唤醒后插入同步线也好了,操作主口也好了;烦请了解的朋友解释一下为什么唤醒后需要重新初始化NAND呢?
    2010年6月21日 6:45
  • 请问CE5.0在同步的情况下休眠,这时候同步软件正常下应该是什么状态呢?还会显示“已连接”吗

    再唤醒,这时同步的状态又应该是什么呢?可以通过同步软件来浏览CE的目录和文件吗

    我的系统不论是休眠还是唤醒,同步软件都会显示“已连接”,但是就是不能浏览CE目录和文件

    不知道和你的问题是不是一个原因,请帮忙看一下,谢谢

    2010年9月2日 7:15
  • 请教一下,我用的是pXA310 wince6.0 平台

    在系统启动后,一切正常,但休眠唤醒后,usb还是能和pc同步(文件夹里面黏贴复制删除都行),但用vs2008 把程序部署到 wince机器上时,就出现部署错误。

    这两个用的是不同驱动还是?

    我那ipm好像对

     "IClass"="{CC5195AC-BA49-48a0-BE17-DF6D1B0173DD}"

    没反应

    如何在IPM里面把这个东西注册进去还是?

    请高手指教



    Daniel

    2012年5月27日 19:54