[openfirmware] r1104 - dev/olpc/kb3700
svn at openfirmware.info
svn at openfirmware.info
Thu Feb 12 07:38:24 CET 2009
Author: rsmith
Date: 2009-02-12 07:38:23 +0100 (Thu, 12 Feb 2009)
New Revision: 1104
Modified:
dev/olpc/kb3700/battery.fth
dev/olpc/kb3700/ecio.fth
Log:
OLPC: Integrate a sizeable chunk of the tools used in the extern batman.fth diagnostic script
into the firmware directly.
Modified: dev/olpc/kb3700/battery.fth
===================================================================
--- dev/olpc/kb3700/battery.fth 2009-02-12 05:40:08 UTC (rev 1103)
+++ dev/olpc/kb3700/battery.fth 2009-02-12 06:38:23 UTC (rev 1104)
@@ -5,6 +5,7 @@
: ec@ wbsplit h# 381 pc! h# 382 pc! h# 383 pc@ ;
: ec! wbsplit h# 381 pc! h# 382 pc! h# 383 pc! ;
[then]
+
: wextend ( w -- n ) dup h# 8000 and if h# ffff.0000 or then ;
: rr ec@ . ;
: ww ec! ;
@@ -115,8 +116,348 @@
begin (cr .bat kill-line d# 1000 ms key? until
key drop
;
-\ send questions to andrew at gold peak
+\ A few commands for looking at what the EC is doing in
+\ the battery state machine.
+\ Unless you are on a serial console with stdout turned off
+\ (stdout off) this will miss some state changes.
+\
+: next-bstate
+ begin
+ f780 ec@ tuck <>
+ until
+;
+
+: see-bstate
+ 0 begin
+ next-bstate dup .
+ dup 4 = if
+ cr
+ then key?
+ until
+;
+
+: next-e1-state
+ begin
+ fae1 ec@ tuck <>
+ until
+;
+
+: see-e1
+ 0 begin
+ next-e1-state dup .
+ key?
+ until
+;
+
+\ Turn on the charging mosfet
+: bat-enable-charge ( -- ) fc21 ec@ 40 or fc21 ec! ;
+
+\ Turn off the charging mosfet
+: bat-disable-charge ( -- ) fc21 ec@ 40 invert and fc21 ec! 03 fc24 ec! ;
+
+\ Turn on the trickle charge with max system voltage
+: bat-enable-trickle ( -- ) fc23 ec@ 1 or fc23 ec! 01 fc24 ec! ;
+
+\ Turn off the trickle charger
+: bat-disable-trickle ( -- ) fc23 ec@ 1 invert and fc23 ec! ;
+
+\ Access the 1-wire data line via the EC GPIO ports
+
+h# 383 constant dataport
+h# 382 constant lowadr
+4 constant dq-bit
+0 value high
+0 value low
+false value 1w-initialized
+0 value fileih
+
+: disable-ec-charging
+ 1 h# fa07 ec!
+;
+
+: disable-ec-1w
+ 1 h# fa08 ec!
+;
+
+: enable-ec-charging
+ 0 h# fa07 ec!
+;
+
+: enable-ec-1w
+ 0 h# fa08 ec!
+;
+
+: 1w-init ( -- )
+ disable-interrupts
+ h# fc24 ec@ dq-bit invert and fc24 ec!
+ h# fc14 ec@ dup dq-bit or to low dq-bit invert and to high
+ high fc14 ec!
+ true to 1w-initialized
+ 1 ms
+;
+
+
+\ New ec revs can turn off the battery subsystem without
+\ putting the ec into reset allowing the user to
+\ use the XO keyboard.
+: init-ec-live
+ disable-ec-charging
+ disable-ec-1w
+ 1w-init
+;
+
+: init-ec-dead
+ kbc-off
+ 1w-init
+;
+
+\ EC code at the time these commands were added can stop
+\ the battery subsystem with out putting the EC into reset.
+\ so we always do a live init
+: batman-init init-ec-live 500 ms bat-disable-charge bat-disable-trickle ;
+: batman-init? 1w-initialized if else batman-init then ;
+
+
+: batman-start batman-init? ;
+
+: batman-stop
+ enable-ec-1w
+ enable-ec-charging
+ enable-interrupts
+ false to 1w-initialized
+;
+
+: bit? ( us -- flag ) \ Test the data after a delay
+ us h# 34 lowadr pc! dataport pc@ dq-bit and 0<>
+;
+
+: 1w-pulse ( us -- ) \ Pulse the wire low for some duration
+ h# 14 lowadr pc! low dataport pc! us high dataport pc!
+;
+
+\ Generic 1-wire primitives
+
+: 1w-reset ( -- )
+ d# 480 1w-pulse
+ d# 67 bit? abort" No response from battery"
+ begin 1 bit? until
+;
+
+: 1w-write-byte ( byte -- )
+ 8 0 do ( byte )
+ dup 1 and if ( byte )
+ 1 1w-pulse d# 60 us ( byte )
+ else ( byte )
+ d# 60 1w-pulse ( byte )
+ then ( byte )
+ 2/ ( byte' )
+ loop ( byte )
+ drop ( )
+;
+
+: 1w-read-byte ( -- )
+ 0 8 0 do
+ 1 1w-pulse
+ \ Shift bits in from the left, little endian
+ d# 10 bit? h# 100 and or 2/ d# 50 us
+ loop
+;
+
+: 1w-skip-address ( -- ) h# cc 1w-write-byte ;
+
+: 1w-cmd ( arg cmd -- ) 1w-reset 1w-skip-address 1w-write-byte 1w-write-byte ;
+
+\ Basic commands for the DS2756 chip
+
+: 1w-read ( adr len start -- )
+ h# 69 1w-cmd ( adr len )
+ bounds ?do 1w-read-byte i c! loop ( )
+ 1w-reset
+;
+
+: 1w-write ( adr len start -- )
+ h# 6c 1w-cmd ( adr len )
+ bounds ?do i c@ 1w-write-byte loop ( )
+ 1w-reset
+;
+
+: 1w-write-start ( start -- )
+ h# 6c 1w-cmd
+;
+
+: 1w-copy ( start -- ) h# 48 1w-cmd d# 10 ms ;
+
+: 1w-recall ( start -- ) h# b8 1w-cmd ;
+
+\ : 1w-lock ( start -- ) h# 6a 1w-cmd ;
+
+: 1w-sync ( -- ) 0 h# d2 1w-cmd ;
+
+\ Some higher-level commands for accessing battery data
+
+\ buffer for reading bank data
+h# 20 constant /ds-bank \ Bytes per bank in the battery sensor chip
+h# 60 constant /ds-eeprom \ Bytes in the eeprom
+h# 01 constant ni-mh
+h# 02 constant li-fe
+h# 00 constant ds-regs
+h# 10 constant ds-acr
+h# 20 constant ds-bank0
+h# 25 constant ds-bat-misc-flag
+h# 2d constant ds-last-dis-soc
+h# 2e constant ds-last-dis-acr-msb
+h# 2f constant ds-last-dis-acr-lsb
+h# 40 constant ds-bank1
+h# 60 constant ds-bank2
+h# 68 constant ds-remain-acr-msb
+h# 69 constant ds-remain-acr-lsb
+h# 5f constant ds-batid
+
+h# 01 constant ds-bat-low-volt
+h# 20 constant ds-bat-full
+
+h# 20 buffer: ds-bank-buf
+
+: ds-bank$ ( -- adr len ) ds-bank-buf /ds-bank ;
+
+: bat-id ( -- id ) ds-bank-buf 1 ds-batid 1w-read ds-bank-buf c@ h# 0f and ;
+
+: read-bank ( offset -- ) ds-bank$ rot 1w-read ;
+
+: bat-read-eeprom ( -- ) ds-bank-buf /ds-eeprom ds-bank0 1w-read ;
+
+: bat-ds-regs@ ( -- ) ds-regs read-bank ;
+: bat-bank0@ ( -- ) ds-bank0 read-bank ;
+: bat-bank1@ ( -- ) ds-bank1 read-bank ;
+: bat-bank2@ ( -- ) ds-bank2 read-bank ;
+
+: bat-dump-bank ( -- ) ds-bank$ dump ;
+
+: bat-dump-banks ( -- )
+ batman-init?
+ cr ." Regs"
+ bat-ds-regs@ bat-dump-bank
+ cr cr ." Bank 0"
+ bat-bank0@ bat-dump-bank
+ cr cr ." Bank 1"
+ bat-bank1@ bat-dump-bank
+ cr cr ." Bank 2"
+ bat-bank2@ bat-dump-bank
+;
+
+: bat-dump-regs ( -- ) batman-init? bat-ds-regs@ bat-dump-bank ;
+
+: w16>d32 ( 16bit -- 32bit_sign-extended )
+ d# 16 << d# 16 >>a
+;
+
+: bat-save ( -- )
+ " disk:\battery.dmp"
+ 2dup ['] $delete catch if 2drop then ( name$ )
+ $create-file to fileih
+
+ 1w-init
+ h# 80 0 do
+ ds-bank$ i 1w-read
+ ds-bank$ " write" fileih $call-method
+ /ds-bank +loop
+
+ fileih close-dev
+;
+
+\ bg-* words access the gauge directly via 1w rather than
+\ read the value from the ec cache
+: bg-acr@ ( -- acr )
+ batman-init?
+ ds-bank-buf 2 ds-acr 1w-read ( )
+ ds-bank-buf c@ 8 << ( msb )
+ ds-bank-buf 1 + c@ or w16>d32 ( acr )
+;
+
+: bg-acr! ( acr -- )
+ batman-init?
+ wbsplit
+ ds-acr 1w-write-start
+ 1w-write-byte
+ 1w-write-byte
+ 1w-reset
+;
+
+: bg-last-dis-soc@ ( -- last-dis-soc )
+ batman-init?
+ ds-bank-buf 1 ds-last-dis-soc 1w-read
+ ds-bank-buf c@
+;
+
+: bg-last-dis-soc! ( soc -- )
+ batman-init?
+ ds-bank0 1w-recall
+ ds-last-dis-soc 1w-write-start
+ 1w-write-byte
+ ds-last-dis-soc 1w-copy
+ 1w-reset
+;
+
+: bg-last-dis-acr@ ( -- last-dis-acr )
+ batman-init?
+ ds-bank-buf 2 ds-last-dis-acr-msb 1w-read ( )
+ ds-bank-buf c@ 8 << ( last-dis-acr-msb )
+ ds-bank-buf 1 + c@ or w16>d32 ( last-dis-acr )
+;
+
+: bg-last-dis-acr! ( last-dis-acr --)
+ batman-init?
+ wbsplit
+ ds-bank0 1w-recall
+ ds-last-dis-acr-msb 1w-write-start
+ 1w-write-byte
+ 1w-write-byte
+ ds-last-dis-acr-msb 1w-copy
+ 1w-reset
+;
+
+: bg-misc@ ( -- misc-flag )
+ batman-init?
+ ds-bank-buf 1 ds-bat-misc-flag 1w-read
+ ds-bank-buf c@
+;
+
+: bg-set-full-flag ( -- )
+ bg-misc@
+ ds-bat-full or
+ ds-bank0 1w-recall
+ ds-bat-misc-flag 1w-write-start
+ 1w-write-byte
+ ds-bat-misc-flag 1w-copy
+ 1w-reset
+;
+
+: bg-clear-full-flag ( -- )
+ bg-misc@
+ ds-bat-full not and
+ ds-bank0 1w-recall
+ ds-bat-misc-flag 1w-write-start
+ 1w-write-byte
+ ds-bat-misc-flag 1w-copy
+ 1w-reset
+;
+
+: .bg-eeprom
+ base @ >r
+ decimal
+ ." acr: " bg-acr@ . cr
+ ." Last dis soc: " bg-last-dis-soc@ . cr
+ ." Last dis acr: " bg-last-dis-acr@ . cr
+ hex
+ ." Misc flags: " bg-misc@ dup . ." : "
+ dup ds-bat-full and if ." fully charged " then
+ dup ds-bat-low-volt and if ." low voltage " then
+ drop
+ cr
+ r> base !
+;
+
dev /
new-device
" battery" device-name
Modified: dev/olpc/kb3700/ecio.fth
===================================================================
--- dev/olpc/kb3700/ecio.fth 2009-02-12 05:40:08 UTC (rev 1103)
+++ dev/olpc/kb3700/ecio.fth 2009-02-12 06:38:23 UTC (rev 1104)
@@ -8,6 +8,18 @@
: 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! ;
+\ Write a word to an EC index.
+: ecw! ( wdata index )
+ wbsplit ( wdata index_lsb index_msb )
+ iobase 1+ pc! ( wdata index_lsb )
+ dup iobase 2+ pc! ( wdata index_lsb )
+ swap wbsplit ( index_lsb wdata_lsb wdata_msb )
+ iobase 3 + pc! ( index_lsb wdata_lsb )
+ swap 1 + ( wdata_lsb index_lsb+1 )
+ iobase 2+ pc! ( wdata_lsb )
+ iobase 3 + pc!
+;
+
: autowak! ( value -- ) f64f ec! ;
: autowak-on ( -- ) 1 autowak! ;
: autowak-off ( -- ) 0 autowak! ;
@@ -145,6 +157,8 @@
too-many-retries
;
+: ec-wakeup! ( wakeup -- ) lbsplit h# 36 ec-cmd-out ec-wb ec-wb ec-wb ec-wb ;
+
: ec-abnormal@ ( -- b ) h# 1f ec-cmd-b@ ;
: bat-init-nimh-gp ( -- ) h# 20 ec-cmd ;
More information about the openfirmware
mailing list