Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
pd-common.h
Go to the documentation of this file.
1 #ifndef PD_COMMON_H
2 #define PD_COMMON_H
3 
4 #include <linux/fs.h>
5 #include <linux/wait.h>
6 #include <linux/list.h>
7 #include <linux/videodev2.h>
8 #include <linux/semaphore.h>
9 #include <linux/usb.h>
10 #include <linux/poll.h>
11 #include <media/videobuf-vmalloc.h>
12 #include <media/v4l2-device.h>
13 
14 #include "dvb_frontend.h"
15 #include "dvbdev.h"
16 #include "dvb_demux.h"
17 #include "dmxdev.h"
18 
19 #define SBUF_NUM 8
20 #define MAX_BUFFER_NUM 6
21 #define PK_PER_URB 32
22 #define ISO_PKT_SIZE 3072
23 
24 #define POSEIDON_STATE_NONE (0x0000)
25 #define POSEIDON_STATE_ANALOG (0x0001)
26 #define POSEIDON_STATE_FM (0x0002)
27 #define POSEIDON_STATE_DVBT (0x0004)
28 #define POSEIDON_STATE_VBI (0x0008)
29 #define POSEIDON_STATE_DISCONNECT (0x0080)
30 
31 #define PM_SUSPEND_DELAY 3
32 
33 #define V4L_PAL_VBI_LINES 18
34 #define V4L_NTSC_VBI_LINES 12
35 #define V4L_PAL_VBI_FRAMESIZE (V4L_PAL_VBI_LINES * 1440 * 2)
36 #define V4L_NTSC_VBI_FRAMESIZE (V4L_NTSC_VBI_LINES * 1440 * 2)
37 
38 #define TUNER_FREQ_MIN (45000000)
39 #define TUNER_FREQ_MAX (862000000)
40 
41 struct vbi_data {
43  struct video_data *video;
44  struct front_face *front;
45 
46  unsigned int copied;
47  unsigned int vbi_size; /* the whole size of two fields */
48  int users;
49 };
50 
51 /*
52  * This is the running context of the video, it is useful for
53  * resume()
54  */
56  u32 freq; /* VIDIOC_S_FREQUENCY */
57  int audio_idx; /* VIDIOC_S_TUNER */
58  v4l2_std_id tvnormid; /* VIDIOC_S_STD */
59  int sig_index; /* VIDIOC_S_INPUT */
60  struct v4l2_pix_format pix; /* VIDIOC_S_FMT */
61 };
62 
63 struct video_data {
64  /* v4l2 video device */
66 
67  /* the working context */
69 
70  /* for data copy */
72 
73  char *dst;
75  int prev_left;
76 
79 
80  /* for communication */
83  struct vbi_data *vbi;
84  struct poseidon *pd;
85  struct front_face *front;
86 
88  int users;
89 
90  /* for bubble handler */
92 };
93 
98 };
99 
100 #define AUDIO_BUFS (3)
101 #define CAPTURE_STREAM_EN 1
104  unsigned int copied_position;
106 
107  unsigned int rcv_position;
108  struct snd_card *card;
110 
111  int users;
112  int pm_state;
114 };
115 
116 struct radio_data {
118  int users;
119  unsigned int is_radio_streaming;
122 };
123 
124 #define DVB_SBUF_NUM 4
125 #define DVB_URB_BUF_SIZE 0x2000
129  struct dmxdev dmxdev;
130  struct dvb_demux demux;
131 
134 
135  /* data transfer */
141 
142  /* data for power resume*/
144 
145  /* for channel scanning */
148  unsigned long last_jiffies;
149 };
150 
151 struct front_face {
152  /* use this field to distinguish VIDEO and VBI */
154 
155  /* for host */
157 
158  /* the bridge for host and device */
160 
161  /* for device */
164  struct poseidon *pd;
165 };
166 
167 struct poseidon {
169 
170  struct mutex lock;
171  struct kref kref;
172 
173  /* for V4L2 */
175 
176  /* hardware info */
177  struct usb_device *udev;
180 
181  struct video_data video_data; /* video */
182  struct vbi_data vbi_data; /* vbi */
183  struct poseidon_audio audio; /* audio (alsa) */
184  struct radio_data radio_data; /* FM */
185  struct pd_dvb_adapter dvb_data; /* DVB */
186 
188  struct file *file_for_stream; /* the active stream*/
189 
190 #ifdef CONFIG_PM
191  int (*pm_suspend)(struct poseidon *);
192  int (*pm_resume)(struct poseidon *);
194 
195  struct work_struct pm_work;
196  u8 portnum;
197 #endif
198 };
199 
201  char *name;
202  int fourcc; /* video4linux 2 */
203  int depth; /* bit/pixel */
204  int flags;
205 };
206 
209  char name[12];
211 };
212 
213 /* video */
214 int pd_video_init(struct poseidon *);
215 void pd_video_exit(struct poseidon *);
216 int stop_all_video_stream(struct poseidon *);
217 
218 /* alsa audio */
219 int poseidon_audio_init(struct poseidon *);
220 int poseidon_audio_free(struct poseidon *);
221 #ifdef CONFIG_PM
222 int pm_alsa_suspend(struct poseidon *);
223 int pm_alsa_resume(struct poseidon *);
224 #endif
225 
226 /* dvb */
227 int pd_dvb_usb_device_init(struct poseidon *);
228 void pd_dvb_usb_device_exit(struct poseidon *);
229 void pd_dvb_usb_device_cleanup(struct poseidon *);
231 void dvb_stop_streaming(struct pd_dvb_adapter *);
232 
233 /* FM */
234 int poseidon_fm_init(struct poseidon *);
235 int poseidon_fm_exit(struct poseidon *);
236 struct video_device *vdev_init(struct poseidon *, struct video_device *);
237 
238 /* vendor command ops */
239 int send_set_req(struct poseidon*, u8, s32, s32*);
240 int send_get_req(struct poseidon*, u8, s32, void*, s32*, s32);
241 s32 set_tuner_mode(struct poseidon*, unsigned char);
242 
243 /* bulk urb alloc/free */
244 int alloc_bulk_urbs_generic(struct urb **urb_array, int num,
245  struct usb_device *udev, u8 ep_addr,
246  int buf_size, gfp_t gfp_flags,
247  usb_complete_t complete_fn, void *context);
248 void free_all_urb_generic(struct urb **urb_array, int num);
249 
250 /* misc */
251 void poseidon_delete(struct kref *kref);
252 void destroy_video_device(struct video_device **v_dev);
253 extern int debug_mode;
254 void set_debug_mode(struct video_device *vfd, int debug_mode);
255 
256 #ifdef CONFIG_PM
257 #define in_hibernation(pd) (pd->msg.event == PM_EVENT_FREEZE)
258 #else
259 #define in_hibernation(pd) (0)
260 #endif
261 #define get_pm_count(p) (atomic_read(&(p)->interface->pm_usage_cnt))
262 
263 #define log(a, ...) printk(KERN_DEBUG "\t[ %s : %.3d ] "a"\n", \
264  __func__, __LINE__, ## __VA_ARGS__)
265 
266 /* for power management */
267 #define logpm(pd) do {\
268  if (debug_mode & 0x10)\
269  log();\
270  } while (0)
271 
272 #define logs(f) do { \
273  if ((debug_mode & 0x4) && \
274  (f)->type == V4L2_BUF_TYPE_VBI_CAPTURE) \
275  log("type : VBI");\
276  \
277  if ((debug_mode & 0x8) && \
278  (f)->type == V4L2_BUF_TYPE_VIDEO_CAPTURE) \
279  log("type : VIDEO");\
280  } while (0)
281 #endif