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/*********************************/
49enum 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
91union 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
106union 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
121union 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
138union 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
155union 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
172union 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
187union 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
210union 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
227union 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
242union 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
257union 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
274union 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
291union 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
316union 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
335union 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
354union 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
371struct 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
380union 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
409union 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
428union 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
444struct 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
469struct 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
481void as10x_cmd_build(struct as10x_cmd_t *pcmd, uint16_t proc_id,
482		      uint16_t cmd_len);
483int as10x_rsp_parse(struct as10x_cmd_t *r, uint16_t proc_id);
484
485/* as10x cmd */
486int as10x_cmd_turn_on(struct as10x_bus_adapter_t *adap);
487int as10x_cmd_turn_off(struct as10x_bus_adapter_t *adap);
488
489int as10x_cmd_set_tune(struct as10x_bus_adapter_t *adap,
490		       struct as10x_tune_args *ptune);
491
492int as10x_cmd_get_tune_status(struct as10x_bus_adapter_t *adap,
493			      struct as10x_tune_status *pstatus);
494
495int as10x_cmd_get_tps(struct as10x_bus_adapter_t *adap,
496		      struct as10x_tps *ptps);
497
498int as10x_cmd_get_demod_stats(struct as10x_bus_adapter_t  *adap,
499			      struct as10x_demod_stats *pdemod_stats);
500
501int as10x_cmd_get_impulse_resp(struct as10x_bus_adapter_t *adap,
502			       uint8_t *is_ready);
503
504/* as10x cmd stream */
505int as10x_cmd_add_PID_filter(struct as10x_bus_adapter_t *adap,
506			     struct as10x_ts_filter *filter);
507int as10x_cmd_del_PID_filter(struct as10x_bus_adapter_t *adap,
508			     uint16_t pid_value);
509
510int as10x_cmd_start_streaming(struct as10x_bus_adapter_t *adap);
511int as10x_cmd_stop_streaming(struct as10x_bus_adapter_t *adap);
512
513/* as10x cmd cfg */
514int as10x_cmd_set_context(struct as10x_bus_adapter_t *adap,
515			  uint16_t tag,
516			  uint32_t value);
517int as10x_cmd_get_context(struct as10x_bus_adapter_t *adap,
518			  uint16_t tag,
519			  uint32_t *pvalue);
520
521int as10x_cmd_eLNA_change_mode(struct as10x_bus_adapter_t *adap, uint8_t mode);
522int as10x_context_rsp_parse(struct as10x_cmd_t *prsp, uint16_t proc_id);
523#endif
524