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