[openfirmware] [commit] r3244 - cpu/arm/mmp3

repository service svn at openfirmware.info
Wed Aug 29 10:44:31 CEST 2012


Author: quozl
Date: Wed Aug 29 10:44:31 2012
New Revision: 3244
URL: http://tracker.coreboot.org/trac/openfirmware/changeset/3244

Log:
OLPC XO-4 - thermal sensor rework

Modified:
   cpu/arm/mmp3/thermal.fth

Modified: cpu/arm/mmp3/thermal.fth
==============================================================================
--- cpu/arm/mmp3/thermal.fth	Wed Aug 29 07:58:31 2012	(r3243)
+++ cpu/arm/mmp3/thermal.fth	Wed Aug 29 10:44:31 2012	(r3244)
@@ -47,12 +47,6 @@
    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 )
 ;
@@ -64,8 +58,32 @@
    h# a0 ts-clock
 ;
 
-: ts-start  ( n -- )
-   dup ts@  h# 4000.0000 or  swap ts!
+h# 03.b000 value tsense  \ p2021
+
+: +ts  ( offset -- io-offset )  tsense swap la+  ;
+: ts@  ( offset -- l )  +ts io@  ;
+: ts!  ( l offset -- )  +ts io!  ;
+
+\ last system reset was caused by thermal sensor?
+\ : tsr?  ( -- flag )  h# 0028 mpmu@  h# 10  and  ;  \ p282
+\ : tsr?  ( -- flag )  h# 1028 mpmu@  h# 10  and  ;  \ p311
+
+\ last thermal sensor watchdog reset was caused by THSENS1 unit?
+\ (polarity differs from documentation)
+\ : thsens1?  ( -- flag )  h# 00a4 mpmu@  h# 10  and  ;  \ p345
+
+\ thsens1 is requesting interrupt service?  (true if auto run enabled)
+\ : thsens1-int?  ( -- flag )  h# 00a4 mpmu@  h#  1  and  ;  \ p346
+
+\ thermal sensor interrupt is masked?  (normally true)
+\ : thsens1-int-masked?  h# 180 icu@  800 and  ;  \ p700
+\ : thsens1-int-status?  h# 188 icu@  800 and  ;  \ p702
+
+\ thermal sensor watchdog to system reset enable  (normally already set)
+\ : wdtr?  h# 200 mpmu@ 1 7 lshift and 0=  ;  \ p302
+
+: ts-auto-read  ( n -- )  \ undocumented
+   dup ts@  h# 20.0000 or  swap ts!
 ;
 
 : ts-wait  ( n -- )
@@ -80,8 +98,7 @@
 
 : ts-read  ( n -- gc )
    dup ts-wait          ( n )
-   dup ts@              ( n gc )
-   swap ts-start        ( gc )
+   ts@                  ( gc )
 ;
 
 : ts-range-low  ( n -- )
@@ -92,33 +109,28 @@
    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
+: ts-watchdog-enable  ( n -- )
+   dup ts@  h# 0400.0300 or  swap ts!  \ 85-87.5C
 ;
 
-\ switch the sensors out of low range - does not work
-[ifdef] notyet
-: hot
+: init-thermal-sensor  ( -- )
    ts-clocks
-   3 0 do  i ts-range-high  i ts-start  loop
+   0 ts-range-high
+   0 ts-watchdog-enable
+   1 ts-range-low
+   2 ts-range-low
+   3 0 do  i ts-auto-read  loop
 ;
-[then]
 
-\ read and average the three sensors
+\ read and average the two sensors on lowrange duty
 : cpu-temperature  ( -- celcius )
-   0 ts-read  gc>c
    1 ts-read  gc>c
    2 ts-read  gc>c
-   + + d# 30 /
+   + d# 20 /
 ;
 
 : ?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.
+   0 ts-read  gc>c  d# 850 > abort " CPU too hot"
 ;
 
 : .c.c  ( n -- )  0 <# # [char] . hold #s #> type ." C " ;
@@ -129,9 +141,9 @@
    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?
+   0 ts@  dup h# f and 0=  if  drop ." <80C "  else  gc>c  .c.c  then
+   1 ts@  gc>c  .c.c  \ FIXME: show <n and >n too here
+   2 ts@  gc>c  .c.c
    ." cpu: "  cpu-temperature  .c
    ." battery: "  bat-temp  .c
    pop-base
@@ -143,6 +155,74 @@
    until key drop cr
 ;
 
+\ .thermal 0 ts@ f and . d# 1000 ms cr many
+
+string-array tsense-regx-bits
+   ," 31=reserved"
+   ," 30=start"
+   ," 29=status"
+   ," 28=over_int"
+   ," 27=lowrange"
+   ," 26=en_wdog"
+   ," 25=temp_int"
+   ," 24=en_over_int"
+   ," 23=en_temp_int"
+   ," 22=reserved"
+   ," 21=auto_read_en"
+end-string-array
+
+: .tc  ( n -- )
+   dup .
+   push-decimal
+   gc>c .c.c
+   pop-base
+;
+
+: .tsense  ( n -- )
+   dup . cr 4 spaces
+   d# 11 0 do
+      dup i lshift h# 8000.0000 and if
+         i tsense-regx-bits count type space
+      then
+   loop cr
+   \ dup d# 12 rshift h# 7ff and dup if 4 spaces ." reserved=" . cr else drop then
+   4 spaces dup 8 rshift h# f and ." wdog_tshld=" .tc cr
+   4 spaces dup 4 rshift h# f and ." int_tshld=" .tc cr
+   4 spaces dup          h# f and ." temp_value=" .tc cr
+   drop
+;
+
+: .ts
+   0 ts@ ." tsense_reg[0]=" .tsense
+   1 ts@ ." tsense_reg[1]=" .tsense
+   2 ts@ ." tsense_reg[2]=" .tsense
+;
+
+: test-thermal
+   ." press against heat spreader and press a key once temperature is low"
+   watch-thermal
+   h# 200 mpmu@ 1 7 lshift and 0=  if
+      ." THRSENS_WDTR_EN was not set" cr
+      h# 200 mpmu@ 1 7 lshift or h# 200 mpmu!
+   then
+   0 ts@
+   1 d# 27 lshift or  \ set the lowrange bit
+   h# 0020.0000 or    \ set the autorun bit (undocumented)
+   h# 0400.0000 or    \ set the watchdog enable bit
+   h# b h# f and d# 8 lshift or       \ set the watchdog temperature (58-60.5C)
+   b# 0101.1111.1010.0000.0000.1111.1111.0000
+   and \ always write zero to reserved bits
+   0 ts!
+   ." thermal watchdog enabled" cr
+   watch-thermal
+;
+
+: force-thermal-watchdog
+   h# 200 mpmu@ 1 7 lshift or h# 200 mpmu! \ thrsens_wdtr_en
+   h# 0c20.0000 h# 03.b000 io! \ lowrange, en_wdog, auto_read_en, wdog_tshld 26C
+;
+
+
 [ifdef] notyet \ FIXME
 : test-thermal
    .thermal cr



More information about the openfirmware mailing list