[openfirmware] r1116 - cpu/x86/pc/olpc dev/olpc/kb3700

svn at openfirmware.info svn at openfirmware.info
Tue Mar 3 23:31:34 CET 2009


Author: rsmith
Date: 2009-03-03 23:31:34 +0100 (Tue, 03 Mar 2009)
New Revision: 1116

Modified:
   cpu/x86/pc/olpc/fw.bth
   dev/olpc/kb3700/battery.fth
Log:
OLPC:
- Add new commands
- 'bat-debug' and 'bat-debug-log'   These commands let you snoop on what the EC is doing when charging the battery. bat-debug-log logs it to a USB disk.

- 'bat-charge-log'  Low power logger for measuring the battery charge without the CPU up and running constantly.  Turns off wireless & DCON, sets the RTC for wake up and puts the system to sleep.  Outputs values to both the serial port and to an SD card. (USB does not work across suspend/resume) 

Data key is: (space delimited) 
 unix-seconds
 SOC 
 voltage in uV 
 current in uA
 bat temp
 ACR 
 net ACR from start in mAh



Modified: cpu/x86/pc/olpc/fw.bth
===================================================================
--- cpu/x86/pc/olpc/fw.bth	2009-02-20 21:50:02 UTC (rev 1115)
+++ cpu/x86/pc/olpc/fw.bth	2009-03-03 22:31:34 UTC (rev 1116)
@@ -639,6 +639,56 @@
 \   " flash http:\\18.85.46.172\new.rom" eval
 ;
 
+:  bat-log-append ( adr len -- )
+   " sd:\charge.log" $append-open   \ hardcode the path for now
+      ftype
+      fcr
+      ofd @ fclose
+;
+
+
+0 value start-acr
+d# 15 value wake-delay
+
+: bat-charge-dataf@
+      base @ >r  decimal
+      0 logstr c!
+      time&date >unix-seconds >sd logstr $cat
+      soc >sd logstr $cat
+      uvolt@ >sd logstr $cat 
+      cur@ >sd logstr $cat
+      bat-temp >sd logstr $cat
+      bat-acr@ s16>s32 dup >sd logstr $cat
+      start-acr - bg-acr>mAh >sd.dd logstr $cat       
+      r> base !
+
+\ space cur@ .d space soc .d space bat-temp .d space
+\      bat-acr@ s16>s32 dup .d space
+\      start-acr - bg-acr>mAh .sd.dd
+;
+
+: bat-charge-log ( -- )
+   " sd:\charge.log" $new-file      \ Make sure the file exists and is empty.
+   ofd @ fclose
+
+   \ Allow for suspend to be super low power
+   dcon-power-off
+   wlan-freeze
+
+   sci-wakeup
+   bat-acr@ s16>s32 to start-acr
+   begin
+      bat-charge-dataf@
+      logstr count type cr
+      logstr count bat-log-append
+      0 acpi-l@ h# 400.0000 or  0 acpi-l!  \ Enable RTC SCI
+      ['] noop  wake-delay " set-alarm" clock-node @ $call-method
+      s3
+      0 0 acpi-l!                          \ Disable RTC SCI
+      key?
+   until key drop
+;
+
 \ This helps with TeraTerm, which sends ESC-O as the arrow key prefix
 also hidden also keys-forth definitions
 warning @  warning off

Modified: dev/olpc/kb3700/battery.fth
===================================================================
--- dev/olpc/kb3700/battery.fth	2009-02-20 21:50:02 UTC (rev 1115)
+++ dev/olpc/kb3700/battery.fth	2009-03-03 22:31:34 UTC (rev 1116)
@@ -122,6 +122,10 @@
 \ Unless you are on a serial console with stdout turned off
 \ (stdout off) this will miss some state changes.
 \
+
+h# FA00 constant ec-rambase
+: ec-ram@ ec-rambase + ec@ ;
+
 : next-bstate
         begin
          f780 ec@ tuck <>
@@ -348,7 +352,7 @@
 
 : bat-dump-regs ( -- ) batman-init? bat-ds-regs@ bat-dump-bank ;
 
-: w16>d32 ( 16bit -- 32bit_sign-extended )
+: s16>s32 ( signed16bit -- 32bit_sign-extended )
    d# 16 << d# 16 >>a
 ;
 
@@ -372,7 +376,7 @@
    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 )
+   ds-bank-buf 1 + c@ or s16>s32                ( acr )
 ;
 
 : bg-acr! ( acr -- )
@@ -403,7 +407,7 @@
    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 )
+   ds-bank-buf 1 + c@ or s16>s32                ( last-dis-acr )
 ;
 
 : bg-last-dis-acr! ( last-dis-acr --)
@@ -458,6 +462,128 @@
    r> base !
 ;
 
+: >sd.ddd  ( n -- formatted )
+   base @ >r  decimal
+   dup abs <# u# u# u# [char] . hold u#s rot sign u#>
+   r> base !
+;
+
+: >sd.dd  ( n -- formatted )
+   base @ >r  decimal
+   dup abs <# u# u# [char] . hold u#s rot sign u#>
+   8 over - 0 max spaces
+   r> base !
+;
+
+: bg-acr>mAh ( raw-value -- acr_in_mAh )
+   abs
+   d# 625 ( mV ) * d# 15 ( mOhm ) /
+   over 0<  if  negate  then
+;
+
+: bg-V>V ( raw-value - Volts )
+   abs
+   d# 488 ( mV ) * 2* d# 100 / 5 >>
+   over 0<  if  negate  then
+;
+
+: bg-I>mA ( raw-value -- I_in_mA )
+   abs 3 >>
+   d# 15625 ( nV ) * d# 15 ( mOhm ) / d# 10 /
+   over 0< if  negate  then
+;
+
+: bg-temp>degc ( raw-value -- temp_in_degc )
+   abs
+   d# 125 * d# 10 / 5 >>
+   over 0<  if  negate  then
+;
+
+h# 90 buffer: logstr
+: >sd
+   <# "  " hold$ u#s u#>
+;
+
+: >sdx
+   <# "  " hold$ u#s " 0x" hold$ u#>
+;
+
+: bat-lfp-dataf@
+      base @ >r 
+      0 logstr c!
+
+      decimal
+      now drop <# " :" hold$ u#s u#> logstr $cat  <# "  " hold$ u#s u#> logstr $cat   \ Running time
+      h# 10 bat-b@        \ SOC
+      >sd logstr $cat
+
+      hex
+      h# e0 ec-ram@       \ C state
+      >sdx logstr $cat
+      h# e1 ec-ram@       \ w1 state index
+      >sdx logstr $cat  
+      h# F780 ec@         \ w1 state
+      >sdx logstr $cat
+      h# 40 ec-ram@       \ pwr_flag
+      >sdx logstr $cat
+      h# a4 ec-ram@       \ bat_status
+      >sdx logstr $cat
+      h# a5 ec-ram@       \ chg status
+      >sdx logstr $cat
+      h# a6 ec-ram@       \ bat misc
+      >sdx logstr $cat
+      h# a7 ec-ram@       \ bat misc2
+      >sdx logstr $cat
+      h# 70 bat-b@        \ AbnormalCauseCode
+      >sdx logstr $cat
+
+      decimal
+      h# 54 bat-b@ 8 << h# 55 bat-b@ or s16>s32    \ ACR
+      bg-acr>mAh >sd.dd logstr $cat "  " logstr $cat
+      h# 00 bat-b@ 8 << h# 01 bat-b@ or s16>s32    \ V
+      bg-V>V >sd.ddd logstr $cat "  " logstr $cat
+      h# 02 bat-b@ 8 << h# 03 bat-b@ or s16>s32    \ I
+      bg-I>mA >sd.dd logstr $cat "  " logstr $cat
+      h# 06 bat-b@ 8 << h# 07 bat-b@ or            \ Temp
+      bg-temp>degc >sd.dd logstr $cat "  " logstr $cat
+\      h# 17 bat-b@ 8 << h# 18 bat-b@ or            \ NiMh Chargetime
+\      >sd logstr $cat
+
+      \ Chemistry specific stuff below here
+      h# 11 bat-b@        \ bat_state
+      >sd logstr $cat
+
+      hex
+      h# FBD1 ec@          \ ProcessBatteryCharge
+      >sdx logstr $cat
+      h# FBD0 ec@          \ ChargeFlowControl
+      >sdx logstr $cat
+
+      r> base !
+;
+
+: bat-debug
+   begin
+      bat-lfp-dataf@
+      logstr count type
+      cr
+      200 ms key?
+   until key drop 
+;
+
+: bat-debug-log
+   " disk:\batdbug.log" $new-file
+   begin
+      bat-lfp-dataf@
+      logstr count ftype
+      logstr count type
+      fcr
+      cr
+      200 ms key?
+   until key drop 
+   ofd @ fclose
+;
+
 dev /
 new-device
 " battery" device-name




More information about the openfirmware mailing list