| /* SPDX-License-Identifier: GPL-2.0-or-later */ |
| /* |
| * Abilis Systems Single DVB-T Receiver |
| * Copyright (C) 2008 Pierrick Hascoet <pierrick.hascoet@abilis.com> |
| */ |
| #ifndef _AS10X_CMD_H_ |
| #define _AS10X_CMD_H_ |
| |
| #include <linux/kernel.h> |
| |
| #include "as102_fe_types.h" |
| |
| /*********************************/ |
| /* MACRO DEFINITIONS */ |
| /*********************************/ |
| #define AS10X_CMD_ERROR -1 |
| |
| #define SERVICE_PROG_ID 0x0002 |
| #define SERVICE_PROG_VERSION 0x0001 |
| |
| #define HIER_NONE 0x00 |
| #define HIER_LOW_PRIORITY 0x01 |
| |
| #define HEADER_SIZE (sizeof(struct as10x_cmd_header_t)) |
| |
| /* context request types */ |
| #define GET_CONTEXT_DATA 1 |
| #define SET_CONTEXT_DATA 2 |
| |
| /* ODSP suspend modes */ |
| #define CFG_MODE_ODSP_RESUME 0 |
| #define CFG_MODE_ODSP_SUSPEND 1 |
| |
| /* Dump memory size */ |
| #define DUMP_BLOCK_SIZE_MAX 0x20 |
| |
| /*********************************/ |
| /* TYPE DEFINITION */ |
| /*********************************/ |
| enum control_proc { |
| CONTROL_PROC_TURNON = 0x0001, |
| CONTROL_PROC_TURNON_RSP = 0x0100, |
| CONTROL_PROC_SET_REGISTER = 0x0002, |
| CONTROL_PROC_SET_REGISTER_RSP = 0x0200, |
| CONTROL_PROC_GET_REGISTER = 0x0003, |
| CONTROL_PROC_GET_REGISTER_RSP = 0x0300, |
| CONTROL_PROC_SETTUNE = 0x000A, |
| CONTROL_PROC_SETTUNE_RSP = 0x0A00, |
| CONTROL_PROC_GETTUNESTAT = 0x000B, |
| CONTROL_PROC_GETTUNESTAT_RSP = 0x0B00, |
| CONTROL_PROC_GETTPS = 0x000D, |
| CONTROL_PROC_GETTPS_RSP = 0x0D00, |
| CONTROL_PROC_SETFILTER = 0x000E, |
| CONTROL_PROC_SETFILTER_RSP = 0x0E00, |
| CONTROL_PROC_REMOVEFILTER = 0x000F, |
| CONTROL_PROC_REMOVEFILTER_RSP = 0x0F00, |
| CONTROL_PROC_GET_IMPULSE_RESP = 0x0012, |
| CONTROL_PROC_GET_IMPULSE_RESP_RSP = 0x1200, |
| CONTROL_PROC_START_STREAMING = 0x0013, |
| CONTROL_PROC_START_STREAMING_RSP = 0x1300, |
| CONTROL_PROC_STOP_STREAMING = 0x0014, |
| CONTROL_PROC_STOP_STREAMING_RSP = 0x1400, |
| CONTROL_PROC_GET_DEMOD_STATS = 0x0015, |
| CONTROL_PROC_GET_DEMOD_STATS_RSP = 0x1500, |
| CONTROL_PROC_ELNA_CHANGE_MODE = 0x0016, |
| CONTROL_PROC_ELNA_CHANGE_MODE_RSP = 0x1600, |
| CONTROL_PROC_ODSP_CHANGE_MODE = 0x0017, |
| CONTROL_PROC_ODSP_CHANGE_MODE_RSP = 0x1700, |
| CONTROL_PROC_AGC_CHANGE_MODE = 0x0018, |
| CONTROL_PROC_AGC_CHANGE_MODE_RSP = 0x1800, |
| |
| CONTROL_PROC_CONTEXT = 0x00FC, |
| CONTROL_PROC_CONTEXT_RSP = 0xFC00, |
| CONTROL_PROC_DUMP_MEMORY = 0x00FD, |
| CONTROL_PROC_DUMP_MEMORY_RSP = 0xFD00, |
| CONTROL_PROC_DUMPLOG_MEMORY = 0x00FE, |
| CONTROL_PROC_DUMPLOG_MEMORY_RSP = 0xFE00, |
| CONTROL_PROC_TURNOFF = 0x00FF, |
| CONTROL_PROC_TURNOFF_RSP = 0xFF00 |
| }; |
| |
| union as10x_turn_on { |
| /* request */ |
| struct { |
| /* request identifier */ |
| __le16 proc_id; |
| } __packed req; |
| /* response */ |
| struct { |
| /* response identifier */ |
| __le16 proc_id; |
| /* error */ |
| uint8_t error; |
| } __packed rsp; |
| } __packed; |
| |
| union as10x_turn_off { |
| /* request */ |
| struct { |
| /* request identifier */ |
| __le16 proc_id; |
| } __packed req; |
| /* response */ |
| struct { |
| /* response identifier */ |
| __le16 proc_id; |
| /* error */ |
| uint8_t err; |
| } __packed rsp; |
| } __packed; |
| |
| union as10x_set_tune { |
| /* request */ |
| struct { |
| /* request identifier */ |
| __le16 proc_id; |
| /* tune params */ |
| struct as10x_tune_args args; |
| } __packed req; |
| /* response */ |
| struct { |
| /* response identifier */ |
| __le16 proc_id; |
| /* response error */ |
| uint8_t error; |
| } __packed rsp; |
| } __packed; |
| |
| union as10x_get_tune_status { |
| /* request */ |
| struct { |
| /* request identifier */ |
| __le16 proc_id; |
| } __packed req; |
| /* response */ |
| struct { |
| /* response identifier */ |
| __le16 proc_id; |
| /* response error */ |
| uint8_t error; |
| /* tune status */ |
| struct as10x_tune_status sts; |
| } __packed rsp; |
| } __packed; |
| |
| union as10x_get_tps { |
| /* request */ |
| struct { |
| /* request identifier */ |
| __le16 proc_id; |
| } __packed req; |
| /* response */ |
| struct { |
| /* response identifier */ |
| __le16 proc_id; |
| /* response error */ |
| uint8_t error; |
| /* tps details */ |
| struct as10x_tps tps; |
| } __packed rsp; |
| } __packed; |
| |
| union as10x_common { |
| /* request */ |
| struct { |
| /* request identifier */ |
| __le16 proc_id; |
| } __packed req; |
| /* response */ |
| struct { |
| /* response identifier */ |
| __le16 proc_id; |
| /* response error */ |
| uint8_t error; |
| } __packed rsp; |
| } __packed; |
| |
| union as10x_add_pid_filter { |
| /* request */ |
| struct { |
| /* request identifier */ |
| __le16 proc_id; |
| /* PID to filter */ |
| __le16 pid; |
| /* stream type (MPE, PSI/SI or PES )*/ |
| uint8_t stream_type; |
| /* PID index in filter table */ |
| uint8_t idx; |
| } __packed req; |
| /* response */ |
| struct { |
| /* response identifier */ |
| __le16 proc_id; |
| /* response error */ |
| uint8_t error; |
| /* Filter id */ |
| uint8_t filter_id; |
| } __packed rsp; |
| } __packed; |
| |
| union as10x_del_pid_filter { |
| /* request */ |
| struct { |
| /* request identifier */ |
| __le16 proc_id; |
| /* PID to remove */ |
| __le16 pid; |
| } __packed req; |
| /* response */ |
| struct { |
| /* response identifier */ |
| __le16 proc_id; |
| /* response error */ |
| uint8_t error; |
| } __packed rsp; |
| } __packed; |
| |
| union as10x_start_streaming { |
| /* request */ |
| struct { |
| /* request identifier */ |
| __le16 proc_id; |
| } __packed req; |
| /* response */ |
| struct { |
| /* response identifier */ |
| __le16 proc_id; |
| /* error */ |
| uint8_t error; |
| } __packed rsp; |
| } __packed; |
| |
| union as10x_stop_streaming { |
| /* request */ |
| struct { |
| /* request identifier */ |
| __le16 proc_id; |
| } __packed req; |
| /* response */ |
| struct { |
| /* response identifier */ |
| __le16 proc_id; |
| /* error */ |
| uint8_t error; |
| } __packed rsp; |
| } __packed; |
| |
| union as10x_get_demod_stats { |
| /* request */ |
| struct { |
| /* request identifier */ |
| __le16 proc_id; |
| } __packed req; |
| /* response */ |
| struct { |
| /* response identifier */ |
| __le16 proc_id; |
| /* error */ |
| uint8_t error; |
| /* demod stats */ |
| struct as10x_demod_stats stats; |
| } __packed rsp; |
| } __packed; |
| |
| union as10x_get_impulse_resp { |
| /* request */ |
| struct { |
| /* request identifier */ |
| __le16 proc_id; |
| } __packed req; |
| /* response */ |
| struct { |
| /* response identifier */ |
| __le16 proc_id; |
| /* error */ |
| uint8_t error; |
| /* impulse response ready */ |
| uint8_t is_ready; |
| } __packed rsp; |
| } __packed; |
| |
| union as10x_fw_context { |
| /* request */ |
| struct { |
| /* request identifier */ |
| __le16 proc_id; |
| /* value to write (for set context)*/ |
| struct as10x_register_value reg_val; |
| /* context tag */ |
| __le16 tag; |
| /* context request type */ |
| __le16 type; |
| } __packed req; |
| /* response */ |
| struct { |
| /* response identifier */ |
| __le16 proc_id; |
| /* value read (for get context) */ |
| struct as10x_register_value reg_val; |
| /* context request type */ |
| __le16 type; |
| /* error */ |
| uint8_t error; |
| } __packed rsp; |
| } __packed; |
| |
| union as10x_set_register { |
| /* request */ |
| struct { |
| /* response identifier */ |
| __le16 proc_id; |
| /* register description */ |
| struct as10x_register_addr reg_addr; |
| /* register content */ |
| struct as10x_register_value reg_val; |
| } __packed req; |
| /* response */ |
| struct { |
| /* response identifier */ |
| __le16 proc_id; |
| /* error */ |
| uint8_t error; |
| } __packed rsp; |
| } __packed; |
| |
| union as10x_get_register { |
| /* request */ |
| struct { |
| /* response identifier */ |
| __le16 proc_id; |
| /* register description */ |
| struct as10x_register_addr reg_addr; |
| } __packed req; |
| /* response */ |
| struct { |
| /* response identifier */ |
| __le16 proc_id; |
| /* error */ |
| uint8_t error; |
| /* register content */ |
| struct as10x_register_value reg_val; |
| } __packed rsp; |
| } __packed; |
| |
| union as10x_cfg_change_mode { |
| /* request */ |
| struct { |
| /* request identifier */ |
| __le16 proc_id; |
| /* mode */ |
| uint8_t mode; |
| } __packed req; |
| /* response */ |
| struct { |
| /* response identifier */ |
| __le16 proc_id; |
| /* error */ |
| uint8_t error; |
| } __packed rsp; |
| } __packed; |
| |
| struct as10x_cmd_header_t { |
| __le16 req_id; |
| __le16 prog; |
| __le16 version; |
| __le16 data_len; |
| } __packed; |
| |
| #define DUMP_BLOCK_SIZE 16 |
| |
| union as10x_dump_memory { |
| /* request */ |
| struct { |
| /* request identifier */ |
| __le16 proc_id; |
| /* dump memory type request */ |
| uint8_t dump_req; |
| /* register description */ |
| struct as10x_register_addr reg_addr; |
| /* nb blocks to read */ |
| __le16 num_blocks; |
| } __packed req; |
| /* response */ |
| struct { |
| /* response identifier */ |
| __le16 proc_id; |
| /* error */ |
| uint8_t error; |
| /* dump response */ |
| uint8_t dump_rsp; |
| /* data */ |
| union { |
| uint8_t data8[DUMP_BLOCK_SIZE]; |
| __le16 data16[DUMP_BLOCK_SIZE / sizeof(__le16)]; |
| __le32 data32[DUMP_BLOCK_SIZE / sizeof(__le32)]; |
| } __packed u; |
| } __packed rsp; |
| } __packed; |
| |
| union as10x_dumplog_memory { |
| struct { |
| /* request identifier */ |
| __le16 proc_id; |
| /* dump memory type request */ |
| uint8_t dump_req; |
| } __packed req; |
| struct { |
| /* request identifier */ |
| __le16 proc_id; |
| /* error */ |
| uint8_t error; |
| /* dump response */ |
| uint8_t dump_rsp; |
| /* dump data */ |
| uint8_t data[DUMP_BLOCK_SIZE]; |
| } __packed rsp; |
| } __packed; |
| |
| union as10x_raw_data { |
| /* request */ |
| struct { |
| __le16 proc_id; |
| uint8_t data[64 - sizeof(struct as10x_cmd_header_t) |
| - 2 /* proc_id */]; |
| } __packed req; |
| /* response */ |
| struct { |
| __le16 proc_id; |
| uint8_t error; |
| uint8_t data[64 - sizeof(struct as10x_cmd_header_t) |
| - 2 /* proc_id */ - 1 /* rc */]; |
| } __packed rsp; |
| } __packed; |
| |
| struct as10x_cmd_t { |
| struct as10x_cmd_header_t header; |
| union { |
| union as10x_turn_on turn_on; |
| union as10x_turn_off turn_off; |
| union as10x_set_tune set_tune; |
| union as10x_get_tune_status get_tune_status; |
| union as10x_get_tps get_tps; |
| union as10x_common common; |
| union as10x_add_pid_filter add_pid_filter; |
| union as10x_del_pid_filter del_pid_filter; |
| union as10x_start_streaming start_streaming; |
| union as10x_stop_streaming stop_streaming; |
| union as10x_get_demod_stats get_demod_stats; |
| union as10x_get_impulse_resp get_impulse_rsp; |
| union as10x_fw_context context; |
| union as10x_set_register set_register; |
| union as10x_get_register get_register; |
| union as10x_cfg_change_mode cfg_change_mode; |
| union as10x_dump_memory dump_memory; |
| union as10x_dumplog_memory dumplog_memory; |
| union as10x_raw_data raw_data; |
| } __packed body; |
| } __packed; |
| |
| struct as10x_token_cmd_t { |
| /* token cmd */ |
| struct as10x_cmd_t c; |
| /* token response */ |
| struct as10x_cmd_t r; |
| } __packed; |
| |
| |
| /**************************/ |
| /* FUNCTION DECLARATION */ |
| /**************************/ |
| |
| void as10x_cmd_build(struct as10x_cmd_t *pcmd, uint16_t proc_id, |
| uint16_t cmd_len); |
| int as10x_rsp_parse(struct as10x_cmd_t *r, uint16_t proc_id); |
| |
| /* as10x cmd */ |
| int as10x_cmd_turn_on(struct as10x_bus_adapter_t *adap); |
| int as10x_cmd_turn_off(struct as10x_bus_adapter_t *adap); |
| |
| int as10x_cmd_set_tune(struct as10x_bus_adapter_t *adap, |
| struct as10x_tune_args *ptune); |
| |
| int as10x_cmd_get_tune_status(struct as10x_bus_adapter_t *adap, |
| struct as10x_tune_status *pstatus); |
| |
| int as10x_cmd_get_tps(struct as10x_bus_adapter_t *adap, |
| struct as10x_tps *ptps); |
| |
| int as10x_cmd_get_demod_stats(struct as10x_bus_adapter_t *adap, |
| struct as10x_demod_stats *pdemod_stats); |
| |
| int as10x_cmd_get_impulse_resp(struct as10x_bus_adapter_t *adap, |
| uint8_t *is_ready); |
| |
| /* as10x cmd stream */ |
| int as10x_cmd_add_PID_filter(struct as10x_bus_adapter_t *adap, |
| struct as10x_ts_filter *filter); |
| int as10x_cmd_del_PID_filter(struct as10x_bus_adapter_t *adap, |
| uint16_t pid_value); |
| |
| int as10x_cmd_start_streaming(struct as10x_bus_adapter_t *adap); |
| int as10x_cmd_stop_streaming(struct as10x_bus_adapter_t *adap); |
| |
| /* as10x cmd cfg */ |
| int as10x_cmd_set_context(struct as10x_bus_adapter_t *adap, |
| uint16_t tag, |
| uint32_t value); |
| int as10x_cmd_get_context(struct as10x_bus_adapter_t *adap, |
| uint16_t tag, |
| uint32_t *pvalue); |
| |
| int as10x_cmd_eLNA_change_mode(struct as10x_bus_adapter_t *adap, uint8_t mode); |
| int as10x_context_rsp_parse(struct as10x_cmd_t *prsp, uint16_t proc_id); |
| #endif |