[openfirmware] [commit] r2162 - cpu/arm/mmp2
repository service
svn at openfirmware.info
Thu Feb 3 02:00:19 CET 2011
Author: wmb
Date: Thu Feb 3 02:00:19 2011
New Revision: 2162
URL: http://tracker.coreboot.org/trac/openfirmware/changeset/2162
Log:
OLPC XO-1.75 - Added a device node for the Marvell Armada 610 TWSI hardware.
Modified:
cpu/arm/mmp2/twsi.fth
Modified: cpu/arm/mmp2/twsi.fth
==============================================================================
--- cpu/arm/mmp2/twsi.fth Thu Feb 3 01:59:11 2011 (r2161)
+++ cpu/arm/mmp2/twsi.fth Thu Feb 3 02:00:19 2011 (r2162)
@@ -91,41 +91,32 @@
: twsi-get ( register-address .. #reg-bytes #data-bytes -- data-byte ... )
>r ( reg-adr .. #regs r: #data-bytes )
- \ Handle the case where the device does not require that a write register address be sent
- slave-address ( reg-adr .. #regs slave-address r: #data-bytes )
- over 0= if ( reg-adr .. #regs slave-address r: #data-bytes )
- r@ if ( reg-adr .. #regs slave-address r: #data-bytes )
- 1 or ( reg-adr .. #regs slave-address' r: #data-bytes )
- then ( reg-adr .. #regs slave-address' r: #data-bytes )
- then ( reg-adr .. #regs slave-address' r: #data-bytes )
-
- twsi-start ( reg-adr .. #regs r: #data-bytes )
-
- \ Abort the transaction if both #reg-bytes and #data-bytes are 0
- dup r@ or 0= if ( #regs r: #data-bytes )
- iue+scle bbu_ICR_MA or cr! ( #regs r: #data-bytes ) \ Master abort
- r> 2drop exit ( -- )
- then ( reg-adr .. #regs r: #data-bytes )
-
- \ Send register addresses, if any
- 0 ?do 0 twsi-putbyte loop ( r: #data-bytes )
-
- \ If no result data requested, quit now
- r> dup 0= if ( #data-bytes )
- drop ( )
- iue+scle bbu_ICR_STOP or cr! ( )
- exit
- then ( #data-bytes )
-
- \ Otherwise send the read address with another start bit
- slave-address 1 or bbu_ICR_START twsi-putbyte ( #data-bytes )
- sr@ sr! \ clear ITE and IRF status bits ( #data-bytes )
- \ Bug on line 367 of bbu_TWSI.s - writes SR without first reading it
-
- 1- 0 ?do 0 twsi-getbyte loop ( bytes )
-
- \ Set the stop bit on the final byte
- bbu_ICR_STOP bbu_ICR_ACKNAK or twsi-getbyte ( bytes )
+ ?dup if ( reg-adr .. #regs slave-address r: #data-bytes )
+ slave-address ( reg-adr .. #regs slave-address r: #data-bytes )
+ twsi-start ( reg-adr .. #regs r: #data-bytes )
+
+ \ Send register addresses
+ 0 ?do 0 twsi-putbyte loop ( r: #data-bytes )
+
+ \ If no result data requested, quit now
+ r@ 0= if ( r: #data-bytes )
+ r> drop ( )
+ iue+scle bbu_ICR_STOP or cr! ( )
+ exit
+ then ( r: #data-bytes )
+ then ( r: #data-bytes )
+
+ r> ?dup if ( #data-bytes )
+ \ Send the read address with a (or another) start bit
+ slave-address 1 or bbu_ICR_START twsi-putbyte ( #data-bytes )
+ sr@ sr! \ clear ITE and IRF status bits ( #data-bytes )
+ \ Bug on line 367 of bbu_TWSI.s - writes SR without first reading it
+
+ 1- 0 ?do 0 twsi-getbyte loop ( bytes )
+
+ \ Set the stop bit on the final byte
+ bbu_ICR_STOP bbu_ICR_ACKNAK or twsi-getbyte ( bytes )
+ then
;
: twsi-write ( byte .. #bytes -- )
@@ -137,3 +128,20 @@
: twsi-b@ ( reg -- byte ) 1 1 twsi-get ;
: twsi-b! ( byte reg -- ) 2 twsi-write ;
+
+0 0 " " " /" begin-package
+" twsi" name
+
+0 0 instance 2value child-address
+: open ( -- okay? ) true ;
+: close ( -- ) ;
+: set-address ( target channel -- ) to child-address ;
+2 " #address-cells" integer-property
+0 " #size-cells" integer-property
+: get ( #bytes -- bytes ... )
+ child-address set-twsi-target
+ 0 swap twsi-get
+;
+: decode-unit ( adr len -- low high ) parse-2int ;
+: encode-unit ( low high -- adr len ) >r <# u#s drop [char] , hold r> u#s u#> ;
+end-package
More information about the openfirmware
mailing list