diff options
author | Jonathan Herman <hermanjl@cs.unc.edu> | 2013-01-22 10:38:37 -0500 |
---|---|---|
committer | Jonathan Herman <hermanjl@cs.unc.edu> | 2013-01-22 10:38:37 -0500 |
commit | fcc9d2e5a6c89d22b8b773a64fb4ad21ac318446 (patch) | |
tree | a57612d1888735a2ec7972891b68c1ac5ec8faea /drivers/media/video/pvrusb2/pvrusb2-hdw.h | |
parent | 8dea78da5cee153b8af9c07a2745f6c55057fe12 (diff) |
Diffstat (limited to 'drivers/media/video/pvrusb2/pvrusb2-hdw.h')
-rw-r--r-- | drivers/media/video/pvrusb2/pvrusb2-hdw.h | 364 |
1 files changed, 364 insertions, 0 deletions
diff --git a/drivers/media/video/pvrusb2/pvrusb2-hdw.h b/drivers/media/video/pvrusb2/pvrusb2-hdw.h new file mode 100644 index 00000000000..d7753ae9ff4 --- /dev/null +++ b/drivers/media/video/pvrusb2/pvrusb2-hdw.h | |||
@@ -0,0 +1,364 @@ | |||
1 | /* | ||
2 | * | ||
3 | * | ||
4 | * Copyright (C) 2005 Mike Isely <isely@pobox.com> | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify | ||
7 | * it under the terms of the GNU General Public License as published by | ||
8 | * the Free Software Foundation; either version 2 of the License | ||
9 | * | ||
10 | * This program is distributed in the hope that it will be useful, | ||
11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
13 | * GNU General Public License for more details. | ||
14 | * | ||
15 | * You should have received a copy of the GNU General Public License | ||
16 | * along with this program; if not, write to the Free Software | ||
17 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
18 | * | ||
19 | */ | ||
20 | #ifndef __PVRUSB2_HDW_H | ||
21 | #define __PVRUSB2_HDW_H | ||
22 | |||
23 | #include <linux/usb.h> | ||
24 | #include <linux/videodev2.h> | ||
25 | #include "pvrusb2-io.h" | ||
26 | #include "pvrusb2-ctrl.h" | ||
27 | |||
28 | |||
29 | /* Private internal control ids, look these up with | ||
30 | pvr2_hdw_get_ctrl_by_id() - these are NOT visible in V4L */ | ||
31 | #define PVR2_CID_STDENUM 1 | ||
32 | #define PVR2_CID_STDCUR 2 | ||
33 | #define PVR2_CID_STDAVAIL 3 | ||
34 | #define PVR2_CID_INPUT 4 | ||
35 | #define PVR2_CID_AUDIOMODE 5 | ||
36 | #define PVR2_CID_FREQUENCY 6 | ||
37 | #define PVR2_CID_HRES 7 | ||
38 | #define PVR2_CID_VRES 8 | ||
39 | #define PVR2_CID_CROPL 9 | ||
40 | #define PVR2_CID_CROPT 10 | ||
41 | #define PVR2_CID_CROPW 11 | ||
42 | #define PVR2_CID_CROPH 12 | ||
43 | #define PVR2_CID_CROPCAPPAN 13 | ||
44 | #define PVR2_CID_CROPCAPPAD 14 | ||
45 | #define PVR2_CID_CROPCAPBL 15 | ||
46 | #define PVR2_CID_CROPCAPBT 16 | ||
47 | #define PVR2_CID_CROPCAPBW 17 | ||
48 | #define PVR2_CID_CROPCAPBH 18 | ||
49 | |||
50 | /* Legal values for the INPUT state variable */ | ||
51 | #define PVR2_CVAL_INPUT_TV 0 | ||
52 | #define PVR2_CVAL_INPUT_DTV 1 | ||
53 | #define PVR2_CVAL_INPUT_COMPOSITE 2 | ||
54 | #define PVR2_CVAL_INPUT_SVIDEO 3 | ||
55 | #define PVR2_CVAL_INPUT_RADIO 4 | ||
56 | |||
57 | enum pvr2_config { | ||
58 | pvr2_config_empty, /* No configuration */ | ||
59 | pvr2_config_mpeg, /* Encoded / compressed video */ | ||
60 | pvr2_config_vbi, /* Standard vbi info */ | ||
61 | pvr2_config_pcm, /* Audio raw pcm stream */ | ||
62 | pvr2_config_rawvideo, /* Video raw frames */ | ||
63 | }; | ||
64 | |||
65 | enum pvr2_v4l_type { | ||
66 | pvr2_v4l_type_video, | ||
67 | pvr2_v4l_type_vbi, | ||
68 | pvr2_v4l_type_radio, | ||
69 | }; | ||
70 | |||
71 | /* Major states that we can be in: | ||
72 | * | ||
73 | * DEAD - Device is in an unusable state and cannot be recovered. This | ||
74 | * can happen if we completely lose the ability to communicate with it | ||
75 | * (but it might still on the bus). In this state there's nothing we can | ||
76 | * do; it must be replugged in order to recover. | ||
77 | * | ||
78 | * COLD - Device is in an unusable state, needs microcontroller firmware. | ||
79 | * | ||
80 | * WARM - We can communicate with the device and the proper | ||
81 | * microcontroller firmware is running, but other device initialization is | ||
82 | * still needed (e.g. encoder firmware). | ||
83 | * | ||
84 | * ERROR - A problem prevents capture operation (e.g. encoder firmware | ||
85 | * missing). | ||
86 | * | ||
87 | * READY - Device is operational, but not streaming. | ||
88 | * | ||
89 | * RUN - Device is streaming. | ||
90 | * | ||
91 | */ | ||
92 | #define PVR2_STATE_NONE 0 | ||
93 | #define PVR2_STATE_DEAD 1 | ||
94 | #define PVR2_STATE_COLD 2 | ||
95 | #define PVR2_STATE_WARM 3 | ||
96 | #define PVR2_STATE_ERROR 4 | ||
97 | #define PVR2_STATE_READY 5 | ||
98 | #define PVR2_STATE_RUN 6 | ||
99 | |||
100 | /* Translate configuration enum to a string label */ | ||
101 | const char *pvr2_config_get_name(enum pvr2_config); | ||
102 | |||
103 | struct pvr2_hdw; | ||
104 | |||
105 | /* Create and return a structure for interacting with the underlying | ||
106 | hardware */ | ||
107 | struct pvr2_hdw *pvr2_hdw_create(struct usb_interface *intf, | ||
108 | const struct usb_device_id *devid); | ||
109 | |||
110 | /* Perform second stage initialization, passing in a notification callback | ||
111 | for when the master state changes. */ | ||
112 | int pvr2_hdw_initialize(struct pvr2_hdw *, | ||
113 | void (*callback_func)(void *), | ||
114 | void *callback_data); | ||
115 | |||
116 | /* Destroy hardware interaction structure */ | ||
117 | void pvr2_hdw_destroy(struct pvr2_hdw *); | ||
118 | |||
119 | /* Return true if in the ready (normal) state */ | ||
120 | int pvr2_hdw_dev_ok(struct pvr2_hdw *); | ||
121 | |||
122 | /* Return small integer number [1..N] for logical instance number of this | ||
123 | device. This is useful for indexing array-valued module parameters. */ | ||
124 | int pvr2_hdw_get_unit_number(struct pvr2_hdw *); | ||
125 | |||
126 | /* Get pointer to underlying USB device */ | ||
127 | struct usb_device *pvr2_hdw_get_dev(struct pvr2_hdw *); | ||
128 | |||
129 | /* Retrieve serial number of device */ | ||
130 | unsigned long pvr2_hdw_get_sn(struct pvr2_hdw *); | ||
131 | |||
132 | /* Retrieve bus location info of device */ | ||
133 | const char *pvr2_hdw_get_bus_info(struct pvr2_hdw *); | ||
134 | |||
135 | /* Retrieve per-instance string identifier for this specific device */ | ||
136 | const char *pvr2_hdw_get_device_identifier(struct pvr2_hdw *); | ||
137 | |||
138 | /* Called when hardware has been unplugged */ | ||
139 | void pvr2_hdw_disconnect(struct pvr2_hdw *); | ||
140 | |||
141 | /* Get the number of defined controls */ | ||
142 | unsigned int pvr2_hdw_get_ctrl_count(struct pvr2_hdw *); | ||
143 | |||
144 | /* Retrieve a control handle given its index (0..count-1) */ | ||
145 | struct pvr2_ctrl *pvr2_hdw_get_ctrl_by_index(struct pvr2_hdw *,unsigned int); | ||
146 | |||
147 | /* Retrieve a control handle given its internal ID (if any) */ | ||
148 | struct pvr2_ctrl *pvr2_hdw_get_ctrl_by_id(struct pvr2_hdw *,unsigned int); | ||
149 | |||
150 | /* Retrieve a control handle given its V4L ID (if any) */ | ||
151 | struct pvr2_ctrl *pvr2_hdw_get_ctrl_v4l(struct pvr2_hdw *,unsigned int ctl_id); | ||
152 | |||
153 | /* Retrieve a control handle given its immediate predecessor V4L ID (if any) */ | ||
154 | struct pvr2_ctrl *pvr2_hdw_get_ctrl_nextv4l(struct pvr2_hdw *, | ||
155 | unsigned int ctl_id); | ||
156 | |||
157 | /* Commit all control changes made up to this point */ | ||
158 | int pvr2_hdw_commit_ctl(struct pvr2_hdw *); | ||
159 | |||
160 | /* Return a bit mask of valid input selections for this device. Mask bits | ||
161 | * will be according to PVR_CVAL_INPUT_xxxx definitions. */ | ||
162 | unsigned int pvr2_hdw_get_input_available(struct pvr2_hdw *); | ||
163 | |||
164 | /* Return a bit mask of allowed input selections for this device. Mask bits | ||
165 | * will be according to PVR_CVAL_INPUT_xxxx definitions. */ | ||
166 | unsigned int pvr2_hdw_get_input_allowed(struct pvr2_hdw *); | ||
167 | |||
168 | /* Change the set of allowed input selections for this device. Both | ||
169 | change_mask and change_valu are mask bits according to | ||
170 | PVR_CVAL_INPUT_xxxx definitions. The change_mask parameter indicate | ||
171 | which settings are being changed and the change_val parameter indicates | ||
172 | whether corresponding settings are being set or cleared. */ | ||
173 | int pvr2_hdw_set_input_allowed(struct pvr2_hdw *, | ||
174 | unsigned int change_mask, | ||
175 | unsigned int change_val); | ||
176 | |||
177 | /* Return name for this driver instance */ | ||
178 | const char *pvr2_hdw_get_driver_name(struct pvr2_hdw *); | ||
179 | |||
180 | /* Mark tuner status stale so that it will be re-fetched */ | ||
181 | void pvr2_hdw_execute_tuner_poll(struct pvr2_hdw *); | ||
182 | |||
183 | /* Return information about the tuner */ | ||
184 | int pvr2_hdw_get_tuner_status(struct pvr2_hdw *,struct v4l2_tuner *); | ||
185 | |||
186 | /* Return information about cropping capabilities */ | ||
187 | int pvr2_hdw_get_cropcap(struct pvr2_hdw *, struct v4l2_cropcap *); | ||
188 | |||
189 | /* Query device and see if it thinks it is on a high-speed USB link */ | ||
190 | int pvr2_hdw_is_hsm(struct pvr2_hdw *); | ||
191 | |||
192 | /* Return a string token representative of the hardware type */ | ||
193 | const char *pvr2_hdw_get_type(struct pvr2_hdw *); | ||
194 | |||
195 | /* Return a single line description of the hardware type */ | ||
196 | const char *pvr2_hdw_get_desc(struct pvr2_hdw *); | ||
197 | |||
198 | /* Turn streaming on/off */ | ||
199 | int pvr2_hdw_set_streaming(struct pvr2_hdw *,int); | ||
200 | |||
201 | /* Find out if streaming is on */ | ||
202 | int pvr2_hdw_get_streaming(struct pvr2_hdw *); | ||
203 | |||
204 | /* Retrieve driver overall state */ | ||
205 | int pvr2_hdw_get_state(struct pvr2_hdw *); | ||
206 | |||
207 | /* Configure the type of stream to generate */ | ||
208 | int pvr2_hdw_set_stream_type(struct pvr2_hdw *, enum pvr2_config); | ||
209 | |||
210 | /* Get handle to video output stream */ | ||
211 | struct pvr2_stream *pvr2_hdw_get_video_stream(struct pvr2_hdw *); | ||
212 | |||
213 | /* Emit a video standard struct */ | ||
214 | int pvr2_hdw_get_stdenum_value(struct pvr2_hdw *hdw,struct v4l2_standard *std, | ||
215 | unsigned int idx); | ||
216 | |||
217 | /* Enable / disable retrieval of CPU firmware or prom contents. This must | ||
218 | be enabled before pvr2_hdw_cpufw_get() will function. Note that doing | ||
219 | this may prevent the device from running (and leaving this mode may | ||
220 | imply a device reset). */ | ||
221 | void pvr2_hdw_cpufw_set_enabled(struct pvr2_hdw *, | ||
222 | int mode, /* 0=8KB FX2, 1=16KB FX2, 2=PROM */ | ||
223 | int enable_flag); | ||
224 | |||
225 | /* Return true if we're in a mode for retrieval CPU firmware */ | ||
226 | int pvr2_hdw_cpufw_get_enabled(struct pvr2_hdw *); | ||
227 | |||
228 | /* Retrieve a piece of the CPU's firmware at the given offset. Return | ||
229 | value is the number of bytes retrieved or zero if we're past the end or | ||
230 | an error otherwise (e.g. if firmware retrieval is not enabled). */ | ||
231 | int pvr2_hdw_cpufw_get(struct pvr2_hdw *,unsigned int offs, | ||
232 | char *buf,unsigned int cnt); | ||
233 | |||
234 | /* Retrieve a previously stored v4l minor device number */ | ||
235 | int pvr2_hdw_v4l_get_minor_number(struct pvr2_hdw *,enum pvr2_v4l_type index); | ||
236 | |||
237 | /* Store a v4l minor device number */ | ||
238 | void pvr2_hdw_v4l_store_minor_number(struct pvr2_hdw *, | ||
239 | enum pvr2_v4l_type index,int); | ||
240 | |||
241 | /* Direct read/write access to chip's registers: | ||
242 | match - specify criteria to identify target chip (this is a v4l dbg struct) | ||
243 | reg_id - register number to access | ||
244 | setFl - true to set the register, false to read it | ||
245 | val_ptr - storage location for source / result. */ | ||
246 | int pvr2_hdw_register_access(struct pvr2_hdw *, | ||
247 | struct v4l2_dbg_match *match, u64 reg_id, | ||
248 | int setFl, u64 *val_ptr); | ||
249 | |||
250 | /* The following entry points are all lower level things you normally don't | ||
251 | want to worry about. */ | ||
252 | |||
253 | /* Issue a command and get a response from the device. LOTS of higher | ||
254 | level stuff is built on this. */ | ||
255 | int pvr2_send_request(struct pvr2_hdw *, | ||
256 | void *write_ptr,unsigned int write_len, | ||
257 | void *read_ptr,unsigned int read_len); | ||
258 | |||
259 | /* Slightly higher level device communication functions. */ | ||
260 | int pvr2_write_register(struct pvr2_hdw *, u16, u32); | ||
261 | |||
262 | /* Call if for any reason we can't talk to the hardware anymore - this will | ||
263 | cause the driver to stop flailing on the device. */ | ||
264 | void pvr2_hdw_render_useless(struct pvr2_hdw *); | ||
265 | |||
266 | /* Set / clear 8051's reset bit */ | ||
267 | void pvr2_hdw_cpureset_assert(struct pvr2_hdw *,int); | ||
268 | |||
269 | /* Execute a USB-commanded device reset */ | ||
270 | void pvr2_hdw_device_reset(struct pvr2_hdw *); | ||
271 | |||
272 | /* Reset worker's error trapping circuit breaker */ | ||
273 | int pvr2_hdw_untrip(struct pvr2_hdw *); | ||
274 | |||
275 | /* Execute hard reset command (after this point it's likely that the | ||
276 | encoder will have to be reconfigured). This also clears the "useless" | ||
277 | state. */ | ||
278 | int pvr2_hdw_cmd_deep_reset(struct pvr2_hdw *); | ||
279 | |||
280 | /* Execute simple reset command */ | ||
281 | int pvr2_hdw_cmd_powerup(struct pvr2_hdw *); | ||
282 | |||
283 | /* suspend */ | ||
284 | int pvr2_hdw_cmd_powerdown(struct pvr2_hdw *); | ||
285 | |||
286 | /* Order decoder to reset */ | ||
287 | int pvr2_hdw_cmd_decoder_reset(struct pvr2_hdw *); | ||
288 | |||
289 | /* Direct manipulation of GPIO bits */ | ||
290 | int pvr2_hdw_gpio_get_dir(struct pvr2_hdw *hdw,u32 *); | ||
291 | int pvr2_hdw_gpio_get_out(struct pvr2_hdw *hdw,u32 *); | ||
292 | int pvr2_hdw_gpio_get_in(struct pvr2_hdw *hdw,u32 *); | ||
293 | int pvr2_hdw_gpio_chg_dir(struct pvr2_hdw *hdw,u32 msk,u32 val); | ||
294 | int pvr2_hdw_gpio_chg_out(struct pvr2_hdw *hdw,u32 msk,u32 val); | ||
295 | |||
296 | /* This data structure is specifically for the next function... */ | ||
297 | struct pvr2_hdw_debug_info { | ||
298 | int big_lock_held; | ||
299 | int ctl_lock_held; | ||
300 | int flag_disconnected; | ||
301 | int flag_init_ok; | ||
302 | int flag_ok; | ||
303 | int fw1_state; | ||
304 | int flag_decoder_missed; | ||
305 | int flag_tripped; | ||
306 | int state_encoder_ok; | ||
307 | int state_encoder_run; | ||
308 | int state_decoder_run; | ||
309 | int state_decoder_ready; | ||
310 | int state_usbstream_run; | ||
311 | int state_decoder_quiescent; | ||
312 | int state_pipeline_config; | ||
313 | int state_pipeline_req; | ||
314 | int state_pipeline_pause; | ||
315 | int state_pipeline_idle; | ||
316 | int cmd_debug_state; | ||
317 | int cmd_debug_write_len; | ||
318 | int cmd_debug_read_len; | ||
319 | int cmd_debug_write_pend; | ||
320 | int cmd_debug_read_pend; | ||
321 | int cmd_debug_timeout; | ||
322 | int cmd_debug_rstatus; | ||
323 | int cmd_debug_wstatus; | ||
324 | unsigned char cmd_code; | ||
325 | }; | ||
326 | |||
327 | /* Non-intrusively retrieve internal state info - this is useful for | ||
328 | diagnosing lockups. Note that this operation is completed without any | ||
329 | kind of locking and so it is not atomic and may yield inconsistent | ||
330 | results. This is *purely* a debugging aid. */ | ||
331 | void pvr2_hdw_get_debug_info_unlocked(const struct pvr2_hdw *hdw, | ||
332 | struct pvr2_hdw_debug_info *); | ||
333 | |||
334 | /* Intrusively retrieve internal state info - this is useful for | ||
335 | diagnosing overall driver state. This operation synchronizes against | ||
336 | the overall driver mutex - so if there are locking problems this will | ||
337 | likely hang! This is *purely* a debugging aid. */ | ||
338 | void pvr2_hdw_get_debug_info_locked(struct pvr2_hdw *hdw, | ||
339 | struct pvr2_hdw_debug_info *); | ||
340 | |||
341 | /* Report out several lines of text that describes driver internal state. | ||
342 | Results are written into the passed-in buffer. */ | ||
343 | unsigned int pvr2_hdw_state_report(struct pvr2_hdw *hdw, | ||
344 | char *buf_ptr,unsigned int buf_size); | ||
345 | |||
346 | /* Cause modules to log their state once */ | ||
347 | void pvr2_hdw_trigger_module_log(struct pvr2_hdw *hdw); | ||
348 | |||
349 | /* Cause encoder firmware to be uploaded into the device. This is normally | ||
350 | done autonomously, but the interface is exported here because it is also | ||
351 | a debugging aid. */ | ||
352 | int pvr2_upload_firmware2(struct pvr2_hdw *hdw); | ||
353 | |||
354 | #endif /* __PVRUSB2_HDW_H */ | ||
355 | |||
356 | /* | ||
357 | Stuff for Emacs to see, in order to encourage consistent editing style: | ||
358 | *** Local Variables: *** | ||
359 | *** mode: c *** | ||
360 | *** fill-column: 75 *** | ||
361 | *** tab-width: 8 *** | ||
362 | *** c-basic-offset: 8 *** | ||
363 | *** End: *** | ||
364 | */ | ||