[openfirmware] [commit] r3496 - dev/olpc/dcon

repository service svn at openfirmware.info
Fri Dec 14 08:32:28 CET 2012


Author: quozl
Date: Fri Dec 14 08:32:27 2012
New Revision: 3496
URL: http://tracker.coreboot.org/trac/openfirmware/changeset/3496

Log:
OLPC XO-1.75 XO-4 - fix DCON unfreeze glitch in "test /display", #12394, but needs review; calling screen wake and sleep from /dcon seems ugly.

Modified:
   dev/olpc/dcon/mmp2dcon.fth

Modified: dev/olpc/dcon/mmp2dcon.fth
==============================================================================
--- dev/olpc/dcon/mmp2dcon.fth	Fri Dec 14 08:25:26 2012	(r3495)
+++ dev/olpc/dcon/mmp2dcon.fth	Fri Dec 14 08:32:27 2012	(r3496)
@@ -59,6 +59,20 @@
 : dcon@  ( reg# -- word )  " reg-w@" $call-parent  ;
 : dcon!  ( word reg# -- )  " reg-w!" $call-parent  ;
 
+: mode@    ( -- mode )    1 dcon@  ;
+: mode!    ( mode -- )    1 dcon!  ;
+: hres!    ( hres -- )    2 dcon!  ;  \ def: h#  458 d# 1200
+: htotal!  ( htotal -- )  3 dcon!  ;  \ def: h#  4e8 d# 1256
+: hsync!   ( sync -- )    4 dcon!  ;  \ def: h# 1808 d# 24,8
+: vres!    ( vres -- )    5 dcon!  ;  \ def: h#  340 d# 900
+: vtotal!  ( htotal -- )  6 dcon!  ;  \ def: h#  390 d# 912
+: vsync!   ( sync -- )    7 dcon!  ;  \ def: h#  403 d# 4,3
+: timeout! ( to -- )      8 dcon!  ;  \ def: h# ffff
+: scanint! ( si -- )      9 dcon!  ;  \ def: h# 0000
+
+: scanint-on   ( -- )  mode@  h# 100 or  mode!  ;
+: scanint-off  ( -- )  mode@  h# 100 invert and  mode!  ;
+
 : dcon-load  ( -- )  dcon-load-gpio# gpio-set  ;
 : dcon-unload  ( -- )  dcon-load-gpio# gpio-clr  ;
 
@@ -72,12 +86,30 @@
 1 value vga? \ VGA
 0 value color? \ COLOUR
 
-d# 905 value resumeline  \ Configurable; should be set from args
-
-: wait-output  ( -- )  d# 40 ms  ;
-
+d# 850 value resumeline
 : mark-time  ( -- start-time )  get-msecs  ;
 : delta-ms  ( start-time -- elapsed-ms )  mark-time  swap -   ;
+
+: wait-output  ( -- )
+   mark-time                                            ( start-time )
+   resumeline scanint!  setup-dcon-irq  scanint-on      ( )
+   begin                                                ( start-time )
+      dcon-irq?  if                                     ( start-time )
+         setup-dcon-irq                                 ( start-time )
+         begin                                          ( start-time )
+            dcon-irq?  if                               ( start-time )
+               drop scanint-off exit                    ( )
+            then                                        ( start-time )
+            dup delta-ms  d# 100 >                      ( start-time )
+         until                                          ( start-time )
+      then                                              ( start-time )
+      dup delta-ms  d# 100 >                            ( start-time reached? )
+   until                                                ( start-time )
+   drop                                                 ( )
+   ." Timeout leaving DCON mode" cr                     ( )
+   scanint-off                                          ( )
+;
+
 : wait-dcon-mode  ( -- retry? )
    mark-time                            ( start-time )
    begin                                ( start-time )
@@ -103,23 +135,22 @@
    dup vga? =  if  drop exit  then  ( source )
    dup to vga?                      ( source )
    if
-\      unblank-display
-      d# 50 ms
-      wait-output
-      dcon-load  \ Put the DCON in VGA-refreshed mode
-      d# 25 ms   \ Ensure that that DCON sees the DCONLOAD high
-\      display-on
+      wait-output               \ Wait for the DCON to reach the scan line
+      " wake" $call-screen      \ Enable video signal from SoC
+      d# 5 ms
+      dcon-load                 \ Put the DCON in VGA-refreshed mode
+      d# 25 ms                  \ Ensure that that DCON sees the DCONLOAD high
    else
       has-dcon-ram?  if
          begin                             ( )
             setup-dcon-irq
             dcon-unload  \ Put the DCON in self-refresh mode
             wait-dcon-mode                 ( retry? )
-            \        display-off           ( retry? )
          while                             ( )
             \ We got a false ack from the DCON so start over from LOAD state
             dcon-load  d# 25 ms            ( )
          repeat                            ( )
+         " sleep" $call-screen
       then
    then
 ;
@@ -132,16 +163,6 @@
    ['] dcon!  catch  if  2drop  bus-reset  then
 ;
 
-: mode@    ( -- mode )    1 dcon@  ;
-: mode!    ( mode -- )    1 dcon!  ;
-: hres!    ( hres -- )    2 dcon!  ;  \ def: h#  458 d# 1200
-: htotal!  ( htotal -- )  3 dcon!  ;  \ def: h#  4e8 d# 1256
-: hsync!   ( sync -- )    4 dcon!  ;  \ def: h# 1808 d# 24,8
-: vres!    ( vres -- )    5 dcon!  ;  \ def: h#  340 d# 900
-: vtotal!  ( htotal -- )  6 dcon!  ;  \ def: h#  390 d# 912
-: vsync!   ( sync -- )    7 dcon!  ;  \ def: h#  403 d# 4,3
-: timeout! ( to -- )      8 dcon!  ;  \ def: h# ffff
-: scanint! ( si -- )      9 dcon!  ;  \ def: h# 0000
 [ifdef] old-way
 : dcon-bright!  ( level -- ) d# 10 dcon! ; \ def: h# xxxF
 ' dcon-bright!  to bright!
@@ -261,6 +282,16 @@
    then
 ;
 
+[ifdef] notdef
+: test-dcon-freeze-glitch
+   screen-ih remove-output
+   " gvsr" $call-screen
+   begin  dcon-freeze  dcon-unfreeze  key?  until  key drop
+   screen-ih add-output
+   page
+;
+[then]
+
 \ LICENSE_BEGIN
 \ Copyright (c) 2010 FirmWorks
 \ 



More information about the openfirmware mailing list