Author: wmb Date: 2009-11-29 08:51:53 +0100 (Sun, 29 Nov 2009) New Revision: 1522
Modified: dev/olpc/viacamera/camera.fth dev/via/unichrome/accel2d.fth Log: OLPC trac 9763 - Fixed camera test to work with 32bpp display mode.
Modified: dev/olpc/viacamera/camera.fth =================================================================== --- dev/olpc/viacamera/camera.fth 2009-11-29 00:10:18 UTC (rev 1521) +++ dev/olpc/viacamera/camera.fth 2009-11-29 07:51:53 UTC (rev 1522) @@ -345,7 +345,6 @@ i 'dma-buf-phys 340 i 4 * + cl! \ Capture frame buffers loop ; - [then]
@@ -378,7 +377,7 @@ 0 300 cl! \ Mask all interrupts 8850.2114 310 cl! \ Enable CLK, FIFO threshold, UYVY, 8-bit CCIR656, \ Capture odd/even in interlace, triple buffers - 500 350 cl! \ Disable coring and 640*2 stride + VGA_WIDTH 2* 350 cl! \ Disable coring and 640*2 stride ;
: power-up ( -- ) @@ -422,6 +421,18 @@ then ;
+: snap ( timeout -- true | adr false ) + 0 do + buf-done? if + next-buf 'dma-buf false + 300 cl@ 83 or 300 cl! \ Clear interrupts + unloop exit + then + 1 ms + loop + true +; + : (read) ( adr len -- actual ) next-buf 'dma-buf -rot /dma-buf min dup >r move r> ( actual ) 300 cl@ 83 or 300 cl! \ Clear interrupts @@ -429,11 +440,11 @@
external
-: camera-read ( adr len -- actual ) +: read ( adr len -- actual ) buf-done? if (read) else 2drop 0 then ;
-: camera-open ( -- flag ) +: open ( -- flag ) init ov7670-detected? 0= if false exit then alloc-dma-bufs @@ -441,7 +452,7 @@ true ;
-: camera-close ( -- ) +: close ( -- ) ctlr-stop power-off free-dma-bufs @@ -463,42 +474,31 @@ : full-brightness ( -- ) h# f " bright!" $call-parent ;
: display-frame ( adr -- ) -\ test-x test-y VGA_WIDTH VGA_HEIGHT draw-rectangle - " expand-to-screen" $call-parent + VGA_WIDTH 2* ( src-adr src-pitch ) + 0 0 d# 280 d# 210 VGA_WIDTH VGA_HEIGHT " copy16>32" $call-parent autobright ;
: timeout-read ( adr len timeout -- actual ) >r 0 -rot r> 0 ?do ( actual adr len ) - 2dup camera-read ?dup if 3 roll drop -rot leave then + 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 camera-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? ) + d# 1000 snap if true exit then ( adr ) + display-frame + false ;
-: 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? ) +: 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 ) + false ;
: mirrored ( -- ) h# 1e ov@ h# 20 or h# 1e ov! ; @@ -509,12 +509,12 @@ ." The serial port is in use so the camera cannot be used" cr true exit then - camera-open 0= if true exit then + open 0= if true exit then d# 300 ms - unmirrored shoot-still ?dup if camera-close exit then ( error? ) + unmirrored shoot-still ?dup if close exit then ( error? ) d# 1,000 ms mirrored shoot-movie full-brightness ( error? ) - camera-close ( error? ) + close ( error? ) ?dup 0= if confirm-selftest? then ( error? ) ;
@@ -535,12 +535,12 @@ ;
: xselftest ( -- error? ) - camera-open 0= if true exit then + 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 camera-close ( error? ) + 0 close ( error? ) ;
Modified: dev/via/unichrome/accel2d.fth =================================================================== --- dev/via/unichrome/accel2d.fth 2009-11-29 00:10:18 UTC (rev 1521) +++ dev/via/unichrome/accel2d.fth 2009-11-29 07:51:53 UTC (rev 1522) @@ -43,6 +43,17 @@ wait-done ;
+: copy16>32 ( src-base src-pitch src-x,y dst-x,y w,h -- ) + wh! dst! src! ( src-base src-pitch ) + h# 30 mmio@ >r 8 mmio@ >r h# 1c mmio@ >r ( src-base src-pitch ) + 3 rshift bytes/line 3 rshift wljoin 8 mmio! ( src-base ) + fb-va - 3 rshift h# 1c mmio! ( ) + h# 8000.0041 h# 30 mmio! ( ) \ Expand RGB565 to ARGB8888 + h# cc.00.00.01 0 mmio! ( ) \ Perform BLT Output = source + wait-done + r> h# 1c mmio! r> 8 mmio! r> h# 30 mmio! +; + \ some tests 1 [if] : gp-fill-screen ( color -- )
openfirmware@openfirmware.info