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