9342|16

57

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

wince唤醒时,死在USB OTG驱动里面了 [复制链接]

我是用的wince6.0,和三星6410的板子,驱动中有两个,一个是USB,另外一个是OTG,USB驱动里面很简单,就只有一个C文件。

当我将系统挂起之后,所有驱动均正常。唤醒之后,大部分驱动正常,在我测试之后,发现:
   1. 将OTG驱动去掉,保留USB驱动,系统能够正常唤醒,但是有一个现象:直接开机的时候可以使用鼠标,唤醒之后鼠标不能使用了。
   2. 将USB驱动保留,OTG驱动保留,系统不能唤醒。
   3. 将两个驱动均拿掉,开机之后USB不能使用,只能用触摸屏。挂起唤醒均正常。

于是我将OTG中的POWERUP函数加入了调试信息,进入此函数时输出,退出此函数时也输出。结果是进入退出调试均正常。代码如下:

  1.     RETAILMSG(TRUE, (TEXT("[UfnPdd] +++Power Up\r\n")));
  2.     SETFNAME();
  3.     DEBUGMSG(ZONE_POWER, (_T("%s\r\n"), pszFname));

  4.     PCTRLR_PDD_CONTEXT pContext = (PCTRLR_PDD_CONTEXT) pvPddContext;
  5.     ValidateContext(pContext);
  6.     RETAILMSG(TRUE, (TEXT("[UfnPdd] ---Power Up\r\n")));
复制代码


此函数应该是没有任何操作的,执行也正常,那么会死在什么地方呢。


我看了OEMPowerOff,其中挂起之前,设置了一次USBOTG寄存器,将其关闭,唤醒之后立即开启了USBOTG,这两个步骤都是在OEMPowerOff中完成。代码如下:

  1. void OEMPowerOff()
  2. {
  3.     volatile S3C6410_SYSCON_REG *pSysConReg;
  4.     volatile S3C6410_GPIO_REG *pGPIOReg;
  5.     volatile S3C6410_VIC_REG *pVIC0Reg;
  6.     volatile S3C6410_VIC_REG *pVIC1Reg;
  7.     volatile S3C6410_DMAC_REG *pDMAC0Reg;
  8.     volatile S3C6410_DMAC_REG *pDMAC1Reg;
  9.     volatile OTG_PHY_REG *pOtgPhyReg;

  10.      int nIndex = 0;

  11.     OALMSG(TRUE, (L"[OEM] ++OEMPowerOff()\r\n"));

  12. #if    0    // KITL can not support Sleep
  13.     // Make sure that KITL is powered off
  14.     pArgs = (OAL_KITL_ARGS*)OALArgsQuery(OAL_ARGS_QUERY_KITL);
  15.     if ((pArgs->flags & OAL_KITL_FLAGS_ENABLED) != 0)
  16.     {
  17.         OALKitlPowerOff();
  18.         OALMSG(1, (L"OEMPowerOff: KITL Disabled\r\n"));
  19.     }
  20. #endif

  21.     //-----------------------------
  22.     // Disable DVS and Set to Full Speed
  23.     //-----------------------------
  24. #ifdef DVS_EN
  25.     ChangeDVSLevel(SYS_L0);
  26. #endif

  27.     //-----------------------------
  28.     // Prepare Specific Actions for Sleep
  29.     //-----------------------------
  30.     BSPPowerOff();

  31.     //------------------------------
  32.     // Prepare CPU Entering Sleep Mode
  33.     //------------------------------

  34.     //----------------
  35.     // Map SFR Address
  36.     //----------------
  37.     pSysConReg = (S3C6410_SYSCON_REG *)OALPAtoVA(S3C6410_BASE_REG_PA_SYSCON, FALSE);
  38.     pGPIOReg = (S3C6410_GPIO_REG *)OALPAtoVA(S3C6410_BASE_REG_PA_GPIO, FALSE);
  39.     pVIC0Reg = (S3C6410_VIC_REG *)OALPAtoVA(S3C6410_BASE_REG_PA_VIC0, FALSE);
  40.     pVIC1Reg = (S3C6410_VIC_REG *)OALPAtoVA(S3C6410_BASE_REG_PA_VIC1, FALSE);
  41.     pDMAC0Reg = (S3C6410_DMAC_REG *)OALPAtoVA(S3C6410_BASE_REG_PA_DMA0, FALSE);
  42.     pDMAC1Reg = (S3C6410_DMAC_REG *)OALPAtoVA(S3C6410_BASE_REG_PA_DMA1, FALSE);
  43.     pOtgPhyReg = (OTG_PHY_REG *)OALPAtoVA(S3C6410_BASE_REG_PA_USBOTG_PHY, FALSE);
  44.    
  45.     //------------------
  46.     // Save VIC Registers
  47.     //------------------
  48.     S3C6410_SaveState_VIC((void *)pVIC0Reg, (void *)pVIC1Reg, g_aSleepSave_VIC);

  49.     // Disable All Interrupt
  50.     pVIC0Reg->VICINTENCLEAR = 0xFFFFFFFF;
  51.     pVIC1Reg->VICINTENCLEAR = 0xFFFFFFFF;
  52.     pVIC0Reg->VICSOFTINTCLEAR = 0xFFFFFFFF;
  53.     pVIC1Reg->VICSOFTINTCLEAR = 0xFFFFFFFF;

  54.     //--------------------
  55.     // Save DMAC Registers
  56.     //--------------------
  57.     S3C6410_SaveState_DMACon((void *)pDMAC0Reg, g_aSleepSave_DMACon0);
  58.     S3C6410_SaveState_DMACon((void *)pDMAC1Reg, g_aSleepSave_DMACon1);

  59.     //------------------
  60.     // Save GPIO Register
  61.     //------------------
  62.     S3C6410_SaveState_GPIO((void *)pGPIOReg, g_aSleepSave_GPIO);

  63.     //--------------------
  64.     // Save SysCon Register
  65.     //--------------------
  66.     S3C6410_SaveState_SysCon((void *)pSysConReg, g_aSleepSave_SysCon);

  67.     //-------------------------------------------------------
  68.     // Unmask Clock Gating and Block Power turn On (SW workaround)
  69.     //-------------------------------------------------------

  70.     // HCLK_IROM, HCLK_MEM1, HCLK_MEM0, HCLK_MFC Should be Always On for power Mode (Something coupled with BUS operation)
  71.     //pSysConReg->HCLK_GATE |= ((1<<25)|(1<<22)|(1<<21)|(1<<0));
  72.     pSysConReg->HCLK_GATE = 0xFFFFFFFF;
  73.     pSysConReg->PCLK_GATE = 0xFFFFFFFF;
  74.     pSysConReg->SCLK_GATE = 0xFFFFFFFF;
  75.     // Turn On All Block Block Power
  76.     pSysConReg->NORMAL_CFG = 0xFFFFFF00;

  77.     // Wait for Block Power Stable
  78.     while((pSysConReg->BLK_PWR_STAT & 0x7E) != 0x7E);

  79.     //----------------------------
  80.     // Wake Up Source Configuration
  81.     //----------------------------
  82.      S3C6410_WakeUpSource_Configure();

  83.     //-------------------------------
  84.     // Extra work for Entering Sleep Mode
  85.     //-------------------------------

  86.     // USB Power Control
  87.     pSysConReg->OTHERS &= ~(1<<16);    // USB Signal Mask Clear
  88.     pGPIOReg->SPCON |= (1<<3);            // USB Tranceiver PAD to Suspend

  89.     // TODO: SPCONSLP ???
  90.     //pGPIOReg->SPCONSLP;    // Use Default Valie

  91.     //-------------------------------
  92.     // GPIO Configuration for Sleep State
  93.     //-------------------------------
  94.     // TODO: Configure GPIO at Sleep
  95.     //BSPConfigGPIOforPowerOff();

  96.     // Sleep Mode Pad Configuration
  97.     pGPIOReg->SLPEN = 0x2;    // Controlled by SLPEN Bit (You Should Clear SLPEN Bit in Wake Up Process...)

  98.         OALMSG(TRUE, (L"[OEM] --OEMPowerOff()\r\nCPU Entering Sleep Mode\r\n"));
  99.         OALMSG(TRUE, (L"****************************************************\r\n"));

  100.     //-----------------------
  101.     // CPU Entering Sleep Mode
  102.     //-----------------------

  103.     OALCPUPowerOff();    // Now in Sleep

  104.     //----------------------------
  105.     // CPU Wake Up from Sleep Mode
  106.     //----------------------------

  107.     //----------------------------
  108.     // Wake Up Source Determine
  109.     //----------------------------
  110.      S3C6410_WakeUpSource_Detect();

  111.     // USB Power Control
  112.     InitializeOTGCLK();              // pll_powerdown, suspend mode   

  113.     pGPIOReg->SPCON &= ~(1<<3);        // USB Tranceiver PAD to Normal

  114.     // Restore SysCon Register
  115.     S3C6410_RestoreState_SysCon((void *)pSysConReg, g_aSleepSave_SysCon);

  116.     // Restore GPIO Register
  117.     S3C6410_RestoreState_GPIO((void *)pGPIOReg, g_aSleepSave_GPIO);

  118.     // Sleep Mode Pad Configuration
  119.     pGPIOReg->SLPEN = 0x2;    // Clear SLPEN Bit for Pad back to Normal Mode

  120.     //-----------------------
  121.     // Restore DMAC Registers
  122.     //-----------------------
  123.     S3C6410_RestoreState_DMACon((void *)pDMAC0Reg, g_aSleepSave_DMACon0);
  124.     S3C6410_RestoreState_DMACon((void *)pDMAC1Reg, g_aSleepSave_DMACon1);

  125.     // Restore VIC Registers
  126.     S3C6410_RestoreState_VIC((void *)pVIC0Reg, (void *)pVIC1Reg, g_aSleepSave_VIC);
  127.     //pVIC0Reg->VICADDRESS = 0x0;
  128.     //pVIC1Reg->VICADDRESS = 0x0;

  129.     // UART Debug Port Initialize
  130.     OEMInitDebugSerial();
  131.     OALMSG(TRUE, (L"****************************************************\r\n"));
  132.     OALMSG(TRUE, (L"[OEM] --OEMPowerOff() --- Wake up\r\n"));

  133.     // Disable Vectored Interrupt Mode on CP15
  134.     System_DisableVIC();

  135.     // Enable Branch Prediction on CP15
  136.     System_EnableBP();

  137.     // Enable IRQ Interrupt on CP15
  138.     System_EnableIRQ();

  139.     // Enable FIQ Interrupt on CP15
  140.     System_EnableFIQ();
  141.    
  142.     if (g_oalWakeSource == SYSWAKE_UNKNOWN)
  143.     {
  144.         OALMSG(TRUE, (L"[OEM:ERR] OEMPowerOff() : SYSWAKE_UNKNOWN , WAKEUP_STAT = 0x%08x", g_LastWakeupStatus));
  145.     }

  146.     // Initialize System Timer
  147.     OEMInitializeSystemTimer(RESCHED_PERIOD, OEM_COUNT_1MS, 0);

  148. #if    0    // KITL can not support Sleep
  149.     // Reinitialize KITL
  150.     if ((pArgs->flags & OAL_KITL_FLAGS_ENABLED) != 0)
  151.     {
  152.         OALKitlPowerOn();
  153.     }
  154. #endif

  155.     //--------------------------------------
  156.     // Post Processing Specific Actions for Wake Up
  157.     //--------------------------------------
  158.     BSPPowerOn();

  159.     OALMSG(TRUE, (L"[OEM] --OEMPowerOff() --- over\r\n"));
  160. }

复制代码



请大家帮忙分析一下,为什么唤醒之后会挂掉。是死在驱动里面了,还是OTG寄存器的设置导致了CPU死掉了。

谢谢
此帖出自WindowsCE论坛

最新回复

但是我的并非是XIPKERNEL  详情 回复 发表于 2009-9-2 23:19
点赞 关注
 

回复
举报

89

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
怎么没人参与讨论啊,帮忙分析一下啊
此帖出自WindowsCE论坛
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
各位兄弟姐妹,讨论一下啊
此帖出自WindowsCE论坛
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

4
 

我的OTG也有问题. 作为HOST使用时,U盘的灯亮了一下又灭了,打印消息的意思是:等待端口状态变化...
麻烦啊.
如果楼主用不着OTG驱动,就把它去掉吧,既然已经有了USB驱动,就行了,除非你要用OTG功能,OTG协议比较麻烦的,要找个spec看看,现在用的标准应该都是OTG ver1.3的
此帖出自WindowsCE论坛
 
 
 

回复

88

帖子

0

TA的资源

一粒金砂(初级)

5
 
看来搞6410的人还挺多的,以我的经验你不是死在Power Up中,而是SetPowerState中的d0,d4中的
HW_USBClocks(pContext, d*)中,具体可以查查死在HW_USBClocks函数中的哪句代码了       
此帖出自WindowsCE论坛
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

6
 
是的,没有死在PowerUp中,其他驱动都正常启动了。

按照xunjingzhpu所说,是否在唤醒之后,系统不仅调用了驱动的PowerUp,而且还调用了iocontrol,将电源设置为D0

不知理解是否正确。

我现在确实不需要otg,仅device就够用了,但是不知道怎么去掉这个
此帖出自WindowsCE论坛
 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

7
 
另外,在OEMPowerOff中,挂起之前设置了USB得相关寄存器,唤醒之后也立即设置了USB相关寄存器,这是为什么呢,

难道直接在驱动的POWERUP中设置不行吗
此帖出自WindowsCE论坛
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

8
 
uping
此帖出自WindowsCE论坛
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

9
 
你确定是代码是跑死了?
OTG的硬件没问题?
你的MINI USB口需要接GND,还要把VCC悬空才行的哦。
此帖出自WindowsCE论坛
 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

10
 
难道说是硬件死掉了,
VCC悬空的话,作为host的时候谁来给外设供电呢。

硬件死掉也很有可能,因为我在每个驱动POWERUP和POWERDOWN进入和退出都加了调试
进入和退出的调试输出都很正常,看不出来是死在哪个驱动里面了。

很郁闷
此帖出自WindowsCE论坛
 
 
 

回复

82

帖子

0

TA的资源

一粒金砂(初级)

11
 
昨天测试了一下,硬件没有死掉,而是唤醒时调用HW_USBClocks设置电源为D0状态时,复位硬件时,造成了一个死循环,调用了以下一个函数:

  1. static
  2. void
  3. SoftResetCore(
  4.     PCTRLR_PDD_CONTEXT pContext
  5.     )
  6. {
  7.     DWORD dwTemp;

  8.     WriteReg(pContext, GRSTCTL, 0x1);
  9.     do
  10.     {
  11.         dwTemp = ReadReg(pContext, GRSTCTL);
  12.     }while(!(dwTemp & (0x1<<31))); //Wait until AHB Master IDLE
  13. }
复制代码


查询GRSTCTL寄存器第31位:AHBIdle,手册上是这么说的:
AHB Master Idle
Indicates that the AHB Master State Machine is in the IDLE
condition.


此寄存器第0位:CSftRst,上面有这么一段话:
The application can write to this bit any time it wants to reset
the core. This is a self-clearing bit and the core clears this bit
after all the necessary logic is reset in the core, which may
take several clocks, depending on the current state of the core.
Once this bit is cleared software must wait at least 3 PHY
clocks before doing any access to the PHY domain. Software
must also check that bit 31 of this register is 1 (AHB Master is
IDLE) before starting any operation. Typically software reset is
used during software development and also when you
dynamically change the PHY selection bits in the USB
configuration registers listed above. When you change the
PHY, the corresponding clock for the PHY is selected and
used in the PHY domain. Once a new clock is selected, the
PHY domain has to be reset for proper operation.


是什么地方没有设置对吗??

是不是因为我在OEMPowerOff()中调用了InitializeOTGCLK();
  1. static void InitializeOTGCLK(void)
  2. {
  3.     volatile S3C6410_SYSCON_REG *pSysConReg = (S3C6410_SYSCON_REG *)OALPAtoVA(S3C6410_BASE_REG_PA_SYSCON, FALSE);
  4.     volatile OTG_PHY_REG *pOtgPhyReg = (OTG_PHY_REG *)OALPAtoVA(S3C6410_BASE_REG_PA_USBOTG_PHY, FALSE);

  5.     pSysConReg->HCLK_GATE |= (1<<20);

  6.     pSysConReg->OTHERS |= (1<<16);

  7.     pOtgPhyReg->OPHYPWR = 0x0;  // OTG block, & Analog bock in PHY2.0 power up, normal operation
  8.     pOtgPhyReg->OPHYCLK = 0x20; // Externel clock/oscillator, 48MHz reference clock for PLL
  9.     pOtgPhyReg->ORSTCON = 0x1;
  10.     OALStall_us(100);   
  11.     pOtgPhyReg->ORSTCON = 0x0;
  12.     OALStall_us(100);   

  13.     pSysConReg->HCLK_GATE &= ~(1<<20);

  14. }
复制代码

此帖出自WindowsCE论坛
 
 
 

回复

86

帖子

0

TA的资源

一粒金砂(初级)

12
 
关注
此帖出自WindowsCE论坛
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

13
 
问三星代理要最新的bsp,ms老的bsp有这个问题
此帖出自WindowsCE论坛
 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

14
 
我没买他的开发板,会给我最新的BSP吗???
此帖出自WindowsCE论坛
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

15
 
我的bsp包改成xip后遇到同样问题!
此帖出自WindowsCE论坛
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

16
 
不过我发现是某些模块没加入XIPKERNEL.bin所致,而不是楼主所说的SoftResetCore函数引起的
此帖出自WindowsCE论坛
 
 
 

回复

84

帖子

0

TA的资源

一粒金砂(初级)

17
 
但是我的并非是XIPKERNEL
此帖出自WindowsCE论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表