1 /*
2  * Abilis Systems Single DVB-T Receiver
3  * Copyright (C) 2008 Pierrick Hascoet <pierrick.hascoet@abilis.com>
4  *
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License as published by
7  * the Free Software Foundation; either version 2, or (at your option)
8  * any later version.
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 #ifndef _AS10X_CMD_H_
16 #define _AS10X_CMD_H_
17 
18 #include <linux/kernel.h>
19 
20 #include "as102_fe_types.h"
21 
22 /*********************************/
23 /*       MACRO DEFINITIONS       */
24 /*********************************/
25 #define AS10X_CMD_ERROR		-1
26 
27 #define SERVICE_PROG_ID		0x0002
28 #define SERVICE_PROG_VERSION	0x0001
29 
30 #define HIER_NONE		0x00
31 #define HIER_LOW_PRIORITY	0x01
32 
33 #define HEADER_SIZE (sizeof(struct as10x_cmd_header_t))
34 
35 /* context request types */
36 #define GET_CONTEXT_DATA	1
37 #define SET_CONTEXT_DATA	2
38 
39 /* ODSP suspend modes */
40 #define CFG_MODE_ODSP_RESUME	0
41 #define CFG_MODE_ODSP_SUSPEND	1
42 
43 /* Dump memory size */
44 #define DUMP_BLOCK_SIZE_MAX	0x20
45 
46 /*********************************/
47 /*     TYPE DEFINITION           */
48 /*********************************/
49 enum control_proc {
50 	CONTROL_PROC_TURNON			= 0x0001,
51 	CONTROL_PROC_TURNON_RSP			= 0x0100,
52 	CONTROL_PROC_SET_REGISTER		= 0x0002,
53 	CONTROL_PROC_SET_REGISTER_RSP		= 0x0200,
54 	CONTROL_PROC_GET_REGISTER		= 0x0003,
55 	CONTROL_PROC_GET_REGISTER_RSP		= 0x0300,
56 	CONTROL_PROC_SETTUNE			= 0x000A,
57 	CONTROL_PROC_SETTUNE_RSP		= 0x0A00,
58 	CONTROL_PROC_GETTUNESTAT		= 0x000B,
59 	CONTROL_PROC_GETTUNESTAT_RSP		= 0x0B00,
60 	CONTROL_PROC_GETTPS			= 0x000D,
61 	CONTROL_PROC_GETTPS_RSP			= 0x0D00,
62 	CONTROL_PROC_SETFILTER			= 0x000E,
63 	CONTROL_PROC_SETFILTER_RSP		= 0x0E00,
64 	CONTROL_PROC_REMOVEFILTER		= 0x000F,
65 	CONTROL_PROC_REMOVEFILTER_RSP		= 0x0F00,
66 	CONTROL_PROC_GET_IMPULSE_RESP		= 0x0012,
67 	CONTROL_PROC_GET_IMPULSE_RESP_RSP	= 0x1200,
68 	CONTROL_PROC_START_STREAMING		= 0x0013,
69 	CONTROL_PROC_START_STREAMING_RSP	= 0x1300,
70 	CONTROL_PROC_STOP_STREAMING		= 0x0014,
71 	CONTROL_PROC_STOP_STREAMING_RSP		= 0x1400,
72 	CONTROL_PROC_GET_DEMOD_STATS		= 0x0015,
73 	CONTROL_PROC_GET_DEMOD_STATS_RSP	= 0x1500,
74 	CONTROL_PROC_ELNA_CHANGE_MODE		= 0x0016,
75 	CONTROL_PROC_ELNA_CHANGE_MODE_RSP	= 0x1600,
76 	CONTROL_PROC_ODSP_CHANGE_MODE		= 0x0017,
77 	CONTROL_PROC_ODSP_CHANGE_MODE_RSP	= 0x1700,
78 	CONTROL_PROC_AGC_CHANGE_MODE		= 0x0018,
79 	CONTROL_PROC_AGC_CHANGE_MODE_RSP	= 0x1800,
80 
81 	CONTROL_PROC_CONTEXT			= 0x00FC,
82 	CONTROL_PROC_CONTEXT_RSP		= 0xFC00,
83 	CONTROL_PROC_DUMP_MEMORY		= 0x00FD,
84 	CONTROL_PROC_DUMP_MEMORY_RSP		= 0xFD00,
85 	CONTROL_PROC_DUMPLOG_MEMORY		= 0x00FE,
86 	CONTROL_PROC_DUMPLOG_MEMORY_RSP		= 0xFE00,
87 	CONTROL_PROC_TURNOFF			= 0x00FF,
88 	CONTROL_PROC_TURNOFF_RSP		= 0xFF00
89 };
90 
91 union as10x_turn_on {
92 	/* request */
93 	struct {
94 		/* request identifier */
95 		__le16 proc_id;
96 	} __packed req;
97 	/* response */
98 	struct {
99 		/* response identifier */
100 		__le16 proc_id;
101 		/* error */
102 		uint8_t error;
103 	} __packed rsp;
104 } __packed;
105 
106 union as10x_turn_off {
107 	/* request */
108 	struct {
109 		/* request identifier */
110 		__le16 proc_id;
111 	} __packed req;
112 	/* response */
113 	struct {
114 		/* response identifier */
115 		__le16 proc_id;
116 		/* error */
117 		uint8_t err;
118 	} __packed rsp;
119 } __packed;
120 
121 union as10x_set_tune {
122 	/* request */
123 	struct {
124 		/* request identifier */
125 		__le16 proc_id;
126 		/* tune params */
127 		struct as10x_tune_args args;
128 	} __packed req;
129 	/* response */
130 	struct {
131 		/* response identifier */
132 		__le16 proc_id;
133 		/* response error */
134 		uint8_t error;
135 	} __packed rsp;
136 } __packed;
137 
138 union as10x_get_tune_status {
139 	/* request */
140 	struct {
141 		/* request identifier */
142 		__le16 proc_id;
143 	} __packed req;
144 	/* response */
145 	struct {
146 		/* response identifier */
147 		__le16 proc_id;
148 		/* response error */
149 		uint8_t error;
150 		/* tune status */
151 		struct as10x_tune_status sts;
152 	} __packed rsp;
153 } __packed;
154 
155 union as10x_get_tps {
156 	/* request */
157 	struct {
158 		/* request identifier */
159 		__le16 proc_id;
160 	} __packed req;
161 	/* response */
162 	struct {
163 		/* response identifier */
164 		__le16 proc_id;
165 		/* response error */
166 		uint8_t error;
167 		/* tps details */
168 		struct as10x_tps tps;
169 	} __packed rsp;
170 } __packed;
171 
172 union as10x_common {
173 	/* request */
174 	struct {
175 		/* request identifier */
176 		__le16  proc_id;
177 	} __packed req;
178 	/* response */
179 	struct {
180 		/* response identifier */
181 		__le16 proc_id;
182 		/* response error */
183 		uint8_t error;
184 	} __packed rsp;
185 } __packed;
186 
187 union as10x_add_pid_filter {
188 	/* request */
189 	struct {
190 		/* request identifier */
191 		__le16  proc_id;
192 		/* PID to filter */
193 		__le16  pid;
194 		/* stream type (MPE, PSI/SI or PES )*/
195 		uint8_t stream_type;
196 		/* PID index in filter table */
197 		uint8_t idx;
198 	} __packed req;
199 	/* response */
200 	struct {
201 		/* response identifier */
202 		__le16 proc_id;
203 		/* response error */
204 		uint8_t error;
205 		/* Filter id */
206 		uint8_t filter_id;
207 	} __packed rsp;
208 } __packed;
209 
210 union as10x_del_pid_filter {
211 	/* request */
212 	struct {
213 		/* request identifier */
214 		__le16  proc_id;
215 		/* PID to remove */
216 		__le16  pid;
217 	} __packed req;
218 	/* response */
219 	struct {
220 		/* response identifier */
221 		__le16 proc_id;
222 		/* response error */
223 		uint8_t error;
224 	} __packed rsp;
225 } __packed;
226 
227 union as10x_start_streaming {
228 	/* request */
229 	struct {
230 		/* request identifier */
231 		__le16 proc_id;
232 	} __packed req;
233 	/* response */
234 	struct {
235 		/* response identifier */
236 		__le16 proc_id;
237 		/* error */
238 		uint8_t error;
239 	} __packed rsp;
240 } __packed;
241 
242 union as10x_stop_streaming {
243 	/* request */
244 	struct {
245 		/* request identifier */
246 		__le16 proc_id;
247 	} __packed req;
248 	/* response */
249 	struct {
250 		/* response identifier */
251 		__le16 proc_id;
252 		/* error */
253 		uint8_t error;
254 	} __packed rsp;
255 } __packed;
256 
257 union as10x_get_demod_stats {
258 	/* request */
259 	struct {
260 		/* request identifier */
261 		__le16 proc_id;
262 	} __packed req;
263 	/* response */
264 	struct {
265 		/* response identifier */
266 		__le16 proc_id;
267 		/* error */
268 		uint8_t error;
269 		/* demod stats */
270 		struct as10x_demod_stats stats;
271 	} __packed rsp;
272 } __packed;
273 
274 union as10x_get_impulse_resp {
275 	/* request */
276 	struct {
277 		/* request identifier */
278 		__le16 proc_id;
279 	} __packed req;
280 	/* response */
281 	struct {
282 		/* response identifier */
283 		__le16 proc_id;
284 		/* error */
285 		uint8_t error;
286 		/* impulse response ready */
287 		uint8_t is_ready;
288 	} __packed rsp;
289 } __packed;
290 
291 union as10x_fw_context {
292 	/* request */
293 	struct {
294 		/* request identifier */
295 		__le16 proc_id;
296 		/* value to write (for set context)*/
297 		struct as10x_register_value reg_val;
298 		/* context tag */
299 		__le16 tag;
300 		/* context request type */
301 		__le16 type;
302 	} __packed req;
303 	/* response */
304 	struct {
305 		/* response identifier */
306 		__le16 proc_id;
307 		/* value read (for get context) */
308 		struct as10x_register_value reg_val;
309 		/* context request type */
310 		__le16 type;
311 		/* error */
312 		uint8_t error;
313 	} __packed rsp;
314 } __packed;
315 
316 union as10x_set_register {
317 	/* request */
318 	struct {
319 		/* response identifier */
320 		__le16 proc_id;
321 		/* register description */
322 		struct as10x_register_addr reg_addr;
323 		/* register content */
324 		struct as10x_register_value reg_val;
325 	} __packed req;
326 	/* response */
327 	struct {
328 		/* response identifier */
329 		__le16 proc_id;
330 		/* error */
331 		uint8_t error;
332 	} __packed rsp;
333 } __packed;
334 
335 union as10x_get_register {
336 	/* request */
337 	struct {
338 		/* response identifier */
339 		__le16 proc_id;
340 		/* register description */
341 		struct as10x_register_addr reg_addr;
342 	} __packed req;
343 	/* response */
344 	struct {
345 		/* response identifier */
346 		__le16 proc_id;
347 		/* error */
348 		uint8_t error;
349 		/* register content */
350 		struct as10x_register_value reg_val;
351 	} __packed rsp;
352 } __packed;
353 
354 union as10x_cfg_change_mode {
355 	/* request */
356 	struct {
357 		/* request identifier */
358 		__le16 proc_id;
359 		/* mode */
360 		uint8_t mode;
361 	} __packed req;
362 	/* response */
363 	struct {
364 		/* response identifier */
365 		__le16 proc_id;
366 		/* error */
367 		uint8_t error;
368 	} __packed rsp;
369 } __packed;
370 
371 struct as10x_cmd_header_t {
372 	__le16 req_id;
373 	__le16 prog;
374 	__le16 version;
375 	__le16 data_len;
376 } __packed;
377 
378 #define DUMP_BLOCK_SIZE 16
379 
380 union as10x_dump_memory {
381 	/* request */
382 	struct {
383 		/* request identifier */
384 		__le16 proc_id;
385 		/* dump memory type request */
386 		uint8_t dump_req;
387 		/* register description */
388 		struct as10x_register_addr reg_addr;
389 		/* nb blocks to read */
390 		__le16 num_blocks;
391 	} __packed req;
392 	/* response */
393 	struct {
394 		/* response identifier */
395 		__le16 proc_id;
396 		/* error */
397 		uint8_t error;
398 		/* dump response */
399 		uint8_t dump_rsp;
400 		/* data */
401 		union {
402 			uint8_t  data8[DUMP_BLOCK_SIZE];
403 			__le16 data16[DUMP_BLOCK_SIZE / sizeof(__le16)];
404 			__le32 data32[DUMP_BLOCK_SIZE / sizeof(__le32)];
405 		} __packed u;
406 	} __packed rsp;
407 } __packed;
408 
409 union as10x_dumplog_memory {
410 	struct {
411 		/* request identifier */
412 		__le16 proc_id;
413 		/* dump memory type request */
414 		uint8_t dump_req;
415 	} __packed req;
416 	struct {
417 		/* request identifier */
418 		__le16 proc_id;
419 		/* error */
420 		uint8_t error;
421 		/* dump response */
422 		uint8_t dump_rsp;
423 		/* dump data */
424 		uint8_t data[DUMP_BLOCK_SIZE];
425 	} __packed rsp;
426 } __packed;
427 
428 union as10x_raw_data {
429 	/* request */
430 	struct {
431 		__le16 proc_id;
432 		uint8_t data[64 - sizeof(struct as10x_cmd_header_t)
433 			     - 2 /* proc_id */];
434 	} __packed req;
435 	/* response */
436 	struct {
437 		__le16 proc_id;
438 		uint8_t error;
439 		uint8_t data[64 - sizeof(struct as10x_cmd_header_t)
440 			     - 2 /* proc_id */ - 1 /* rc */];
441 	} __packed rsp;
442 } __packed;
443 
444 struct as10x_cmd_t {
445 	struct as10x_cmd_header_t header;
446 	union {
447 		union as10x_turn_on		turn_on;
448 		union as10x_turn_off		turn_off;
449 		union as10x_set_tune		set_tune;
450 		union as10x_get_tune_status	get_tune_status;
451 		union as10x_get_tps		get_tps;
452 		union as10x_common		common;
453 		union as10x_add_pid_filter	add_pid_filter;
454 		union as10x_del_pid_filter	del_pid_filter;
455 		union as10x_start_streaming	start_streaming;
456 		union as10x_stop_streaming	stop_streaming;
457 		union as10x_get_demod_stats	get_demod_stats;
458 		union as10x_get_impulse_resp	get_impulse_rsp;
459 		union as10x_fw_context		context;
460 		union as10x_set_register	set_register;
461 		union as10x_get_register	get_register;
462 		union as10x_cfg_change_mode	cfg_change_mode;
463 		union as10x_dump_memory		dump_memory;
464 		union as10x_dumplog_memory	dumplog_memory;
465 		union as10x_raw_data		raw_data;
466 	} __packed body;
467 } __packed;
468 
469 struct as10x_token_cmd_t {
470 	/* token cmd */
471 	struct as10x_cmd_t c;
472 	/* token response */
473 	struct as10x_cmd_t r;
474 } __packed;
475 
476 
477 /**************************/
478 /* FUNCTION DECLARATION   */
479 /**************************/
480 
481 void as10x_cmd_build(struct as10x_cmd_t *pcmd, uint16_t proc_id,
482 		      uint16_t cmd_len);
483 int as10x_rsp_parse(struct as10x_cmd_t *r, uint16_t proc_id);
484 
485 /* as10x cmd */
486 int as10x_cmd_turn_on(struct as10x_bus_adapter_t *adap);
487 int as10x_cmd_turn_off(struct as10x_bus_adapter_t *adap);
488 
489 int as10x_cmd_set_tune(struct as10x_bus_adapter_t *adap,
490 		       struct as10x_tune_args *ptune);
491 
492 int as10x_cmd_get_tune_status(struct as10x_bus_adapter_t *adap,
493 			      struct as10x_tune_status *pstatus);
494 
495 int as10x_cmd_get_tps(struct as10x_bus_adapter_t *adap,
496 		      struct as10x_tps *ptps);
497 
498 int as10x_cmd_get_demod_stats(struct as10x_bus_adapter_t  *adap,
499 			      struct as10x_demod_stats *pdemod_stats);
500 
501 int as10x_cmd_get_impulse_resp(struct as10x_bus_adapter_t *adap,
502 			       uint8_t *is_ready);
503 
504 /* as10x cmd stream */
505 int as10x_cmd_add_PID_filter(struct as10x_bus_adapter_t *adap,
506 			     struct as10x_ts_filter *filter);
507 int as10x_cmd_del_PID_filter(struct as10x_bus_adapter_t *adap,
508 			     uint16_t pid_value);
509 
510 int as10x_cmd_start_streaming(struct as10x_bus_adapter_t *adap);
511 int as10x_cmd_stop_streaming(struct as10x_bus_adapter_t *adap);
512 
513 /* as10x cmd cfg */
514 int as10x_cmd_set_context(struct as10x_bus_adapter_t *adap,
515 			  uint16_t tag,
516 			  uint32_t value);
517 int as10x_cmd_get_context(struct as10x_bus_adapter_t *adap,
518 			  uint16_t tag,
519 			  uint32_t *pvalue);
520 
521 int as10x_cmd_eLNA_change_mode(struct as10x_bus_adapter_t *adap, uint8_t mode);
522 int as10x_context_rsp_parse(struct as10x_cmd_t *prsp, uint16_t proc_id);
523 #endif
524