Changeset 2880


Ignore:
Timestamp:
Feb 25, 2012, 5:55:45 PM (2 years ago)
Author:
wmb
Message:

OLPC - all versions - support new SETi image sensor.

Files:
2 added
14 edited

Legend:

Unmodified
Added
Removed
  • cpu/arm/olpc/smbus.fth

    r2726 r2880  
    1616: smb-data-dir-in  ( -- )  smb-data-gpio# gpio-dir-in  ; 
    1717 
     18: smb-start ( -- )  smb-clk-hi  smb-data-hi  smb-data-lo smb-clk-lo  ; 
     19: smb-stop  ( -- )  smb-clk-lo  smb-data-lo  smb-clk-hi  smb-data-hi  ; 
     20 
    1821h# 3500 constant smb-clk-timeout-us 
    1922\ Slave can flow control by holding CLK low temporarily 
     
    2225      smb-clk@  if  smb-dly  unloop exit  then  1 us 
    2326   loop 
     27   smb-stop 
    2428   true abort" I2C clock stuck low" 
    2529; 
    2630: smb-data-hi-w  ( -- )  smb-data-hi  smb-wait-clk-hi  ; 
    2731 
     32[ifdef] notdef 
    2833h# 3500 constant smb-data-timeout-us 
    2934: smb-wait-data-hi  ( -- ) 
     
    3136      smb-data@  if  unloop exit  then  1 us 
    3237   loop 
     38   smb-stop 
    3339   true abort" I2C data stuck low" 
    3440; 
     41[then] 
    3542 
    3643: smb-restart  ( -- ) 
     
    3845; 
    3946 
    40 : smb-start ( -- )  smb-clk-hi  smb-data-hi  smb-data-lo smb-clk-lo  ; 
    41 : smb-stop  ( -- )  smb-clk-lo  smb-data-lo  smb-clk-hi  smb-data-hi  ; 
    42  
    4347: smb-get-ack  ( -- ) 
    4448   smb-data-dir-in 
    4549   smb-data-hi 
    4650   smb-clk-hi smb-wait-clk-hi   
    47    smb-data@  \ drop            \ SCCB generates an don't care bit 
    48    if  smb-stop  true abort" I2c NAK" then 
    49    smb-clk-lo 
    50 \   smb-wait-data-hi 
    51    smb-data-dir-out 
     51   smb-data@           ( nak? ) 
     52 
     53   smb-clk-lo          ( nak? ) 
     54 
     55\ Empirically, the Omnivision image sensor sometimes fails to 
     56\ release the ACK until the next clock, so smb-wait-data-hi 
     57\ causes spurious failures. 
     58\  smb-wait-data-hi 
     59 
     60   smb-data-dir-out    ( nak? ) 
     61 
     62   if  smb-stop  true abort" I2c NAK"  then 
    5263; 
    5364: smb-bit  ( flag -- ) 
  • dev/olpc/cafecamera/cafecamera.bth

    r2558 r2880  
    1111 
    1212fload ${BP}/dev/olpc/cafecamera/platform.fth 
    13 fload ${BP}/dev/olpc/ov7670.fth 
     13fload ${BP}/dev/olpc/imagesensor.fth 
     14fload ${BP}/dev/olpc/seti.fth 
     15fload ${BP}/dev/olpc/ov7670.fth         \ Load last; most likely to be present 
    1416fload ${BP}/dev/olpc/cafecamera/cafecamera.fth 
    1517fload ${BP}/dev/olpc/cameratest.fth 
  • dev/olpc/cafecamera/cafecamera.fth

    r2558 r2880  
    6666 
    6767: read-setup  ( -- ) 
    68    camera-config 
     68   true camera-config   \ Always use RGB 
    6969   ctlr-config 
    7070   3f 30 cl!                            \ Clear pending interrupts 
     
    108108   40 dup cl@ 1000.0000 or swap cl!             \ power off 
    109109; 
    110 : init  ( -- ) 
    111    (init) 
    112    power-up 
    113    camera-init 
    114 ; 
    115110 
    116111 
     
    208203: open  ( -- flag ) 
    209204   map-regs 
    210    init 
    211    ov7670-detected? 0=  if  unmap-regs false exit  then 
     205   (init) 
     206   power-up 
     207   sensor-found? 0=  if  unmap-regs false exit  then 
    212208   alloc-dma-bufs 
    213209   read-setup 
  • dev/olpc/cafecamera/platform.fth

    r2558 r2880  
    3838; 
    3939 
    40 h# 42 2 << constant ov-sid 
     40h# 42 value camera-smb-slave 
     41: camera-smb-on  ( -- )  ; 
    4142 
    4243: clr-smb-intr  ( -- )  7.0000 30 cl!  ; 
     
    4647; 
    4748 
     49: set-slave  ( -- )  camera-smb-slave 2 lshift  87.fc01 or b8 cl!  ;    \ TWSI control 0: id, 8-bit, clk 
     50 
    4851: ov@  ( reg -- data ) 
    4952   clr-smb-intr 
    50    ov-sid 87.fc01 or b8 cl!     \ TWSI control 0: id, 8-bit, clk 
     53   set-slave 
    5154   bc cl@ drop                  \ Force write 
    5255   d# 16 << 100.0000 or bc cl!  \ TWSI control 1: read, reg 
     
    5760: ov!  ( data reg -- ) 
    5861   clr-smb-intr 
    59    ov-sid 8.7fc01 or b8 cl!     \ TWSI control 0: id, 8-bit, clk 
     62   set-slave 
    6063   bc cl@ drop                  \ Force write 
    6164   d# 16 << or bc cl!           \ TWSI control 1: read, reg 
  • dev/olpc/cameratest.fth

    r2556 r2880  
    99\ and the full-screen + mirrored display. 
    1010 
     11[ifdef] notdef 
     12\ This seemed like a good idea but in practice it was found to be confusing 
    1113: autobright  ( -- ) 
    1214   read-agc 3 + 3 rshift  h# f min  " bright!" " $call-screen" evaluate 
    1315; 
     16[then] 
     17 
    1418: full-brightness  ( -- )  h# f " bright!" " $call-screen" evaluate  ; 
    1519 
     
    4145   d# 300 ms 
    4246   start-display 
    43    unmirrored  resync                                   ( ) 
     47   false set-mirrored  resync                           ( ) 
    4448   shoot-still  ?dup  if  stop-display close exit  then ( error? ) 
    4549   d# 1,000 ms 
    46    mirrored  resync  shoot-movie  full-brightness       ( error? ) 
     50   true set-mirrored  resync  shoot-movie  full-brightness      ( error? ) 
    4751   stop-display close                                   ( error? ) 
    4852   ?dup  0=  if  confirm-selftest?  then                ( error? ) 
    4953; 
    5054 
     55[ifdef] notdef 
    5156: xselftest  ( -- error? ) 
    5257   open 0=  if  true exit  then 
     
    5762   0 close                                      ( error? ) 
    5863; 
     64[then] 
    5965 
    6066\ LICENSE_BEGIN 
  • dev/olpc/mmp2camera/ccic.fth

    r2556 r2880  
    4747h#        a0 constant rgb-format         \ RGB input (20) and output (80), no swapping 
    4848 
     490 value use-ycrcb? 
     50 
    4951: setup-image  ( -- ) 
    5052   VGA_WIDTH 2*  h# 24 cl!      \ 640*2 stride, UV stride in high bits = 0 
     
    7072 
    7173: read-setup  ( -- ) 
    72    camera-config 
     74   use-ycrcb? camera-config 
    7375   ctlr-config 
    7476     \ Clear all interrupts 
     
    98100   h# 40 cl@  h# 1000.0000 or  h# 40 cl!  \ Disable pads 
    99101   sensor-power-off 
    100 ; 
    101  
    102 : init  ( -- ) 
    103    power-on 
    104    camera-smb-setup  smb-on 
    105    camera-init 
    106102; 
    107103 
     
    146142: open  ( -- flag ) 
    147143   my-address my-space  h# 1000  " map-in" $call-parent  to camera-base 
    148    init 
     144   power-on 
     145   sensor-found?  0=  if  false exit  then 
    149146   my-args " yuv" $=  to use-ycrcb? 
    150    ov7670-detected? 0=  if  false exit  then 
    151147   alloc-dma-bufs 
    152148   read-setup 
  • dev/olpc/mmp2camera/loadpkg.fth

    r2556 r2880  
    2424 
    2525   fload ${BP}/dev/olpc/mmp2camera/platform.fth 
     26   fload ${BP}/dev/olpc/imagesensor.fth 
     27   warning @ warning off 
    2628   fload ${BP}/dev/olpc/ov7670.fth 
     29   fload ${BP}/dev/olpc/seti.fth                \ Load last; most likely to be present 
     30   warning ! 
    2731   fload ${BP}/dev/olpc/mmp2camera/ccic.fth 
    2832   fload ${BP}/dev/olpc/cameratest.fth 
  • dev/olpc/mmp2camera/platform.fth

    r2741 r2880  
    55hex 
    66 
     70 value camera-smb-slave 
    78: camera-smb-setup  ( -- ) 
    89   1 to smb-dly-us 
     
    1112\+ olpc-cl3   d#   4 to smb-clock-gpio# 
    1213\+ olpc-cl3   d#   5 to smb-data-gpio# 
    13    h# 42 to smb-slave 
     14   camera-smb-slave to smb-slave 
    1415; 
     16: camera-smb-on  ( -- )  camera-smb-setup  smb-on  ; 
    1517: ov@  ( reg -- data )  camera-smb-setup  smb-byte@  ; 
    1618: ov!  ( data reg -- )  camera-smb-setup  smb-byte!  ; 
  • dev/olpc/mmp2camera/smbus.fth

    r1992 r2880  
    114 value smb-dly-us 
     2 
     30 value smb-clock-gpio# 
     40 value smb-data-gpio# 
     5 
    26: smb-dly  smb-dly-us us  ; 
    3  
    4 0 value smb-data-gpio# 
    5 0 value smb-clk-gpio# 
    6  
    77: smb-data-hi  ( -- )  smb-data-gpio# gpio-set  smb-dly  ; 
    88: smb-data-lo  ( -- )  smb-data-gpio# gpio-clr  smb-dly  ; 
    9 : smb-clk-hi  ( -- )  smb-clk-gpio# gpio-set  smb-dly  ; 
    10 : smb-clk-lo  ( -- )  smb-clk-gpio# gpio-clr  smb-dly  ; 
     9: smb-clk-hi  ( -- )  smb-clock-gpio# gpio-set  smb-dly  ; 
     10: smb-clk-lo  ( -- )  smb-clock-gpio# gpio-clr  smb-dly  ; 
    1111: smb-data@  ( -- flag )  smb-data-gpio# gpio-pin@  ; 
    12 : smb-clk@  ( -- )  smb-clk-gpio# gpio-pin@  ; 
     12: smb-clk@  ( -- flag )  smb-clock-gpio# gpio-pin@  ; 
    1313: smb-off  ( -- )  smb-data-gpio# gpio-dir-in  ; 
    14 : smb-on  ( -- )  smb-data-gpio# gpio-dir-out  smb-clk-gpio# gpio-dir-out  ; 
     14: smb-on  ( -- )  smb-data-gpio# gpio-dir-out  smb-clock-gpio# gpio-dir-out  ; 
    1515: smb-data-dir-out  ( -- )  smb-data-gpio# gpio-dir-out  ; 
    1616: smb-data-dir-in  ( -- )  smb-data-gpio# gpio-dir-in  ; 
     17 
     18: smb-start ( -- )  smb-clk-hi  smb-data-hi  smb-data-lo smb-clk-lo  ; 
     19: smb-stop  ( -- )  smb-clk-lo  smb-data-lo  smb-clk-hi  smb-data-hi  ; 
    1720 
    1821h# 3500 constant smb-clk-timeout-us 
     
    2225      smb-clk@  if  smb-dly  unloop exit  then  1 us 
    2326   loop 
     27   smb-stop 
    2428   true abort" I2C clock stuck low" 
    2529; 
    2630: smb-data-hi-w  ( -- )  smb-data-hi  smb-wait-clk-hi  ; 
    2731 
     32[ifdef] notdef 
    2833h# 3500 constant smb-data-timeout-us 
    2934: smb-wait-data-hi  ( -- ) 
     
    3136      smb-data@  if  unloop exit  then  1 us 
    3237   loop 
     38   smb-stop 
    3339   true abort" I2C data stuck low" 
    3440; 
     41[then] 
    3542 
    3643: smb-restart  ( -- ) 
     
    3845; 
    3946 
    40 : smb-start ( -- )  smb-clk-hi  smb-data-hi  smb-data-lo smb-clk-lo  ; 
    41 : smb-stop  ( -- )  smb-clk-lo  smb-data-lo  smb-clk-hi  smb-data-hi  ; 
    42  
    4347: smb-get-ack  ( -- ) 
    4448   smb-data-dir-in 
    4549   smb-data-hi 
    4650   smb-clk-hi smb-wait-clk-hi   
    47    smb-data@  \ drop            \ SCCB generates an don't care bit 
    48    if  smb-stop  smb-data-dir-out  true abort" I2c NAK" then 
    49    smb-clk-lo 
    50 \   smb-wait-data-hi 
    51    smb-data-dir-out 
     51   smb-data@ cmb-clk-low       ( nak? ) 
     52   smb-data-dir-out            ( nak? ) 
     53   if  smb-stop  true abort" I2c NAK"  then 
    5254; 
    5355: smb-bit  ( flag -- ) 
  • dev/olpc/ov7670.fth

    r2556 r2880  
    22purpose: Omnivision OV7670 image sensor driver 
    33 
    4 " OV7670" " sensor" string-property 
    5  
    64\ ============================= camera operations ============================= 
    75 
    8 \ Check for the expected value 
    9 : ovc  ( val adr -- ) 
    10    2dup ov@      ( val reg# val actual ) 
    11    tuck <>  if   ( val reg# actual ) 
    12       ." Bad camera I2C value at " swap 2 u.r  ( val actual ) 
    13       ."  expected " swap 2 u.r  ."  got " 2 u.r  cr    ( ) 
    14    else          ( val reg# actual ) 
    15       3drop      ( ) 
    16    then          ( ) 
    17 ; 
    18  
    19 0 value use-ycrcb? 
    20  
    21 false value ov7670-detected? 
    22  
    23 : ((camera-init)  ( -- ) 
     6: set-hw  ( vstop vstart hstop hstart -- ) 
     7   dup  3 >> 17 ov!                     \ Horiz start high bits 
     8   over 3 >> 18 ov!                     \ Horiz stop high bits 
     9   32 ov@ swap 7 and or swap 7 and 3 << or 10 ms 32 ov! \ Horiz bottom bits 
     10 
     11   dup  2 >> 19 ov!                     \ Vert start high bits 
     12   over 2 >> 1a ov!                     \ Vert start high bits 
     13   03 ov@ swap 3 and or swap 3 and 2 << or 10 ms 03 ov! \ Vert bottom bits 
     14; 
     15 
     16\ VGA RGB565 
     17: ov7670-rgb565  ( -- ) 
     18   04 12 ov!                    \ VGA, RGB565 
     19   00 8c ov!                    \ No RGB444 
     20   00 04 ov!                    \ Control 1: CCIR601 (H/VSYNC framing) 
     21   10 40 ov!                    \ RGB565 output 
     22   38 14 ov!                    \ 16x gain ceiling 
     23   b3 4f ov!                    \ v-red 
     24   b3 50 ov!                    \ v-green 
     25   00 51 ov!                    \ v-blue 
     26   3d 52 ov!                    \ u-red 
     27   a7 53 ov!                    \ u-green 
     28   e4 54 ov!                    \ u-blue 
     29   c0 3d ov!                    \ Gamma enable, UV saturation auto adjust 
     30 
     31   \ OVT says that rewrite this works around a bug in 565 mode. 
     32   \ The symptom of the bug is red and green speckles in the image. 
     33   01 11 ov!                    \ 30 fps def 80  !! Linux doesn't do this 
     34; 
     35 
     36: ov7670-config  ( ycrcb? -- ) 
     37   >r                           ( r: ycrcb? ) 
     38 
    2439   80 12 ov!  2 ms              \ reset (reads back different) 
    2540   01 11 ov!                    \ 30 fps 
     
    122137   26 79 ov! 
    123138 
    124    \ OVT says that rewrite this works around a bug in 565 mode. 
    125    \ The symptom of the bug is red and green speckles in the image. 
    126 \   01 11 ov!                   \ 30 fps def 80  !! Linux doesn't do this 
     139   ( r: ycrcb? )  r>  0=  if  ov7670-rgb565  then   ( )  \ Possibly switch to RGB mode 
     140 
     141   d# 490 d# 10 d# 14 d# 158 set-hw     \ VGA window info 
     142; 
     143 
     144: ov7670-set-mirrored  ( mirrored? -- ) 
     145   h# 1e ov@  h# 20                     ( mirrored? reg-value bit ) 
     146   rot  if  or  else  invert and  then  ( reg-value' ) 
     147   h# 1e ov! 
     148; 
     149 
     150: probe-ov7670  ( -- found? ) 
     151   h# 42 to camera-smb-slave    ( )   \ Omnivision SMB ID 
     152   camera-smb-on 
     153 
     154   \ Try to read a byte of the manufacturing ID.  If the read fails, 
     155   \ the device is not present or not responding. 
     156   h# 1d ['] ov@ catch  if      ( x ) 
     157      drop                      ( ) 
     158      false exit                ( -- false ) 
     159   then                         ( id-low ) 
     160 
     161   \ Otherwise there is something at that SMB address; verify that 
     162   \ it has the correct ID. 
     163 
     164   h# 1c ov@  h# 0b ov@  h# 0a ov@  bljoin h# 7673.7fa2 <>   if     \ ProdID.MfgID 
     165      false exit                ( -- false ) 
     166   then                         ( ) 
     167 
     168   " OV7670" " sensor" string-property 
     169 
     170   ['] ov7670-set-mirrored to set-mirrored 
     171   ['] ov7670-config       to camera-config 
     172   true 
     173; 
     174 
     175\ Chain of sensor recognizers 
     176: sensor-found?  ( -- flag ) 
     177   probe-ov7670  if  true exit  then 
     178   sensor-found? 
     179; 
     180 
     181\ The rest is for debugging and testing 
     182[ifdef] notdef 
     183 
     184\ Check for the expected value 
     185: ovc  ( val adr -- ) 
     186   2dup ov@      ( val reg# val actual ) 
     187   tuck <>  if   ( val reg# actual ) 
     188      ." Bad camera I2C value at " swap 2 u.r  ( val actual ) 
     189      ."  expected " swap 2 u.r  ."  got " 2 u.r  cr    ( ) 
     190   else          ( val reg# actual ) 
     191      3drop      ( ) 
     192   then          ( ) 
    127193; 
    128194 
     
    212278   30 99 ovc  84 9a ovc  29 9b ovc  03 9c ovc 
    213279   5c 9d ovc  3f 9e ovc  04 78 ovc 
    214  
    215 ; 
    216  
    217 : camera-init  ( -- ) 
    218    false to ov7670-detected? 
    219    ((camera-init) 
    220    1d ov@ 1c ov@  bwjoin 7fa2 <>  if  exit  then        \ Manufacturing ID 
    221     b ov@  a ov@  bwjoin 7673 <>  if  exit  then        \ Product ID 
    222    true to ov7670-detected? 
    223 ; 
    224  
    225 \ VGA RGB565 
    226 : init-rgb565  ( -- ) 
    227    04 12 ov!                            \ VGA, RGB565 
    228    00 8c ov!                            \ No RGB444 
    229    00 04 ov!                            \ Control 1: CCIR601 (H/VSYNC framing) 
    230    10 40 ov!                            \ RGB565 output 
    231    38 14 ov!                            \ 16x gain ceiling 
    232    b3 4f ov!                            \ v-red 
    233    b3 50 ov!                            \ v-green 
    234    00 51 ov!                            \ v-blue 
    235    3d 52 ov!                            \ u-red 
    236    a7 53 ov!                            \ u-green 
    237    e4 54 ov!                            \ u-blue 
    238    c0 3d ov!                            \ Gamma enable, UV saturation auto adjust 
    239  
    240    \ OVT says that rewrite this works around a bug in 565 mode. 
    241    \ The symptom of the bug is red and green speckles in the image. 
    242    01 11 ov!                    \ 30 fps def 80  !! Linux doesn't do this 
    243280; 
    244281 
     
    251288   h# 10 ov@  2 lshift  or 
    252289   4 ov@  3 and  or 
    253 ; 
    254  
    255 : set-hw  ( vstop vstart hstop hstart -- ) 
    256    dup  3 >> 17 ov!                     \ Horiz start high bits 
    257    over 3 >> 18 ov!                     \ Horiz stop high bits 
    258    32 ov@ swap 7 and or swap 7 and 3 << or 10 ms 32 ov! \ Horiz bottom bits 
    259  
    260    dup  2 >> 19 ov!                     \ Vert start high bits 
    261    over 2 >> 1a ov!                     \ Vert start high bits 
    262    03 ov@ swap 3 and or swap 3 and 2 << or 10 ms 03 ov! \ Vert bottom bits 
    263 ; 
    264  
    265 : camera-config  ( -- ) 
    266    ((camera-init) 
    267    use-ycrcb?  0=  if  init-rgb565  then 
    268    d# 490 d# 10 d# 14 d# 158 set-hw     \ VGA window info 
    269290; 
    270291 
     
    284305   h# 10 +loop 
    285306; 
    286  
    287 : mirrored  ( -- )  h# 1e ov@  h# 20 or  h# 1e ov!  ; 
    288 : unmirrored  ( -- )  h# 1e ov@  h# 20 invert and  h# 1e ov!  ; 
     307[then] 
     308 
    289309 
    290310\ LICENSE_BEGIN 
  • dev/olpc/viacamera/camera.fth

    r2557 r2880  
    5858: ctlr-stop   ( -- )  310 dup cl@ 1 invert and swap cl!  ;      \ Stop the whole thing 
    5959 
     600 value use-ycrcb? 
     61 
    6062: read-setup  ( -- ) 
    61    camera-config 
     63   use-ycrcb? camera-config 
    6264   ctlr-config 
    6365   83 300 cl!                           \ Clear pending interrupts 
     
    105107   power-up 
    106108   camera-smb-setup  smb-on 
    107    camera-init 
    108109; 
    109110 
     
    155156   init 
    156157   my-args " yuv" $=  to use-ycrcb? 
    157    ov7670-detected? 0=  if  false exit  then 
     158   sensor-found? 0=  if  false exit  then 
    158159   alloc-dma-bufs 
    159160   read-setup 
  • dev/olpc/viacamera/loadpkg.fth

    r2557 r2880  
    3131   fload ${BP}/dev/olpc/viacamera/smbus.fth       \ Bit-banging SMBUS driver 
    3232   fload ${BP}/dev/olpc/viacamera/platform.fth 
    33    fload ${BP}/dev/olpc/ov7670.fth 
     33   fload ${BP}/dev/olpc/imagesensor.fth 
     34   warning @ warning off 
     35   fload ${BP}/dev/olpc/seti.fth 
     36   fload ${BP}/dev/olpc/ov7670.fth      \ Load last; most likely to be present 
     37   warning ! 
    3438   fload ${BP}/cpu/x86/ycrcbtorgb.fth             \ Color space conversion 
    3539   fload ${BP}/dev/olpc/viacamera/camera.fth 
  • dev/olpc/viacamera/platform.fth

    r2557 r2880  
    1212: cl@  ( adr -- l )  " mmio-base" $call-parent + rl@  ; 
    1313 
    14 h# 42 constant ov-sid 
    1514h# 31 constant sccb-port 
    1615 
    17 : camera-smb-setup  ( -- )  sccb-port to smb-port  ov-sid to smb-slave  ; 
     160 value camera-smb-slave 
     17: camera-smb-setup  ( -- )  sccb-port to smb-port  camera-smb-slave to smb-slave  ; 
     18: camera-smb-on  ( -- )  camera-smb-setup  smb-on  ; 
    1819: ov@  ( reg -- data )  camera-smb-setup  smb-byte@  ; 
    1920: ov!  ( data reg -- )  camera-smb-setup  smb-byte!  ; 
  • dev/olpc/viacamera/smbus.fth

    r2557 r2880  
    4747   smb-data-hi 
    4848   smb-clk-hi smb-wait-clk-hi   
    49    smb-data@  \ drop            \ SCCB generates an don't care bit 
     49   smb-data@ smb-clk-lo       ( nak? ) 
    5050   if  smb-stop  true abort" I2c NAK" then 
    51    smb-clk-lo 
    52 \   smb-wait-data-hi 
    5351; 
    5452: smb-bit  ( flag -- ) 
Note: See TracChangeset for help on using the changeset viewer.