summaryrefslogtreecommitdiff
path: root/usr/src/uts/common/sys/1394/targets/dcam1394/dcam.h
blob: 6bfdc3c1ffea8144b92299895bbdc2b29e25d421 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
/*
 * CDDL HEADER START
 *
 * The contents of this file are subject to the terms of the
 * Common Development and Distribution License, Version 1.0 only
 * (the "License").  You may not use this file except in compliance
 * with the License.
 *
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
 * or http://www.opensolaris.org/os/licensing.
 * See the License for the specific language governing permissions
 * and limitations under the License.
 *
 * When distributing Covered Code, include this CDDL HEADER in each
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
 * If applicable, add the following below this CDDL HEADER, with the
 * fields enclosed by brackets "[]" replaced with your own identifying
 * information: Portions Copyright [yyyy] [name of copyright owner]
 *
 * CDDL HEADER END
 */
/*
 * Copyright 2005 Sun Microsystems, Inc.  All rights reserved.
 * Use is subject to license terms.
 * Copyright 2017 Joyent, Inc.
 */

#ifndef _SYS_1394_TARGETS_DCAM1394_DCAM_H
#define	_SYS_1394_TARGETS_DCAM1394_DCAM_H

#include <sys/modctl.h>
#include <sys/ksynch.h>
#include <sys/types.h>
#include <sys/dditypes.h>
#include <sys/1394/t1394.h>
#include <sys/dcam/dcam1394_io.h>

#ifdef	__cplusplus
extern "C" {
#endif

#define	ILP32_PTR_SIZE	4	/* caller's data model type	*/
#define	LP64_PTR_SIZE 	8

#define	DCAM_POWER_OFF	0	/* power management state	*/
#define	DCAM_POWER_ON	1

#define	DCAM1394_MINOR_CTRL	0x80		/* this is the control device */

#define	DCAM1394_FLAG_ATTACH_COMPLETE	0x1  /* dcam_attach() is complete */
#define	DCAM1394_FLAG_OPEN		0x2  /* driver is open */
#define	DCAM1394_FLAG_OPEN_CAPTURE	0x4  /* device is open for capture */
#define	DCAM1394_FLAG_OPEN_CONTROL	0x8  /* device is open for control */
#define	DCAM1394_FLAG_FRAME_RCV_INIT	0x10
#define	DCAM1394_FLAG_FRAME_RCVING	0x20
#define	DCAM1394_FLAG_READ_REQ_PROC	0x40
#define	DCAM1394_FLAG_READ_REQ_INVALID	0x80

#define	IS_VALID	0x1
#define	IS_PRESENT	0x2
#define	CAP_GET		0x4
#define	CAP_SET		0x8
#define	CAP_CTRL_SET	0x10

#define	MAX_STR_LEN	50

#define	DEV_TO_INSTANCE(d) (getminor(d) & 0x7f)

typedef uint_t
    dcam1394_param_attr_t[DCAM1394_NUM_PARAM][DCAM1394_NUM_SUBPARAM];

typedef struct buff_info_s {
	uint_t			vid_mode;
	unsigned int		seq_num;
	hrtime_t		timestamp;
	caddr_t			kaddr_p;		/* kernel data buffer */
	ddi_dma_handle_t	dma_handle;		/* bind handle */
	ddi_acc_handle_t	data_acc_handle;  	/* acc handle */
	ddi_dma_cookie_t	dma_cookie;		/* cookie */
	size_t			real_len;    		/* mem len */
	uint_t			dma_cookie_count;	/* cookie count */
} buff_info_t;

#define	MAX_NUM_READ_PTRS 1

typedef struct ring_buff_s {
	size_t		 num_buffs;
	size_t		 buff_num_bytes;
	buff_info_t	*buff_info_array_p;
	int		 num_read_ptrs;
	int		 read_ptr_incr_val;
	size_t		 read_ptr_pos[MAX_NUM_READ_PTRS];
	uint_t		 status[MAX_NUM_READ_PTRS];
	size_t		 write_ptr_pos;
} ring_buff_t;

typedef struct dcam_state_s {
	dev_info_t			*dip;
	int				instance;
	int				usr_model;
	t1394_handle_t			sl_handle;
	t1394_attachinfo_t		attachinfo;
	t1394_targetinfo_t		targetinfo;
	t1394_isoch_singleinfo_t	sii;
	t1394_isoch_single_out_t	sii_output_args;
	t1394_isoch_single_handle_t	sii_hdl;
	t1394_isoch_dma_handle_t 	isoch_handle;
	kmutex_t			softc_mutex;
	kmutex_t			dcam_frame_is_done_mutex;
	dcam1394_param_attr_t		param_attr;

	ixl1394_command_t		*ixlp;

	ring_buff_t			*ring_buff_p;
	unsigned int			seq_count;
	uint_t				reader_flags[MAX_NUM_READ_PTRS];
	uint_t				flags;
	int				cur_vid_mode;
	int				cur_frame_rate;
	int				cur_ring_buff_capacity;
	int				param_status;
	int				camera_online;
	int				pm_open_count;
	int				pm_cable_power;
	int				suspended;
	ddi_callback_id_t		event_id;
} dcam_state_t;

int _init(void);
int _info(struct modinfo *modinfop);
int _fini(void);

int dcam_attach(dev_info_t *dip, ddi_attach_cmd_t cmd);
int dcam_power(dev_info_t *dip, int component, int level);
int dcam_getinfo(dev_info_t *dip, ddi_info_cmd_t cmd, void *arg, void **result);
int dcam_identify(dev_info_t *dip);
int dcam_detach(dev_info_t *dip, ddi_detach_cmd_t cmd);
int dcam_open(dev_t *devp, int flag, int otyp, cred_t *credp);
int dcam_close(dev_t dev, int flags, int otyp, cred_t *credp);
int dcam_read(dev_t dev, struct uio *uio, cred_t *credp);
int dcam_write(dev_t dev, struct uio *uio, cred_t *credp);
int dcam_mmap(dev_t dev, off_t off, int prot);
int dcam_devmap(dev_t dev, devmap_cookie_t dhp, offset_t off, size_t len,
    size_t *maplen, uint_t model);
int dcam_ioctl(dev_t dev, int cmd, intptr_t arg, int mode,
    cred_t *credp, int *rvalp);
int dcam_chpoll(dev_t dev, short events, int anyyet, short *reventsp,
    struct pollhead **phpp);
int dcam_intr(caddr_t dcam_softc_p);
void dcam_bus_reset_notify(dev_info_t *dip, ddi_eventcookie_t ev_cookie,
    void *arg, void *impl_data);


ring_buff_t *ring_buff_create(dcam_state_t *softc_p, size_t num_buffs,
    size_t buff_num_bytes);
void ring_buff_free(dcam_state_t *softc_p, ring_buff_t *ring_buff_p);
int ring_buff_reader_add(ring_buff_t *ring_buff_p);
int ring_buff_reader_remove(ring_buff_t *ring_buff_p, int reader_id);
buff_info_t *ring_buff_read_ptr_buff_get(ring_buff_t *ring_buff_p, int
    reader_id);
size_t ring_buff_read_ptr_pos_get(ring_buff_t *ring_buff_p, int read_ptr_id);
void ring_buff_read_ptr_incr(ring_buff_t *ring_buff_p, int read_ptr_id);
size_t ring_buff_write_ptr_pos_get(ring_buff_t *ring_buff_p);
void ring_buff_write_ptr_incr(ring_buff_t *ring_buff_p);
int dcam_frame_rcv_stop(dcam_state_t *softc_p);
int dcam1394_ioctl_frame_rcv_start(dcam_state_t *softc_p);

#ifdef	__cplusplus
}
#endif

#endif	/* _SYS_1394_TARGETS_DCAM1394_DCAM_H */