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