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 2010 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
31extern "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
39typedef struct usbvc_state usbvc_state_t;
40
41/*
42 * Power Management support
43 */
44typedef 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 */
61typedef 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	uint_t len_read; /* bytes read */
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
127	/*
128	 * To flag if VIDIOC_STREAMON is executed, only used by STREAM mode
129	 * for suspend/resume. If it's non-zero, we'll have to resume the
130	 * device's isoc polling operation after resume.
131	 */
132	uint8_t		stream_on;
133
134	uchar_t		fid;		/* the MJPEG FID bit */
135	usbvc_buf_grp_t	buf_read;	/* buf used for read I/O */
136	uint8_t			buf_read_num; /* desired buf num for read I/O */
137	usbvc_buf_grp_t	buf_map;	/* buf used for mmap I/O */
138	list_node_t	stream_if_node;
139} usbvc_stream_if_t;
140
141/* video interface collection */
142typedef struct usbvc_vic {
143
144	/* bFirstInterface, the video control infterface num of this VIC */
145	uint8_t	vctrl_if_num;
146
147	/*
148	 * bInterfaceCount -1, the total number of stream interfaces
149	 * belong to this VIC
150	 */
151	uint8_t	vstrm_if_cnt;
152} usbvc_vic_t;
153
154/* Macros */
155#define	USBVC_OPEN		0x00000001
156
157/* For serialization. */
158#define	USBVC_SER_NOSIG	B_FALSE
159#define	USBVC_SER_SIG		B_TRUE
160
161/*
162 * Masks for debug printing
163 */
164#define	PRINT_MASK_ATTA		0x00000001
165#define	PRINT_MASK_OPEN 	0x00000002
166#define	PRINT_MASK_CLOSE	0x00000004
167#define	PRINT_MASK_READ		0x00000008
168#define	PRINT_MASK_IOCTL	0x00000010
169#define	PRINT_MASK_PM	0x00000020
170#define	PRINT_MASK_CB	0x00000040
171#define	PRINT_MASK_HOTPLUG	0x00000080
172#define	PRINT_MASK_DEVCTRL	0x00000100
173#define	PRINT_MASK_DEVMAP	0x00000200
174#define	PRINT_MASK_ALL		0xFFFFFFFF
175
176#define	offsetof(s, m)	((size_t)(&(((s *)0)->m)))
177
178#define	USBVC_MAX_PKTS 40
179
180#define	USBVC_DEFAULT_READ_BUF_NUM 3
181#define	USBVC_MAX_READ_BUF_NUM 40
182#define	USBVC_MAX_MAP_BUF_NUM 40
183
184/* According to UVC specs, the frame interval is in 100ns unit */
185#define	USBVC_FRAME_INTERVAL_DENOMINATOR	10000000
186
187/* Only D3...D0 are writable, Table 4-6, UVC Spec */
188#define	USBVC_POWER_MODE_MASK	0xf0;
189
190enum usbvc_buf_status {
191	USBVC_BUF_INIT		= 0,  /* Allocated, to be queued */
192	    USBVC_BUF_MAPPED	= 1,  /* For map I/O only. Memory is mapped. */
193	    USBVC_BUF_EMPTY		= 2, /* not initialized, to be filled */
194
195	/*
196	 * buf is filled with a full frame without any errors,
197	 * it will be moved to full list.
198	 */
199	    USBVC_BUF_DONE		= 4,
200
201	/*
202	 * buf is filled to full but no EOF bit is found at the end
203	 * of video data
204	 */
205	    USBVC_BUF_ERR		= 8
206};
207
208/*
209 * This structure is used to map v4l2 controls to uvc controls. The structure
210 * array is addressed by (V4L2_CID_BASE - V4L2_CID_*)
211 */
212typedef struct usbvc_v4l2_ctrl_map {
213	char	name[32];
214	uint8_t	selector; /* Control Selector */
215	uint8_t	len;	/* wLength, defined in uvc spec chp 4 for each ctrl */
216
217	/* The xth bit in bmControls bitmap of processing unit descriptor */
218	uint8_t	bit;
219
220	enum	v4l2_ctrl_type type;
221} usbvc_v4l2_ctrl_map_t;
222
223typedef struct usbvc_v4l2_ctrl {
224	uint8_t			entity_id;
225	usbvc_v4l2_ctrl_map_t	*ctrl_map;
226} usbvc_v4l2_ctrl_t;
227
228
229/*
230 * State structure
231 */
232struct usbvc_state {
233	dev_info_t		*usbvc_dip;	/* per-device info handle */
234	usb_client_dev_data_t	*usbvc_reg;	/* registration data */
235	int			usbvc_dev_state; /* USB device states. */
236	int			usbvc_drv_state; /* driver states. */
237	kmutex_t		usbvc_mutex;
238	kcondvar_t		usbvc_serial_cv;
239	boolean_t		usbvc_serial_inuse;
240	boolean_t		usbvc_locks_initialized;
241
242	usbvc_power_t		*usbvc_pm;
243
244	usb_log_handle_t	usbvc_log_handle;	/* log handle */
245	usb_pipe_handle_t	usbvc_default_ph; /* default pipe */
246
247	/* Video ctrl interface header descriptor */
248	usbvc_vc_header_t	*usbvc_vc_header;
249	list_t			usbvc_term_list;
250	list_t			usbvc_unit_list;
251
252	list_t			usbvc_stream_list;
253	usbvc_stream_if_t	*usbvc_curr_strm;
254	kcondvar_t		usbvc_read_cv;	/* wait for read buf done */
255	kcondvar_t		usbvc_mapio_cv;	/* wait for mmap I/O buf done */
256
257	/* current I/O type: read or mmap. */
258	uchar_t			usbvc_io_type;
259};
260
261
262/*
263 * Used in ioctl entry to copy an argument from kernel space (arg_name)
264 * to USER space (arg)
265 */
266#define	USBVC_COPYOUT(arg_name) \
267if (ddi_copyout(&arg_name, (caddr_t)arg, sizeof (arg_name), mode)) { \
268    rv = EFAULT; \
269    break;	\
270}
271
272/*
273 * Used in ioctl entry to copy an argument from USER space (arg) to
274 * KERNEL space (arg_name)
275 */
276#define	USBVC_COPYIN(arg_name) \
277if (ddi_copyin((caddr_t)arg, &arg_name, sizeof (arg_name), mode)) { \
278	rv = EFAULT; \
279	break;	\
280}
281
282/* Turn a little endian byte array to a uint32_t */
283#define	LE_TO_UINT32(src, off, des)	{ \
284				uint32_t tmp; \
285				des = src[off + 3]; \
286				des = des << 24; \
287				tmp = src[off + 2]; \
288				des |= tmp << 16; \
289				tmp = src[off + 1]; \
290				des |= tmp << 8; \
291				des |= src[off]; \
292				}
293
294/* Turn a uint32_t to a little endian byte array */
295#define	UINT32_TO_LE(src, off, des)	{ \
296				des[off + 0] = 0xff & src; \
297				des[off + 1] = 0xff & (src >> 8); \
298				des[off + 2] = 0xff & (src >> 16); \
299				des[off + 3] = 0xff & (src >> 24); \
300				}
301
302/* Turn a little endian byte array to a uint16_t */
303#define	LE_TO_UINT16(src, off, des)	 \
304				des = src[off + 1]; \
305				des = des << 8; \
306				des |= src[off];
307
308/* Turn a uint16_t to alittle endian byte array */
309#define	UINT16_TO_LE(src, off, des)	{ \
310				des[off + 0] = 0xff & src; \
311				des[off + 1] = 0xff & (src >> 8); \
312				}
313
314#define	NELEM(a)	(sizeof (a) / sizeof (*(a)))
315
316/* Minimum length of class specific descriptors */
317#define	USBVC_C_HEAD_LEN_MIN	12	/* ctrl header */
318#define	USBVC_I_TERM_LEN_MIN	8	/* input term */
319#define	USBVC_O_TERM_LEN_MIN	9	/* output term */
320#define	USBVC_P_UNIT_LEN_MIN	8	/* processing unit */
321#define	USBVC_S_UNIT_LEN_MIN	5	/* selector unit */
322#define	USBVC_E_UNIT_LEN_MIN	22	/* extension unit */
323#define	USBVC_FRAME_LEN_MIN	26	/* Frame descriptor */
324
325/* Length of the Frame descriptor which has continuous frame intervals */
326#define	USBVC_FRAME_LEN_CON	38
327
328
329/*
330 * According to usb2.0 spec (table 9-13), for all ep, bits 10..0 specify the
331 * max pkt size; for high speed ep, bits 12..11 specify the number of
332 * additional transaction opportunities per microframe.
333 */
334#define	HS_PKT_SIZE(pktsize) (pktsize & 0x07ff) * (1 + ((pktsize >> 11) & 3))
335
336/*
337 * warlock directives
338 * _NOTE is an advice for locklint.  Locklint checks lock use for deadlocks.
339 */
340_NOTE(MUTEX_PROTECTS_DATA(usbvc_state_t::usbvc_mutex, usbvc_state_t))
341_NOTE(DATA_READABLE_WITHOUT_LOCK(usbvc_state_t::{
342	usbvc_dip
343	usbvc_pm
344	usbvc_log_handle
345	usbvc_reg
346	usbvc_default_ph
347	usbvc_vc_header
348	usbvc_term_list
349	usbvc_unit_list
350	usbvc_stream_list
351}))
352
353_NOTE(SCHEME_PROTECTS_DATA("stable data", usb_pipe_policy))
354_NOTE(SCHEME_PROTECTS_DATA("USBA", usbvc_stream_if::datain_ph))
355_NOTE(SCHEME_PROTECTS_DATA("USBA", usbvc_stream_if::curr_alt))
356_NOTE(SCHEME_PROTECTS_DATA("USBA", usbvc_stream_if::curr_ep))
357_NOTE(SCHEME_PROTECTS_DATA("unshared data", usbvc_buf::umem_cookie))
358_NOTE(SCHEME_PROTECTS_DATA("unshared data", usbvc_buf::data))
359_NOTE(SCHEME_PROTECTS_DATA("unshared data", usbvc_v4l2_ctrl))
360_NOTE(SCHEME_PROTECTS_DATA("unshared data", usbvc_v4l2_ctrl_map))
361_NOTE(SCHEME_PROTECTS_DATA("unshared data", mblk_t))
362_NOTE(SCHEME_PROTECTS_DATA("unshared data", buf))
363_NOTE(SCHEME_PROTECTS_DATA("unshared data", usb_isoc_req))
364_NOTE(SCHEME_PROTECTS_DATA("unshared data", v4l2_queryctrl))
365_NOTE(SCHEME_PROTECTS_DATA("unshared data", v4l2_format))
366_NOTE(SCHEME_PROTECTS_DATA("unshared data", v4l2_control))
367_NOTE(SCHEME_PROTECTS_DATA("unshared data", v4l2_streamparm))
368
369int	usbvc_open_isoc_pipe(usbvc_state_t *, usbvc_stream_if_t *);
370int	usbvc_start_isoc_polling(usbvc_state_t *, usbvc_stream_if_t *, uchar_t);
371int	usbvc_vc_set_ctrl(usbvc_state_t *, uint8_t,  uint8_t,
372		uint16_t, uint16_t, mblk_t *);
373int	usbvc_vc_get_ctrl(usbvc_state_t *, uint8_t,  uint8_t,
374		uint16_t, uint16_t, mblk_t *);
375int	usbvc_vs_set_probe_commit(usbvc_state_t *, usbvc_stream_if_t *,
376	usbvc_vs_probe_commit_t *, uchar_t);
377void	usbvc_free_map_bufs(usbvc_state_t *, usbvc_stream_if_t *);
378int	usbvc_alloc_map_bufs(usbvc_state_t *, usbvc_stream_if_t *, int, int);
379int	usbvc_vs_get_probe(usbvc_state_t *, usbvc_stream_if_t *,
380		usbvc_vs_probe_commit_t *, uchar_t);
381
382/* Functions specific for V4L2 API */
383uint8_t		usbvc_v4l2_colorspace(uint8_t);
384uint32_t	usbvc_v4l2_guid2fcc(uint8_t *);
385int		usbvc_v4l2_ioctl(usbvc_state_t *, int, intptr_t, int);
386
387
388#ifdef __cplusplus
389}
390#endif
391
392#endif	/* _SYS_USB_USBVC_VAR_H */
393