Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
at v5.16 178 lines 4.4 kB view raw
1/* SPDX-License-Identifier: GPL-2.0+ */ 2/* 3 * uvc_gadget.h -- USB Video Class Gadget driver 4 * 5 * Copyright (C) 2009-2010 6 * Laurent Pinchart (laurent.pinchart@ideasonboard.com) 7 */ 8 9#ifndef _UVC_GADGET_H_ 10#define _UVC_GADGET_H_ 11 12#include <linux/list.h> 13#include <linux/mutex.h> 14#include <linux/spinlock.h> 15#include <linux/usb/composite.h> 16#include <linux/videodev2.h> 17 18#include <media/v4l2-device.h> 19#include <media/v4l2-dev.h> 20#include <media/v4l2-fh.h> 21 22#include "uvc_queue.h" 23 24struct usb_ep; 25struct usb_request; 26struct uvc_descriptor_header; 27struct uvc_device; 28 29/* ------------------------------------------------------------------------ 30 * Debugging, printing and logging 31 */ 32 33#define UVC_TRACE_PROBE (1 << 0) 34#define UVC_TRACE_DESCR (1 << 1) 35#define UVC_TRACE_CONTROL (1 << 2) 36#define UVC_TRACE_FORMAT (1 << 3) 37#define UVC_TRACE_CAPTURE (1 << 4) 38#define UVC_TRACE_CALLS (1 << 5) 39#define UVC_TRACE_IOCTL (1 << 6) 40#define UVC_TRACE_FRAME (1 << 7) 41#define UVC_TRACE_SUSPEND (1 << 8) 42#define UVC_TRACE_STATUS (1 << 9) 43 44#define UVC_WARN_MINMAX 0 45#define UVC_WARN_PROBE_DEF 1 46 47extern unsigned int uvc_gadget_trace_param; 48 49#define uvc_trace(flag, msg...) \ 50 do { \ 51 if (uvc_gadget_trace_param & flag) \ 52 printk(KERN_DEBUG "uvcvideo: " msg); \ 53 } while (0) 54 55#define uvcg_dbg(f, fmt, args...) \ 56 dev_dbg(&(f)->config->cdev->gadget->dev, "%s: " fmt, (f)->name, ##args) 57#define uvcg_info(f, fmt, args...) \ 58 dev_info(&(f)->config->cdev->gadget->dev, "%s: " fmt, (f)->name, ##args) 59#define uvcg_warn(f, fmt, args...) \ 60 dev_warn(&(f)->config->cdev->gadget->dev, "%s: " fmt, (f)->name, ##args) 61#define uvcg_err(f, fmt, args...) \ 62 dev_err(&(f)->config->cdev->gadget->dev, "%s: " fmt, (f)->name, ##args) 63 64/* ------------------------------------------------------------------------ 65 * Driver specific constants 66 */ 67 68#define UVC_MAX_REQUEST_SIZE 64 69#define UVC_MAX_EVENTS 4 70 71#define UVCG_REQUEST_HEADER_LEN 12 72 73/* ------------------------------------------------------------------------ 74 * Structures 75 */ 76struct uvc_request { 77 struct usb_request *req; 78 u8 *req_buffer; 79 struct uvc_video *video; 80 struct sg_table sgt; 81 u8 header[UVCG_REQUEST_HEADER_LEN]; 82}; 83 84struct uvc_video { 85 struct uvc_device *uvc; 86 struct usb_ep *ep; 87 88 struct work_struct pump; 89 90 /* Frame parameters */ 91 u8 bpp; 92 u32 fcc; 93 unsigned int width; 94 unsigned int height; 95 unsigned int imagesize; 96 struct mutex mutex; /* protects frame parameters */ 97 98 unsigned int uvc_num_requests; 99 100 /* Requests */ 101 unsigned int req_size; 102 struct uvc_request *ureq; 103 struct list_head req_free; 104 spinlock_t req_lock; 105 106 unsigned int req_int_count; 107 108 void (*encode) (struct usb_request *req, struct uvc_video *video, 109 struct uvc_buffer *buf); 110 111 /* Context data used by the completion handler */ 112 __u32 payload_size; 113 __u32 max_payload_size; 114 115 struct uvc_video_queue queue; 116 unsigned int fid; 117}; 118 119enum uvc_state { 120 UVC_STATE_DISCONNECTED, 121 UVC_STATE_CONNECTED, 122 UVC_STATE_STREAMING, 123}; 124 125struct uvc_device { 126 struct video_device vdev; 127 struct v4l2_device v4l2_dev; 128 enum uvc_state state; 129 struct usb_function func; 130 struct uvc_video video; 131 bool func_connected; 132 133 /* Descriptors */ 134 struct { 135 const struct uvc_descriptor_header * const *fs_control; 136 const struct uvc_descriptor_header * const *ss_control; 137 const struct uvc_descriptor_header * const *fs_streaming; 138 const struct uvc_descriptor_header * const *hs_streaming; 139 const struct uvc_descriptor_header * const *ss_streaming; 140 } desc; 141 142 unsigned int control_intf; 143 struct usb_ep *control_ep; 144 struct usb_request *control_req; 145 void *control_buf; 146 147 unsigned int streaming_intf; 148 149 /* Events */ 150 unsigned int event_length; 151 unsigned int event_setup_out : 1; 152}; 153 154static inline struct uvc_device *to_uvc(struct usb_function *f) 155{ 156 return container_of(f, struct uvc_device, func); 157} 158 159struct uvc_file_handle { 160 struct v4l2_fh vfh; 161 struct uvc_video *device; 162 bool is_uvc_app_handle; 163}; 164 165#define to_uvc_file_handle(handle) \ 166 container_of(handle, struct uvc_file_handle, vfh) 167 168/* ------------------------------------------------------------------------ 169 * Functions 170 */ 171 172extern void uvc_function_setup_continue(struct uvc_device *uvc); 173extern void uvc_endpoint_stream(struct uvc_device *dev); 174 175extern void uvc_function_connect(struct uvc_device *uvc); 176extern void uvc_function_disconnect(struct uvc_device *uvc); 177 178#endif /* _UVC_GADGET_H_ */