[openfirmware] [commit] r2453 - in dev/usb2/device: . webcam
repository service
svn at openfirmware.info
Wed Aug 10 00:42:06 CEST 2011
Author: lwalter
Date: Wed Aug 10 00:42:06 2011
New Revision: 2453
URL: http://tracker.coreboot.org/trac/openfirmware/changeset/2453
Log:
Automate video settings based on VC and VS descriptors
Modified:
dev/usb2/device/common.fth
dev/usb2/device/webcam/desc.fth
dev/usb2/device/webcam/webcam.fth
Modified: dev/usb2/device/common.fth
==============================================================================
--- dev/usb2/device/common.fth Tue Aug 9 20:41:09 2011 (r2452)
+++ dev/usb2/device/common.fth Wed Aug 10 00:42:06 2011 (r2453)
@@ -53,6 +53,8 @@
" iso-out-pipe" get-int-property to iso-out-pipe
" iso-in-size" get-int-property to /iso-in-pipe
" iso-out-size" get-int-property to /iso-out-pipe
+ " iso-in-interval" get-int-property to iso-in-interval
+ " iso-out-interval" get-int-property to iso-out-interval
" intr-in-pipe" get-int-property to intr-in-pipe
" intr-out-pipe" get-int-property to intr-out-pipe
" intr-in-size" get-int-property to /intr-in-pipe
Modified: dev/usb2/device/webcam/desc.fth
==============================================================================
--- dev/usb2/device/webcam/desc.fth Tue Aug 9 20:41:09 2011 (r2452)
+++ dev/usb2/device/webcam/desc.fth Wed Aug 10 00:42:06 2011 (r2453)
@@ -23,14 +23,14 @@
d# 32 constant MAX_FRAME_DESC \ Maximum number of frame descriptors/format
0 value #fdesc \ Number of uncompressed frame descriptors
0 value #alt \ Number of alternate interface descriptors
-MAX_FRAME_DESC /n* 2* buffer: farray \ Array of width and height per frame
-MAX_ALT_DESC /n* buffer: iarray \ Array of /payload per alternate interface
+MAX_FRAME_DESC /n* 2* buffer: frame-array \ Array of width and height per frame
+MAX_ALT_DESC /n* buffer: alt-array \ Array of /payload per alternate interface
: #fdesc! ( idx -- ) #fdesc max to #fdesc ;
: #alt! ( idx -- ) #alt max to #alt ;
-: alt-array! ( l idx -- ) /n* iarray + ! ;
-: alt-array@ ( idx -- l ) /n* iarray + @ ;
-: frame-array! ( w h idx -- ) /n* 2* farray + tuck na1+ ! ! ;
+: alt-array! ( l idx -- ) /n* alt-array + ! ;
+: alt-array@ ( idx -- l ) /n* alt-array + @ ;
+: frame-array! ( w h idx -- ) /n* 2* frame-array + tuck na1+ ! ! ;
: frame-array@ ( idx -- width height ) /n* 2* frame-array + dup @ swap na1+ @ ;
: process-vc ( idx -- )
@@ -40,7 +40,7 @@
;
: process-vs-desc ( adr -- adr' )
- farray MAX_FRAME_DESC /n* 2* erase
+ frame-array MAX_FRAME_DESC /n* 2* erase
begin dup desc-buf-end <> while ( adr )
dup 1+ c@ h# 24 <> if exit then \ CS_INTERFACE
dup 2 + c@ case
@@ -59,24 +59,24 @@
;
: process-alt-desc ( idx adr -- )
- iarray MAX_ALT_DESC /n* erase ( idx adr )
+ alt-array MAX_ALT_DESC /n* erase ( idx adr )
begin dup desc-buf-end <> while ( idx adr )
dup 1+ c@ 4 = if ( idx adr )
2dup 2 + c@ = if \ Alternate INTERFACE descriptor
dup 3 + c@ dup #alt! ( idx adr alt )
- swap c@ + ( idx alt adr' )
+ swap dup c@ + ( idx alt adr' )
dup 1+ c@ 5 = if \ Endpoint descriptor
tuck 4 + le-w@ swap alt-array! ( idx adr )
dup 3 + c@ 1 and 0= if abort" Expect isochronous endpoint" then
dup 2 + c@ h# f and ( idx adr pipe )
- dup 6 + c@ ( idx adr pipe interval )
+ over 6 + c@ ( idx adr pipe interval )
2 pick 2 + c@ h# 80 and
if to iso-in-interval to iso-in-pipe else to iso-out-interval to iso-out-pipe then
then
then
then
dup c@ +
- repeat drop
+ repeat 2drop
;
: process-vs ( idx -- )
Modified: dev/usb2/device/webcam/webcam.fth
==============================================================================
--- dev/usb2/device/webcam/webcam.fth Tue Aug 9 20:41:09 2011 (r2452)
+++ dev/usb2/device/webcam/webcam.fth Wed Aug 10 00:42:06 2011 (r2453)
@@ -49,31 +49,12 @@
then
;
-create samsung-frame-array
- 0 , 0 , \ width height
- h# 280 , h# 1e0 ,
- h# a0 , h# 78 ,
- h# b0 , h# 90 ,
- h# 140 , h# f0 ,
- h# 160 , h# 120 ,
- h# 320 , h# 258 ,
- h# 500 , h# 2d0 ,
-
0 value hint
5 value frame-idx
h# 160 value width
h# 120 value height
width height * 2* value /frame \ 16-bit per pixel
-create samsung-alt-array
- 0 , h# c0 , h# 180 , h# 200 ,
- h# 280 , h# 320 , h# 3b0 , h# a80 ,
- h# b20 , h# be0 , h# 1380 , h# 13fc ,
-
-['] samsung-frame-array to frame-array \ Comment these 2 lines to use
-['] samsung-alt-array to alt-array \ descriptor info
-
-\ Make sure the alt interface's endpoint and maxpayload matches
d# 5 value alt-interface
h# 320 value /payload
d# 256 value #payload
@@ -82,13 +63,13 @@
external
: set-frame ( idx -- )
dup to frame-idx
- /n * 2* frame-array + dup @ to width na1+ @ to height
- width height * 2* to /frame
+ frame-array@ 2dup to height to width
+ * bytes/pixel * to /frame
;
: set-alt ( idx -- )
dup to alt-interface
- alt-array swap na+ @ dup to /payload
+ alt-array@ dup to /payload
dup h# 7ff and swap d# 11 >> 1+ * to /xlen
;
@@ -108,8 +89,6 @@
: init-stream
\ Make sure the alt interface's endpoint and maxpayload matches
- 1 to iso-in-pipe \ Remove when init is properly done
- 1 to iso-in-interval \ Remove when init is properly done
/payload iso-in-pipe set-pipe-maxpayload
#payload iso-in-pipe iso-in-interval init-iso-in
vs-interface alt-interface set-interface if abort" Failed to set alternate interface" then
@@ -118,34 +97,34 @@
;
headers
-\ Algorithm for selecting a particular alternate interface and the corresponding
-\ uncompressed resolution:
+\ Algorithm for selecting a particular alternate interface and
+\ the corresponding uncompressed resolution:
\
-\ Empirically, when the webcam sends a video line of data out at a time,
-\ ofw can process the video data reasonably well.
+\ Empirically, when the webcam sends a video line of data out at
+\ a time, ofw can process the video data reasonably well.
\
-\ Thus, choose the largest payload bandwidth without employing MULT.
-\ Then, choose a best match video resolution.
+\ Thus, choose a video highest resolution that satisfy:
+\ width*byte/pixel+c < h# 400
+\ Then, choose a best match alternate interface
+h# 400 constant MAX_PAYLOAD
0 value twidth
0 value tidx
: select-alt ( -- idx )
0 to tidx
- 0 to twidth
- #alt 1 do
- i alt-array@ dup h# f800 and if
- drop
- else
- dup twidth > if to twidth i to tidx else drop then
- then
+ MAX_PAYLOAD to twidth
+ #alt 1+ 1 do
+ i alt-array@ dup h# 7ff and swap d# 11 >> 1+ *
+ dup width bytes/pixel * h# c + twidth between
+ if to twidth i to tidx else drop then
loop tidx
;
: select-frame ( -- idx )
0 to twidth
0 to tidx
- #fdesc 1 do
+ #fdesc 1+ 1 do
i frame-array@ drop
- dup bytes/pixel * h# c + /xlen <= if
+ dup bytes/pixel * h# c + MAX_PAYLOAD < if
dup twidth > if to twidth i to tidx else drop then
else
drop
@@ -154,11 +133,15 @@
;
: set-params ( -- )
- ['] farray to frame-array
- ['] iarray to alt-array
-
- select-alt set-alt
select-frame set-frame
+ select-alt set-alt
+;
+
+: int-property ( n name$ -- ) rot encode-int 2swap property ;
+: make-properties ( -- )
+ iso-in-pipe " iso-in-pipe" int-property
+ iso-in-interval " iso-in-interval" int-property
+ /payload " iso-in-size" int-property
;
: get-next-payload ( -- len )
@@ -235,8 +218,9 @@
: init ( -- )
init device set-target
- ( init-params )
- ( set-params )
+ init-params
+ set-params
+ make-properties
;
0 value selftest-adr
More information about the openfirmware
mailing list