[openfirmware] [commit] r3224 - in cpu/arm: mmp3 olpc

repository service svn at openfirmware.info
Fri Aug 24 11:01:02 CEST 2012


Author: quozl
Date: Fri Aug 24 11:01:01 2012
New Revision: 3224
URL: http://tracker.coreboot.org/trac/openfirmware/changeset/3224

Log:
OLPC XO-4 - configure and read thermal sensor

Added:
   cpu/arm/mmp3/thermal.fth
Modified:
   cpu/arm/olpc/build-fw.fth

Added: cpu/arm/mmp3/thermal.fth
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ cpu/arm/mmp3/thermal.fth	Fri Aug 24 11:01:01 2012	(r3224)
@@ -0,0 +1,192 @@
+\ See license at end of file
+purpose: Driver for the MMP3 thermal sensor
+
+\ FIXME: characterise the observations using an IR thermometer,
+\ because the datasheet and the registers manual disagree on
+\ interpretation of these gray code values.
+
+create gc0 \ high range
+d#  780 w, \ 0000
+d#  830 w, \ 0001
+d#  855 w, \ 0010
+d#  805 w, \ 0011
+d#  955 w, \ 0100
+d#  930 w, \ 0101
+d#  880 w, \ 0110
+d#  905 w, \ 0111
+d#    0 w, \ 1000
+d# 1130 w, \ 1001
+d# 1080 w, \ 1010
+d# 1105 w, \ 1011
+d#  980 w, \ 1100
+d# 1005 w, \ 1101
+d# 1055 w, \ 1110
+d# 1030 w, \ 1111
+
+create gc1 \ low range
+d# 260 w, \ 0000
+d# 285 w, \ 0001
+d# 335 w, \ 0010
+d# 310 w, \ 0011
+d# 435 w, \ 0100
+d# 410 w, \ 0101
+d# 360 w, \ 0110
+d# 385 w, \ 0111
+d# 0 w,   \ 1000
+d# 610 w, \ 1001
+d# 560 w, \ 1010
+d# 585 w, \ 1011
+d# 460 w, \ 1100
+d# 485 w, \ 1101
+d# 535 w, \ 1110
+d# 510 w, \ 1111
+
+: gc>c  ( gray-code -- tenths-of-celcius )
+   dup h# 0800.0000 and                 ( gray-code low-range? )
+   if gc1 else gc0 then                 ( gray-code table )
+   swap h# f and wa+ w@
+;
+
+h# 03.b000 value tsense
+
+: +ts  ( offset -- io-offset )  tsense swap la+  ;
+: ts@  ( offset -- l )  +ts io@  ;
+: ts!  ( l offset -- )  +ts io!  ;
+
+: ts-clock  ( offset -- )
+   7 over apbc!  3 swap apbc!   ( n )
+;
+
+: ts-clocks
+   h# 90 ts-clock
+   h# 98 ts-clock
+   h# 9c ts-clock
+   h# a0 ts-clock
+;
+
+: ts-start  ( n -- )
+   dup ts@  h# 4000.0000 or  swap ts!
+;
+
+: ts-wait  ( n -- )
+   d# 10 get-msecs +                    ( n limit )
+   begin
+      over ts@  h# 2000.0000 and        ( n limit ready? )
+      if  2drop exit  then
+      dup get-msecs -  0<               ( n limit timeout? )
+   until                                ( n limit )
+   2drop                                ( )
+;
+
+: ts-read  ( n -- gc )
+   dup ts-wait          ( n )
+   dup ts@              ( n gc )
+   swap ts-start        ( gc )
+;
+
+: ts-range-low  ( n -- )
+   dup ts@  h# 0800.0000 or  swap ts!
+;
+
+: ts-range-high  ( n -- )
+   dup ts@  h# 0800.0000 invert and  swap ts!
+;
+
+: init-thermal-sensor  ( -- )
+   ts-clocks
+   3 0 do  i ts-range-low  i ts-start  loop
+;
+
+\ switch the sensors out of low range - does not work
+[ifdef] notyet
+: hot
+   ts-clocks
+   3 0 do  i ts-range-high  i ts-start  loop
+;
+[then]
+
+\ read and average the three sensors
+: cpu-temperature  ( -- celcius )
+   0 ts-read  gc>c
+   1 ts-read  gc>c
+   2 ts-read  gc>c
+   + + d# 30 /
+;
+
+: ?thermal  ( -- )
+   cpu-temperature d# 70 > abort " CPU too hot"
+   \ FIXME: choose an appropriate limit, because
+   \ - the sample unit easily reaches 61C,
+   \ - using the low range we can't see greater than 61C, and
+   \ - the high range doesn't actually work.
+;
+
+: .c.c  ( n -- )  0 <# # [char] . hold #s #> type ." C " ;
+
+: .c  ( n -- )  (.) type ." C " ;
+
+: .thermal
+   push-decimal
+   time&date >unix-seconds .
+   ." sensors: "
+   0 ts@  gc>c  .c.c  \ innermost?
+   1 ts@  gc>c  .c.c
+   2 ts@  gc>c  .c.c  \ outermost?
+   ." cpu: "  cpu-temperature  .c
+   ." battery: "  bat-temp  .c
+   pop-base
+;
+
+: watch-thermal
+   begin
+      .thermal cr d# 1000 ms key?
+   until key drop cr
+;
+
+[ifdef] notyet \ FIXME
+: test-thermal
+   .thermal cr
+
+   \ save the threshold set by cforth
+   thermal-base 4 + io@ >r
+
+   \ temporarily set the threshold close to current value
+   thermal-base io@  h# 3ff and  8 +  wd-thresh!
+
+   begin
+      (cr .thermal kill-line d# 500 ms key?
+   until key drop cr
+
+   \ restore the threshold
+   r> wd-thresh!
+   .thermal cr
+;
+[then]
+
+stand-init: Thermal sensor
+   init-thermal-sensor
+;
+
+\ LICENSE_BEGIN
+\ Copyright (c) 2012 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

Modified: cpu/arm/olpc/build-fw.fth
==============================================================================
--- cpu/arm/olpc/build-fw.fth	Fri Aug 24 05:22:48 2012	(r3223)
+++ cpu/arm/olpc/build-fw.fth	Fri Aug 24 11:01:01 2012	(r3224)
@@ -354,7 +354,11 @@
    extra-mem-va /extra-mem add-memory
 ;
 
+[ifdef] mmp3
+fload ${BP}/cpu/arm/mmp3/thermal.fth
+[else]
 fload ${BP}/cpu/arm/mmp2/thermal.fth
+[then]
 fload ${BP}/cpu/arm/mmp2/fuse.fth
 [ifdef] bsl-uart-base
 fload ${BP}/cpu/arm/olpc/bsl.fth



More information about the openfirmware mailing list