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

svn at openfirmware.info svn at openfirmware.info
Thu Oct 1 07:26:33 CEST 2009


Author: rsmith
Date: 2009-10-01 07:26:33 +0200 (Thu, 01 Oct 2009)
New Revision: 1381

Modified:
   cpu/x86/pc/olpc/charge.fth
   dev/olpc/kb3700/battery.fth
Log:
OLPC: Fix various batman bugs

The bat man code has a few problems with Gen 1.5.  The formatting also didn't handle negative number right.
Add new command 'bat-charge' which will force the charger on and then show vitals.



Modified: cpu/x86/pc/olpc/charge.fth
===================================================================
--- cpu/x86/pc/olpc/charge.fth	2009-09-25 01:54:20 UTC (rev 1380)
+++ cpu/x86/pc/olpc/charge.fth	2009-10-01 05:26:33 UTC (rev 1381)
@@ -29,11 +29,12 @@
       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
+      uvolt@ dup >sd, logstr $cat 100 /         ( V__.1mV ) 
+      cur@ dup >sd, logstr $cat   100 /         ( V_.1mV I__.1mA )
+       * drop                            ( W_mW ) 
+      bat-temp >sd, logstr $cat                 
+      bat-acr@ s16>s32 dup >sd, logstr $cat     
+      start-acr - bg-acr>mAh >sd.dd, logstr $cat
       r> base !
 ;
 

Modified: dev/olpc/kb3700/battery.fth
===================================================================
--- dev/olpc/kb3700/battery.fth	2009-09-25 01:54:20 UTC (rev 1380)
+++ dev/olpc/kb3700/battery.fth	2009-10-01 05:26:33 UTC (rev 1381)
@@ -123,7 +123,18 @@
 \ (stdout off) this will miss some state changes.
 \
 
-h# FA00 constant ec-rambase
+h# FA00  constant ec-rambase
+h# 20    constant ec-platformID
+
+h# FC00  constant ec-gpiobase
+h# 00    constant ec-gpiofs00 
+h# 12    constant ec-gpio-0A
+
+h# FE00  constant ec-pwmbase
+h# 08    constant ec-pwmhigh2
+h# 09    constant ec-pwmhigh3 
+h# 0A    constant ec-pwmhigh4
+
 : ec-ram@ ec-rambase + ec@ ;
 
 : next-bstate
@@ -134,11 +145,10 @@
 
 : see-bstate
         0 begin
-            next-bstate
-            dup 0 = if
-                  cr
-            then 
-            dup . key?
+         next-bstate dup . 
+         dup 4 = if
+            cr
+         then key? 
         until
 ;
 
@@ -155,11 +165,32 @@
         until
 ;
 
+\ Get platformID so we can decide if this is a gen 1 or gen 1.5
+: bat-pid@ ( -- id ) ec-platformID ec-ram@ ;
+
+\ Gen 1.5 Leds are PWM. In the interest of simplicity this just
+\ adjusts the pwm value rather than fully turning the led off because
+\ for off you have to disable the pwm and then set it to IO low.
+\ pwm value of 0x00 is the same as full scale.
+: bat-red-led-pwm-on ( -- ) h# ff ec-pwmbase ec-pwmhigh4 + ec! ;
+: bat-green-led-pwm-on ( -- ) h# ff ec-pwmbase ec-pwmhigh2 + ec! ;
+: bat-yellow-led-pwm-on ( -- ) bat-red-led-pwm-on bat-green-led-pwm-on ;
+: bat-red-led-pwm-off ( -- ) h# 01 ec-pwmbase ec-pwmhigh4 + ec! ;
+: bat-green-led-pwm-off ( -- ) h# 01 ec-pwmbase ec-pwmhigh2 + ec! ;
+: bat-yellow-led-pwm-off ( -- ) bat-red-led-pwm-off bat-green-led-pwm-off ;
+
+\ On XO 1 we just clear the IO on Gen 1.5 its bit more complex
+: bat-chg-led-off 
+   bat-pid@ h# cf > if bat-yellow-led-pwm-off else 
+      fc24 ec@ 03 or fc24 ec!
+   then  
+;
+
 \ 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! ;
+: bat-disable-charge ( -- ) fc21 ec@ 40 invert and fc21 ec! bat-chg-led-off ;
 
 \ Turn on the trickle charge with max system voltage
 : bat-enable-trickle ( -- ) fc23 ec@ 1 or fc23 ec! 01 fc24 ec! ;
@@ -470,40 +501,45 @@
    r> base !
 ;
 
+\ Retrieve the key battery stats in bulk and put it on the stack
+\ sign extending the values that are 2's complement.
+: bg-charge-info@
+   ds-bank-buf 6 h# 0c 1w-read         ( )
+   ds-bank-buf c@ 8 <<              ( voltage_msb )
+   ds-bank-buf 1 + c@ or s16>s32    ( voltage )
+   ds-bank-buf 2 + c@ 8 <<          ( voltage current_msb )
+   ds-bank-buf 3 + c@ or s16>s32    ( voltage current )
+   ds-bank-buf 4 + c@ 8 <<          ( voltage current ACR_msb )
+   ds-bank-buf 5 + c@ or s16>s32    ( voltage current ACR )
+;
+
 : >sd.ddd  ( n -- formatted )
    base @ >r  decimal
-   dup abs <# u# u# u# [char] . hold u#s rot sign u#>
+   dup abs <# u# u# u# [char] . hold u# u#s swap sign u#>
    r> base !
 ;
 
 : >sd.dd  ( n -- formatted )
    base @ >r  decimal
-   dup abs <# u# u# [char] . hold u#s rot sign u#>
+   dup abs <# u# u# [char] . hold u# u#s swap sign u#>
    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 >>
+   3 >>a
    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
@@ -515,6 +551,11 @@
    <# "  " hold$ u#s " 0x" hold$ u#>
 ;
 
+\ Read values directly rather than using the ec-cmd
+
+: bat-I@ ( -- rawI ) h# 02 bat-b@ 8 << h# 03 bat-b@ or s16>s32 ;
+: bat-V@ ( -- rawV ) h# 00 bat-b@ 8 << h# 01 bat-b@ or s16>s32 ;
+
 : bat-lfp-dataf@
       base @ >r 
       0 logstr c!
@@ -545,14 +586,15 @@
       >sdx logstr $cat
 
       decimal
+      bat-V@ bg-V>V >sd.ddd logstr $cat "  " logstr $cat \ V
+      bat-I@ bg-I>mA >sd.dd logstr $cat "  " logstr $cat \ I
+
       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
 
@@ -569,6 +611,18 @@
       r> base !
 ;
 
+: .bg-acr ( raw_acr_in_s32 -- )
+   bg-acr>mAh >sd.dd type
+;
+
+: .bg-current ( raw_I_in_s32 -- )
+   bg-I>mA >sd.dd type
+;
+
+: .bg-volt ( raw_V_in_s32 -- )
+   bg-V>V >sd.ddd type
+;
+
 : bat-debug
    begin
       bat-lfp-dataf@
@@ -591,6 +645,27 @@
    ofd @ fclose
 ;
 
+
+0 value bg-last-acr
+0 value bg-v_avg
+
+: bat-charge ( -- )
+   batman-init?
+   bat-enable-charge
+   bg-acr@
+   begin
+      bg-charge-info@
+      dup to bg-last-acr
+      ." ACR:" .bg-acr ."  I:" .bg-current ."  V:"  .bg-volt
+      dup bg-last-acr swap - ."  Chg:" .bg-acr
+      cr
+      500 ms
+      key?
+   until
+   drop
+   bat-disable-charge
+;
+
 dev /
 new-device
 " battery" device-name




More information about the openfirmware mailing list