[openfirmware] [commit] r2556 - in dev/olpc: . mmp2camera
repository service
svn at openfirmware.info
Sat Oct 1 19:32:47 CEST 2011
Author: wmb
Date: Sat Oct 1 19:32:47 2011
New Revision: 2556
URL: http://tracker.coreboot.org/trac/openfirmware/changeset/2556
Log:
OLPC XO-1.75 - trac #11236 - Added YCrCb (YUV) support to the XO-1.75 camera test, in the process factoring out the Omnivision sensor code and the base selftest infrastructure into separate files so that XO-1, XO-1.5, and XO-1.75 don't have to duplicate that code. This addresses the stated request of 11236, but does not really change the underlying reality with respect to testing H/VSYNC, since the XO-1.75 camera test has always used CCIR601 separate-sync-lines signaling instead of CCIR656 in-stream sync.
Added:
dev/olpc/cameratest.fth
dev/olpc/ov7670.fth
Modified:
dev/olpc/mmp2camera/ccic.fth
dev/olpc/mmp2camera/loadpkg.fth
dev/olpc/mmp2camera/platform.fth
Added: dev/olpc/cameratest.fth
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ dev/olpc/cameratest.fth Sat Oct 1 19:32:47 2011 (r2556)
@@ -0,0 +1,82 @@
+\ See license at end of file
+purpose: Common code for OLPC Camera selftest
+
+d# 5,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 ;
+
+: 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-still ( -- error? )
+ d# 1000 snap if true exit then ( buf )
+ display-frame ( autobright )
+ false
+;
+
+: shoot-movie ( -- error? )
+ get-msecs movie-time + ( timeout )
+ begin ( timeout )
+ shoot-still if drop true exit then ( timeout )
+ dup get-msecs - 0<= ( timeout reached )
+ until ( timeout )
+ drop false
+;
+
+: selftest ( -- error? )
+ camera-blocked? if false exit then
+ open 0= if true exit then
+ d# 300 ms
+ start-display
+ unmirrored resync ( )
+ shoot-still ?dup if stop-display close exit then ( error? )
+ d# 1,000 ms
+ mirrored resync shoot-movie full-brightness ( error? )
+ stop-display close ( error? )
+ ?dup 0= if confirm-selftest? then ( error? )
+;
+
+: 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? )
+;
+
+\ LICENSE_BEGIN
+\ Copyright (c) 2009 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
Modified: dev/olpc/mmp2camera/ccic.fth
==============================================================================
--- dev/olpc/mmp2camera/ccic.fth Fri Sep 30 03:30:43 2011 (r2555)
+++ dev/olpc/mmp2camera/ccic.fth Sat Oct 1 19:32:47 2011 (r2556)
@@ -1,5 +1,12 @@
+\ See license at end of file
+purpose: Driver for OLPC camera connected to Marvell MMP2 CCIC port
+
\ ========================== video capture operations ==========================
+0 value camera-base
+: cl! ( l adr -- ) camera-base + rl! ;
+: cl@ ( adr -- l ) camera-base + rl@ ;
+
d# 640 constant VGA_WIDTH
d# 480 constant VGA_HEIGHT
@@ -36,18 +43,16 @@
\ 0100.0000 for HSYNC active low
\ 0080.0000 for VSYNC falling edge
h# 0000.0000 constant polarities
-h# 20 constant rgb-sensor
-h# 080 constant rgb-fb
-h# 00 constant rgb-endian \ 0c bits
+h# 0.8000 constant ycrcb4:2:2-format \ YCrCb input and output, 422 packed format (8000), no swapping
+h# a0 constant rgb-format \ RGB input (20) and output (80), no swapping
-\ VGA RGB565
: setup-image ( -- )
VGA_WIDTH 2* h# 24 cl! \ 640*2 stride, UV stride in high bits = 0
VGA_WIDTH 2* VGA_HEIGHT wljoin h# 34 cl! \ Image size register
0 0 wljoin h# 38 cl! \ Image offset
- polarities rgb-fb or rgb-sensor or rgb-endian or h# 3c cl! \ CTRL0
+ use-ycrcb? if ycrcb4:2:2-format else rgb-format then polarities or h# 3c cl! \ CTRL0
;
: interrupts-off ( -- ) 0 h# 2c cl! h# ffffffff h# 30 cl! ;
@@ -96,7 +101,7 @@
: init ( -- )
power-on
- ov-smb-setup smb-on
+ camera-smb-setup smb-on
camera-init
;
@@ -114,6 +119,7 @@
then
;
+: resync ( -- ) ;
: snap ( timeout -- true | buf# false )
0 do
@@ -140,21 +146,24 @@
: open ( -- flag )
my-address my-space h# 1000 " map-in" $call-parent to camera-base
init
+ my-args " yuv" $= to use-ycrcb?
ov7670-detected? 0= if false exit then
alloc-dma-bufs
read-setup
true
;
+\ There are no pin conflicts on this platform, so the camera can't be blocked
+false constant camera-blocked?
+
: start-display ( -- )
- 0 'dma-buf-phys VGA_WIDTH VGA_HEIGHT " start-video" $call-screen
+ 0 'dma-buf-phys VGA_WIDTH VGA_HEIGHT use-ycrcb? " start-video" $call-screen
;
: stop-display ( -- )
" stop-video" $call-screen
;
: close ( -- )
- stop-display
ctlr-stop
interrupts-off
power-off
@@ -165,17 +174,28 @@
\ ============================= selftest operation ===========================
-d# 5,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
+[ifdef] notdef \ Unnecessary, since that we don't use 24bpp
+VGA_WIDTH value rect-w
+VGA_HEIGHT value rect-h
+
+d# 1200 3 * value dst-pitch
+d# 1200 VGA_WIDTH - 2/ value dst-x
+d# 800 VGA_HEIGHT - 2/ value dst-y
+
+VGA_WIDTH 2* value src-pitch
+
+: >dst-adr ( adr -- adr' ) dst-y dst-pitch * dst-x + 3 * + ;
+
+: copy16>24 ( src-adr dst-base -- )
+ >dst-adr ( src-adr dst-adr )
+ rect-h 0 ?do ( src-adr dst-adr )
+ 2dup rect-w copy16>24-line ( scr-adr dst-adr )
+ swap src-pitch + swap dst-pitch + ( scr-adr' dst-adr' )
+ loop ( src-adr dst-adr )
+ 2drop ( )
;
-: full-brightness ( -- ) h# f " bright!" $call-screen ;
code copy16>24-line ( src-adr dst-adr #pixels -- )
mov r2,tos \ #pixels in r2
@@ -199,93 +219,11 @@
decs r2,1
0= until
c;
+[then]
-VGA_WIDTH value rect-w
-VGA_HEIGHT value rect-h
-
-d# 1200 3 * value dst-pitch
-d# 1200 VGA_WIDTH - 2/ value dst-x
-d# 800 VGA_HEIGHT - 2/ value dst-y
-
-: >dst-adr ( adr -- adr' ) dst-y dst-pitch * dst-x + 3 * + ;
-
-VGA_WIDTH 2* value src-pitch
-
-: copy16>24 ( src-adr dst-base -- )
- >dst-adr ( src-adr dst-adr )
- rect-h 0 ?do ( src-adr dst-adr )
- 2dup rect-w copy16>24-line ( scr-adr dst-adr )
- swap src-pitch + swap dst-pitch + ( scr-adr' dst-adr' )
- loop ( src-adr dst-adr )
- 2drop ( )
-;
-
-: display-frame ( buf# -- )
+: display-frame ( buf -- )
'dma-buf-phys " set-video-dma-adr" $call-screen
\ 'dma-buf fb-pa copy16>24
-\ 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-still ( -- error? )
- d# 1000 snap if true exit then ( buf# )
- display-frame
- false
-;
-
-: shoot-movie ( -- error? )
- get-msecs movie-time + ( timeout )
- begin ( timeout )
- shoot-still if drop true exit then ( timeout )
- dup get-msecs - 0<= ( timeout reached )
- until ( timeout )
- drop false
-;
-
-: 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
- d# 300 ms
- start-display
- unmirrored shoot-still ?dup if close exit then ( error? )
- d# 1,000 ms
- mirrored shoot-movie full-brightness ( error? )
- close ( error? )
- ?dup 0= if confirm-selftest? then ( 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? )
;
\ LICENSE_BEGIN
Modified: dev/olpc/mmp2camera/loadpkg.fth
==============================================================================
--- dev/olpc/mmp2camera/loadpkg.fth Fri Sep 30 03:30:43 2011 (r2555)
+++ dev/olpc/mmp2camera/loadpkg.fth Sat Oct 1 19:32:47 2011 (r2556)
@@ -23,8 +23,7 @@
[then]
fload ${BP}/dev/olpc/mmp2camera/platform.fth
- fload ${BP}/dev/olpc/mmp2camera/ov.fth
+ fload ${BP}/dev/olpc/ov7670.fth
fload ${BP}/dev/olpc/mmp2camera/ccic.fth
+ fload ${BP}/dev/olpc/cameratest.fth
end-package
-
-
Modified: dev/olpc/mmp2camera/platform.fth
==============================================================================
--- dev/olpc/mmp2camera/platform.fth Fri Sep 30 03:30:43 2011 (r2555)
+++ dev/olpc/mmp2camera/platform.fth Sat Oct 1 19:32:47 2011 (r2556)
@@ -1,17 +1,17 @@
\ See license at end of file
-purpose: Driver for OLPC camera connected to Via VX855 Video Capture Port
+purpose: Platform specifics for OLPC camera connected to Marvell MMP2 CMOS Camera Interface Controller (CCIC)
headers
hex
-" OV7670" " sensor" string-property
-
-: ov-smb-setup ( -- )
+: camera-smb-setup ( -- )
1 to smb-dly-us
d# 108 to smb-clock-gpio#
d# 109 to smb-data-gpio#
h# 42 to smb-slave
;
+: ov@ ( reg -- data ) camera-smb-setup smb-byte@ ;
+: ov! ( data reg -- ) camera-smb-setup smb-byte! ;
: reset-sensor ( -- ) d# 102 gpio-clr 1 ms d# 102 gpio-set ;
@@ -27,6 +27,26 @@
\ PIXMCLK on GPIO69, PIXCLK on GPIO70, PIXDATA[7:0] on GPIO[59:66]
\ CAM_SCL on GPIO108, CAM_SDA on GPIO109 (bitbang)
-0 value camera-base
-: cl! ( l adr -- ) camera-base + rl! ;
-: cl@ ( adr -- l ) camera-base + rl@ ;
+\ 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
Added: dev/olpc/ov7670.fth
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ dev/olpc/ov7670.fth Sat Oct 1 19:32:47 2011 (r2556)
@@ -0,0 +1,312 @@
+\ See license at end of file
+purpose: Omnivision OV7670 image sensor driver
+
+" OV7670" " sensor" string-property
+
+\ ============================= camera operations =============================
+
+\ Check for the expected value
+: 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 ( )
+;
+
+0 value use-ycrcb?
+
+false value ov7670-detected?
+
+: ((camera-init) ( -- )
+ 80 12 ov! 2 ms \ 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
+ 02 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 !! Linux then sets REG_AECH to 0
+ 00 10 ov!
+ 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!
+ 4c 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 !! Linux doesn't do this
+;
+
+: 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
+ 02 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
+ ( 00 10 ovc ) \ Automatic exposure control 9:2
+ 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: CCIR601 (H/VSYNC framing)
+ 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
+
+ \ 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 !! Linux doesn't do this
+;
+
+: 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)
+ use-ycrcb? 0= if init-rgb565 then
+ d# 490 d# 10 d# 14 d# 158 set-hw \ VGA window info
+;
+
+: 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
+;
+
+: mirrored ( -- ) h# 1e ov@ h# 20 or h# 1e ov! ;
+: unmirrored ( -- ) h# 1e ov@ h# 20 invert and h# 1e ov! ;
+
+\ 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