This series aims at integrating configfs into uvc, the way
it has been done for acm, ncm, ecm, eem, ecm subset, rndis, obex, phonet,
mass_storage, FunctionFS, loopback, sourcesink, uac1, uac2, hid and midi.

v1..v2:
- sorted header fiels alphabetically
- applied style corrections
- factored out verifying uvc descriptors presence into a separate patch
- added mutex_destroy()
- added more comments for not-obvious parts
- eliminated copy-paste errors (assinment to opts->fs_control,
opts->ss_control
- actually used the refcnt member of struct f_uvc_opts

v2..v3:
- style corrections as suggested by Laurent
- improved documentation comments in u_uvc.h as suggested by Laurent

Below is an example listing of gadget's function directory. The attributes
whose access permissions are -r--r--r-- are there only for inspection
by the user but not for modifications. For color matching, camera
terminal, processing unit and output terminal only default descriptors
are provided, that is, creating user's own is not supported at this
moment.

drwxr-xr-x .  
drwxr-xr-x ./streaming  
drwxr-xr-x ./streaming/class  
drwxr-xr-x ./streaming/class/ss  
drwxr-xr-x ./streaming/class/hs  
lrwxrwxrwx ./streaming/class/hs/h -> \
../../../../../../../usb_gadget/g1/functions/uvc.usb0/streaming/header/h
drwxr-xr-x ./streaming/class/fs  
lrwxrwxrwx ./streaming/class/fs/h -> \
../../../../../../../usb_gadget/g1/functions/uvc.usb0/streaming/header/h
drwxr-xr-x ./streaming/color_matching  
drwxr-xr-x ./streaming/color_matching/default  
-r--r--r-- ./streaming/color_matching/default/bMatrixCoefficients  
-r--r--r-- ./streaming/color_matching/default/bTransferCharacteristics  
-r--r--r-- ./streaming/color_matching/default/bColorPrimaries  
drwxr-xr-x ./streaming/uncompressed  
drwxr-xr-x ./streaming/uncompressed/u  
drwxr-xr-x ./streaming/uncompressed/u/360p  
-rw-r--r-- ./streaming/uncompressed/u/360p/dwFrameInterval  
-rw-r--r-- ./streaming/uncompressed/u/360p/dwDefaultFrameInterval  
-rw-r--r-- ./streaming/uncompressed/u/360p/dwMaxVideoFrameBufferSize  
-rw-r--r-- ./streaming/uncompressed/u/360p/dwMaxBitRate  
-rw-r--r-- ./streaming/uncompressed/u/360p/dwMinBitRate  
-rw-r--r-- ./streaming/uncompressed/u/360p/wHeight  
-rw-r--r-- ./streaming/uncompressed/u/360p/wWidth  
-rw-r--r-- ./streaming/uncompressed/u/360p/bmCapabilities  
-rw-r--r-- ./streaming/uncompressed/u/bmaControls  
-r--r--r-- ./streaming/uncompressed/u/bmInterfaceFlags  
-r--r--r-- ./streaming/uncompressed/u/bAspectRatioY  
-r--r--r-- ./streaming/uncompressed/u/bAspectRatioX  
-rw-r--r-- ./streaming/uncompressed/u/bDefaultFrameIndex  
-rw-r--r-- ./streaming/uncompressed/u/bBitsPerPixel  
-rw-r--r-- ./streaming/uncompressed/u/guidFormat  
drwxr-xr-x ./streaming/header  
drwxr-xr-x ./streaming/header/h  
lrwxrwxrwx ./streaming/header/h/u -> \
../../../../../../../usb_gadget/g1/functions/uvc.usb0/streaming/uncompressed/u
-r--r--r-- ./streaming/header/h/bTriggerUsage  
-r--r--r-- ./streaming/header/h/bTriggerSupport  
-r--r--r-- ./streaming/header/h/bStillCaptureMethod  
-r--r--r-- ./streaming/header/h/bTerminalLink  
-r--r--r-- ./streaming/header/h/bmInfo  
drwxr-xr-x ./control  
drwxr-xr-x ./control/class  
drwxr-xr-x ./control/class/ss  
lrwxrwxrwx ./control/class/ss/h -> \
../../../../../../../usb_gadget/g1/functions/uvc.usb0/control/header/h
drwxr-xr-x ./control/class/fs  
lrwxrwxrwx ./control/class/fs/h -> \
../../../../../../../usb_gadget/g1/functions/uvc.usb0/control/header/h
drwxr-xr-x ./control/terminal  
drwxr-xr-x ./control/terminal/output  
drwxr-xr-x ./control/terminal/output/default  
-r--r--r-- ./control/terminal/output/default/iTerminal  
-r--r--r-- ./control/terminal/output/default/bSourceID  
-r--r--r-- ./control/terminal/output/default/bAssocTerminal  
-r--r--r-- ./control/terminal/output/default/wTerminalType  
-r--r--r-- ./control/terminal/output/default/bTerminalID  
drwxr-xr-x ./control/terminal/camera  
drwxr-xr-x ./control/terminal/camera/default  
-r--r--r-- ./control/terminal/camera/default/bmControls  
-r--r--r-- ./control/terminal/camera/default/wOcularFocalLength  
-r--r--r-- ./control/terminal/camera/default/wObjectiveFocalLengthMax  
-r--r--r-- ./control/terminal/camera/default/wObjectiveFocalLengthMin  
-r--r--r-- ./control/terminal/camera/default/iTerminal  
-r--r--r-- ./control/terminal/camera/default/bAssocTerminal  
-r--r--r-- ./control/terminal/camera/default/wTerminalType  
-r--r--r-- ./control/terminal/camera/default/bTerminalID  
drwxr-xr-x ./control/processing  
drwxr-xr-x ./control/processing/default  
-r--r--r-- ./control/processing/default/iProcessing  
-r--r--r-- ./control/processing/default/bmControls  
-r--r--r-- ./control/processing/default/wMaxMultiplier  
-r--r--r-- ./control/processing/default/bSourceID  
-r--r--r-- ./control/processing/default/bUnitID  
drwxr-xr-x ./control/header  
drwxr-xr-x ./control/header/h  
-rw-r--r-- ./control/header/h/dwClockFrequency  
-rw-r--r-- ./control/header/h/bcdUVC  
-rw-r--r-- ./streaming_maxburst  
-rw-r--r-- ./streaming_maxpacket  
-rw-r--r-- ./streaming_interval  

BACKWARD COMPATIBILITY
======================

Please note that the old g_webcam.ko is still available and works.


USING THE NEW "GADGET"
======================

Please refer to this post:

http://www.spinics.net/lists/linux-usb/msg76388.html

for general information from Sebastian on how to use configfs-based
gadgets (*).

With configfs the procedure is as follows, compared to the information
mentioned above (*):

instead of mkdir functions/acm.ttyS1 do

mkdir functions/uvc.<instance name>

e.g. mkdir functions/uvc.usb0.

Here is an example script which sets up a minimal
uvc gadget for operation with a high-speed udc:

$ modprobe libcomposite
$ mount none cfg -t configfs
$ mkdir cfg/usb_gadget/g1
$ cd cfg/usb_gadget/g1
$ mkdir configs/c.1
$ mkdir functions/uvc.usb0
$ mkdir strings/0x409
$ mkdir configs/c.1/strings/0x409
$ echo 0x3290 > idProduct
$ echo 0x18ec > idVendor
$ echo serial > strings/0x409/serialnumber
$ echo manufacturer > strings/0x409/manufacturer
$ echo UVC Gadget > strings/0x409/product
$ echo "Conf 1" > configs/c.1/strings/0x409/configuration
$ echo 120 > configs/c.1/MaxPower
$ mkdir -p functions/uvc.usb0/streaming/uncompressed/u/360p
$ cat <<EOF > functions/uvc.usb0/streaming/uncompressed/u/360p/dwFrameInterval
666666
1000000
5000000
EOF
$ mkdir functions/uvc.usb0/streaming/header/h
$ cd functions/uvc.usb0/streaming/header/h
$ ln -s ../../uncompressed/u
$ cd ../../class/fs
$ ln -s ../../header/h
$ cd ../../class/hs
$ ln -s ../../header/h
$ cd ../../../control
$ mkdir header/h
$ ln -s header/h class/fs
$ ln -s header/h class/ss
$ cd ../../../
$ echo 2048 > functions/uvc.usb0/streaming_maxpacket
$ ln -s functions/uvc.usb0 configs/c.1
$ echo 12480000.hsotg > UDC

TESTING THE FUNCTIONS (actually there is only one)
=====================

uvc)

device: connect the gadget, enable it, modprobe vivid,

$ ./uvc-gadget -u /dev/video<uvc video node #> -v /dev/video<vivid video node #>

I used Laurent's program:
http://git.ideasonboard.org/uvc-gadget.git

with these patches:

http://www.spinics.net/lists/linux-usb/msg99220.html

host: luvcview -f yuv

Andrzej Pietrasiewicz (3):
  usb: gadget: f_uvc: rename a macro to avoid conflicts
  usb: gadget: uvc: verify descriptors presence
  usb: gadget: uvc: configfs support in uvc function

 Documentation/ABI/testing/configfs-usb-gadget-uvc |  265 +++
 drivers/usb/gadget/Kconfig                        |   11 +
 drivers/usb/gadget/function/Makefile              |    2 +-
 drivers/usb/gadget/function/f_uvc.c               |  136 +-
 drivers/usb/gadget/function/u_uvc.h               |   52 +-
 drivers/usb/gadget/function/uvc_configfs.c        | 2439 +++++++++++++++++++++
 drivers/usb/gadget/function/uvc_configfs.h        |   22 +
 7 files changed, 2917 insertions(+), 10 deletions(-)
 create mode 100644 Documentation/ABI/testing/configfs-usb-gadget-uvc
 create mode 100644 drivers/usb/gadget/function/uvc_configfs.c
 create mode 100644 drivers/usb/gadget/function/uvc_configfs.h

-- 
1.9.1

--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to