xref: /illumos-gate/usr/src/uts/common/sys/usb/clients/video/usbvc/usbvc_var.h (revision f6f4cb8ada400367a1921f6b93fb9e02f53ac5e6)
1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License (the "License").
6  * You may not use this file except in compliance with the License.
7  *
8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9  * or http://www.opensolaris.org/os/licensing.
10  * See the License for the specific language governing permissions
11  * and limitations under the License.
12  *
13  * When distributing Covered Code, include this CDDL HEADER in each
14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15  * If applicable, add the following below this CDDL HEADER, with the
16  * fields enclosed by brackets "[]" replaced with your own identifying
17  * information: Portions Copyright [yyyy] [name of copyright owner]
18  *
19  * CDDL HEADER END
20  */
21 /*
22  * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
23  * Use is subject to license terms.
24  */
25 
26 #ifndef _SYS_USB_USBVC_VAR_H
27 #define	_SYS_USB_USBVC_VAR_H
28 
29 
30 #ifdef	__cplusplus
31 extern "C" {
32 #endif
33 
34 #include <sys/list.h>
35 #include <sys/usb/usba/usbai_private.h>
36 #include <sys/videodev2.h>
37 #include <sys/usb/clients/video/usbvc/usbvc.h>
38 
39 typedef struct usbvc_state usbvc_state_t;
40 
41 /*
42  * Power Management support
43  */
44 typedef struct usbvc_power  {
45 
46 	void		*usbvc_state;	/* points back to usbvc_state */
47 	uint8_t		usbvc_pwr_states; /* bit mask of device pwr states */
48 	int		usbvc_pm_busy;
49 
50 	/* Wakeup and power transistion capabilites of an interface */
51 	uint8_t		usbvc_pm_capabilities;
52 
53 	/* flag to indicate if driver is about to raise power level */
54 	boolean_t	usbvc_raise_power;
55 
56 	uint8_t		usbvc_current_power;
57 	uint8_t		usbvc_wakeup_enabled;
58 } usbvc_power_t;
59 
60 /* Raw data buf from the USB cam */
61 typedef struct usbvc_buf
62 {
63 	uchar_t *data;
64 	uint_t len;	/* the length of the allocated memory of data */
65 	uint_t filled;	/* number of bytes filled */
66 	uchar_t status; /* empty, filling done, read done */
67 
68 	/* cookie used for memory mapping */
69 	ddi_umem_cookie_t	umem_cookie;
70 	struct			v4l2_buffer v4l2_buf;
71 	list_node_t		buf_node;	/* list */
72 } usbvc_buf_t;
73 
74 /* Group data buf related lists and other elements */
75 typedef struct usbvc_buf_grp
76 {
77     list_t		uv_buf_free;
78 	list_t		uv_buf_done;
79 	usbvc_buf_t	*buf_filling;
80 	uint_t		buf_cnt;
81 	usbvc_buf_t	*buf_head;
82 } usbvc_buf_grp_t;
83 
84 /*
85  * UVC Spec: one format descriptor may be followed by sererval frame
86  * descriptors, one still image descriptor and one color matching descriptor.
87  * It is called a format group. There might be several format groups follow
88  * one input/output header.
89  */
90 typedef struct usbvc_format_group {
91 	usbvc_format_descr_t	*format;
92 	usbvc_frames_t		*frames;
93 	uint8_t			frame_cnt;
94 
95 	/* bytes per pix, used to calculate bytesperline */
96 	uint8_t			v4l2_bpp;
97 
98 	uint8_t			v4l2_color;
99 	uint32_t		v4l2_pixelformat;	/* fcc, pixelformat */
100 	usbvc_still_image_frame_t	*still;
101 	usbvc_color_matching_descr_t	*color;
102 	usbvc_frames_t			*cur_frame;
103 } usbvc_format_group_t;
104 
105 /* A stream interface may have several format groups */
106 typedef struct usbvc_stream_if {
107 
108 	/* The actual format groups we parsed for the stream interface */
109 	uint8_t			fmtgrp_cnt;
110 
111 	usb_if_data_t		*if_descr;
112 	usbvc_input_header_t	*input_header;
113 	usbvc_output_header_t	*output_header;
114 	usbvc_format_group_t	*format_group;
115 	usbvc_format_group_t	*cur_format_group;
116 	usbvc_vs_probe_commit_t	ctrl_pc;
117 	usb_ep_descr_t		*curr_ep;	/* current isoc ep descr */
118 	usb_pipe_handle_t	datain_ph;	/* current isoc pipe handle */
119 	uint_t			curr_alt;	/* current alternate  */
120 
121 	/* The max payload that the isoc data EPs can support */
122 	uint32_t	max_isoc_payload;
123 
124 	uchar_t		start_polling;	/* indicate if isoc polling started */
125 	uchar_t		fid;		/* the MJPEG FID bit */
126 	usbvc_buf_grp_t	buf_read;	/* buf used for read I/O */
127 	uint8_t			buf_read_num; /* desired buf num for read I/O */
128 	usbvc_buf_grp_t	buf_map;	/* buf used for mmap I/O */
129 	list_node_t	stream_if_node;
130 } usbvc_stream_if_t;
131 
132 /* video interface collection */
133 typedef struct usbvc_vic {
134 
135 	/* bFirstInterface, the video control infterface num of this VIC */
136 	uint8_t	vctrl_if_num;
137 
138 	/*
139 	 * bInterfaceCount -1, the total number of stream interfaces
140 	 * belong to this VIC
141 	 */
142 	uint8_t	vstrm_if_cnt;
143 } usbvc_vic_t;
144 
145 /* Macros */
146 #define	USBVC_OPEN		0x00000001
147 
148 /* For serialization. */
149 #define	USBVC_SER_NOSIG	B_FALSE
150 #define	USBVC_SER_SIG		B_TRUE
151 
152 /*
153  * Masks for debug printing
154  */
155 #define	PRINT_MASK_ATTA		0x00000001
156 #define	PRINT_MASK_OPEN 	0x00000002
157 #define	PRINT_MASK_CLOSE	0x00000004
158 #define	PRINT_MASK_READ		0x00000008
159 #define	PRINT_MASK_IOCTL	0x00000010
160 #define	PRINT_MASK_PM	0x00000020
161 #define	PRINT_MASK_CB	0x00000040
162 #define	PRINT_MASK_HOTPLUG	0x00000080
163 #define	PRINT_MASK_DEVCTRL	0x00000100
164 #define	PRINT_MASK_DEVMAP	0x00000200
165 #define	PRINT_MASK_ALL		0xFFFFFFFF
166 
167 #define	offsetof(s, m)	((size_t)(&(((s *)0)->m)))
168 
169 #define	USBVC_MAX_PKTS 40
170 
171 #define	USBVC_DEFAULT_READ_BUF_NUM 3
172 #define	USBVC_MAX_READ_BUF_NUM 40
173 #define	USBVC_MAX_MAP_BUF_NUM 40
174 
175 /* According to UVC specs, the frame interval is in 100ns unit */
176 #define	USBVC_FRAME_INTERVAL_DENOMINATOR	10000000
177 
178 /* Only D3...D0 are writable, Table 4-6, UVC Spec */
179 #define	USBVC_POWER_MODE_MASK	0xf0;
180 
181 enum usbvc_buf_status {
182 	USBVC_BUF_INIT		= 0,  /* Allocated, to be queued */
183 	    USBVC_BUF_MAPPED	= 1,  /* For map I/O only. Memory is mapped. */
184 	    USBVC_BUF_EMPTY		= 2, /* not initialized, to be filled */
185 
186 	/*
187 	 * buf is filled with a full frame without any errors,
188 	 * it will be moved to full list.
189 	 */
190 	    USBVC_BUF_DONE		= 4,
191 
192 	/*
193 	 * buf is filled to full but no EOF bit is found at the end
194 	 * of video data
195 	 */
196 	    USBVC_BUF_ERR		= 8
197 };
198 
199 /*
200  * This structure is used to map v4l2 controls to uvc controls. The structure
201  * array is addressed by (V4L2_CID_BASE - V4L2_CID_*)
202  */
203 typedef struct usbvc_v4l2_ctrl_map {
204 	char	name[32];
205 	uint8_t	selector; /* Control Selector */
206 	uint8_t	len;	/* wLength, defined in uvc spec chp 4 for each ctrl */
207 
208 	/* The xth bit in bmControls bitmap of processing unit descriptor */
209 	uint8_t	bit;
210 
211 	enum	v4l2_ctrl_type type;
212 } usbvc_v4l2_ctrl_map_t;
213 
214 typedef struct usbvc_v4l2_ctrl {
215 	uint8_t			entity_id;
216 	usbvc_v4l2_ctrl_map_t	*ctrl_map;
217 } usbvc_v4l2_ctrl_t;
218 
219 
220 /*
221  * State structure
222  */
223 struct usbvc_state {
224 	dev_info_t		*usbvc_dip;	/* per-device info handle */
225 	usb_client_dev_data_t	*usbvc_reg;	/* registration data */
226 	int			usbvc_dev_state; /* USB device states. */
227 	int			usbvc_drv_state; /* driver states. */
228 	kmutex_t		usbvc_mutex;
229 	kcondvar_t		usbvc_serial_cv;
230 	boolean_t		usbvc_serial_inuse;
231 	boolean_t		usbvc_locks_initialized;
232 
233 	usbvc_power_t		*usbvc_pm;
234 
235 	usb_log_handle_t	usbvc_log_handle;	/* log handle */
236 	usb_pipe_handle_t	usbvc_default_ph; /* default pipe */
237 
238 	/* Video ctrl interface header descriptor */
239 	usbvc_vc_header_t	*usbvc_vc_header;
240 	list_t			usbvc_term_list;
241 	list_t			usbvc_unit_list;
242 
243 	list_t			usbvc_stream_list;
244 	usbvc_stream_if_t	*usbvc_curr_strm;
245 	kcondvar_t		usbvc_read_cv;	/* wait for read buf done */
246 	kcondvar_t		usbvc_mapio_cv;	/* wait for mmap I/O buf done */
247 
248 	/* current I/O type: read or mmap. */
249 	uchar_t			usbvc_io_type;
250 };
251 
252 
253 /*
254  * Used in ioctl entry to copy an argument from kernel space (arg_name)
255  * to USER space (arg)
256  */
257 #define	USBVC_COPYOUT(arg_name) \
258 if (ddi_copyout(&arg_name, (caddr_t)arg, sizeof (arg_name), mode)) { \
259     rv = EFAULT; \
260     break;	\
261 }
262 
263 /*
264  * Used in ioctl entry to copy an argument from USER space (arg) to
265  * KERNEL space (arg_name)
266  */
267 #define	USBVC_COPYIN(arg_name) \
268 if (ddi_copyin((caddr_t)arg, &arg_name, sizeof (arg_name), mode)) { \
269 	rv = EFAULT; \
270 	break;	\
271 }
272 
273 /* Turn a little endian byte array to a uint32_t */
274 #define	LE_TO_UINT32(src, off, des)	{ \
275 				uint32_t tmp; \
276 				des = src[off + 3]; \
277 				des = des << 24; \
278 				tmp = src[off + 2]; \
279 				des |= tmp << 16; \
280 				tmp = src[off + 1]; \
281 				des |= tmp << 8; \
282 				des |= src[off]; \
283 				}
284 
285 /* Turn a uint32_t to a little endian byte array */
286 #define	UINT32_TO_LE(src, off, des)	{ \
287 				des[off + 0] = 0xff & src; \
288 				des[off + 1] = 0xff & (src >> 8); \
289 				des[off + 2] = 0xff & (src >> 16); \
290 				des[off + 3] = 0xff & (src >> 24); \
291 				}
292 
293 /* Turn a little endian byte array to a uint16_t */
294 #define	LE_TO_UINT16(src, off, des)	 \
295 				des = src[off + 1]; \
296 				des = des << 8; \
297 				des |= src[off];
298 
299 /* Turn a uint16_t to alittle endian byte array */
300 #define	UINT16_TO_LE(src, off, des)	{ \
301 				des[off + 0] = 0xff & src; \
302 				des[off + 1] = 0xff & (src >> 8); \
303 				}
304 
305 #define	NELEM(a)	(sizeof (a) / sizeof (*(a)))
306 
307 /* Minimum length of class specific descriptors */
308 #define	USBVC_C_HEAD_LEN_MIN	12	/* ctrl header */
309 #define	USBVC_I_TERM_LEN_MIN	8	/* input term */
310 #define	USBVC_O_TERM_LEN_MIN	9	/* output term */
311 #define	USBVC_P_UNIT_LEN_MIN	8	/* processing unit */
312 #define	USBVC_S_UNIT_LEN_MIN	5	/* selector unit */
313 #define	USBVC_E_UNIT_LEN_MIN	22	/* extension unit */
314 #define	USBVC_FRAME_LEN_MIN	26	/* Frame descriptor */
315 
316 /* Length of the Frame descriptor which has continuous frame intervals */
317 #define	USBVC_FRAME_LEN_CON	38
318 
319 
320 /*
321  * According to usb2.0 spec (table 9-13), for all ep, bits 10..0 specify the
322  * max pkt size; for high speed ep, bits 12..11 specify the number of
323  * additional transaction opportunities per microframe.
324  */
325 #define	HS_PKT_SIZE(pktsize) (pktsize & 0x07ff) * (1 + ((pktsize >> 11) & 3))
326 
327 /*
328  * warlock directives
329  * _NOTE is an advice for locklint.  Locklint checks lock use for deadlocks.
330  */
331 _NOTE(MUTEX_PROTECTS_DATA(usbvc_state_t::usbvc_mutex, usbvc_state_t))
332 _NOTE(DATA_READABLE_WITHOUT_LOCK(usbvc_state_t::{
333 	usbvc_dip
334 	usbvc_pm
335 	usbvc_log_handle
336 	usbvc_reg
337 	usbvc_default_ph
338 	usbvc_vc_header
339 	usbvc_term_list
340 	usbvc_unit_list
341 	usbvc_stream_list
342 }))
343 
344 _NOTE(SCHEME_PROTECTS_DATA("stable data", usb_pipe_policy))
345 _NOTE(SCHEME_PROTECTS_DATA("USBA", usbvc_stream_if::datain_ph))
346 _NOTE(SCHEME_PROTECTS_DATA("USBA", usbvc_stream_if::curr_alt))
347 _NOTE(SCHEME_PROTECTS_DATA("USBA", usbvc_stream_if::curr_ep))
348 _NOTE(SCHEME_PROTECTS_DATA("unshared data", usbvc_buf::umem_cookie))
349 _NOTE(SCHEME_PROTECTS_DATA("unshared data", usbvc_buf::data))
350 _NOTE(SCHEME_PROTECTS_DATA("unshared data", usbvc_v4l2_ctrl))
351 _NOTE(SCHEME_PROTECTS_DATA("unshared data", usbvc_v4l2_ctrl_map))
352 _NOTE(SCHEME_PROTECTS_DATA("unshared data", mblk_t))
353 _NOTE(SCHEME_PROTECTS_DATA("unshared data", buf))
354 _NOTE(SCHEME_PROTECTS_DATA("unshared data", usb_isoc_req))
355 _NOTE(SCHEME_PROTECTS_DATA("unshared data", v4l2_queryctrl))
356 _NOTE(SCHEME_PROTECTS_DATA("unshared data", v4l2_format))
357 _NOTE(SCHEME_PROTECTS_DATA("unshared data", v4l2_control))
358 _NOTE(SCHEME_PROTECTS_DATA("unshared data", v4l2_streamparm))
359 
360 int	usbvc_open_isoc_pipe(usbvc_state_t *, usbvc_stream_if_t *);
361 int	usbvc_start_isoc_polling(usbvc_state_t *, usbvc_stream_if_t *, uchar_t);
362 int	usbvc_vc_set_ctrl(usbvc_state_t *, uint8_t,  uint8_t,
363 		uint16_t, uint16_t, mblk_t *);
364 int	usbvc_vc_get_ctrl(usbvc_state_t *, uint8_t,  uint8_t,
365 		uint16_t, uint16_t, mblk_t *);
366 int	usbvc_vs_set_probe_commit(usbvc_state_t *, usbvc_stream_if_t *,
367 	usbvc_vs_probe_commit_t *, uchar_t);
368 void	usbvc_free_map_bufs(usbvc_state_t *, usbvc_stream_if_t *);
369 int	usbvc_alloc_map_bufs(usbvc_state_t *, usbvc_stream_if_t *, int, int);
370 int	usbvc_vs_get_probe(usbvc_state_t *, usbvc_stream_if_t *,
371 		usbvc_vs_probe_commit_t *, uchar_t);
372 
373 /* Functions specific for V4L2 API */
374 uint8_t		usbvc_v4l2_colorspace(uint8_t);
375 uint32_t	usbvc_v4l2_guid2fcc(uint8_t *);
376 int		usbvc_v4l2_ioctl(usbvc_state_t *, int, intptr_t, int);
377 
378 
379 #ifdef __cplusplus
380 }
381 #endif
382 
383 #endif	/* _SYS_USB_USBVC_VAR_H */
384