summaryrefslogtreecommitdiff
path: root/drivers/media/dvb/firesat/firesat.h
blob: 5f0de88e41a614c100f308f92ffe05cc05eafc2f (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
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
/*
 * FireDTV driver (formerly known as FireSAT)
 *
 * Copyright (C) 2004 Andreas Monitzer <andy@monitzer.com>
 * Copyright (C) 2008 Henrik Kurelid <henrik@kurelid.se>
 *
 *	This program is free software; you can redistribute it and/or
 *	modify it under the terms of the GNU General Public License as
 *	published by the Free Software Foundation; either version 2 of
 *	the License, or (at your option) any later version.
 */

#ifndef _FIREDTV_H
#define _FIREDTV_H

#include <linux/dvb/dmx.h>
#include <linux/dvb/frontend.h>
#include <linux/list.h>
#include <linux/mutex.h>
#include <linux/spinlock_types.h>
#include <linux/types.h>
#include <linux/wait.h>
#include <linux/workqueue.h>
#include <asm/atomic.h>

#include <demux.h>
#include <dmxdev.h>
#include <dvb_demux.h>
#include <dvb_net.h>
#include <dvbdev.h>

#include <linux/version.h>
#if LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 25)
#define DVB_REGISTER_ADAPTER(x, y, z, w, v) dvb_register_adapter(x, y, z, w, v)
#else
#define DVB_REGISTER_ADAPTER(x, y, z, w, v) dvb_register_adapter(x, y, z, w)
#define DVB_DEFINE_MOD_OPT_ADAPTER_NR(x)
#endif

/*****************************************************************
 * CA message command constants from en50221_app_tags.h of libdvb
 *****************************************************************/
/*	Resource Manager		*/
#define TAG_PROFILE_ENQUIRY		0x9f8010
#define TAG_PROFILE			0x9f8011
#define TAG_PROFILE_CHANGE		0x9f8012

/*	Application Info		*/
#define TAG_APP_INFO_ENQUIRY		0x9f8020
#define TAG_APP_INFO			0x9f8021
#define TAG_ENTER_MENU			0x9f8022

/*	CA Support			*/
#define TAG_CA_INFO_ENQUIRY		0x9f8030
#define TAG_CA_INFO			0x9f8031
#define TAG_CA_PMT			0x9f8032
#define TAG_CA_PMT_REPLY		0x9f8033

/*	Host Control			*/
#define TAG_TUNE			0x9f8400
#define TAG_REPLACE			0x9f8401
#define TAG_CLEAR_REPLACE		0x9f8402
#define TAG_ASK_RELEASE			0x9f8403

/*	Date and Time			*/
#define TAG_DATE_TIME_ENQUIRY		0x9f8440
#define TAG_DATE_TIME			0x9f8441

/*	Man Machine Interface (MMI)	*/
#define TAG_CLOSE_MMI			0x9f8800
#define TAG_DISPLAY_CONTROL		0x9f8801
#define TAG_DISPLAY_REPLY		0x9f8802
#define TAG_TEXT_LAST			0x9f8803
#define TAG_TEXT_MORE			0x9f8804
#define TAG_KEYPAD_CONTROL		0x9f8805
#define TAG_KEYPRESS			0x9f8806
#define TAG_ENQUIRY			0x9f8807
#define TAG_ANSWER			0x9f8808
#define TAG_MENU_LAST			0x9f8809
#define TAG_MENU_MORE			0x9f880a
#define TAG_MENU_ANSWER			0x9f880b
#define TAG_LIST_LAST			0x9f880c
#define TAG_LIST_MORE			0x9f880d
#define TAG_SUBTITLE_SEGMENT_LAST	0x9f880e
#define TAG_SUBTITLE_SEGMENT_MORE	0x9f880f
#define TAG_DISPLAY_MESSAGE		0x9f8810
#define TAG_SCENE_END_MARK		0x9f8811
#define TAG_SCENE_DONE			0x9f8812
#define TAG_SCENE_CONTROL		0x9f8813
#define TAG_SUBTITLE_DOWNLOAD_LAST	0x9f8814
#define TAG_SUBTITLE_DOWNLOAD_MORE	0x9f8815
#define TAG_FLUSH_DOWNLOAD		0x9f8816
#define TAG_DOWNLOAD_REPLY		0x9f8817

/*	Low Speed Communications	*/
#define TAG_COMMS_COMMAND		0x9f8c00
#define TAG_CONNECTION_DESCRIPTOR	0x9f8c01
#define TAG_COMMS_REPLY			0x9f8c02
#define TAG_COMMS_SEND_LAST		0x9f8c03
#define TAG_COMMS_SEND_MORE		0x9f8c04
#define TAG_COMMS_RECV_LAST		0x9f8c05
#define TAG_COMMS_RECV_MORE		0x9f8c06

/* Authentication */
#define TAG_AUTH_REQ			0x9f8200
#define TAG_AUTH_RESP			0x9f8201

/* Teletext */
#define TAG_TELETEXT_EBU		0x9f9000

/* Smartcard */
#define TAG_SMARTCARD_COMMAND		0x9f8e00
#define TAG_SMARTCARD_REPLY		0x9f8e01
#define TAG_SMARTCARD_SEND		0x9f8e02
#define TAG_SMARTCARD_RCV		0x9f8e03

/* EPG */
#define TAG_EPG_ENQUIRY         	0x9f8f00
#define TAG_EPG_REPLY           	0x9f8f01


enum model_type {
	FireSAT_UNKNOWN = 0,
	FireSAT_DVB_S   = 1,
	FireSAT_DVB_C   = 2,
	FireSAT_DVB_T   = 3,
	FireSAT_DVB_S2  = 4,
};

struct hpsb_host;
struct hpsb_iso;
struct node_entry;

struct firesat {
	struct dvb_demux dvb_demux;

	/* DVB bits */
	struct dvb_adapter		*adapter;
	struct dmxdev			dmxdev;
	struct dvb_demux		demux;
	struct dmx_frontend		frontend;
	struct dvb_net			dvbnet;
	struct dvb_frontend_info	*frontend_info;
	struct dvb_frontend		*fe;

	struct dvb_device		*cadev;
	int				ca_last_command;
	int				ca_time_interval;

	struct mutex			avc_mutex;
	wait_queue_head_t		avc_wait;
	atomic_t			avc_reply_received;
	struct work_struct		remote_ctrl_work;

	struct firesat_channel {
		struct firesat *firesat;
		struct dvb_demux_feed *dvbdmxfeed;

		int active;
		int id;
		int pid;
		int type;	/* 1 - TS, 2 - Filter */
	} channel[16];
	struct mutex			demux_mutex;

	/* needed by avc_api */
	void *respfrm;
	int resp_length;

	struct hpsb_host *host;
	u64 guid;			/* GUID of this node */
	u32 guid_vendor_id;		/* Top 24bits of guid */
	struct node_entry *nodeentry;

	enum model_type type;
	char subunit;
	fe_sec_voltage_t voltage;
	fe_sec_tone_mode_t tone;

	int isochannel;
	struct hpsb_iso *iso_handle;

	struct list_head list;
};

struct firewireheader {
	union {
		struct {
			__u8 tcode:4;
			__u8 sy:4;
			__u8 tag:2;
			__u8 channel:6;

			__u8 length_l;
			__u8 length_h;
		} hdr;
		__u32 val;
	};
};

struct CIPHeader {
	union {
		struct {
			__u8 syncbits:2;
			__u8 sid:6;
			__u8 dbs;
			__u8 fn:2;
			__u8 qpc:3;
			__u8 sph:1;
			__u8 rsv:2;
			__u8 dbc;
			__u8 syncbits2:2;
			__u8 fmt:6;
			__u32 fdf:24;
		} cip;
		__u64 val;
	};
};

extern const char *firedtv_model_names[];
extern struct list_head firesat_list;
extern spinlock_t firesat_list_lock;

struct device;

/* firesat_dvb.c */
int firesat_start_feed(struct dvb_demux_feed *dvbdmxfeed);
int firesat_stop_feed(struct dvb_demux_feed *dvbdmxfeed);
int firesat_dvbdev_init(struct firesat *firesat, struct device *dev,
		struct dvb_frontend *fe);

/* firesat_fe.c */
int firesat_frontend_attach(struct firesat *firesat, struct dvb_frontend *fe);

/* firesat_iso.c */
int setup_iso_channel(struct firesat *firesat);
void tear_down_iso_channel(struct firesat *firesat);

#endif /* _FIREDTV_H */