6392|16

65

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

高手进,休眠唤醒后死机 [复制链接]

参考各路大侠的帖子试验休眠唤醒的实现
http://topic.eeworld.net/u/20090330/13/34EC9ED9-660A-412E-932B-ABF789E9A26B.html
http://so.eeworld.net/bbsSearchResult.aspx?q=wince+%e4%bc%91%e7%9c%a0&p=0
http://so.eeworld.net/bbsSearchResult.aspx?q=wince+%e5%94%a4%e9%86%92&p=0

平台:s3c2440a + wince5.0
问题想象:
能进入休眠,按下唤醒中断EXTINT0后,唤醒,LCD点亮,进入Wince桌面,串口有输出,这个时候点击触摸屏,桌面有图标获取到了焦点,可接着就没了反应,好像死机一样,不知道是反映非常非常慢还是死机了。

参考了帖子,是nand falsh(型号:K9F1G08U0B)没初始化正确吗?只初始化以下寄存器就可以了吗???
在函数OEMPowerOff()中,我做了如下初始化:

  1. NANDInit();
  2. {
  3.     #define TACLS                1
  4.     #define TWRPH0                4
  5.     #define TWRPH1                1

  6.     S3C2440A_CLKPWR_REG *pClkPwr = (S3C2440A_CLKPWR_REG*)OALPAtoVA(S3C2440A_BASE_REG_PA_CLOCK_POWER, FALSE);
  7.     S3C2440A_NAND_REG *pNand     = (S3C2440A_NAND_REG*)OALPAtoVA(S3C2440A_BASE_REG_PA_NAND, FALSE);

  8.     //  Enable the clock to NAND controller
  9.     pClkPwr->CLKCON |= (1<<4);

  10.     //  Now we need enable the NAND Flash controller
  11.     pNand->NFCONF = (TACLS<<12)|(TWRPH0<<8)|(TWRPH1<<4)|(0<<0);
  12.     pNand->NFCONT = (0<<13)|(0<<12)|(0<<10)|(0<<9)|(0<<8)|(1<<6)|(1<<5)|(1<<4)|(1<<1)|(1<<0);
  13.     pNand->NFSTAT = 0;
  14. }
复制代码


现在不知道是卡在驱动上,时钟配置上,还是flash没初始化正确。

请各路大侠们指点指点

最新回复

请问一下...您用的NAND晶片跟我的板子一样,您有改哪些程式码嘛?拜託告訴我,謝謝>.  详情 回复 发表于 2010-3-12 14:01
点赞 关注

回复
举报

77

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
休眠的时候有没有对外部设置断电,如果有唤醒后要重新初始化
 
 

回复

94

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
现在不知道是卡在驱动上,时钟配置上,还是flash没初始化正确。

分别加打印信息既知
 
 
 

回复

84

帖子

0

TA的资源

一粒金砂(初级)

4
 
你进入休眠状态之前做了保存了些什么?恢复的时候又做了些什么?
顺便问说一句,你可以在eboot里写测试程序,既从Eboot里休眠再唤醒,同时分别在eboot里加入nand或者其他你关心部分的测试程序,问题就容易找到了;毕竟有了os情况会复杂很多。
 
 
 

回复

64

帖子

0

TA的资源

一粒金砂(初级)

5
 
是不是卡在哪个driver的power on上面??
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

6
 
多谢各位指点!
我的启动方式是用ADS的bootloader,没使用到eboot
我把相关代码贴出来,如果以后有人遇到这个问题也好互相借鉴

  1. void OEMPowerOff()
  2. {
  3.     static UINT32 saveArea[51];
  4.     S3C2440A_INTR_REG *pIntr = (S3C2440A_INTR_REG*)OALPAtoVA (S3C2440A_BASE_REG_PA_INTR, FALSE);
  5.     S3C2440A_IOPORT_REG *pIOPort = (S3C2440A_IOPORT_REG*)OALPAtoVA(S3C2440A_BASE_REG_PA_IOPORT, FALSE);
  6.     S3C2440A_LCD_REG *pLCD = (S3C2440A_LCD_REG*)OALPAtoVA(S3C2440A_BASE_REG_PA_LCD, FALSE);

  7.     RETAILMSG(1, (TEXT("+OEMPowerOff Called \r\n")));
  8.     RETAILMSG(1, (TEXT("pIntr->INTMOD = 0x%x \r\n"), pIntr->INTMOD));
  9.     RETAILMSG(1, (TEXT("pIntr->INTMSK = 0x%x \r\n"), pIntr->INTMSK));
  10.     RETAILMSG(1, (TEXT("pIntr->INTSUBMSK = 0x%x \r\n"), pIntr->INTSUBMSK));

  11.     // Then save system registers
  12.     saveArea[0]  = INPORT32(&pIOPort->GPACON);
  13.     saveArea[1]  = INPORT32(&pIOPort->GPADAT);
  14.     saveArea[2]  = INPORT32(&pIOPort->GPBCON);
  15.     saveArea[3]  = INPORT32(&pIOPort->GPBDAT);
  16.     saveArea[4]  = INPORT32(&pIOPort->GPBUP);
  17.     saveArea[5]  = INPORT32(&pIOPort->GPCCON);
  18.     saveArea[6]  = INPORT32(&pIOPort->GPCDAT);
  19.     saveArea[7]  = INPORT32(&pIOPort->GPCUP);
  20.     saveArea[8]  = INPORT32(&pIOPort->GPDCON);
  21.     saveArea[9]  = INPORT32(&pIOPort->GPDDAT);
  22.     saveArea[10] = INPORT32(&pIOPort->GPDUP);
  23.     saveArea[11] = INPORT32(&pIOPort->GPECON);
  24.     saveArea[12] = INPORT32(&pIOPort->GPEDAT);
  25.     saveArea[13] = INPORT32(&pIOPort->GPEUP);
  26.     saveArea[14] = INPORT32(&pIOPort->GPFCON);
  27.     saveArea[15] = INPORT32(&pIOPort->GPFDAT);
  28.     saveArea[16] = INPORT32(&pIOPort->GPFUP);
  29.     saveArea[17] = INPORT32(&pIOPort->GPGCON);
  30.     saveArea[18] = INPORT32(&pIOPort->GPGDAT);
  31.     saveArea[19] = INPORT32(&pIOPort->GPGUP);
  32.     saveArea[20] = INPORT32(&pIOPort->GPHCON);
  33.     saveArea[21] = INPORT32(&pIOPort->GPHDAT);
  34.     saveArea[22] = INPORT32(&pIOPort->GPHUP);

  35.     saveArea[23] = INPORT32(&pIOPort->MISCCR);
  36.     saveArea[24] = INPORT32(&pIOPort->DCLKCON);
  37.     saveArea[25] = INPORT32(&pIOPort->EXTINT0);
  38.     saveArea[26] = INPORT32(&pIOPort->EXTINT1);
  39.     saveArea[27] = INPORT32(&pIOPort->EXTINT2);
  40.     saveArea[28] = INPORT32(&pIOPort->EINTFLT0);
  41.     saveArea[29] = INPORT32(&pIOPort->EINTFLT1);
  42.     saveArea[30] = INPORT32(&pIOPort->EINTFLT2);
  43.     saveArea[31] = INPORT32(&pIOPort->EINTFLT3);
  44.     saveArea[32] = INPORT32(&pIOPort->EINTMASK);

  45.     saveArea[33] = INPORT32(&pIntr->INTMOD);
  46.     saveArea[34] = INPORT32(&pIntr->INTMSK);
  47.     saveArea[35] = INPORT32(&pIntr->INTSUBMSK);

  48.     saveArea[36] = INPORT32(&pLCD->TCONSEL);
  49.     saveArea[37] = INPORT32(&pLCD->LCDINTMSK);
  50.     saveArea[38] = INPORT32(&pLCD->TPAL);
  51.     saveArea[39] = INPORT32(&pLCD->DITHMODE);
  52.     saveArea[40] = INPORT32(&pLCD->BLUELUT);
  53.     saveArea[41] = INPORT32(&pLCD->GREENLUT);
  54.     saveArea[42] = INPORT32(&pLCD->REDLUT);
  55.     saveArea[43] = INPORT32(&pLCD->LCDSADDR3);
  56.     saveArea[44] = INPORT32(&pLCD->LCDSADDR2);
  57.     saveArea[45] = INPORT32(&pLCD->LCDSADDR1);
  58.     saveArea[46] = INPORT32(&pLCD->LCDCON5);
  59.     saveArea[47] = INPORT32(&pLCD->LCDCON4);
  60.     saveArea[48] = INPORT32(&pLCD->LCDCON3);
  61.     saveArea[49] = INPORT32(&pLCD->LCDCON2);
  62.     saveArea[50] = INPORT32(&pLCD->LCDCON1);

  63.     /* LCD Controller Disable               */
  64.     CPULCDOff();

  65.     // Switch off power for KITL device
  66.     OALKitlPowerOff();

  67.     /* Stop all GPIO */
  68.     ConfigStopGPIO();

  69.     /* Set misc register for power off */
  70.     ConfigMiscReg();

  71.     // Go to power off mode
  72.     OALCPUPowerOff();

  73.     // Switch on power for KITL device
  74.     OALKitlPowerOn();
  75.    
  76.     /* Recover Process, Load CPU Regs       */
  77.     OUTPORT32(&pIOPort->GPACON,   saveArea[0]);
  78.     OUTPORT32(&pIOPort->GPADAT,   saveArea[1]);
  79.     OUTPORT32(&pIOPort->GPBCON,   saveArea[2]);
  80.     OUTPORT32(&pIOPort->GPBDAT,   saveArea[3]);
  81.     OUTPORT32(&pIOPort->GPBUP,    saveArea[4]);
  82.     OUTPORT32(&pIOPort->GPCCON,   saveArea[5]);
  83.     OUTPORT32(&pIOPort->GPCDAT,   saveArea[6]);
  84.     OUTPORT32(&pIOPort->GPCUP,    saveArea[7]);
  85.     OUTPORT32(&pIOPort->GPDCON,   saveArea[8]);
  86.     OUTPORT32(&pIOPort->GPDDAT,   saveArea[9]);
  87.     OUTPORT32(&pIOPort->GPDUP,    saveArea[10]);
  88.     OUTPORT32(&pIOPort->GPECON,   saveArea[11]);
  89.     OUTPORT32(&pIOPort->GPEDAT,   saveArea[12]);
  90.     OUTPORT32(&pIOPort->GPEUP,    saveArea[13]);
  91.     OUTPORT32(&pIOPort->GPFCON,   saveArea[14]);
  92.     OUTPORT32(&pIOPort->GPFDAT,   saveArea[15]);
  93.     OUTPORT32(&pIOPort->GPFUP,    saveArea[16]);
  94.     OUTPORT32(&pIOPort->GPGCON,   saveArea[17]);
  95.     OUTPORT32(&pIOPort->GPGDAT,   saveArea[18]);
  96.     OUTPORT32(&pIOPort->GPGUP,    saveArea[19]);
  97.     OUTPORT32(&pIOPort->GPHCON,   saveArea[20]);
  98.     OUTPORT32(&pIOPort->GPHDAT,   saveArea[21]);
  99.     OUTPORT32(&pIOPort->GPHUP,    saveArea[22]);
  100.                                 
  101.     OUTPORT32(&pIOPort->MISCCR,   saveArea[23]);
  102.     OUTPORT32(&pIOPort->DCLKCON,   saveArea[24]);
  103.     OUTPORT32(&pIOPort->EXTINT0,  saveArea[25]);
  104.     OUTPORT32(&pIOPort->EXTINT1,  saveArea[26]);
  105.     OUTPORT32(&pIOPort->EXTINT2,  saveArea[27]);
  106.     OUTPORT32(&pIOPort->EINTFLT0, saveArea[28]);
  107.     OUTPORT32(&pIOPort->EINTFLT1, saveArea[29]);
  108.     OUTPORT32(&pIOPort->EINTFLT2, saveArea[30]);
  109.     OUTPORT32(&pIOPort->EINTFLT3, saveArea[31]);
  110.     OUTPORT32(&pIOPort->EINTMASK, saveArea[32]);

  111.     OUTPORT32(&pIntr->INTMOD,     saveArea[33]);
  112.     OUTPORT32(&pIntr->INTMSK,     saveArea[34]);
  113.     OUTPORT32(&pIntr->INTSUBMSK,  saveArea[35]);
  114.                                    
  115.     pLCD->TCONSEL    =  saveArea[36];
  116.     pLCD->LCDINTMSK =  saveArea[37];
  117.     pLCD->TPAL      =  saveArea[38];
  118.     pLCD->DITHMODE  =  saveArea[39];
  119.     pLCD->BLUELUT   =  saveArea[40];
  120.     pLCD->GREENLUT  =  saveArea[41];
  121.     pLCD->REDLUT    =  saveArea[42];
  122.     pLCD->LCDSADDR3 =  saveArea[43];
  123.     pLCD->LCDSADDR2 =  saveArea[44];
  124.     pLCD->LCDSADDR1 =  saveArea[45];
  125.     pLCD->LCDCON5   =  saveArea[46];
  126.     pLCD->LCDCON4   =  saveArea[47];
  127.     pLCD->LCDCON3   =  saveArea[48];
  128.     pLCD->LCDCON2   =  saveArea[49];
  129.     pLCD->LCDCON1   =  saveArea[50];
  130.        
  131.     /* Interrupt Clear                      */
  132.     OUTPORT32(&pIOPort->EINTPEND, INPORT32(&pIOPort->EINTPEND));
  133.     OUTPORT32(&pIntr->SUBSRCPND, INPORT32(&pIntr->SUBSRCPND));
  134.     OUTPORT32(&pIntr->SRCPND, INPORT32(&pIntr->SRCPND));
  135.     OUTPORT32(&pIntr->INTPND, INPORT32(&pIntr->INTPND));

  136.     pLCD->LCDSRCPND = pLCD->LCDSRCPND;
  137.     pLCD->LCDINTPND = pLCD->LCDINTPND;

  138.     NANDInit();

  139.     OEMInitDebugSerial();

  140.     RETAILMSG(1, (TEXT("\r\n\r\n")));
  141.     RETAILMSG(1, (TEXT("pIntr->INTMOD = 0x%x \r\n"), pIntr->INTMOD));
  142.     RETAILMSG(1, (TEXT("pIntr->INTMSK = 0x%x \r\n"), pIntr->INTMSK));
  143.     RETAILMSG(1, (TEXT("pIntr->INTSUBMSK = 0x%x \r\n"), pIntr->INTSUBMSK));

  144.     // Do platform dependent power on actions
  145.     BSPPowerOn();

  146.     RETAILMSG(1, (TEXT("-OEMPowerOff Called \r\n")));
  147. }
复制代码
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

7
 
其中

  1. CPULCDOff();
  2. {//函数实现
  3.      /* LCD Controller Disable               */
  4.     CLRPORT32(&pIOPort->GPGDAT, 1 << 4);
  5.         
  6.     pLCD->LCDCON1   = 0;
  7.     pLCD->LCDCON2   = 0;
  8.     pLCD->LCDCON3   = 0;
  9.     pLCD->LCDCON4   = 0;
  10.     pLCD->LCDCON5   = 0;
  11.     pLCD->LCDSADDR1 = 0;
  12.     pLCD->LCDSADDR2 = 0;
  13.     pLCD->LCDSADDR3 = 0;
  14.     pLCD->TCONSEL    = 0;
  15.     pLCD->TPAL      = 0;
  16. }
复制代码

  1.     ConfigMiscReg();
  2.     {//函数实现
  3.         volatile S3C2440A_IOPORT_REG *pIOPort = (S3C2440A_IOPORT_REG*)OALPAtoVA(S3C2440A_BASE_REG_PA_IOPORT, FALSE);
  4.         volatile S3C2440A_ADC_REG *pADC = (S3C2440A_ADC_REG*)OALPAtoVA(S3C2440A_BASE_REG_PA_ADC, FALSE);
  5.         volatile S3C2440A_RTC_REG *pRTC = (S3C2440A_RTC_REG*)OALPAtoVA(S3C2440A_BASE_REG_PA_RTC, FALSE);

  6.         pRTC->RTCCON=0x0;   // R/W disable, 1/32768, Normal(merge), No reset
  7.         pADC->ADCCON|=(1<<2);                // ADC StanbyMode

  8.         pIOPort->MISCCR|=(1<<12); //USB port0 = suspend
  9.         pIOPort->MISCCR|=(1<<13); //USB port1 = suspend

  10.         pIOPort->MISCCR|=(1<<2); //Previous state at STOP(?) mode (???)

  11.         //D[31:0] pull-up off. The data bus will not be float by the external bus holder.
  12.         //If the pull-up resitsers are turned on,
  13.         //there will be the leakage current through the pull-up resister
  14.         pIOPort->MISCCR=pIOPort->MISCCR|(3<<0);

  15.             // In the evaluation board, Even though in sleep mode, the devices are all supplied the power.
  16.             pIOPort->MSLCON = (0<<11)|(0<<10)|(0<<9)|(0<<8)|(0<<7)|(0<<6)|(0<<5)|(0<<4)|(0<<3)|(0<<2)|(0<<1)|(0<<0);
  17.             pIOPort->DSC0 = (1<<31)|(3<<8)|(3<<0);
  18.             pIOPort->DSC1 = (3<<28)|(3<<26)|(3<24)|(3<<22)|(3<<20)|(3<<18);
  19.     }
复制代码

  1.     NANDInit();
  2.     {//函数实现
  3.             #define TACLS                1
  4.             #define TWRPH0                4
  5.             #define TWRPH1                1

  6.         S3C2440A_CLKPWR_REG *pClkPwr = (S3C2440A_CLKPWR_REG*)OALPAtoVA(S3C2440A_BASE_REG_PA_CLOCK_POWER, FALSE);
  7.         S3C2440A_NAND_REG *pNand = (S3C2440A_NAND_REG*)OALPAtoVA(S3C2440A_BASE_REG_PA_NAND, FALSE);

  8.             //  Enable the clock to NAND controller
  9.             pClkPwr->CLKCON |= (1<<4);

  10.             //  Now we need enable the NAND Flash controller
  11.     //        pNand->NFCONF = NFCONF_INIT;
  12.             pNand->NFCONF = (TACLS<<12)|(TWRPH0<<8)|(TWRPH1<<4)|(0<<0);
  13.             pNand->NFCONT = (0<<13)|(0<<12)|(0<<10)|(0<<9)|(0<<8)|(1<<6)|(1<<5)|(1<<4)|(1<<1)|(1<<0);
  14.             pNand->NFSTAT = 0;
  15.     }
复制代码
 
 
 

回复

82

帖子

0

TA的资源

一粒金砂(初级)

8
 

  1.         InitTimer();
  2.         {//函数实现
  3.             volatile S3C2440A_PWM_REG *g_pPWMRegs = (S3C2440A_PWM_REG*)OALPAtoUA(S3C2440A_BASE_REG_PA_PWM);
  4.             UINT32 tcon;

  5.             RETAILMSG(1, (TEXT("InitTimer\r\n")));

  6.             // Hardware Setup
  7.             g_pPWMRegs = (S3C2440A_PWM_REG*)OALPAtoUA(S3C2440A_BASE_REG_PA_PWM);

  8.             // Set prescaler 1 to 1
  9.             OUTREG32(&g_pPWMRegs->TCFG0, INREG32(&g_pPWMRegs->TCFG0) & ~0x0000FF00);
  10.             OUTREG32(&g_pPWMRegs->TCFG0, INREG32(&g_pPWMRegs->TCFG0) | PRESCALER <<8);
  11.             // Select MUX input 1/2
  12.             OUTREG32(&g_pPWMRegs->TCFG1, INREG32(&g_pPWMRegs->TCFG1) & ~(0xF << 16));
  13.             #if( SYS_TIMER_DIVIDER == D2 )
  14.                 OUTREG32(&g_pPWMRegs->TCFG1, INREG32(&g_pPWMRegs->TCFG1) | (D1_2 << 16));
  15.             #elif ( SYS_TIMER_DIVIDER == D4 )
  16.                 OUTREG32(&g_pPWMRegs->TCFG1, INREG32(&g_pPWMRegs->TCFG1) | (D1_4 << 16));
  17.             #elif ( SYS_TIMER_DIVIDER == D8 )
  18.                 OUTREG32(&g_pPWMRegs->TCFG1, INREG32(&g_pPWMRegs->TCFG1) | (D1_8 << 16));
  19.             #elif ( SYS_TIMER_DIVIDER == D16 )
  20.                 OUTREG32(&g_pPWMRegs->TCFG1, INREG32(&g_pPWMRegs->TCFG1) | (D1_16 << 16));
  21.             #endif
  22.             // Set timer register
  23.             OUTREG32(&g_pPWMRegs->TCNTB4, g_oalTimer.countsPerSysTick);

  24.             // Start timer in one shot mode
  25.             tcon = INREG32(&g_pPWMRegs->TCON) & ~(0x0F << 20);
  26.             OUTREG32(&g_pPWMRegs->TCON, tcon | (0x2 << 20) );
  27.             OUTREG32(&g_pPWMRegs->TCON, tcon | (0x1 << 20) );
  28.         }
复制代码


  1.     BSPPowerOn();
  2.     {//函数实现
  3.             // Initialize system clock
  4.             InitTimer();

  5.         //pIOPort->EXTINT0 = 0x22222222;    // EINT[7:0]
  6.         //pIOPort->EXTINT1 = 0x22222222;    // EINT[15:8]
  7.         //pIOPort->EXTINT2 = 0x22222222;    // EINT[23:16]

  8.             pIOPort->GSTATUS2 = pIOPort->GSTATUS2;

  9.         pIOPort->MISCCR &= ~(1<<12); //USB port0 = normal mode
  10.         pIOPort->MISCCR &= ~(1<<13); //USB port1 = normal mode

  11.         /* LCD Controller Enable               */
  12.         SETPORT32(&pIOPort->GPGDAT, 1 << 4);
  13.     }
复制代码

 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

9
 
我唤醒后能正常。也是用ADS的bootloader,只是唤醒后USB口就没供电(通过2046和2071控制的),串口跟PC通信出现乱码。。。弄了半天也不知到怎么解决。。。
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

10
 
CE开源啦,,呵
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

11
 
re-init UART.
引用 8 楼 wen_hua 的回复:
我唤醒后能正常。也是用ADS的bootloader,只是唤醒后USB口就没供电(通过2046和2071控制的),串口跟PC通信出现乱码。。。弄了半天也不知到怎么解决。。。
 
 
 

回复

60

帖子

0

TA的资源

一粒金砂(初级)

12
 
some comments:
1. make sure Interrupt Unit registers save/restore.
2. list all the drivers that implements a power-on function.
3. try to test suspend/resume in bootloader first.[highly recommended!!]
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

13
 
我顶; 学习下。
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

14
 
顶起
打印信息后,比较休眠前和唤醒后:CLKCON  CLKDIVN  CLKSLOW  LOCKTIME  MPLLCON  UPLLCON 寄存器值都是一致的。
在NANDInit()中增加了NANDReset部分,效果还是一样的。

怀疑是唤醒后SDRAM配置不正确。

哪位大侠指点指点,休眠和唤醒时对SDRAM的配置要注意什么

startup.s文件

  1. LEAF_ENTRY OALCPUPowerOff

  2. ;       1. Push SVC state onto our stack
  3.         stmdb   sp!, {r4-r12}                  
  4.         stmdb   sp!, {lr}

  5. ;       2. Save MMU & CPU Register to RAM
  6.     ldr     r3, =SLEEPDATA_BASE_VIRTUAL     ; base of Sleep mode storage

  7.         ldr     r2, =Awake_address              ; store Virtual return address
  8.         str     r2, [r3], #4

  9.         mrc     p15, 0, r2, c1, c0, 0           ; load r2 with MMU Control
  10.         ldr     r0, =MMU_CTL_MASK               ; mask off the undefined bits
  11.         bic     r2, r2, r0
  12.         str     r2, [r3], #4                    ; store MMU Control data

  13.         mrc     p15, 0, r2, c2, c0, 0           ; load r2 with TTB address.
  14.         ldr     r0, =MMU_TTB_MASK               ; mask off the undefined bits
  15.         bic     r2, r2, r0
  16.         str     r2, [r3], #4                    ; store TTB address

  17.         mrc     p15, 0, r2, c3, c0, 0           ; load r2 with domain access control.
  18.         str     r2, [r3], #4                    ; store domain access control

  19.         str     sp, [r3], #4                    ; store SVC stack pointer

  20.         mrs     r2, spsr
  21.         str     r2, [r3], #4                    ; store SVC status register

  22.         mov     r1, #Mode_FIQ:OR:I_Bit:OR:F_Bit ; Enter FIQ mode, no interrupts
  23.         msr     cpsr, r1
  24.         mrs     r2, spsr
  25.         stmia   r3!, {r2, r8-r12, sp, lr}       ; store the FIQ mode registers

  26.         mov     r1, #Mode_ABT:OR:I_Bit:OR:F_Bit ; Enter ABT mode, no interrupts
  27.         msr     cpsr, r1
  28.         mrs                r0, spsr
  29.         stmia   r3!, {r0, sp, lr}               ; store the ABT mode Registers

  30.         mov     r1, #Mode_IRQ:OR:I_Bit:OR:F_Bit ; Enter IRQ mode, no interrupts
  31.         msr     cpsr, r1
  32.         mrs     r0, spsr
  33.         stmia   r3!, {r0, sp, lr}               ; store the IRQ Mode Registers

  34.         mov     r1, #Mode_UND:OR:I_Bit:OR:F_Bit ; Enter UND mode, no interrupts
  35.         msr     cpsr, r1
  36.         mrs     r0, spsr
  37.         stmia   r3!, {r0, sp, lr}               ; store the UND mode Registers

  38.         mov     r1, #Mode_SYS:OR:I_Bit:OR:F_Bit ; Enter SYS mode, no interrupts
  39.         msr     cpsr, r1
  40.         stmia   r3!, {sp, lr}                   ; store the SYS mode Registers

  41.         mov     r1, #Mode_SVC:OR:I_Bit:OR:F_Bit ; Back to SVC mode, no interrupts
  42.         msr     cpsr, r1

  43. ;       3. do Checksum on the Sleepdata
  44.         ldr     r3, =SLEEPDATA_BASE_VIRTUAL        ; get pointer to SLEEPDATA
  45.         ldr     r2, =0x0
  46.         ldr     r0, =(SLEEPDATA_SIZE-1)                ; get size of data structure (in words)
  47. 30
  48.         ldr     r1, [r3], #4
  49.         and     r1, r1, #0x1
  50.         mov     r1, r1, ROR #31
  51.         add     r2, r2, r1
  52.         subs    r0, r0, #1
  53.         bne     %b30

  54.         ldr     r0, =vGPIOBASE
  55.         ;;;add                r2, r2, #1                                ; test checksum of the Sleep data error
  56.         str     r2, [r0, #oGSTATUS3]                ; Store in Power Manager Scratch pad register

  57.         ldr     r0, =vGPIOBASE
  58.         ldr     r1, =0x550a
  59.         str     r1, [r0, #oGPFCON]
  60.        
  61.         ldr                r1, =0x30
  62.         str                r1, [r0, #oGPFDAT]       

  63. ;       4. Interrupt Disable
  64.     ldr     r0, =vINTBASE
  65.     mvn     r2, #0
  66.         str     r2, [r0, #oINTMSK]
  67.         str     r2, [r0, #oSRCPND]
  68.         str     r2, [r0, #oINTPND]

  69. ;;       5. Cache Flush
  70.         bl                OALClearUTLB
  71.         bl                OALFlushICache
  72.         ldr     r0, = (DCACHE_LINES_PER_SET - 1)   
  73.         ldr     r1, = (DCACHE_NUM_SETS - 1)   
  74.         ldr     r2, = DCACHE_SET_INDEX_BIT   
  75.         ldr     r3, = DCACHE_LINE_SIZE     
  76.         bl                OALFlushDCache

  77. ;       6. Setting Wakeup External Interrupt(EINT0,1,2) Mode
  78.         ldr     r0, =vGPIOBASE

  79.         ldr     r1, =0x550a
  80.         str     r1, [r0, #oGPFCON]

  81.         ;ldr     r1, =0x0180FCBA
  82.         ;str     r1, [r0, #oGPGCON]

  83. ;       7. Go to Power-Off Mode
  84.         ldr         r0, =vMISCCR                        ; hit the TLB
  85.         ldr                r0, [r0]
  86.         ldr         r0, =vCLKCON
  87.         ldr                r0, [r0]

  88.         ldr     r0, =vREFRESH               
  89.         ldr     r1, [r0]                ; r1=rREFRESH       
  90.         orr     r1, r1, #(1 << 22)

  91.         ldr         r2, =vMISCCR
  92.         ldr                r3, [r2]
  93.         orr                r3, r3, #(3<<17)        ; Make sure that SCLK0:SCLK->0, SCLK1:SCLK->0, SCKE=L during boot-up
  94.         bic                r3, r3, #(7<<20)
  95.         orr                r3, r3, #(6<<20)

  96.         ldr     r4, =vCLKCON
  97.         ldr     r5, =0x1ffff8            ; Power Off Mode

  98. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  99. ; Sometimes it is not working in cache mode. So I modify to jump to ROM area.
  100. ;
  101. ;;;        ldr                r6, =0x92000000                ; make address to 0x9200 0020
  102. ;;;        add                r6, r6, #0x20                ;
  103. ;;;        mov     pc, r6                                ; jump to Power off code in ROM
  104. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

  105.         b       SelfRefreshAndPowerOff

  106.         ALIGN   32                      ; for I-Cache Line(32Byte, 8 Word)

  107. SelfRefreshAndPowerOff                ; run with Instruction Cache's code
  108.         str     r1, [r0]                ; Enable SDRAM self-refresh
  109.         str                r3, [r2]                ; MISCCR Setting
  110.         str     r5, [r4]                ; Power Off !!
  111.         b       .
复制代码

 
 
 

回复

56

帖子

0

TA的资源

一粒金砂(初级)

15
 
bootloader中的唤醒部分

  1. WAKEUP_SLEEP
  2.         ;Release SCLKn after wake-up from the SLEEP mode.
  3.         ldr        r1,=MISCCR
  4.         ldr        r0,[r1]
  5.         bic        r0,r0,#(7<<17)  ;SCLK0:0->SCLK, SCLK1:0->SCLK, SCKE:0->=SCKE.
  6.         str        r0,[r1]

  7.         ;Set memory control registers       
  8.         add     r0, pc, #SMRDATA - (. + 8)
  9.         ldr        r1,=BWSCON        ;BWSCON Address
  10.         add        r2, r0, #52        ;End address of SMRDATA
  11. 0
  12.         ldr        r3, [r0], #4
  13.         str        r3, [r1], #4
  14.         cmp        r2, r0
  15.         bne        %B0

  16.         mov     r0, #0x2000  
  17. ;0        subs r1,r1,#1        ;1) wait until the SelfRefresh is released.
  18. 0   subs    r0, r0, #1  
  19.         bne %B0

  20.         ;ldr r1,=GSTATUS3         ;GSTATUS3 has the start address just after SLEEP wake-up
  21.         ;ldr r0,[r1]

  22.         ;mov pc,r0
  23. ;------------------------------------------------------------------------------
  24. ;   Recover Process : Starting Point
  25. ;
  26. ;   1. Checksum Calculation saved Data
  27.         ldr     r5, =SLEEPDATA_BASE_PHYSICAL    ; pointer to physical address of reserved Sleep mode info data structure
  28.         mov     r3, r5                          ; pointer for checksum calculation
  29.         ldr     r2, =0x0
  30.         ldr     r0, =(SLEEPDATA_SIZE-1)             ; get size of data structure to do checksum on
  31. 50       
  32.         ldr     r1, [r3], #4                    ; pointer to SLEEPDATA
  33.         and     r1, r1, #0x1
  34.         mov     r1, r1, ROR #31
  35.         add     r2, r2, r1
  36.         subs    r0, r0, #1                      ; dec the count
  37.         bne     %b50                            ; loop till done   

  38.         ldr     r0,=GSTATUS3
  39.         ldr     r3, [r0]                        ; get the Sleep data checksum from the Power Manager Scratch pad register
  40.         cmp     r2, r3                          ; compare to what we saved before going to sleep
  41.         bne     BringUpWinCE                    ; bad news - do a cold boot
  42.    
  43. ;   2. MMU Enable
  44.         ldr     r10, [r5, #SleepState_MMUDOMAIN] ; load the MMU domain access info
  45.         ldr     r9,  [r5, #SleepState_MMUTTB]    ; load the MMU TTB info
  46.         ldr     r8,  [r5, #SleepState_MMUCTL]    ; load the MMU control info
  47.         ldr     r7,  [r5, #SleepState_WakeAddr ] ; load the LR address
  48.         nop         
  49.         nop
  50.         nop
  51.         nop
  52.         nop

  53. ; if software reset
  54.         mov     r1, #0
  55.         teq     r1, r7
  56.         bne     %f60
  57.         b              BringUpWinCE

  58. ; wakeup routine
  59. 60        mcr     p15, 0, r10, c3, c0, 0          ; setup access to domain 0
  60.         mcr     p15, 0, r9,  c2, c0, 0          ; PT address
  61.         mcr     p15, 0, r0,  c8, c7, 0          ; flush I+D TLBs
  62.         mcr     p15, 0, r8,  c1, c0, 0          ; restore MMU control

  63. ;   3. Jump to Kernel Image's fw.s (Awake_address)
  64.         mov     pc, r7                          ;  jump to new VA (back up Power management stack)
  65.         nop

  66. BringUpWinCE
  67.         ; bad news, data lose, bring up wince again
  68.         mov         r0, #2
  69.         ldr                r1, =GSTATUS2
  70.         str                r0, [r1]
复制代码


休眠唤醒代码都是参考网上帖子修改的,自己没完全消化,看来还得一步步看看代码哪出问题。 买的开发板没引出PWR_EN管脚是个问题。
 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

16
 
问题自己解决了!
结贴
 
 
 

回复

56

帖子

0

TA的资源

一粒金砂(初级)

17
 
请问一下...您用的NAND晶片跟我的板子一样,您有改哪些程式码嘛?拜託告訴我,謝謝>.<
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

 
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
快速回复 返回顶部 返回列表