Author: wmb Date: 2007-06-05 01:27:29 +0200 (Tue, 05 Jun 2007) New Revision: 435
Modified: dev/geode/acpi.fth dev/olpc/kb3700/ecio.fth dev/olpc/spiflash/spiui.fth Log: OLPC - Fixes for new EC command protocol - see trac #1562.
Modified: dev/geode/acpi.fth =================================================================== --- dev/geode/acpi.fth 2007-06-04 23:21:02 UTC (rev 434) +++ dev/geode/acpi.fth 2007-06-04 23:27:29 UTC (rev 435) @@ -19,8 +19,12 @@ \ If the keyboard controller is off (after "flash"), power off doesn't work. \ I suspect that is because the EC doesn't notice the deassertion \ of main_on and sus_on from the 5536. - kbc-on + ec-power-off
+ \ The rest of this will succeed in turning off the CPU, but the EC will + \ stay on. The ec-power-off above turns off both the EC and CPU, so the + \ rest of this is for historical interest only. + \ Recipe from AMD; no way I would have figured this out from manual 5 d# 10 << 1 or 8 acpi-w! \ S5 - power off
Modified: dev/olpc/kb3700/ecio.fth =================================================================== --- dev/olpc/kb3700/ecio.fth 2007-06-04 23:21:02 UTC (rev 434) +++ dev/olpc/kb3700/ecio.fth 2007-06-04 23:27:29 UTC (rev 435) @@ -21,12 +21,6 @@
\ EC internal addresses
-h# fc2a constant GPIO5 - -: flash-write-protect-on ( -- ) GPIO5 ec@ h# 80 invert and GPIO5 ec! ; - -: flash-write-protect-off ( -- ) GPIO5 ec@ h# 80 or GPIO5 ec! ; - : wait-ib-empty ( -- ) d# 1000 0 do h# 6c pc@ 2 and 0= if unloop exit then 1 ms loop true abort" EC port 6c input buffer timeout" @@ -70,25 +64,25 @@ : bat-gauge-id@ ( -- sn0 .. sn7 ) h# 17 ec-cmd-out 8 0 do ec-rb loop ; : bat-gauge@ ( -- b ) h# 18 ec-cmd-out h# 31 ec-wb ec-rb ; \ 31 is the EEPROM address : board-id@ ( -- b ) h# 19 ec-cmd-b@ ; -: sci-source@ ( -- b ) h# 1a ec-cmd-w@ ; +: sci-source@ ( -- b ) h# 1a ec-cmd-b@ ; : sci-mask! ( b -- ) h# 1b ec-cmd-b! ; : sci-mask@ ( -- b ) h# 1c ec-cmd-b@ ; : game-key@ ( -- w ) h# 1d ec-cmd-out ec-rw ; : ec-date! ( day month year -- ) h# 1e ec-cmd-out ec-wb ec-wb ec-wb ; -: ec-abnormal@ ( -- b ) h# 1f ec-cmd-b@ ; \ XXX is this byte or word? +: ec-abnormal@ ( -- b ) h# 1f ec-cmd-b@ ;
: bat-init-lifepo4 ( -- ) h# 21 ec-cmd-out ; : bat-init-nimh ( -- ) h# 22 ec-cmd-out ; : wlan-off ( -- ) 0 h# 23 ec-cmd-b! ; : wlan-on ( -- ) 1 h# 23 ec-cmd-b! ; : wlan-wake ( -- ) h# 24 ec-cmd-out ; -: wlan-rst ( -- ) h# 25 ec-cmd-out ; +: wlan-reset ( -- ) h# 25 ec-cmd-out ; : dcon-disable ( -- ) 0 h# 26 ec-cmd-b! ; : dcon-enable ( -- ) 1 h# 26 ec-cmd-b! ; : reset-ec-warm ( -- ) h# 27 ec-cmd-out ; : reset-ec ( -- ) h# 28 ec-cmd-out ; : write-protect-fw ( -- ) h# 29 ec-cmd-out ; -: ebook-mode? ( -- ) h# 2a ec-cmd-b@ ; +: ebook-mode? ( -- b ) h# 2a ec-cmd-b@ ;
\ EC mailbox access words
@@ -117,8 +111,6 @@
: kb3920? ( -- flag ) h# 6c pc@ h# ff = if true exit then 9 ec-cmd 9 = ;
-: snoop-board-id@ ( -- id ) h# fa20 ec@ ; - \ This makes the EC stop generating a flood of SCIs every time you do \ the port 66 command sequence. : sci-quiet ( -- ) h# 50 h# ff03 ec! ; @@ -135,14 +127,39 @@ true to kbc-off? ;
+: ec-power-off ( -- ) + 1 h# ff14 ec! + 1 h# ff01 ec! \ Tell the EC to bounce us on restart + 0 h# ff14 ec! +; + \ Unfortunately, since the system reset is mediated by the keyboard \ controller, turning the keyboard controller back on resets the system.
: kbc-on ( -- ) h# ff14 ec@ 1 invert and h# ff14 ec! \ Innocuous if already on + false to kbc-off? ; +: fancy-kbc-on ( -- ) + 2 h# ff01 ec! \ Prevent full system reset + h# ff14 ec@ 1 invert and h# ff14 ec! \ Innocuous if already on + d# 400 ms \ Give the EC time to start up + h# 44 h# fc80 ec! \ Re-enable scan code conversion and system flag + h# 43 h# fc81 ec! \ Re-enable fast gate and ibf/obf interrupts
+ h# f h# fe51 ec! \ Clear pending interrupts + h# f h# fe50 ec! \ Re-enable GPT interrupts + h# 0 h# fea7 ec! \ Clear FLASH write enable + h# 4 h# fead ec! \ fast read mode + h# fe95 ec@ h# 80 or h# fe95 ec! \ Write-protect LPC + h# 3 h# ff04 ec! \ enable IBF/OBF interrupts +\ h# 40 h# ff08 ec! \ Clear some interrupt + h# ff30 ec@ h# 10 or h# ff30 ec! \ Enable interrupt from GPIO04, PCI_RST# + + false to kbc-off? +; + \ kbc-pause temporarily halts execution of the keyboard controller microcode. \ kbc-resume makes it run again, picking up where it left off. \ This is useful for accessing the SPI FLASH in cases where you do not @@ -151,21 +168,6 @@ : kbc-pause ( -- ) h# dd ec-cmd66 ; : kbc-resume ( -- ) h# df ec-cmd66 ;
- - -: kbd-led-on ( -- ) h# fc21 ec@ 1 invert and h# fc21 ec! ; -: kbd-led-off ( -- ) h# fc21 ec@ 1 or h# fc21 ec! ; - -: wlan-reset ( -- ) - \ WLAN reset is EC GPIOEE, controlled by EC registers fc15 and fc25 - h# fc15 ec@ h# fc25 ec@ ( enable data ) - dup h# 40 invert and h# fc25 ec! ( enable data ) \ WLAN_RESET data output low - over h# 40 or h# fc15 ec! ( enable data ) \ Assert output enable - 1 ms - h# 40 or h# fc25 ec! ( enable ) \ Drive data high - h# 40 invert and h# fc15 ec! ( ) \ Release output enable -; - : io-spi@ ( reg# -- b ) h# fea8 + ec@ ; : io-spi! ( b reg# -- ) h# fea8 + ec! ;
@@ -179,6 +181,8 @@ : io-spi-reprogrammed ( -- ) ." Powering off..." d# 2000 ms cr power-off +\ kbc-on +\ ." Keyboard back on" cr ;
: io-spi-start ( -- )
Modified: dev/olpc/spiflash/spiui.fth =================================================================== --- dev/olpc/spiflash/spiui.fth 2007-06-04 23:21:02 UTC (rev 434) +++ dev/olpc/spiflash/spiui.fth 2007-06-04 23:27:29 UTC (rev 435) @@ -236,7 +236,7 @@ $get-file ;
-: flash ( ["filename"] -- ) get-file reflash power-off ; +: flash ( ["filename"] -- ) get-file reflash ;
[ifdef] dev dev /flash