[OpenBIOS] r465 - cpu/x86/pc/olpc/sdtools
svn at openbios.org
svn at openbios.org
Thu Jul 5 19:29:32 CEST 2007
Author: wmb
Date: 2007-07-05 19:29:32 +0200 (Thu, 05 Jul 2007)
New Revision: 465
Added:
cpu/x86/pc/olpc/sdtools/ecio.fth
Log:
OLPC SDkit - added EC I/O routines.
Added: cpu/x86/pc/olpc/sdtools/ecio.fth
===================================================================
--- cpu/x86/pc/olpc/sdtools/ecio.fth (rev 0)
+++ cpu/x86/pc/olpc/sdtools/ecio.fth 2007-07-05 17:29:32 UTC (rev 465)
@@ -0,0 +1,223 @@
+\ See license at end of file
+purpose: Driver for "EC" (KB3700) chip
+
+\ EC access primitives
+
+h# 380 constant iobase
+
+: ec@ ( index -- b ) wbsplit iobase 1+ pc! iobase 2+ pc! iobase 3 + pc@ ;
+: ec! ( b index -- ) wbsplit iobase 1+ pc! iobase 2+ pc! iobase 3 + pc! ;
+
+: ec-dump ( offset len -- )
+ ." Addr 0 1 2 3 4 5 6 7 8 9 a b c d e f" cr cr
+ push-hex
+ bounds ?do
+ i 4 u.r space
+ i h# 10 bounds do i ec@ 3 u.r loop cr
+ exit? ?leave
+ h# 10 +loop
+ pop-base
+;
+
+\ EC internal addresses
+
+: 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"
+;
+: ec-cmd-out ( cmd -- ) wait-ib-empty h# 6c pc! ;
+: ec-wb ( -- ) wait-ib-empty h# 68 pc! ;
+: ec-rb ( -- b )
+ d# 1000 0 do
+ h# 6c pc@ 3 and 1 = if
+ h# 68 pc@
+ unloop exit
+ then
+ 1 ms
+ loop
+ true abort" EC port 6c output buffer timeout"
+;
+
+: ec-cmd ( cmd -- response ) ec-cmd-out ec-rb ;
+
+: ec-cmd66 ( byte -- )
+ h# 66 pc!
+ \ It typically requires about 200 polls
+ d# 4000 0 do 1 ms h# 66 pc@ 2 and 0= if unloop exit then loop
+ true abort" EC didn't respond to port 66 command"
+;
+
+: ec-rw ( -- w ) ec-rb ec-rb swap bwjoin ;
+: ec-ww ( -- w ) wbsplit ec-wb ec-wb ;
+
+: ec-cmd-w@ ( cmd -- w ) ec-cmd-out ec-rw ;
+: ec-cmd-b@ ( cmd -- b ) ec-cmd ;
+: ec-cmd-b! ( b cmd -- ) ec-cmd-out ec-wb ;
+
+: bat-voltage@ ( -- w ) h# 10 ec-cmd-w@ ;
+: bat-current@ ( -- w ) h# 11 ec-cmd-w@ ;
+: bat-acr@ ( -- w ) h# 12 ec-cmd-w@ ;
+: bat-temp@ ( -- w ) h# 13 ec-cmd-w@ ;
+: ambient-temp@ ( -- w ) h# 14 ec-cmd-w@ ;
+: bat-status@ ( -- b ) h# 15 ec-cmd-b@ ;
+: bat-soc@ ( -- b ) h# 16 ec-cmd-b@ ;
+: 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-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@ ;
+
+: 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-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? ( -- b ) h# 2a ec-cmd-b@ ;
+
+\ EC mailbox access words
+
+: ec-mb-adr@ ( -- w ) h# 80 ec-cmd-out ec-rw ;
+: ec-mb-adr! ( w -- ) h# 81 ec-cmd-out ec-ww ;
+: ec-mb-setup ( cmd w -- ) ec-mb-adr! ec-cmd-out ;
+
+: ec-mb-b@ ( adr -- b ) h# 8a ec-mb-setup h# 84 ec-cmd-b@ ;
+: ec-mb-w@ ( adr -- w ) h# 88 ec-mb-setup h# 82 ec-cmd-w@ ;
+: ec-mb-b! ( b adr -- ) h# 85 ec-mb-setup ec-wb h# 8b ec-cmd-out ;
+: ec-mb-w! ( w adr -- ) h# 83 ec-mb-setup ec-ww h# 89 ec-cmd-out ;
+
+\ SCI source codes:
+\ SCI_WAKEUP_EVENT 0x01 // Game button,
+\ SCI_BATTERY_STATUS_CHANGE 0x02 // AC plugged/unplugged, ...
+\ Battery inserted/remove, Battery Low, Battery full, Battery destroy
+\ SCI_SOC_CHANGE 0x04 // SOC Change
+\ SCI_ABNORMAL_EVENT 0x08
+\ SCI_EB_MODE_CHANGE 0x10
+\ SCI_WAKEUP_WLAN_EVENT 0x20
+
+\ This command hard-resets the EC deeply enough for the SP write-protect to
+\ be off when the system is powered up again.
+
+: ec-reset ( -- ) 5 ec-cmd ;
+
+: kb3920? ( -- flag ) h# 6c pc@ h# ff = if true exit then 9 ec-cmd 9 = ;
+
+\ 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! ;
+
+\ While accessing the SPI FLASH, we have to turn off the keyboard controller,
+\ because it continuously fetches from the SPI FLASH when it's on. That
+\ interferes with our accesses.
+
+0 value kbc-off?
+: kbc-off ( -- )
+ kbc-off? if exit then \ Fast bail out
+ h# d8 ec-cmd66 \ Prepare for reset
+ h# ff14 ec@ 1 or h# ff14 ec!
+ 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
+\ overwrite the keyboard controller microcodes.
+
+: kbc-pause ( -- ) h# dd ec-cmd66 ;
+: kbc-resume ( -- ) h# df ec-cmd66 ;
+
+: io-spi@ ( reg# -- b ) h# fea8 + ec@ ;
+: io-spi! ( b reg# -- ) h# fea8 + ec! ;
+
+\ We need the spi-cmd-wait because the data has to go out
+\ serially on the SPI bus and that is a bit slower than
+\ the IO port access. We must wait to avoid overwriting
+\ the command register during the serial tranfer.
+
+: io-spi-out ( b -- ) spicmd! spi-cmd-wait ;
+
+: io-spi-reprogrammed ( -- )
+ ." Powering off..." d# 2000 ms cr
+ power-off
+\ kbc-on
+\ ." Keyboard back on" cr
+;
+
+: io-spi-start ( -- )
+ ['] io-spi@ to spi@
+ ['] io-spi! to spi!
+ ['] io-spi-out to spi-out
+ ['] io-spi-reprogrammed to spi-reprogrammed
+ h# fff0.0000 to flash-base
+
+ 7 to spi-us \ Measured time for "1 fea9 ec!" is 7.9 uS
+
+ kbc-off
+;
+: use-local-ec ( -- ) ['] io-spi-start to spi-start ;
+use-local-ec
+\ LICENSE_BEGIN
+\ Copyright (c) 2006 FirmWorks
+\
+\ Permission is hereby granted, free of charge, to any person obtaining
+\ a copy of this software and associated documentation files (the
+\ "Software"), to deal in the Software without restriction, including
+\ without limitation the rights to use, copy, modify, merge, publish,
+\ distribute, sublicense, and/or sell copies of the Software, and to
+\ permit persons to whom the Software is furnished to do so, subject to
+\ the following conditions:
+\
+\ The above copyright notice and this permission notice shall be
+\ included in all copies or substantial portions of the Software.
+\
+\ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+\ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+\ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+\ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+\ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+\ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+\ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+\
+\ LICENSE_END
More information about the OpenBIOS
mailing list