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