515 lines · c
1/* SPDX-License-Identifier: GPL-2.0-or-later */2/*3 * Abilis Systems Single DVB-T Receiver4 * 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 -117 18#define SERVICE_PROG_ID 0x000219#define SERVICE_PROG_VERSION 0x000120 21#define HIER_NONE 0x0022#define HIER_LOW_PRIORITY 0x0123 24#define HEADER_SIZE (sizeof(struct as10x_cmd_header_t))25 26/* context request types */27#define GET_CONTEXT_DATA 128#define SET_CONTEXT_DATA 229 30/* ODSP suspend modes */31#define CFG_MODE_ODSP_RESUME 032#define CFG_MODE_ODSP_SUSPEND 133 34/* Dump memory size */35#define DUMP_BLOCK_SIZE_MAX 0x2036 37/*********************************/38/* TYPE DEFINITION */39/*********************************/40enum 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 = 0xFF0080};81 82union 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 97union 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 112union 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 129union 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 146union 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 163union 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 178union 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 201union 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 218union 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 233union 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 248union 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 265union 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 282union 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 307union 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 326union 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 345union 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 362struct 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 16370 371union 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 400union 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 419union 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 435struct 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 460struct 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 472void as10x_cmd_build(struct as10x_cmd_t *pcmd, uint16_t proc_id,473 uint16_t cmd_len);474int as10x_rsp_parse(struct as10x_cmd_t *r, uint16_t proc_id);475 476/* as10x cmd */477int as10x_cmd_turn_on(struct as10x_bus_adapter_t *adap);478int as10x_cmd_turn_off(struct as10x_bus_adapter_t *adap);479 480int as10x_cmd_set_tune(struct as10x_bus_adapter_t *adap,481 struct as10x_tune_args *ptune);482 483int as10x_cmd_get_tune_status(struct as10x_bus_adapter_t *adap,484 struct as10x_tune_status *pstatus);485 486int as10x_cmd_get_tps(struct as10x_bus_adapter_t *adap,487 struct as10x_tps *ptps);488 489int as10x_cmd_get_demod_stats(struct as10x_bus_adapter_t *adap,490 struct as10x_demod_stats *pdemod_stats);491 492int as10x_cmd_get_impulse_resp(struct as10x_bus_adapter_t *adap,493 uint8_t *is_ready);494 495/* as10x cmd stream */496int as10x_cmd_add_PID_filter(struct as10x_bus_adapter_t *adap,497 struct as10x_ts_filter *filter);498int as10x_cmd_del_PID_filter(struct as10x_bus_adapter_t *adap,499 uint16_t pid_value);500 501int as10x_cmd_start_streaming(struct as10x_bus_adapter_t *adap);502int as10x_cmd_stop_streaming(struct as10x_bus_adapter_t *adap);503 504/* as10x cmd cfg */505int as10x_cmd_set_context(struct as10x_bus_adapter_t *adap,506 uint16_t tag,507 uint32_t value);508int as10x_cmd_get_context(struct as10x_bus_adapter_t *adap,509 uint16_t tag,510 uint32_t *pvalue);511 512int as10x_cmd_eLNA_change_mode(struct as10x_bus_adapter_t *adap, uint8_t mode);513int as10x_context_rsp_parse(struct as10x_cmd_t *prsp, uint16_t proc_id);514#endif515