Chinaunix首页 | 论坛 | 博客
  • 博客访问: 512483
  • 博文数量: 92
  • 博客积分: 3146
  • 博客等级: 中校
  • 技术积分: 2314
  • 用 户 组: 普通用户
  • 注册时间: 2010-09-27 10:20
文章分类

全部博文(92)

文章存档

2014年(3)

2013年(17)

2012年(16)

2011年(22)

2010年(34)

分类: 嵌入式

2012-09-28 14:32:03

     在s5pc110平台发现一个现象,睡眠的时候过了一段时间系统自动唤醒了,然后马上就又睡眠下去,期间LCD,backligh都没有亮。当初以为是哪个中断触发了系统唤醒,可细想想不对啊,如果按键中断唤醒话怎么马上就睡下去了呢!带着这个问题大致看了下代码,原来是RTC造成的!这bug不过现在还不知道要不要改!!^_^
     首先得清楚平台下支持哪些模式
 
了解在睡眠的模式的时候支持哪些wake-up的mode
 
 

点击(此处)折叠或打开

  1. static void s5pv210_pm_prepare(void)
  2. {
  3.     unsigned int tmp;

  4.     /* ensure at least INFORM0 has the resume address */
  5.     __raw_writel(virt_to_phys(s3c_cpu_resume), S5P_INFORM0);

  6.     /* WFI for SLEEP mode configuration by SYSCON */
  7.     tmp = __raw_readl(S5P_PWR_CFG);
  8.     tmp &= S5P_CFG_WFI_CLEAN;
  9.     tmp |= S5P_CFG_WFI_SLEEP;
  10.     __raw_writel(tmp, S5P_PWR_CFG);

  11.     printk("hbb test %s read S5P_PWR_CFG = %0x\n",__func__,tmp);

  12.     /* SYSCON interrupt handling disable */
  13.     tmp = __raw_readl(S5P_OTHERS);
  14.     tmp |= S5P_OTHER_SYSC_INTOFF;
  15.     __raw_writel(tmp, S5P_OTHERS);

  16.     __raw_writel(0xffffffff, (VA_VIC0 + VIC_INT_ENABLE_CLEAR));
  17.     __raw_writel(0xffffffff, (VA_VIC1 + VIC_INT_ENABLE_CLEAR));
  18.     __raw_writel(0xffffffff, (VA_VIC2 + VIC_INT_ENABLE_CLEAR));
  19.     __raw_writel(0xffffffff, (VA_VIC3 + VIC_INT_ENABLE_CLEAR));

  20.     tmp = __raw_readl(S5P_WAKEUP_MASK);
  21.     tmp &= ~(1 << 1 | 1 << 5);
  22.     __raw_writel(tmp, S5P_WAKEUP_MASK);

  23.     printk("hbb test %s read S5P_WAKEUP_MASK = %0x\n",__func__,tmp);
  24.     
  25.     s3c_pm_do_save(sromc_save, ARRAY_SIZE(sromc_save));
  26.     s3c_pm_do_save(core_save, ARRAY_SIZE(core_save));
  27. }
上面那段代码很好解释在sleep的模式的仅支持EINT 和RTC wake-up了!
现在再看看唤醒的时候

点击(此处)折叠或打开

  1. static inline void s3c_pm_arch_show_resume_irqs(void)
  2. {
  3.     printk( "S5P_WAKEUP_STAT 0x%X\n", __raw_readl(S5P_WAKEUP_STAT));
  4.     printk("%s: s3c_irqwake_eintmask = 0x%x \n",__func__,__raw_readl(S5P_EINT_WAKEUP_MASK));
  5.     printk( "EINT_PEND 0x%X, 0x%X, 0x%X, 0x%X\n",
  6.         __raw_readl(S5P_EINT_PEND(0)), __raw_readl(S5P_EINT_PEND(1)),
  7.         __raw_readl(S5P_EINT_PEND(2)), __raw_readl(S5P_EINT_PEND(3)));
  8. }
发现在自动唤醒的时候打印S5P_WAKEUP_STAT的value为0x2,再看看下面图

 
阅读(1690) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~