[openfirmware] [commit] r2558 - dev/olpc/cafecamera

repository service svn at openfirmware.info
Sat Oct 1 19:45:39 CEST 2011


Author: wmb
Date: Sat Oct  1 19:45:39 2011
New Revision: 2558
URL: http://tracker.coreboot.org/trac/openfirmware/changeset/2558

Log:
OLPC XO-1 - Changed camera driver to use the shared common code for the Omnivision sensor and the selftest infrastructure.

Added:
   dev/olpc/cafecamera/platform.fth
Modified:
   dev/olpc/cafecamera/cafecamera.bth
   dev/olpc/cafecamera/cafecamera.fth

Modified: dev/olpc/cafecamera/cafecamera.bth
==============================================================================
--- dev/olpc/cafecamera/cafecamera.bth	Sat Oct  1 19:44:26 2011	(r2557)
+++ dev/olpc/cafecamera/cafecamera.bth	Sat Oct  1 19:45:39 2011	(r2558)
@@ -9,7 +9,10 @@
 
 FCode-version2
 
+fload ${BP}/dev/olpc/cafecamera/platform.fth
+fload ${BP}/dev/olpc/ov7670.fth
 fload ${BP}/dev/olpc/cafecamera/cafecamera.fth
+fload ${BP}/dev/olpc/cameratest.fth
 
 end0
 

Modified: dev/olpc/cafecamera/cafecamera.fth
==============================================================================
--- dev/olpc/cafecamera/cafecamera.fth	Sat Oct  1 19:44:26 2011	(r2557)
+++ dev/olpc/cafecamera/cafecamera.fth	Sat Oct  1 19:45:39 2011	(r2558)
@@ -1,331 +1,6 @@
 \ See license at end of file
 purpose: Driver for the CMOS camera
 
-headers
-hex
-
-" camera" device-name
-" olpc,camera" model
-" camera" device-type
-" olpc,camera" " compatible" string-property
-" OV7670" " sensor" string-property
-
-h# 4000 constant /regs
-
-my-address my-space               encode-phys
-    0 encode-int encode+  h# 0 encode-int encode+
-
-my-address my-space h# 200.0010 + encode-phys encode+
-    0 encode-int encode+  /regs encode-int encode+
-
-" reg" property
-
-
-: my-w@  ( offset -- w )  my-space +  " config-w@" $call-parent  ;
-: my-w!  ( w offset -- )  my-space +  " config-w!" $call-parent  ;
-
-0 instance value chip
-
-: cl!  ( l adr -- )  chip + rl!  ;
-: cl@  ( adr -- l )  chip + rl@  ;
-
-: map-regs ( -- )
-   0 0  h# 0200.0010 my-space +  /regs " map-in" $call-parent to chip
-   4 my-w@  6 or  4 my-w!
-;
-
-: unmap-regs  ( -- )
-   chip /regs " map-out" $call-parent
-\   4 my-w@  6 invert and  4 my-w!  \ No need to turn it off
-;
-
-\ ======================= OV7670 SMBUS operations ==========================
-
-\ cafe_smbus_xfer
-
-h# 42 2 << constant ov-sid
-
-: clr-smb-intr  ( -- )  7.0000 30 cl!  ;
-: smbus-wait  ( -- )
-   begin  28 cl@ 7.0000 and  until
-   1 ms				\ 20 usec delay
-;
-
-: ov@  ( reg -- data )
-   clr-smb-intr
-   ov-sid 87.fc01 or b8 cl!	\ TWSI control 0: id, 8-bit, clk
-   bc cl@ drop			\ Force write
-   d# 16 << 100.0000 or bc cl!	\ TWSI control 1: read, reg
-   smbus-wait
-   bc cl@ ff and
-;
-
-: ov!  ( data reg -- )
-   clr-smb-intr
-   ov-sid 8.7fc01 or b8 cl!	\ TWSI control 0: id, 8-bit, clk
-   bc cl@ drop			\ Force write
-   d# 16 << or bc cl!		\ TWSI control 1: read, reg
-   2 ms
-   smbus-wait
-   bc cl@ drop
-;
-
-: ovc  ( val adr -- )
-   2dup ov@      ( val reg# val actual )
-   tuck <>  if   ( val reg# actual )
-      ." Bad camera I2C value at " swap 2 u.r  ( val actual )
-      ."  expected " swap 2 u.r  ."  got " 2 u.r  cr    ( )
-   else          ( val reg# actual )
-      3drop      ( )
-   then          ( )
-;
-
-\ ============================= camera operations =============================
-
-false value ov7670-detected?
-
-: ((camera-init)  ( -- )
-   80 12 ov!			\ reset (reads back different)
-   01 11 ov!			\ 30 fps
-   04 3a ov!			\ UYVY or VYUY
-   00 12 ov!			\ VGA
-
-   \ Hardware window
-   13 17 ov!			\ Horiz start high bits
-   01 18 ov!			\ Horiz stop high bits
-   b6 32 ov!			\ HREF pieces
-   0a 19 ov!			\ Vert start high bits
-   7a 1a ov!			\ Vert stop high bits
-   0a 03 ov!			\ GAIN, VSTART, VSTOP pieces
-
-   \ Mystery scaling numbers
-   00 0c ov!			\ Control 3
-   00 3e ov!			\ Control 14
-   3a 70 ov!  35 71 ov!  11 72 ov!  f0 73 ov!
-   02 a2 ov!
-   00 15 ov!			\ Control 10
-
-   \ Gamma curve values
-   20 7a ov!  10 7b ov!  1e 7c ov!  35 7d ov!
-   5a 7e ov!  69 7f ov!  76 80 ov!  80 81 ov!
-   88 82 ov!  8f 83 ov!  96 84 ov!  a3 85 ov!
-   af 86 ov!  c4 87 ov!  d7 88 ov!  e8 89 ov!
-
-   \ AGC and AEC parameters
-   e0 13 ov!			\ Control 8
-   00 00 ov!			\ Gain lower 8 bits
-   40 0d ov!			\ Control 4 magic reserved bit
-   18 14 ov!			\ Control 9: 4x gain + magic reserved bit
-   05 a5 ov!			\ 50hz banding step limit
-   07 ab ov!			\ 60hz banding step limit
-   95 24 ov!			\ AGC upper limit
-   33 25 ov!			\ AGC lower limit
-   e3 24 ov!			\ AGC/AEC fast mode op region
-   78 9f ov!			\ Hist AEC/AGC control 1
-   68 a0 ov!			\ Hist AEC/AGC control 2
-   03 a1 ov!			\ Magic
-   d8 a6 ov!			\ Hist AEC/AGC control 3
-   d8 a7 ov!			\ Hist AEC/AGC control 4
-   f0 a8 ov!			\ Hist AEC/AGC control 5
-   90 a9 ov!			\ Hist AEC/AGC control 6
-   94 aa ov!			\ Hist AEC/AGC control 7
-   e5 13 ov!			\ Control 8
-
-   \ Mostly magic
-   61 0e ov!  4b 0f ov!  02 16 ov!  07 1e ov!
-   02 21 ov!  91 22 ov!  07 29 ov!  0b 33 ov!
-   0b 35 ov!  1d 37 ov!  71 38 ov!  2a 39 ov!
-   78 3c ov!  40 4d ov!  20 4e ov!  00 69 ov! 
-   4a 6b ov!  10 74 ov!  4f 8d ov!  00 8e ov!
-   00 8f ov!  00 90 ov!  00 91 ov!  00 96 ov!
-   00 9a ov!  84 b0 ov!  0c b1 ov!  0e b2 ov!
-   82 b3 ov!  0a b8 ov!
-
-   \ More magic, some of which tweaks white balance
-   0a 43 ov!  f0 44 ov!  34 45 ov!  58 46 ov!
-   28 47 ov!  3a 48 ov!  88 59 ov!  88 5a ov!
-   44 5b ov!  67 5c ov!  49 5d ov!  0e 5e ov!
-   0a 6c ov!  55 6d ov!  11 6e ov!
-   9f 6f ov!			\ 9e for advance AWB
-   40 6a ov!
-   40 01 ov!			\ Blue gain
-   60 02 ov!			\ Red gain
-   e7 13 ov!			\ Control 8
-
-   \ Matrix coefficients
-   80 4f ov!  80 50 ov!  00 51 ov!  22 52 ov!
-   5e 53 ov!  80 54 ov!  9e 58 ov!
-
-   08 41 ov!			\ AWB gain enable
-   00 3f ov!			\ Edge enhancement factor
-   05 75 ov!  e1 76 ov!  00 4c ov!  01 77 ov!
-   c3 3d ov!			\ Control 13
-   09 4b ov!  60 c9 ov!         \ Reads back differently
-   38 41 ov!			\ Control 16
-   40 56 ov!
-
-   11 34 ov!
-   12 3b ov!			\ Control 11
-   88 a4 ov!  00 96 ov!  30 97 ov!  20 98 ov!
-   30 99 ov!  84 9a ov!  29 9b ov!  03 9c ov!
-   5c 9d ov!  3f 9e ov!  04 78 ov!
-
-   \ Extra-weird stuff.  Some sort of multiplexor register
-   01 79 ov!  f0 c8 ov!
-   0f 79 ov!  00 c8 ov!
-   10 79 ov!  7e c8 ov!
-   0a 79 ov!  80 c8 ov!
-   0b 79 ov!  01 c8 ov!
-   0c 79 ov!  0f c8 ov!
-   0d 79 ov!  20 c8 ov!
-   09 79 ov!  80 c8 ov!
-   02 79 ov!  c0 c8 ov!
-   03 79 ov!  40 c8 ov!
-   05 79 ov!  30 c8 ov!
-   26 79 ov!
-
-   \ OVT says that rewrite this works around a bug in 565 mode.
-   \ The symptom of the bug is red and green speckles in the image.
-   01 11 ov!			\ 30 fps def 80
-;
-
-: config-check  ( -- )
-   01 11 ovc			\ 30 fps
-   04 3a ovc			\ UYVY or VYUY
-   ( 00 12 ovc )		\ VGA
-
-   \ Hardware window
-   13 17 ovc			\ Horiz start high bits
-   01 18 ovc			\ Horiz stop high bits
-   b6 32 ovc			\ HREF pieces
-   ( 0a 19 ovc )		\ Vert start high bits
-   7a 1a ovc			\ Vert stop high bits
-   0a 03 ovc			\ GAIN, VSTART, VSTOP pieces
-
-   \ Mystery scaling numbers
-   00 0c ovc			\ Control 3
-   00 3e ovc			\ Control 14
-   3a 70 ovc  35 71 ovc  11 72 ovc  f0 73 ovc
-   02 a2 ovc
-   00 15 ovc			\ Control 10
-
-   \ Gamma curve values
-   20 7a ovc  10 7b ovc  1e 7c ovc  35 7d ovc
-   5a 7e ovc  69 7f ovc  76 80 ovc  80 81 ovc
-   88 82 ovc  8f 83 ovc  96 84 ovc  a3 85 ovc
-   af 86 ovc  c4 87 ovc  d7 88 ovc  e8 89 ovc
-
-   \ AGC and AEC parameters
-   ( e0 13 ovc )		\ Control 8
-   ( 00 00 ovc )		\ Gain lower 8 bits
-   40 0d ovc			\ Control 4 magic reserved bit
-   ( 18 14 ovc )		\ Control 9: 4x gain + magic reserved bit
-   05 a5 ovc			\ 50hz banding step limit
-   07 ab ovc			\ 60hz banding step limit
-   ( 95 24 ovc )		\ AGC upper limit
-   33 25 ovc			\ AGC lower limit
-   e3 24 ovc			\ AGC/AEC fast mode op region
-   78 9f ovc			\ Hist AEC/AGC control 1
-   68 a0 ovc			\ Hist AEC/AGC control 2
-   03 a1 ovc			\ Magic
-   d8 a6 ovc			\ Hist AEC/AGC control 3
-   d8 a7 ovc			\ Hist AEC/AGC control 4
-   f0 a8 ovc			\ Hist AEC/AGC control 5
-   90 a9 ovc			\ Hist AEC/AGC control 6
-   94 aa ovc			\ Hist AEC/AGC control 7
-   ( e5 13 ovc	)		\ Control 8
-
-   \ Mostly magic
-   61 0e ovc  4b 0f ovc  02 16 ovc  07 1e ovc
-   02 21 ovc  91 22 ovc  07 29 ovc  0b 33 ovc
-   0b 35 ovc  1d 37 ovc  71 38 ovc  2a 39 ovc
-   78 3c ovc  40 4d ovc  20 4e ovc  00 69 ovc 
-   4a 6b ovc  10 74 ovc  4f 8d ovc  00 8e ovc
-   00 8f ovc  00 90 ovc  00 91 ovc  00 96 ovc
-   ( 00 9a ovc )  84 b0 ovc  0c b1 ovc  0e b2 ovc
-   82 b3 ovc  0a b8 ovc
-
-   \ More magic, some of which tweaks white balance
-   0a 43 ovc  f0 44 ovc  34 45 ovc  58 46 ovc
-   28 47 ovc  3a 48 ovc  88 59 ovc  88 5a ovc
-   44 5b ovc  67 5c ovc  49 5d ovc  0e 5e ovc
-   0a 6c ovc  55 6d ovc  11 6e ovc
-   9f 6f ovc			\ 9e for advance AWB
-   ( 40 6a ovc )
-   ( 40 01 ovc )		\ Blue gain
-   ( 60 02 ovc )		\ Red gain
-   e7 13 ovc			\ Control 8
-
-   \ Matrix coefficients
-   b3 4f ovc  b3 50 ovc  00 51 ovc  3d 52 ovc
-   a7 53 ovc  e4 54 ovc  9e 58 ovc
-
-   \ 08 41 ovc			\ AWB gain enable
-   ( 00 3f ovc )		\ Edge enhancement factor
-   05 75 ovc  e1 76 ovc  ( 00 4c ovc )  01 77 ovc
-   c0 3d ovc			\ Control 13
-   09 4b ovc  ( 60 c9 ovc )
-   38 41 ovc			\ Control 16
-   40 56 ovc
-
-   11 34 ovc
-   12 3b ovc			\ Control 11
-   88 a4 ovc  00 96 ovc  30 97 ovc  20 98 ovc
-   30 99 ovc  84 9a ovc  29 9b ovc  03 9c ovc
-   5c 9d ovc  3f 9e ovc  04 78 ovc
-
-;
-
-: camera-init  ( -- )
-   false to ov7670-detected?
-   ((camera-init)
-   1d ov@ 1c ov@  bwjoin 7fa2 <>  if  exit  then	\ Manufacturing ID
-    b ov@  a ov@  bwjoin 7673 <>  if  exit  then	\ Product ID
-   true to ov7670-detected?
-;
-
-\ VGA RGB565
-: init-rgb565  ( -- )
-   04 12 ov!				\ VGA, RGB565
-   00 8c ov!				\ No RGB444
-   00 04 ov!				\ Control 1
-   10 40 ov!				\ RGB565 output
-   38 14 ov!				\ 16x gain ceiling
-   b3 4f ov!				\ v-red
-   b3 50 ov!				\ v-green
-   00 51 ov!				\ v-blue
-   3d 52 ov!				\ u-red
-   a7 53 ov!				\ u-green
-   e4 54 ov!				\ u-blue
-   c0 3d ov!				\ Gamma enable, UV saturation auto adjust
-;
-
-: read-agc  ( -- n )
-   3 ov@  h# c0 and  2 lshift  0 ov@ or
-;
-
-: read-aec  ( -- n )
-   7 ov@  h# 3f and  d# 10 lshift
-   h# 10 ov@  2 lshift  or
-   4 ov@  3 and  or
-;
-
-: set-hw  ( vstop vstart hstop hstart -- )
-   dup  3 >> 17 ov!			\ Horiz start high bits
-   over 3 >> 18 ov!			\ Horiz stop high bits
-   32 ov@ swap 7 and or swap 7 and 3 << or 10 ms 32 ov!	\ Horiz bottom bits
-
-   dup  2 >> 19 ov!			\ Vert start high bits
-   over 2 >> 1a ov!			\ Vert start high bits
-   03 ov@ swap 3 and or swap 3 and 2 << or 10 ms 03 ov!	\ Vert bottom bits
-;
-
-: camera-config  ( -- )
-   ((camera-init)
-   init-rgb565
-   d# 490 d# 10 d# 14 d# 158 set-hw	\ VGA window info
-;
-
 \ =============================  cafe operations ==============================
 
 d# 640 constant VGA_WIDTH
@@ -444,15 +119,21 @@
 0 value buf-mask
 0 value buf-act
 : /string  ( adr len n -- adr' len' )  tuck - -rot + swap  ;
+
+\ Advance next-buf - modulo #dma-bufs - by the number of bits set in buf-mask
 : +next-buf  ( buf-mask -- )
    0 swap				( cnt buf-mask )
-   3 0  do  dup 1 and rot + swap 1 >>  loop  drop
-   next-buf + #dma-bufs mod to next-buf
+   #dma-bufs 0  do                      ( cnt buf-mask )
+      dup 1 and                         ( cnt buf-mask bit  )
+      rot +                             ( buf-mask cnt'  )
+      swap 1 >>                         ( cnt buf-mask' )
+   loop  drop                           ( cnt )
+   next-buf +  #dma-bufs mod  to next-buf  ( )
 ;
 : buf-done?  ( -- buf-mask )  28 cl@  2f 30 cl!  7 and  ;
-: read-buf  ( adr len i -- adr' len' )
+: read-buf  ( adr len buf# -- adr' len' )
    1 over << buf-mask and 0=  if  drop exit  then
-					( adr len i )
+					( adr len buf# )
    'dma-buf 2 pick 2 pick		( adr len dma-buf adr len )
    /dma-buf min dup >r move r>		( adr len len' )
    buf-act over + to buf-act		( adr len len' )
@@ -469,12 +150,60 @@
    buf-mask +next-buf
 ;
 
+0 value snap-next-buf
+: snap-buf-done?  ( -- false | buf true )
+   1 snap-next-buf lshift     ( bitmask )
+   dup  h# 28 cl@  and  if    ( bitmask )
+      h# 38 or  h# 30 cl!     ( )         \ Clear interrupts
+      snap-next-buf dup  1+ #dma-bufs mod  to snap-next-buf  ( buf# )
+      'dma-buf  true          ( buf true )
+   else                       ( bitmask )
+      drop false              ( flag )
+   then
+;
+
+: resync  ( -- )
+   \ Wait for the current frame to be ready
+   begin  snap-buf-done?  until  drop
+
+   \ Ack any buffers that are already ready
+   begin  snap-buf-done?  while  drop  repeat
+
+   \ Now when the next buffer is ready, it will be fresh
+;
+
+\ Clear out any stale buffers
+: xresync  ( -- )
+   \ Ack pending end-of-frames until there are none
+   begin  h# 28 cl@  7 and  dup  while  h# 30 cl!  repeat  drop
+
+   \ Now wait for a frame to become ready and set snap-next-buf to point to it
+   begin  h# 28 cl@  7 and  dup  0=  while  drop  repeat   ( mask )
+   3 0  do
+      dup 1 and  if
+         i to snap-next-buf
+         unloop exit
+      then
+      2/
+   loop
+   0 to snap-next-buf
+;
+
 external
 : write  ( adr len -- actual )  2drop 0  ;
 
 : read   ( adr len -- actual )
    buf-done? ?dup  if  (read)  else  2drop 0  then
 ;
+: snap  ( timeout -- true | buf false )
+   0  do
+      snap-buf-done?  if   ( buf )
+         false  unloop exit  ( -- buf false )
+      then
+      1 ms
+   loop
+   true
+;
 
 : open  ( -- flag )
    map-regs
@@ -492,93 +221,13 @@
    unmap-regs
 ;
 
-\ ============================= selftest operation ===========================
-
-d# 10,000 constant movie-time
-0 constant test-x
-0 constant test-y
-
-\ Thanks to Cortland Setlow (AKA Blaketh) for the autobrightness code
-\ and the full-screen + mirrored display.
-
-: autobright  ( -- )
-   read-agc 3 + 3 rshift  h# f min  " bright!" " $call-screen" evaluate
-;
-: full-brightness  ( -- )  h# f " bright!" " $call-screen" evaluate  ;
-
-: display-frame  ( adr -- )
-\   test-x test-y VGA_WIDTH VGA_HEIGHT " draw-rectangle" " $call-screen" evaluate
+: display-frame  ( buf -- )
    " expand-to-screen" " $call-screen" evaluate
-\  autobright
-;
-
-: timeout-read  ( adr len timeout -- actual )
-   >r 0 -rot r>  0  ?do			( actual adr len )
-      2dup read ?dup  if  3 roll drop -rot leave  then
-      1 ms
-   loop  2drop
-;
-
-: shoot-movie  ( -- error? )
-   /dma-buf #dma-bufs * dup dma-alloc swap	( adr len )
-   get-msecs movie-time + -rot			( timeout adr len )
-   begin
-      2dup read ?dup 0>  if			( timeout adr len actual )
-         VGA_WIDTH VGA_HEIGHT * 2* / 0  ?do  over display-frame  loop
-      else
-         1 ms
-      then					( timeout adr len )
-      get-msecs 3 pick u>
-   until					( timeout adr len )
-   dma-free drop false				( error? )
-;
-
-: shoot-still  ( -- error? )
-   /dma-buf dup dma-alloc tuck			( adr len adr )
-   /dma-buf d# 1,000 timeout-read 0>  if	( adr len )
-      over display-frame
-      false
-   else
-      true
-   then						( adr len error? )
-   -rot dma-free				( error? )
-;
-
-: mirrored  ( -- )  h# 1e ov@  h# 20 or  h# 1e ov!  ;
-: unmirrored  ( -- )  h# 1e ov@  h# 20 invert and  h# 1e ov!  ;
-
-: selftest  ( -- error? )
-   open 0=  if  true exit  then
-   unmirrored  shoot-still  ?dup  if  close exit  then	( error? )
-   d# 1,000 ms
-   mirrored   shoot-movie  full-brightness		( error? )
-   close						( error? )
-;
-
-: dump-regs  ( run# -- )
-   0 d# 16 " at-xy" eval
-   ." Pass " .d
-   key upc  h# 47 =  if ." Good" else  ." Bad" then cr  \ 47 is G
-
-   ."        0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f" cr
-   ."       -----------------------------------------------" cr
-   h# ca 0  do
-      i 2 u.r ." :  "
-      i h# 10 bounds  do
-         i h# ca <  if  i ov@ 3 u.r   then
-      loop
-      cr
-   h# 10 +loop
-;
-
-: xselftest  ( -- error? )
-   open 0=  if  true exit  then
-   h# 10 0 do
-      shoot-still  drop  d# 500 ms  camera-config  config-check
-      i dump-regs
-   loop
-   0 close					( error? )
+\   test-x test-y VGA_WIDTH VGA_HEIGHT " draw-rectangle" " $call-screen" evaluate
 ;
+: start-display  ( -- )  ;
+: stop-display  ( -- )  ;
+false constant camera-blocked?
 
 \ Do this at probe time to make sure the camera power is off
 map-regs

Added: dev/olpc/cafecamera/platform.fth
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dev/olpc/cafecamera/platform.fth	Sat Oct  1 19:45:39 2011	(r2558)
@@ -0,0 +1,94 @@
+\ See license at end of file
+purpose: Platform specifics for OLPC Camera on XO-1
+
+headers
+hex
+
+" camera" device-name
+" olpc,camera" model
+" camera" device-type
+" olpc,camera" " compatible" string-property
+
+h# 4000 constant /regs
+
+my-address my-space               encode-phys
+    0 encode-int encode+  h# 0 encode-int encode+
+
+my-address my-space h# 200.0010 + encode-phys encode+
+    0 encode-int encode+  /regs encode-int encode+
+
+" reg" property
+
+: my-w@  ( offset -- w )  my-space +  " config-w@" $call-parent  ;
+: my-w!  ( w offset -- )  my-space +  " config-w!" $call-parent  ;
+
+0 instance value chip
+
+: cl!  ( l adr -- )  chip + rl!  ;
+: cl@  ( adr -- l )  chip + rl@  ;
+
+: map-regs ( -- )
+   0 0  h# 0200.0010 my-space +  /regs " map-in" $call-parent to chip
+   4 my-w@  6 or  4 my-w!
+;
+
+: unmap-regs  ( -- )
+   chip /regs " map-out" $call-parent
+\   4 my-w@  6 invert and  4 my-w!  \ No need to turn it off
+;
+
+h# 42 2 << constant ov-sid
+
+: clr-smb-intr  ( -- )  7.0000 30 cl!  ;
+: smbus-wait  ( -- )
+   begin  28 cl@ 7.0000 and  until
+   1 ms				\ 20 usec delay
+;
+
+: ov@  ( reg -- data )
+   clr-smb-intr
+   ov-sid 87.fc01 or b8 cl!	\ TWSI control 0: id, 8-bit, clk
+   bc cl@ drop			\ Force write
+   d# 16 << 100.0000 or bc cl!	\ TWSI control 1: read, reg
+   smbus-wait
+   bc cl@ ff and
+;
+
+: ov!  ( data reg -- )
+   clr-smb-intr
+   ov-sid 8.7fc01 or b8 cl!	\ TWSI control 0: id, 8-bit, clk
+   bc cl@ drop			\ Force write
+   d# 16 << or bc cl!		\ TWSI control 1: read, reg
+   2 ms
+   smbus-wait
+   bc cl@ drop
+;
+
+\ This must be headerless so evaluate won't find this version
+headerless
+: confirm-selftest?  ( -- flag )  " confirm-selftest?" evaluate  ;
+headers
+
+\ LICENSE_BEGIN
+\ Copyright (c) 2011 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



More information about the openfirmware mailing list