2007年7月28日星期六

筆記:Into Idle

在設定完chip register,進入idle mode後,還要program co-processor:
這一篇 http://nocash.emubase.de/gbatek.htm 有說明到ARM CP15 Cache Control。

Cn,Cm,Op2 Rd   Command
C7,C0,4 0 Wait For Interrupt (Halt)
另外在linux kernel code中也有:
/*
* cpu_arm926_do_idle()
*/
.align 5
ENTRY(cpu_arm926_do_idle)
#if defined(CONFIG_CPU_ARM926_CPU_IDLE)
mcr p15, 0, r0, c7, c0, 4 @ Wait for interrupt
#endif
mov pc, lr
ref SystemIdle Function:
MMU_WaitInterrupt(void)
mov  r0,#0x0
mcr p15,0,r0,c7,c0,4
mov pc,lr
所以,這是要cache 進入idle mode,等待interrupt 的意思 ?

S3C2412有三種Power mode:
  1. IDLE
  2. STOP
  3. SLEEP
是利用PWRMODECON 這個register來設定。

說是這樣說,但是Samsung的BSP code卻沒有這樣作,完全沒用PWRMODECON,反而是用 PWRCFG。其中的STANDBYWFI 佔2 bit,設定後,可以進入:
  • IDLE : 01b
  • STOP : 10b
  • SLEEP : 11b
這種利用寫入 PWRMODECON 的STANDBYWFIbit 的作法,在datasheet 中稱作是 "mcr p15, 0, r0, c7, c0, 4"。

datasheet 中「很好心」地為大家提供一個 "alternat method to set STANDBYWFI" :就是用剛剛的cp15 command:

mcr  p15,0,r0,c7,c0,4
但是沒有說明相當於command的哪一個信號? 01b, 10b, 11b ?

對照datasheet和BSP code:

STANDBYWFI 進入IDLE是 01b。
BSP code用 mcr cp15 command 進入時,Rd (在此用r0),卻是設定成 #0x0。

而且這是datasheet中有關"進入STOP Mode"的說明中寫的,BSP code卻是在進入idle mode 的code中使用的。

接著有一個table,說明進入三個mode的方法:
  • IDLE - STANDBYWFI
  • STOP - CMD or STANDBYWFI
  • SLEEP - CMD or STANDBYWFI
STANDBYWFI 的意思大概可瞭解,雖然有點不清楚,那麼"CMD"是什麼 ?是寫入command到PWRMODECON的MODESLEEP 嗎?

沒有留言: