Changeset 2880


Ignore:
Timestamp:
Feb 25, 2012, 5:55:45 PM (3 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.