Linux kernel mirror (for testing)
git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel
os
linux
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