[openfirmware] [commit] r2557 - cpu/x86 dev/olpc/viacamera
repository service
svn at openfirmware.info
Sat Oct 1 19:44:27 CEST 2011
Author: wmb
Date: Sat Oct 1 19:44:26 2011
New Revision: 2557
URL: http://tracker.coreboot.org/trac/openfirmware/changeset/2557
Log:
OLPC XO-1.5 - Changed camera driver to use the shared common code for the Omnivision sensor and the selftest infrastructure.
Added:
cpu/x86/ycrcbtorgb.fth
- copied unchanged from r2553, dev/olpc/viacamera/ycrcbtorgb.fth
dev/olpc/viacamera/platform.fth
Deleted:
dev/olpc/viacamera/ycrcbtorgb.fth
Modified:
dev/olpc/viacamera/camera.fth
dev/olpc/viacamera/loadpkg.fth
dev/olpc/viacamera/smbus.fth
Copied: cpu/x86/ycrcbtorgb.fth (from r2553, dev/olpc/viacamera/ycrcbtorgb.fth)
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ cpu/x86/ycrcbtorgb.fth Sat Oct 1 19:44:26 2011 (r2557, copy of r2553, dev/olpc/viacamera/ycrcbtorgb.fth)
@@ -0,0 +1,141 @@
+\ See license at end of file
+purpose: Color space conversion from YCbCr to RGB
+
+\ R = clip (Y + 1.402 * Cr)
+\ G = clip (Y - 0.344 * Cb - 0.714 * Cr)
+\ B = clip (Y + 1.772 * Cb)
+
+\ This is for full-range YCbCr, where the Y anc Cb/Cr values ranges from 0-255.
+\ For restricted-range YCbCr (16 <= Y <= 235, 16 <= Cr,Cb <= 240), the Y value
+\ would need to be adjusted to Ysc = (Y - 16) * 1.164 (1.164 = 298 / 256 = 149 / 128)
+\ and the multipliers change from (1.402, -0.343, -0.711, 1.765) to (1.596, -0.392, -0.813, 2.017)
+
+code ycrcb444>rgb888 ( y cr cb -- r g b )
+ \ y: 8 [sp]
+ \ u: 4 [sp] = Cr
+ \ v: 0 [sp] = Cb
+
+ d# 128 # 0 [sp] sub \ convert Cb to signed
+ d# 128 # 4 [sp] sub \ convert Cr to signed
+ 8 [sp] bx mov \ Get Y into register
+
+ d# 90 # 4 [sp] ax imul-imm \ Multiply Cr by 1.402 * 64 (actually 1.406)
+ d# 6 # ax sar \ Scale down by 64
+ bx ax add \ Add to Y
+ 0< if ax ax xor then \ Clip to 0
+ d# 255 # ax cmp > if d# 255 # ax mov then \ Clip to 255
+
+ ax 8 [sp] mov \ Put R in place on stack
+
+ d# -46 # 4 [sp] ax imul-imm \ Multiply Cr by -0.714 * 64 (actually -0.719)
+ d# 6 # ax sar \ Scale down by 64
+ ax cx mov
+ d# -22 # 0 [sp] ax imul-imm \ Multiply Cr by -0.344 * 64 (actually -0.344)
+ d# 6 # ax sar \ Scale down by 64
+ ax cx add
+ bx cx add \ Now we have G
+ 0< if cx cx xor then \ Clip to 0
+ d# 255 # cx cmp > if d# 255 # cx mov then \ Clip to 255
+
+ d# 113 # 0 [sp] ax imul-imm \ Multiply Cr by 1.772 * 64 (actually 1.766)
+ d# 6 # ax sar \ Scale down by 64
+ bx ax add \ Add to Y
+ 0< if ax ax xor then \ Clip to 0
+ d# 255 # ax cmp > if d# 255 # ax mov then \ Clip to 255
+ ax 0 [sp] mov \ Put B in place on stack
+
+ cx 4 [sp] mov \ Put G in place on stack
+c;
+
+
+\ This version operates on pixel values in memory
+\ Src bytes are Cb Y1 Cr Y2 (2 pixels)
+\ Dst bytes are R G B A R G B A (2 pixels)
+
+code ycbcr422>rgba8888 ( src dst count -- )
+ 4 [sp] di xchg \ di: dst
+ 8 [sp] si xchg \ si: src
+
+ ax push ax push \ Space on stack for Cr and Cb values
+
+ begin
+ \ src: Cb Y1 Cr Y2 dst: R1 G1 B1 A1 R2 G2 B2 A2
+ ax ax xor al lods d# 128 # ax sub ax 0 [sp] mov \ Get Cb, make signed, save on stack
+ ax ax xor al lods ax bx mov \ Get Y1, save in BX
+ ax ax xor al lods d# 128 # ax sub ax 4 [sp] mov \ Get Cr, make signed, save on stack
+
+ d# 90 # 4 [sp] ax imul-imm \ Multiply Cr by 1.402 * 64 (actually 1.406)
+ d# 6 # ax sar \ Scale down by 64
+ bx ax add \ Add to Y
+
+ 0< if ax ax xor then \ Clip to 0
+ d# 255 # ax cmp > if d# 255 # ax mov then \ Clip to 255
+
+ al stos \ Output R
+
+ d# -46 # 4 [sp] ax imul-imm \ Multiply Cr by -0.714 * 64 (actually -0.719)
+ d# 6 # ax sar \ Scale down by 64
+ ax dx mov
+ d# -22 # 0 [sp] ax imul-imm \ Multiply Cr by -0.344 * 64 (actually -0.344)
+ d# 6 # ax sar \ Scale down by 64
+ dx ax add
+ bx ax add \ Now we have G
+
+ 0< if ax ax xor then \ Clip to 0
+ d# 255 # ax cmp > if d# 255 # ax mov then \ Clip to 255
+
+ al stos \ Output G
+
+ d# 113 # 0 [sp] ax imul-imm \ Multiply Cr by 1.772 * 64 (actually 1.766)
+ d# 6 # ax sar \ Scale down by 64
+ bx ax add \ Add to Y
+
+ 0< if ax ax xor then \ Clip to 0
+ d# 255 # ax cmp > if d# 255 # ax mov then \ Clip to 255
+
+ al stos \ Output B
+ d# 255 # al mov
+ al stos \ Output A
+
+ ax ax xor al lods ax bx mov \ Get Y2 into BX
+
+ d# 90 # 4 [sp] ax imul-imm \ Multiply Cr by 1.402 * 64 (actually 1.406)
+ d# 6 # ax sar \ Scale down by 64
+ bx ax add \ Add to Y
+
+ 0< if ax ax xor then \ Clip to 0
+ d# 255 # ax cmp > if d# 255 # ax mov then \ Clip to 255
+
+ al stos \ Output R
+
+ d# -46 # 4 [sp] ax imul-imm \ Multiply Cr by -0.714 * 64 (actually -0.719)
+ d# 6 # ax sar \ Scale down by 64
+ ax dx mov
+ d# -22 # 0 [sp] ax imul-imm \ Multiply Cr by -0.344 * 64 (actually -0.344)
+ d# 6 # ax sar \ Scale down by 64
+ dx ax add
+ bx ax add \ Now we have G
+
+ 0< if ax ax xor then \ Clip to 0
+ d# 255 # ax cmp > if d# 255 # ax mov then \ Clip to 255
+
+ al stos \ Output G
+
+ d# 113 # 0 [sp] ax imul-imm \ Multiply Cr by 1.772 * 64 (actually 1.766)
+ d# 6 # ax sar \ Scale down by 64
+ bx ax add \ Add to Y
+
+ 0< if ax ax xor then \ Clip to 0
+ d# 255 # ax cmp > if d# 255 # ax mov then \ Clip to 255
+
+ al stos \ Output B
+ d# 255 # al mov
+ al stos \ Output A
+
+ 8 [sp] dec
+ 0= until
+
+ d# 12 [sp] sp lea \ Clean stack, removing Cr, Cb, and count values
+ di pop \ Restore EDI
+ si pop \ Restore ESI
+c;
Modified: dev/olpc/viacamera/camera.fth
==============================================================================
--- dev/olpc/viacamera/camera.fth Sat Oct 1 19:32:47 2011 (r2556)
+++ dev/olpc/viacamera/camera.fth Sat Oct 1 19:44:26 2011 (r2557)
@@ -4,284 +4,6 @@
headers
hex
-" OV7670" " sensor" string-property
-
-: cl! ( l adr -- ) " mmio-base" $call-parent + rl! ;
-: cl@ ( adr -- l ) " mmio-base" $call-parent + rl@ ;
-
-\ ======================= OV7670 SMBUS operations ==========================
-
-h# 42 constant ov-sid
-h# 31 constant sccb-port
-
-: sccb-setup ( -- ) sccb-port to smb-port ov-sid to smb-slave ;
-: ov@ ( reg -- data ) sccb-setup smb-byte@ ;
-: ov! ( data reg -- ) sccb-setup smb-byte! ;
-
-: 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 =============================
-
-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 - !! 02
- 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
-;
-
\ ========================== video capture operations ==========================
d# 640 constant VGA_WIDTH
@@ -381,7 +103,7 @@
: init ( -- )
(init)
power-up
- sccb-setup smb-on
+ camera-smb-setup smb-on
camera-init
;
@@ -396,6 +118,8 @@
then
;
+: resync ( -- ) ;
+
: snap ( timeout -- true | adr false )
0 do
buf-done? if
@@ -413,6 +137,14 @@
300 cl@ 83 or 300 cl! \ Clear interrupts
;
+: start-display ( -- ) ;
+: stop-display ( -- ) ;
+: camera-blocked? ( -- flag )
+ serial-enabled? dup if
+ ." The serial port is in use so the camera cannot be used" cr
+ then
+;
+
external
: read ( adr len -- actual )
@@ -437,18 +169,6 @@
\ ============================= 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-parent
-;
-: full-brightness ( -- ) h# f " bright!" $call-parent ;
-
: display-ycrcb-frame ( adr -- )
temp-buf VGA_WIDTH VGA_HEIGHT * ycbcr422>rgba8888
temp-buf VGA_WIDTH 4* ( src-adr src-pitch )
@@ -462,72 +182,7 @@
: display-frame ( adr -- )
use-ycrcb? if display-ycrcb-frame else display-rgb-frame then
-\ 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 ( adr )
- 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? )
- serial-enabled? if
- ." The serial port is in use so the camera cannot be used" cr
- false exit
- then
- open 0= if true exit then
- d# 300 ms
- 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
\ Copyright (c) 2009 FirmWorks
Modified: dev/olpc/viacamera/loadpkg.fth
==============================================================================
--- dev/olpc/viacamera/loadpkg.fth Sat Oct 1 19:32:47 2011 (r2556)
+++ dev/olpc/viacamera/loadpkg.fth Sat Oct 1 19:44:26 2011 (r2557)
@@ -26,10 +26,14 @@
new-device
" camera" device-name
0 0 reg \ A reg property makes "test-all" consider this device
- fload ${BP}/dev/olpc/viacamera/smbus.fth
- fload ${BP}/dev/olpc/viacamera/ycrcbtorgb.fth
+ [ifndef] seq! : seq! 3c4 pc! 3c5 pc! ; [then]
+ [ifndef] seq@ : seq@ 3c4 pc! 3c5 pc@ ; [then]
+ fload ${BP}/dev/olpc/viacamera/smbus.fth \ Bit-banging SMBUS driver
+ fload ${BP}/dev/olpc/viacamera/platform.fth
+ fload ${BP}/dev/olpc/ov7670.fth
+ fload ${BP}/cpu/x86/ycrcbtorgb.fth \ Color space conversion
fload ${BP}/dev/olpc/viacamera/camera.fth
+ fload ${BP}/dev/olpc/cameratest.fth
finish-device
device-end
-
Added: dev/olpc/viacamera/platform.fth
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ dev/olpc/viacamera/platform.fth Sat Oct 1 19:44:26 2011 (r2557)
@@ -0,0 +1,43 @@
+\ See license at end of file
+purpose: Platform specifics for OLPC Camera on XO-1.5
+
+h# 26 constant dcon-port
+: dcon-setup ( -- ) dcon-port to smb-port h# 1a to smb-slave ;
+: smb-init ( -- ) dcon-setup smb-on smb-pulses ;
+
+: dcon@ ( reg# -- word ) dcon-setup smb-word@ ;
+: dcon! ( word reg# -- ) dcon-setup smb-word! ;
+
+: cl! ( l adr -- ) " mmio-base" $call-parent + rl! ;
+: cl@ ( adr -- l ) " mmio-base" $call-parent + rl@ ;
+
+h# 42 constant ov-sid
+h# 31 constant sccb-port
+
+: camera-smb-setup ( -- ) sccb-port to smb-port ov-sid to smb-slave ;
+: ov@ ( reg -- data ) camera-smb-setup smb-byte@ ;
+: ov! ( data reg -- ) camera-smb-setup smb-byte! ;
+
+\ 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
Modified: dev/olpc/viacamera/smbus.fth
==============================================================================
--- dev/olpc/viacamera/smbus.fth Sat Oct 1 19:32:47 2011 (r2556)
+++ dev/olpc/viacamera/smbus.fth Sat Oct 1 19:44:26 2011 (r2557)
@@ -1,10 +1,4 @@
-[ifndef] seq!
-: seq! 3c4 pc! 3c5 pc! ;
-[then]
-
-[ifndef] seq@
-: seq@ 3c4 pc! 3c5 pc@ ;
-[then]
+\
0 value smb-port
@@ -123,10 +117,3 @@
: smb-pulses ( -- )
d# 32 0 do smb-clk-lo smb-clk-hi loop
;
-
-h# 26 constant dcon-port
-: dcon-setup ( -- ) dcon-port to smb-port h# 1a to smb-slave ;
-: smb-init ( -- ) dcon-setup smb-on smb-pulses ;
-
-: dcon@ ( reg# -- word ) dcon-setup smb-word@ ;
-: dcon! ( word reg# -- ) dcon-setup smb-word! ;
More information about the openfirmware
mailing list