/* SPDX-License-Identifier: GPL-2.0-or-later */ /* * Abilis Systems Single DVB-T Receiver * Copyright (C) 2008 Pierrick Hascoet */ #ifndef _AS10X_CMD_H_ #define _AS10X_CMD_H_ #include #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