[openfirmware] [commit] r3468 - cpu/arm/olpc
repository service
svn at openfirmware.info
Mon Dec 3 08:07:43 CET 2012
Author: wmb
Date: Mon Dec 3 08:07:43 2012
New Revision: 3468
URL: http://tracker.coreboot.org/trac/openfirmware/changeset/3468
Log:
OLPC XO-4 - Improved access methods for HDMI EDID info.
Modified:
cpu/arm/olpc/gpio-i2c.fth
Modified: cpu/arm/olpc/gpio-i2c.fth
==============================================================================
--- cpu/arm/olpc/gpio-i2c.fth Mon Dec 3 08:05:56 2012 (r3467)
+++ cpu/arm/olpc/gpio-i2c.fth Mon Dec 3 08:07:43 2012 (r3468)
@@ -42,7 +42,7 @@
0 0 encode-bytes
cam-sda-gpio# 0 encode-gpio
- cam-scl-gpio# 0 encode-gpio
+ cam-scl-gpio# 0 encode-gpio
" gpios" property
0 instance value slave-address
@@ -144,22 +144,59 @@
" hdmi-ddc" device-name
h# 50 1 reg
: close ( -- ) ;
- h# 100 buffer: hdmi-edid
-
- : get-edid ( -- adr len )
- hdmi-edid h# 100 0 " i2c-read" $call-parent
- hdmi-edid h# 100
+ h# 80 constant /edid-chunk
+ 0 value edid
+ 0 value /edid
+
+ : release-edid ( -- )
+ edid /edid free-mem ( )
+ 0 to /edid 0 to edid ( )
;
+
: open ( -- okay? )
my-unit " set-address" $call-parent
- hdmi-edid h# 100 0 " i2c-read" ['] $call-parent catch if
- 2drop 3drop false
- else
- true
+ /edid-chunk to /edid
+ /edid alloc-mem to edid
+
+ edid /edid 0 " i2c-read" ['] $call-parent catch if ( x x x x x )
+ 2drop 3drop ( )
+ release-edid false exit ( -- false )
+ then
+
+ \ Basic sanity check to make sure it's an EDID
+ edid " "(00ffffffffffff00)" comp if ( )
+ release-edid false exit ( -- false )
then
+
+ \ We could (should) do a checksum here...
+
+ \ If there are no extensions, exit now, successfully
+ edid d# 126 + c@ dup 0= over h# ff = or if ( #exts )
+ drop true exit ( -- true )
+ then ( #exts )
+
+ \ Otherwise make the buffer larger to accomodate the extensions ...
+ 1+ /edid-chunk * to /edid ( )
+ edid /edid resize-memory if ( adr' )
+ drop ( )
+ 0 to /edid 0 to edid ( )
+ false exit ( )
+ then ( adr )
+ to edid ( )
+
+ \ ... and read the extensions
+ edid /edid /edid-chunk /string /edid-chunk ( adr len offset )
+ " i2c-read" ['] $call-parent catch if ( x x x x x )
+ 2drop 3drop ( )
+ release-edid false exit ( -- false )
+ then
+
+ true
;
- : edid$ ( -- adr len ) hdmi-edid h# 100 ;
+ : edid$ ( -- adr len ) edid /edid ;
finish-device
finish-device
[then]
device-end
+
+devalias i2c6 /hdmi-i2c
More information about the openfirmware
mailing list