wince6.0+S5PV210能通过电源键让系统进入休眠,可是换不醒,谁懂?

zhengmeifu 2011-05-23 03:59:38
我看了off.c文件里的OEMPowerOff,也设定了休眠后唤醒的中断,可是换不醒。休眠后好像只能保留一个线程,如何设定这个电源按键的IST线程不休眠?
...全文
632 33 打赏 收藏 转发到动态 举报
写回复
用AI写文章
33 条回复
切换为时间正序
请发表友善的回复…
发表回复
MJL007 2013-12-03
  • 打赏
  • 举报
回复
太经典了,前辈们讨论很热情啊。。。。
简单并快乐着 2013-11-01
  • 打赏
  • 举报
回复
不错,不错。
海阔任龟游 2011-11-07
  • 打赏
  • 举报
回复
欢呼,也在整。
zhengmeifu 2011-05-30
  • 打赏
  • 举报
回复
[Quote=引用 27 楼 chenfeng126 的回复:]
加打印,看看程序是停在哪?
[/Quote]
上面12楼已经有贴出来了,停在了[OEM] ++OEMPowerOff()。之后的任何消息都打印不出来了。我确定是CPU的XPWRRGTON这个脚已经置低了,这个脚置低说明CPU是完成了SLEEP流程,最后才把这个脚置低,以关闭PMIC的电源的。
zhengmeifu 2011-05-30
  • 打赏
  • 举报
回复
向各位关心此贴的网友们通告一声:休眠和唤醒已经完全搞定。谢谢上面参与的网友的支持!总结原因是对BSP包里的GPIO口有些重复定义,重复利用了I/O口,因此移植BSP包要仔细定义BSP包里的GPIO。
zhengmeifu 2011-05-30
  • 打赏
  • 举报
回复
已经能正常唤醒了,原来是摄像头驱动的I/O口影响的!把摄像头驱动屏蔽掉就可以了。可是现在还有新的问题:唤醒后死机!!输出LOG信息如下:感谢关注此贴的朋友们的大力支持!继续呀,谢谢!!
[OEM] --OEMPowerOff()
DrvLib_WaitInitialize done
[CEC] CEC_PowerUp(0x00000001)
[BTN] --Button_pwrbtn_enable_interrupt()

[PWRCON:INF] PWC_IOControl(SET_CLOCK_ON, 60)
[UART0] [SetDTR] ZMF:ERROR!!Not DTR PORT!!.
[SDMMCCh2] ZMF: GPJ20_Output=1 PULL_UP DRV4X
MFC Power UpS5PV210UsbFn!SetPowerState: Going from D4 to D0
[31m[UFNPDD] USB_POWER : D0 IN
[0m[31m[UFNPDD] USB_POWER : D0 OUT
[0m[PWRCON:INF] PWC_IOControl(SET_CLOCK_ON, 53)
[PWRCON]++PwrCon_set_IP_clock_on(53) already On
Touch sample rate : 100
Timer prescaler : 10
Timer input clock freq : 66700000
Timer clock freq : 6063636
Timer clock period (ns) : 165
Sample rate : 100
TCNTB3 : 60636
[PWRCON:INF] PWC_IOControl(SET_CLOCK_ON, 56)
[KBD] : ZMF: GPIO_CtrlHandler: ICLASS=1 ILEVEL=2 MATRIX_LAYOUT=0
[KBD] : ZMF: GPIO_PuEnable: iClass=1 bFlag=0
[KBD] : ZMF: GPIO_CtrlHandler: ICLASS=0 ILEVEL=2 MATRIX_LAYOUT=0
[KBD] : ZMF: GPIO_PuEnable: iClass=0 bFlag=0
[SDMMCCh0] SDHCControllerIst - Card is Removed!
[SDMMCCh2] SDHCControllerIst - Card is Removed!
##### Jang +CHub(tier 0)::HandleDetach
##### Jang +CHub(tier 1)::HandleDetach
UsbFnMdd!UfnMdd_Notify: Ignoring notification 0x00000001 - 0x00000000 from PDD
[KBD] : IsrThreadProc: WakeUp
[PWR:INF] PowerMonitorThread() : Read Size:30
[PWRCON:INF] Notified [PBT_TRANSITION : resuming (0x00000000)]
[PWR:INF] PowerMonitorThread() : Wait for PM Notification
[BKL] : Brightness=0 TCMPB=-1
[MFC_DRV: WARNING] MFC_IOControl: IOCTL_POWER_SET..current MFCPowerState: D4

[MFC_DRV: WARNING] MFC_IOControl: NewDx: D0

[MFC_DRV: WARNING] MFC_IOControl: IOCTL_POWER_SET: D0

[IIS] ++IIS_initialize_interface()

[IIS] AP == I2S0_SLAVE && CODEC == I2S0_MASTER

[PWC_PM:INFO] Power Manager Thread receive EVENT
ReadMsgQueue
[PWC_PM:INFO] NumOfLevel[2]=2,[IIS] --IIS_initialize_interface()

[WAV] ++InitIISCodec()

[I2C:I] IOCTL_I2C_GENERAL_WRITE(size : 2)
NumO[I2C:I] IOCTL_I2C_GENERAL_WRITE(size : 2)
fLeve[I2C:I] IOCTL_I2C_GENERAL_WRITE(size : 2)
##### Jang +CHub(tier 2)::HandleDetach
[I2C:I] IOCTL_I2C_GENERAL_WRITE(size : 2)
l[4]=[I2C:I] IOCTL_I2C_GENERAL_WRITE(size : 2)
1
[P[I2C:I] IOCTL_I2C_GENERAL_WRITE(size : 2)
WC_PM[I2C:I] IOCTL_I2C_GENERAL_WRITE(size : 2)
:INFO[I2C:I] IOCTL_I2C_GENERAL_WRITE(size : 2)
] Pow[WAV] --InitIISCodec()

[I2C:I] IOCTL_I2C_GENERAL_WRITE(size : 2)
er Ma[I2C:I] IOCTL_I2C_GENERAL_WRITE(size : 2)
nager[WAV] SEND D2 TO POWERCON
kernel IOCTL_POWER_SET setting state 2
[PWRCON:INF] PWC_IOControl(SET_POWER_ON, 12) : LCD
[PWRCON:INF] PWC_IOControl(SET_CLOCK_ON, 28)
[PWRCON:INF] PWC_IOControl(SET_POWER_ON, 15) : LCD
[PWRCON]++PwrCon_set_block_power_on(4) already On
[PWRCON:INF] PWC_IOControl(SET_CLOCK_ON, 8)
[PWRCON]++PwrCon_set_IP_clock_on(8) already On

ZMF:CLKDIR=0X1A
[PWR:INF] PowerMonitorThread() : Read Size:16
[PWRCON:INF] Notified [PBT_RESUME]
[PWRCON:INF] Wake Up by Power Button
[PWRCON:INF] SetSystemPowerState(POWER_STATE_ON)
[BKL] : Timer prescaler : 10
[BKL] : Timer input clock freq : 66700000
[BKL] : Timer clock freq : 6063636
[BKL] : Timer clock period in ns : 0
[BKL] : PWM frequency in hz : 60636
[BKL] : TCNTB : 100
[BKL] : Brightness=80 TCMPB=40
kernel IOCTL_POWER_SET setting state 0
[PWR:INF] PowerMonitorThread() : Wait for PM Notification
[PWR:INF] PowerMonitorThread() : Read Size:18
[PWRCON:INF] Notified [PBT_TRANSITION : on (0x12010000)]
[PWR:INF] PowerMonitorThread() : Wait for PM Notification
3:PBT_THREAD Power State : on(0x12010000)
[BTN] --Button_pwrbtn_enable_interrupt()

Thread receive EVENT
ReadMsgQueue
[PWC_PM:INFO] NumOfLevel[4]=0, NumOfLevel[2]=3
[PWC_PM:INFO] Check LP Mode 4, 0, 0, 3, 0, 0, 0
[PWC_PM:INFO] Check LP Mode 4, 0, 0, 3, 0, 0, 0
Entering LP_READY

[PWC_PM:INFO] Entering LP_READY

[PWC_PM:INFO] Power Manager Thread receive EVENT
ReadMsgQueue
[PWC_PM:INFO] NumOfLevel[4]=1, NumOfLevel[4]=1
[PWC_PM:INFO] Check LP Mode 5, 0, 0, 3, 0, 1, 0
[PWC_PM:INFO] Check LP Mode 5, 0, 0, 3, 0, 1, 0
[PWC_PM:INF[dm9] .NSR.PHYon 1 / BMSR e0d Up 100M Half
[dm9] .Send connection!
[dm9] NIC_DRIVER_OBJECT::DriverReset
[dm9] -- ----------------- REG38.b[6:5] : CURR= 00 (2mA) --
[dm9] -- ----------------- REG38.b[6:5] : CURR= 11 (8mA) --
[DM9]:-- -- CURR REG38 --- 0x38 -- CURR= 01
[DM9]:-- --- INT REG39 --- 0x39
[DM9]:-- *** INT REG39 *** INT Active low
[dm9]:[ID_CUSTOM_INT_EN]
[DM9]:**DeviceEnableInterrupt**
[dm9] DeviceStart:[dm9] --
::AttachDevice SUCCESS_HS:2000
::AttachDevice SUCCESS_HS:2000
::AttachDevice SUCCESS_HS:2000
chenfeng126 2011-05-27
  • 打赏
  • 举报
回复
只改off.c是不行了,还要改DeepIdle.c
chenfeng126 2011-05-27
  • 打赏
  • 举报
回复
我们是因为加了USB HUB IC的原因导致的,去掉USB 驱动就没问题了。
zhengmeifu 2011-05-27
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 chenfeng126 的回复:]
去掉USB驱动再试试
[/Quote]
和USB驱动有关系吗?为什么?
zhengmeifu 2011-05-27
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 chenfeng126 的回复:]
插上USB 鼠标或U盘,看看sleep和wakeup能不能成功?目前我们遇到就是要插上USB 鼠标或U盘,才能sleep和wakeup。
[/Quote]
我的系统能从useridle切换到on,也能从on自动切换到useridle,再切换到systemidle。也能从on切换到suspend。就是suspend后相当于关机了(PowerOff),再也没法唤醒了。
chenfeng126 2011-05-27
  • 打赏
  • 举报
回复
加打印,看看程序是停在哪?
zhengmeifu 2011-05-27
  • 打赏
  • 举报
回复
我的驱动底下有两个文件夹:PowerButton和Power_control这两个和和电源控制相关的驱动,我认为都没问题。感兴趣可以发给你看一下。我感觉像是关机了,不像SLEEP。可是关机后也应该能重新按电源键开机呀!可是开不了!!!
zhengmeifu 2011-05-27
  • 打赏
  • 举报
回复
[Quote=引用 23 楼 chenfeng126 的回复:]
清中断。不用改这里,只要改宏定义就可以了,如#define EINT_POWER_BUTTON EXT_INT_31改成#define EINT_POWER_BUTTON EXT_INT_0,还有WAKEUP_PWR_BUTTON和EINT_POWER_BUTTON 的宏定义。
[/Quote]
这两个地方都改了。还是不行
zhengmeifu 2011-05-27
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 chenfeng126 的回复:]
留下你的E-mail,看看你的DeepIdle.c和off.c怎么改的.
[/Quote]
我的e-mail:26451602@qq.com
chenfeng126 2011-05-27
  • 打赏
  • 举报
回复
清中断。不用改这里,只要改宏定义就可以了,如#define EINT_POWER_BUTTON EXT_INT_31改成#define EINT_POWER_BUTTON EXT_INT_0,还有WAKEUP_PWR_BUTTON和EINT_POWER_BUTTON 的宏定义。
zhengmeifu 2011-05-27
  • 打赏
  • 举报
回复
off.c中的SetEarlyWakeup是干嘛用的呀?我把原来按键是XEINT31改为XEINT0,如下改法,不知对休眠后唤醒是否有帮助呢?
static BOOL SetEarlyWakeup(void)
{
volatile PMU_PM_REG *pPMUPMReg;
volatile PMU_MISC_REG *pPMUMiscReg;
volatile VIC_REG *pVIC0Reg;
volatile VIC_REG *pVIC1Reg;
volatile VIC_REG *pVIC2Reg;
volatile VIC_REG *pVIC3Reg;
volatile GPIO_REG *pGPIOReg;
DWORD dwWakeMask;
DWORD dwEINTWakeMask;
BOOL bBypass=FALSE;
BOOL bPending=FALSE;
BOOL bRet=FALSE;
DWORD dwEintMask;

OALMSG(OAL_INFO, (L"[OEM] ++SetEarlyWakeup()\r\n"));

pPMUPMReg = (PMU_PM_REG *)OALPAtoVA(BASE_REG_PA_PMU_PM, FALSE);
pPMUMiscReg = (PMU_MISC_REG *)OALPAtoVA(BASE_REG_PA_PMU_MISC, FALSE);
pVIC0Reg = (VIC_REG *)OALPAtoVA(BASE_REG_PA_VIC0, FALSE);
pVIC1Reg = (VIC_REG *)OALPAtoVA(BASE_REG_PA_VIC1, FALSE);
pVIC2Reg = (VIC_REG *)OALPAtoVA(BASE_REG_PA_VIC2, FALSE);
pVIC3Reg = (VIC_REG *)OALPAtoVA(BASE_REG_PA_VIC3, FALSE);
pGPIOReg = (GPIO_REG *)OALPAtoVA(BASE_REG_PA_GPIO, FALSE);

dwWakeMask = pPMUPMReg->PWR_CONF.WAKEUP_MASK;
dwEINTWakeMask = pPMUPMReg->PWR_CONF.EINT_WAKEUP_MASK;

// 1. Check Pending register with Wakeup Mask register
// If Wakeup source interrupt is generated in here,
// bypass entering sleep mode and wakeup system right now.

// Check WakeUp Source - Keypad
if( (!(dwWakeMask & (1<<BP_KEYIF_WAKEUP_MASK))) && (pVIC2Reg->VICRAWINTR & (1<<(PHYIRQ_KEYPAD-VIC2_BIT_OFFSET))))
{
bBypass=TRUE;
g_oalWakeSource = OEMWAKE_KEYPAD;
}

// Check WakeUp Source - HDMICEC
if( (!(dwWakeMask & (1<<BP_HDMICEC_WAKEUP_MASK))) && (pVIC3Reg->VICRAWINTR & (1<<(PHYIRQ_CEC-VIC3_BIT_OFFSET))))
{
bBypass=TRUE;
g_oalWakeSource = OEMWAKE_HDMICEC;
}

// Check WakeUp Source - RTC ALARM
if( (!(dwWakeMask & (1<<BP_RTC_ALARM_WAKEUP_MASK))) && (pVIC0Reg->VICRAWINTR & (1<<PHYIRQ_RTC_ALARM)))
{
bBypass=TRUE;
g_oalWakeSource = OEMWAKE_RTC_ALARM;
}

// Check WakeUp Source - RTC Tick
if( (!(dwWakeMask & (1<<BP_RTC_TICK_WAKEUP_MASK))) && (pVIC0Reg->VICRAWINTR & (1<<PHYIRQ_RTC_TIC)))
{
bBypass=TRUE;
g_oalWakeSource = OEMWAKE_RTC_TICK;
}
if(pVIC0Reg->VICRAWINTR & (1<<PHYIRQ_EINT0)){ /* add by ZMF */
bBypass=TRUE;
g_oalWakeSource = SYSWAKE_POWER_BUTTON;
}

// Check WakeUp Source - EINT0~15
if((pVIC0Reg->VICRAWINTR & 0xffff) & ~(dwEINTWakeMask & 0xffff))
{
dwEintMask = ~((dwEINTWakeMask << BP_EINT0_WAKEUP_MASK) & 0xff); /* add by ZMF */
if((pGPIOReg->EINTPND.EXT_INT0_PEND&0xff) && dwEintMask){/* add by ZMF */
bBypass=TRUE;
// if((pGPIOReg->EINTPND.EXT_INT1_PEND&0xff)==0x80) // mask by ZMF
if((pGPIOReg->EINTPND.EXT_INT0_PEND&0xff)==0x01) // EINT0: Power Button ZMF
g_oalWakeSource = SYSWAKE_POWER_BUTTON;
else
g_oalWakeSource = SYSWAKE_UNKNOWN;
}
}

// Check WakeUp Source - EINT16~31
if(pVIC0Reg->VICRAWINTR & (1<<PHYIRQ_EINT16_31)){


dwEintMask = ~((dwEINTWakeMask << BP_EINT16_WAKEUP_MASK) & 0xff); // EINT16~23
if((pGPIOReg->EINTPND.EXT_INT2_PEND&0xff) && dwEintMask)
{
bBypass=TRUE;
g_oalWakeSource = SYSWAKE_UNKNOWN;
}
dwEintMask = ~((dwEINTWakeMask << BP_EINT24_WAKEUP_MASK) & 0xff); // EINT24~31
if((pGPIOReg->EINTPND.EXT_INT3_PEND&0xff) && dwEintMask)
{
#if 0 /*MASK BY ZMF */
bBypass=TRUE;
if((pGPIOReg->EINTPND.EXT_INT3_PEND&0xff)==0x80) // EINT31: Power Button
g_oalWakeSource = SYSWAKE_POWER_BUTTON;
else
g_oalWakeSource = SYSWAKE_UNKNOWN;
#else
g_oalWakeSource = SYSWAKE_UNKNOWN;
#endif
}
}

if(bBypass){

// Here is interrupt of wakeup source, so wake up system right now.

//---------------------------------------------------------------------
// Clear All Wake Up Status bits
// : This is cleared by writing 1.
pPMUPMReg->STATUS_REG.WAKEUP_STAT = BP_WAKEUP_STAT_ALL_MASK;

// EINT_MASK in SysCon Also Effective in Normal State
// Unmask all bit for External Interrupt at Normal Mode
pPMUPMReg->PWR_CONF.EINT_WAKEUP_MASK &= ~(BP_EINT_WAKEUP_ALL_MASK);

bRet = TRUE;
}
else{

// 2. Clear Pending Registers
// Clear Vector Address Register
pVIC0Reg->VICADDRESS = 0x0;
pVIC1Reg->VICADDRESS = 0x0;
pVIC2Reg->VICADDRESS = 0x0;
pVIC3Reg->VICADDRESS = 0x0;

// Clear External interrupt
pGPIOReg->EINTPND.EXT_INT0_PEND = 0xff;
pGPIOReg->EINTPND.EXT_INT1_PEND = 0xff;
pGPIOReg->EINTPND.EXT_INT2_PEND = 0xff;
pGPIOReg->EINTPND.EXT_INT3_PEND = 0xff;

// 3. set CFG_STANDBYWFI field of PWR_CFG to sleep mode.
pPMUPMReg->PWR_CONF.PWR_CFG = (pPMUPMReg->PWR_CONF.PWR_CFG & ~(BW_CFG_STANDBYWFI<<BP_CFG_STANDBYWFI)) | (CFG_ENTER_SLEEP<<BP_CFG_STANDBYWFI);

// 4. set SYSCON_INT_DISABLE bit for early-wakeup
pPMUMiscReg->SYS_CON.OTHERS |= (1<<BP_OTHERS_SYSCON_INT_DISABLE);
}

OALMSG(OAL_INFO, (L"[OEM] --SetEarlyWakeup()\r\n"));

return bRet;
}
chenfeng126 2011-05-27
  • 打赏
  • 举报
回复
留下你的E-mail,看看你的DeepIdle.c和off.c怎么改的.
chenfeng126 2011-05-27
  • 打赏
  • 举报
回复
DeepIdle.c中DeepIdle_WakeUpSource_Configure 函数中reset button改成如下
g_pPMUPMRegs->PWR_CONF.EINT_WAKEUP_MASK &= ~(1<<WAKEUP_PWR_BUTTON ); // enable Power Button
zhengmeifu 2011-05-27
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 chenfeng126 的回复:]
我们是因为加了USB HUB IC的原因导致的,去掉USB 驱动就没问题了。
[/Quote]
我也有HUB IC,型号是FE2.1。我把USB驱动大部分都去了,还是不能唤醒。估计跟这个没有关系吧。驱动不睡眠只会造成睡眠不下去呀。可是我现在已经睡眠下去了。换不醒!!

我现在把接PMIC的PWREN脚也加电上去了,所有CPU需要的电源都有供上,可是还是换不醒!!郁闷。
zhengmeifu 2011-05-27
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 chenfeng126 的回复:]
只改off.c是不行了,还要改DeepIdle.c
[/Quote]
我的电源按键就是接到了XEINT0上,和SMDKV210不同的就是这个(SMDK上电源键是XEINT31),我已经改了这个管脚有关的东西。我看DeepIdle.c没有什么要改的了。和sleep.s是否有关呀?谢谢这位大侠!
加载更多回复(13)

19,502

社区成员

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

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