From 25009b3afd2de3c5b3a5ef92a216c73142921b3d Mon Sep 17 00:00:00 2001 From: internal <> Date: Mon, 12 Jun 2023 11:32:14 +0200 Subject: [PATCH 01/24] forgot to check in setmod1.c --- apps/setmod1.c | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 apps/setmod1.c diff --git a/apps/setmod1.c b/apps/setmod1.c new file mode 100644 index 0000000..41e11d5 --- /dev/null +++ b/apps/setmod1.c @@ -0,0 +1,33 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +int main() +{ + int fd; + struct dvb_mod_params mp; + struct dvb_mod_channel_params mc; + + fd = open("/dev/dvb/adapter1/mod0", O_RDONLY); + + mp.base_frequency = 722000000; + mp.attenuator = 0; + ioctl(fd, DVB_MOD_SET, &mp); + + mc.modulation = QAM_256; + mc.input_bitrate = 40000000ULL << 32; + mc.pcr_correction = 0; + ioctl(fd, DVB_MOD_CHANNEL_SET, &mc); + close(fd); +} + From 17914cb451597e0e1685b5767b5297a3ae3aa123 Mon Sep 17 00:00:00 2001 From: internal <> Date: Wed, 12 Jul 2023 22:42:46 +0200 Subject: [PATCH 02/24] remove Octopus Net Pro IDs --- ddbridge/ddbridge-hw.c | 9 --------- ddbridge/ddbridge-main.c | 6 ------ 2 files changed, 15 deletions(-) diff --git a/ddbridge/ddbridge-hw.c b/ddbridge/ddbridge-hw.c index eeb95bc..b69aa43 100644 --- a/ddbridge/ddbridge-hw.c +++ b/ddbridge/ddbridge-hw.c @@ -893,15 +893,6 @@ static const struct ddb_device_id ddb_device_ids[] = { DDB_DEVID(0x0221, 0x0001, ddb_sdr_iq), DDB_DEVID(0x0222, 0x0001, ddb_sdr_dvbt), DDB_DEVID(0x0223, 0x0001, ddb_sdr_iq2), - DDB_DEVID(0xffff, 0xffff, ddb_sdr_iq2), - - /* testing on OctopusNet Pro */ - DDB_DEVID(0x0320, 0xffff, ddb_octopro_hdin), - DDB_DEVID(0x0321, 0xffff, ddb_none), - DDB_DEVID(0x0322, 0xffff, ddb_octopro), - DDB_DEVID(0x0323, 0xffff, ddb_none), - DDB_DEVID(0x0328, 0xffff, ddb_none), - DDB_DEVID(0x0329, 0xffff, ddb_octopro_hdin), DDB_DEVID(0xffff, 0xffff, ddb_none), }; diff --git a/ddbridge/ddbridge-main.c b/ddbridge/ddbridge-main.c index 4ea279f..d60c7f7 100644 --- a/ddbridge/ddbridge-main.c +++ b/ddbridge/ddbridge-main.c @@ -425,12 +425,6 @@ static const struct pci_device_id ddb_id_table[] __devinitconst = { DDB_DEVICE_ANY(0x0221), DDB_DEVICE_ANY(0x0222), DDB_DEVICE_ANY(0x0223), - DDB_DEVICE_ANY(0x0320), - DDB_DEVICE_ANY(0x0321), - DDB_DEVICE_ANY(0x0322), - DDB_DEVICE_ANY(0x0323), - DDB_DEVICE_ANY(0x0328), - DDB_DEVICE_ANY(0x0329), {0} }; MODULE_DEVICE_TABLE(pci, ddb_id_table); From 88e65b4db6555ac44c8fd6e69459e808ed2f0aa1 Mon Sep 17 00:00:00 2001 From: internal <> Date: Sat, 22 Jul 2023 21:28:35 +0200 Subject: [PATCH 03/24] adjust image start to card type --- apps/octonet/ddupdate.c | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/apps/octonet/ddupdate.c b/apps/octonet/ddupdate.c index d010eab..5c97692 100644 --- a/apps/octonet/ddupdate.c +++ b/apps/octonet/ddupdate.c @@ -36,6 +36,7 @@ static int update_flash(struct ddflash *ddf) char *fname, *default_fname; int res, stat = 0; char *name = 0, *dname; + uint32_t imgadr = 0x10000; switch (ddf->id.device) { case 0x300: @@ -108,7 +109,21 @@ static int update_flash(struct ddflash *ddf) stat |= 1; return stat; break; + case 0x21: + case 0x22: + case 0x24: + case 0x14: + imgadr = 0; default: + { + uint32_t val; + if (!readreg(ddf->fd, (ddf->link << 28) | 0x10, &val)) { + printf("reg0x10=%08x\n", val); + if ((val >> 24) == 5) + imgadr = 0; + } + printf("imgadr= %08x\n", imgadr); + } fname = ddf->fname; default_fname = devid2fname(ddf->id.device, &name); if (!fname) @@ -119,7 +134,8 @@ static int update_flash(struct ddflash *ddf) printf("Flash: %s\n", ddf->flash_name); printf("Version: %08x\n", ddf->id.hw); printf("REGMAP : %08x\n", ddf->id.regmap); - if ((res = update_image(ddf, fname, 0x10000, ddf->size / 2, 1, 0)) == 1) + printf("Address: %08x\n", imgadr); + if ((res = update_image(ddf, fname, imgadr, ddf->size / 2, 1, 0)) == 1) stat |= 1; return stat; } From e18b425f413197eb104f75a69eaa2a2ae2a380b3 Mon Sep 17 00:00:00 2001 From: internal <> Date: Mon, 31 Jul 2023 21:21:45 +0200 Subject: [PATCH 04/24] rename M4_ defines to MX_ --- apps/ddinfo.c | 6 ++-- ddbridge/ddbridge-m4.c | 2 +- ddbridge/ddbridge-mci.h | 63 +++++++++++++++++++++-------------------- 3 files changed, 37 insertions(+), 34 deletions(-) diff --git a/apps/ddinfo.c b/apps/ddinfo.c index d32d86a..22f08c1 100644 --- a/apps/ddinfo.c +++ b/apps/ddinfo.c @@ -274,7 +274,7 @@ void print_info(int dev, uint32_t link, uint8_t demod, struct mci_result *res) if (res->status == MCI_DEMOD_LOCKED) { switch (res->mode) { case 0: - case M4_MODE_DVBSX: + case MX_MODE_DVBSX: if (res->dvbs2_signal_info.standard != 1) { int short_frame = 0, pilots = 0; char *modcod = "unknown"; @@ -308,10 +308,10 @@ void print_info(int dev, uint32_t link, uint8_t demod, struct mci_result *res) } printf("Inversion: %s\n", (res->dvbs2_signal_info.roll_off & 0x80) ? "on": "off"); break; - case M4_MODE_DVBT: + case MX_MODE_DVBT: printf("Locked DVB-T\n"); break; - case M4_MODE_DVBT2: + case MX_MODE_DVBT2: printf("Locked DVB-T2\n"); break; } diff --git a/ddbridge/ddbridge-m4.c b/ddbridge/ddbridge-m4.c index 29a3a13..f2655d3 100644 --- a/ddbridge/ddbridge-m4.c +++ b/ddbridge/ddbridge-m4.c @@ -404,7 +404,7 @@ static int read_status(struct dvb_frontend *fe, enum fe_status *status) ddb_mci_get_strength(fe); if (res.status == MCI_DEMOD_WAIT_SIGNAL) *status = 0x01; - else if (res.status == M4_DEMOD_WAIT_TS) + else if (res.status == MX_DEMOD_WAIT_TS) *status = 0x03; else if (res.status == MCI_DEMOD_TIMEOUT) *status = FE_TIMEDOUT; diff --git a/ddbridge/ddbridge-mci.h b/ddbridge/ddbridge-mci.h index c604cf9..a3bfc83 100644 --- a/ddbridge/ddbridge-mci.h +++ b/ddbridge/ddbridge-mci.h @@ -96,8 +96,8 @@ #define SX8_DEMOD_IQ_MODE (1) #define SX8_DEMOD_WAIT_MATYPE (3) -#define M4_DEMOD_WAIT_TS (6) -#define M4_DEMOD_C2SCAN (16) +#define MX_DEMOD_WAIT_TS (6) +#define MX_DEMOD_C2SCAN (16) #define MCI_STATUS_OK (0x00) #define MCI_STATUS_UNSUPPORTED (0x80) @@ -142,42 +142,45 @@ #define SX8_CMD_ENABLE_IQOUTPUT (0x44) #define SX8_CMD_DISABLE_IQOUTPUT (0x45) -#define M4_CMD_GET_L1INFO (0x50) -#define M4_CMD_GET_IDS (0x51) -#define M4_CMD_GET_DVBT_TPS (0x52) +#define MX_CMD_GET_L1INFO (0x50) +#define MX_CMD_GET_IDS (0x51) +#define MX_CMD_GET_DVBT_TPS (0x52) #define MCI_CMD_GET_BBHEADER (0x53) -#define M4_CMD_GET_ISDBT_TMCC (0x54) -#define M4_CMD_GET_ISDBS_TMCC (0x55) -#define M4_CMD_GET_ISDBC_TSMF (0x56) +#define MX_CMD_GET_ISDBT_TMCC (0x54) +#define MX_CMD_GET_ISDBS_TMCC (0x55) +#define MX_CMD_GET_ISDBC_TSMF (0x56) -#define M4_CMD_GET_BBHEADER (MCI_CMD_GET_BBHEADER) +#define MX_CMD_GET_BBHEADER (MCI_CMD_GET_BBHEADER) -#define M4_L1INFO_SEL_PRE (0) -#define M4_L1INFO_SEL_DSINFO (1) -#define M4_L1INFO_SEL_PLPINFO (2) -#define M4_L1INFO_SEL_PLPINFO_C (3) -#define M4_L1INFO_SEL_SETID (0x80) +#define MX_L1INFO_SEL_PRE (0) +#define MX_L1INFO_SEL_DSINFO (1) +#define MX_L1INFO_SEL_PLPINFO (2) +#define MX_L1INFO_SEL_PLPINFO_C (3) +#define MX_L1INFO_SEL_SETID (0x80) #define MCI_BANDWIDTH_EXTENSION (0x80) // currently used only for J83B in Japan -#define M4_MODE_DVBSX (2) -#define M4_MODE_DVBC (3) -#define M4_MODE_DVBT (4) -#define M4_MODE_DVBT2 (5) -#define M4_MODE_DVBC2 (6) -#define M4_MODE_J83B (7) -#define M4_MODE_ISDBT (8) -#define M4_MODE_ISDBC (9) -#define M4_MODE_ISDBS (10) +#define MX_MODE_DVBSX (2) +#define MX_MODE_DVBC (3) +#define MX_MODE_DVBT (4) +#define MX_MODE_DVBT2 (5) +#define MX_MODE_DVBC2 (6) +#define MX_MODE_J83B (7) +#define MX_MODE_ISDBT (8) +#define MX_MODE_ISDBC (9) +#define MX_MODE_ISDBS (10) +#define MX_MODE_ISDBS3 (11) +#define MX_MODE_ATSC (12) +#define MX_MODE_ATSC3 (13) -#define M4_DVBC_CONSTELLATION_16QAM (0) -#define M4_DVBC_CONSTELLATION_32QAM (1) -#define M4_DVBC_CONSTELLATION_64QAM (2) // also valid for J83B and ISDB-C -#define M4_DVBC_CONSTELLATION_128QAM (3) -#define M4_DVBC_CONSTELLATION_256QAM (4) // also valid for J83B and ISDB-C +#define MX_DVBC_CONSTELLATION_16QAM (0) +#define MX_DVBC_CONSTELLATION_32QAM (1) +#define MX_DVBC_CONSTELLATION_64QAM (2) // also valid for J83B and ISDB-C +#define MX_DVBC_CONSTELLATION_128QAM (3) +#define MX_DVBC_CONSTELLATION_256QAM (4) // also valid for J83B and ISDB-C -#define M4_SIGNALINFO_FLAG_CHANGE (0x01) -#define M4_SIGNALINFO_FLAG_EWS (0x02) +#define MX_SIGNALINFO_FLAG_CHANGE (0x01) +#define MX_SIGNALINFO_FLAG_EWS (0x02) #define SX8_ROLLOFF_35 0 #define SX8_ROLLOFF_25 1 From abbb9e324a3736d6c1e4905a37c602af449422d9 Mon Sep 17 00:00:00 2001 From: internal <> Date: Mon, 31 Jul 2023 21:22:45 +0200 Subject: [PATCH 05/24] remove PCR mode setting --- apps/modtest.c | 5 ----- 1 file changed, 5 deletions(-) diff --git a/apps/modtest.c b/apps/modtest.c index 4b1e806..de04850 100644 --- a/apps/modtest.c +++ b/apps/modtest.c @@ -1137,11 +1137,6 @@ void set_dvbc_mods(int adapt, int chans, uint32_t start_freq, write_data *wd) exit(1); } - - if (set_property(fd, MODULATOR_PCR_MODE, 0) < 0){ - fprintf(stderr,"setting pcr mode 0 failed\n"); - exit(1); - } freq += 8000000; close(fd); free(device); From 456886f4fb849d98d89d9d98f2b84e5548dcad93 Mon Sep 17 00:00:00 2001 From: internal <> Date: Mon, 31 Jul 2023 21:23:27 +0200 Subject: [PATCH 06/24] missing return value --- apps/octonet/ddtest.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/octonet/ddtest.c b/apps/octonet/ddtest.c index 4b0c871..53c5999 100644 --- a/apps/octonet/ddtest.c +++ b/apps/octonet/ddtest.c @@ -1362,7 +1362,7 @@ int read_id(int dev, int argc, char* argv[], uint32_t Flags) for (i = 0; i < len; i++) printf("%02x ", Id[i]); printf("\n"); - + return 0; } int i2cread(int dev, int argc, char* argv[], uint32_t Flags) From ed14095a2ff6adb62f9ee7d974844324ffd05c20 Mon Sep 17 00:00:00 2001 From: internal <> Date: Mon, 31 Jul 2023 21:28:24 +0200 Subject: [PATCH 07/24] select image start according to reg 0x10 --- apps/octonet/ddupdate.c | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/apps/octonet/ddupdate.c b/apps/octonet/ddupdate.c index 5c97692..7d6b9d0 100644 --- a/apps/octonet/ddupdate.c +++ b/apps/octonet/ddupdate.c @@ -109,20 +109,14 @@ static int update_flash(struct ddflash *ddf) stat |= 1; return stat; break; - case 0x21: - case 0x22: - case 0x24: - case 0x14: - imgadr = 0; default: { uint32_t val; if (!readreg(ddf->fd, (ddf->link << 28) | 0x10, &val)) { - printf("reg0x10=%08x\n", val); + //printf("reg0x10=%08x\n", val); if ((val >> 24) == 5) imgadr = 0; } - printf("imgadr= %08x\n", imgadr); } fname = ddf->fname; default_fname = devid2fname(ddf->id.device, &name); From 0fa14cca0273f3f9c011ef0d0a90d28db70e434e Mon Sep 17 00:00:00 2001 From: internal <> Date: Mon, 31 Jul 2023 21:29:07 +0200 Subject: [PATCH 08/24] change flashdump to void --- apps/octonet/flash.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/octonet/flash.c b/apps/octonet/flash.c index 8a6fb75..c5f75ba 100644 --- a/apps/octonet/flash.c +++ b/apps/octonet/flash.c @@ -167,7 +167,7 @@ static int flashread(int ddb, int link, uint8_t *buf, uint32_t addr, uint32_t le } #endif -int flashdump(int ddb, int link, uint32_t addr, uint32_t len) +void flashdump(int ddb, int link, uint32_t addr, uint32_t len) { int i, j; uint8_t buf[32]; From c522f28d68fccc1a9565c3271c728fe85dc326ab Mon Sep 17 00:00:00 2001 From: internal <> Date: Mon, 31 Jul 2023 21:29:44 +0200 Subject: [PATCH 09/24] flen was not defined yet, so move after assignment --- apps/octonet/flash.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/octonet/flash.c b/apps/octonet/flash.c index c5f75ba..47b37d5 100644 --- a/apps/octonet/flash.c +++ b/apps/octonet/flash.c @@ -630,13 +630,14 @@ int flashwrite_pagemode(struct ddflash *ddf, int dev, uint32_t FlashOffset, uint8_t cmd[260]; int i, j; uint32_t flen, blen; - int blockerase = be && ((FlashOffset & 0xFFFF) == 0 ) && (flen >= 0x10000); + int blockerase; blen = flen = lseek(dev, 0, SEEK_END) - fw_off; if (blen % 0xff) blen = (blen + 0xff) & 0xffffff00; //printf("blen = %u, flen = %u\n", blen, flen); setbuf(stdout, NULL); + blockerase = be && ((FlashOffset & 0xFFFF) == 0 ) && (flen >= 0x10000); cmd[0] = 0x50; // EWSR err = flashio(ddf->fd, ddf->link, cmd, 1, NULL, 0); From 3fc610f546b6767c1a9548e53351cfc9ed4e3a9c Mon Sep 17 00:00:00 2001 From: internal <> Date: Mon, 31 Jul 2023 21:30:29 +0200 Subject: [PATCH 10/24] appease conversion warnings --- apps/octonet/flash.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/octonet/flash.c b/apps/octonet/flash.c index 47b37d5..5daefa0 100644 --- a/apps/octonet/flash.c +++ b/apps/octonet/flash.c @@ -1076,12 +1076,12 @@ static int check_fw(struct ddflash *ddf, char *fn, uint32_t *fw_off) close(fd); for (p = 0; p < fsize && buf[p]; p++) { - char *key = &buf[p], *val = NULL; + char *key = (char *) &buf[p], *val = NULL; for (; p < fsize && buf[p] != 0x0a; p++) { if (buf[p] == ':') { buf[p] = 0; - val = &buf[p + 1]; + val = (char *) &buf[p + 1]; } } if (val == NULL || p == fsize) From 330f2c18215ccc9fdf00cd371b82355386560371 Mon Sep 17 00:00:00 2001 From: internal <> Date: Mon, 31 Jul 2023 21:30:56 +0200 Subject: [PATCH 11/24] add CI M2, M8 and M8A --- apps/octonet/flash.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/apps/octonet/flash.c b/apps/octonet/flash.c index 5daefa0..c4a58b2 100644 --- a/apps/octonet/flash.c +++ b/apps/octonet/flash.c @@ -928,7 +928,10 @@ static const struct devids ids[] = { DEV(0x0011, "Octopus CI", "DVBBridgeV2B_DD01_0011.fpga"), DEV(0x0012, "Octopus CI", "DVBBridgeV2B_DD01_0012_STD.fpga"), DEV(0x0013, "Octopus PRO", "DVBBridgeV2B_DD01_0013_PRO.fpga"), + DEV(0x0014, "Octopus CI M2", "DVBBridgeV3A_DD01_0014_CIM2.fpga"), DEV(0x0020, "Octopus GT Mini", "DVBBridgeV2C_DD01_0020.fpga"), + DEV(0x0022, "Octopus MAXM8", "DVBBridgeV3A_DD01_0022_M8.fpga"), + DEV(0x0024, "Octopus MAXM8A", "DVBBridgeV3A_DD01_0024_M8A.fpga"), DEV(0x0201, "Modulator", "DVBModulatorV1B_DVBModulatorV1B.bit"), DEV(0x0203, "Modulator Test", "DVBModulatorV1B_DD01_0203.fpga"), DEV(0x0210, "Modulator V2", "DVBModulatorV2A_DD01_0210.fpga"), From 781177ea44e6d9a5907dcb9485869d27538df2b4 Mon Sep 17 00:00:00 2001 From: internal <> Date: Mon, 31 Jul 2023 21:35:57 +0200 Subject: [PATCH 12/24] let SSI be set (default 0 is ste in dvb-core), correct tuner/demod settings --- ddbridge/ddbridge-m4.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/ddbridge/ddbridge-m4.c b/ddbridge/ddbridge-m4.c index f2655d3..9dce588 100644 --- a/ddbridge/ddbridge-m4.c +++ b/ddbridge/ddbridge-m4.c @@ -72,11 +72,12 @@ static int search_s2(struct dvb_frontend *fe) cmd.dvbs2_search.retry = 0; cmd.dvbs2_search.frequency = p->frequency * 1000; cmd.dvbs2_search.symbol_rate = p->symbol_rate; - cmd.dvbs2_search.scrambling_sequence_index = 0; //p->scrambling_sequence_index; + cmd.dvbs2_search.scrambling_sequence_index = + p->scrambling_sequence_index; if (p->stream_id != NO_STREAM_ID_FILTER) cmd.dvbs2_search.input_stream_id = p->stream_id; - cmd.tuner = state->mci.nr; - cmd.demod = state->mci.tuner; + cmd.tuner = state->mci.tuner; + cmd.demod = state->mci.demod; cmd.output = state->mci.nr; stat = ddb_mci_cmd(&state->mci, &cmd, NULL); From 73f270d850a38c6c28f9603e84537377499e6974 Mon Sep 17 00:00:00 2001 From: internal <> Date: Mon, 31 Jul 2023 21:37:50 +0200 Subject: [PATCH 13/24] class has no owner field in kernel version >= 6.4.0 --- ddbridge/ddbridge-core.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ddbridge/ddbridge-core.c b/ddbridge/ddbridge-core.c index e9785e1..7c645c4 100644 --- a/ddbridge/ddbridge-core.c +++ b/ddbridge/ddbridge-core.c @@ -4050,7 +4050,9 @@ static struct device_attribute ddb_attrs_fanspeed[] = { static struct class ddb_class = { .name = "ddbridge", +#if (KERNEL_VERSION(6, 4, 0) > LINUX_VERSION_CODE) .owner = THIS_MODULE, +#endif .devnode = ddb_devnode, }; From dfde99c01e989143e44b7a7eae1afe754f51fb66 Mon Sep 17 00:00:00 2001 From: internal <> Date: Mon, 31 Jul 2023 21:59:37 +0200 Subject: [PATCH 14/24] adapt MCI defines to firmware --- ddbridge/ddbridge-mci.h | 26 ++++++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/ddbridge/ddbridge-mci.h b/ddbridge/ddbridge-mci.h index a3bfc83..b3ea69f 100644 --- a/ddbridge/ddbridge-mci.h +++ b/ddbridge/ddbridge-mci.h @@ -113,6 +113,8 @@ #define MCI_CMD_GETSIGNALINFO (0x03) //#define MCI_CMD_RFPOWER (0x04) +#define MCI_CMD_SET_INPUT_CONFIG (0x05) + #define MCI_CMD_SEARCH_DVBS (0x10) #define MCI_CMD_SEARCH_ISDBS (0x11) @@ -125,6 +127,9 @@ #define MCI_CMD_SEARCH_ISDBC (0x25) #define MCI_CMD_SEARCH_J83B (0x26) +#define MCI_CMD_SEARCH_ATSC (0x27) +#define MCI_CMD_SEARCH_ATSC3 (0x28) + #define MCI_CMD_GET_IQSYMBOL (0x30) #define MCI_BANDWIDTH_UNKNOWN (0) @@ -268,8 +273,11 @@ #define MOD_QAM_ISDBC_64 (0x08) #define MOD_QAM_ISDBC_256 (0x09) -#define CMD_GET_SERIALNUMBER (0xF0) -#define CMD_EXPORT_LICENSE (0xF0) +#define CMD_GET_SERIALNUMBER (0xF0) +#define CMD_EXPORT_LICENSE (0xF0) +#define CMD_IMPORT_LICENSE (0xF1) +#define CMD_POWER_DOWN (0xF2) +#define CMD_POWER_UP (0xF3) struct mod_setup_channels { u8 flags; @@ -483,6 +491,20 @@ struct mci_command { struct mod_setup_channels mod_setup_channels[4]; struct mod_setup_stream mod_setup_stream; struct mod_setup_output mod_setup_output; + + struct { + u8 Cmd; + u8 Offset; + u8 Length; + u8 Rsvd1; + u32 Rsvd2[2]; + u8 Data[96]; + } sx8_packet_filter; + + struct { + u8 ID[8]; + u8 LK[24]; + } license; }; }; From 060eac06b883637acd9e0c02be6ae5f2368a5060 Mon Sep 17 00:00:00 2001 From: internal <> Date: Mon, 31 Jul 2023 22:02:11 +0200 Subject: [PATCH 15/24] add ddb_mci_cmd_link_simple() --- ddbridge/ddbridge-mci.c | 11 +++++++++++ ddbridge/ddbridge-mci.h | 1 + 2 files changed, 12 insertions(+) diff --git a/ddbridge/ddbridge-mci.c b/ddbridge/ddbridge-mci.c index 0d093aa..7239369 100644 --- a/ddbridge/ddbridge-mci.c +++ b/ddbridge/ddbridge-mci.c @@ -152,6 +152,17 @@ int ddb_mci_cmd_link(struct ddb_link *link, return stat; } +int ddb_mci_cmd_link_simple(struct ddb_link *link, u8 command, u8 demod, u8 value) +{ + struct mci_command cmd; + + memset(&cmd, 0, sizeof(cmd)); + cmd.command = command; + cmd.demod = demod; + cmd.params8[0] = value; + return ddb_mci_cmd_link(link, &cmd, 0); +} + static void mci_handler(void *priv) { struct ddb_link *link = (struct ddb_link *) priv; diff --git a/ddbridge/ddbridge-mci.h b/ddbridge/ddbridge-mci.h index b3ea69f..bab57a8 100644 --- a/ddbridge/ddbridge-mci.h +++ b/ddbridge/ddbridge-mci.h @@ -993,6 +993,7 @@ struct mci_cfg { int ddb_mci_cmd(struct mci *state, struct mci_command *command, struct mci_result *result); int ddb_mci_cmd_link(struct ddb_link *link, struct mci_command *command, struct mci_result *result); +int ddb_mci_cmd_link_simple(struct ddb_link *link, u8 command, u8 demod, u8 value); int ddb_mci_get_status(struct mci *mci, struct mci_result *res); int ddb_mci_get_snr(struct dvb_frontend *fe); int ddb_mci_get_info(struct mci *mci); From 5e5ff60b21f72f03b74e4f3acbaa64c698fddac6 Mon Sep 17 00:00:00 2001 From: internal <> Date: Mon, 31 Jul 2023 22:04:49 +0200 Subject: [PATCH 16/24] adjust usage count for frontends which do not have their own module --- ddbridge/ddbridge-core.c | 7 +++---- ddbridge/ddbridge-m4.c | 3 +++ ddbridge/ddbridge-sx8.c | 3 +++ 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/ddbridge/ddbridge-core.c b/ddbridge/ddbridge-core.c index 7c645c4..c654a32 100644 --- a/ddbridge/ddbridge-core.c +++ b/ddbridge/ddbridge-core.c @@ -1122,6 +1122,9 @@ static int dummy_read_status(struct dvb_frontend *fe, enum fe_status *status) static void dummy_release(struct dvb_frontend *fe) { kfree(fe); +#ifdef CONFIG_MEDIA_ATTACH + __module_get(THIS_MODULE); +#endif } static enum dvbfe_algo dummy_algo(struct dvb_frontend *fe) @@ -1170,11 +1173,7 @@ static int demod_attach_dummy(struct ddb_input *input) { struct ddb_dvb *dvb = &input->port->dvb[input->nr & 1]; -#if 0 - dvb->fe = dvb_attach(dummy_attach); -#else dvb->fe = dummy_attach(); -#endif return 0; } diff --git a/ddbridge/ddbridge-m4.c b/ddbridge/ddbridge-m4.c index 9dce588..74ccc77 100644 --- a/ddbridge/ddbridge-m4.c +++ b/ddbridge/ddbridge-m4.c @@ -457,6 +457,9 @@ static void release(struct dvb_frontend *fe) kfree(mci_base); } kfree(state); +#ifdef CONFIG_MEDIA_ATTACH + __module_get(THIS_MODULE); +#endif } static enum dvbfe_algo get_algo(struct dvb_frontend *fe) diff --git a/ddbridge/ddbridge-sx8.c b/ddbridge/ddbridge-sx8.c index 84f7a3d..c25f325 100644 --- a/ddbridge/ddbridge-sx8.c +++ b/ddbridge/ddbridge-sx8.c @@ -117,6 +117,9 @@ static void release(struct dvb_frontend *fe) kfree(mci_base); } kfree(state); +#ifdef CONFIG_MEDIA_ATTACH + __module_get(THIS_MODULE); +#endif } static int ddb_mci_tsconfig(struct mci *state, u32 config) From 7250608d53bde316b2649f7b47aad3b3c3ff8bd2 Mon Sep 17 00:00:00 2001 From: internal <> Date: Mon, 31 Jul 2023 22:07:40 +0200 Subject: [PATCH 17/24] fix frontend allocation --- lib/ddzap.c | 2 +- lib/src/dddvb.c | 15 +++++++++------ 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/lib/ddzap.c b/lib/ddzap.c index 0ab1358..559cb60 100644 --- a/lib/ddzap.c +++ b/lib/ddzap.c @@ -484,7 +484,7 @@ int main(int argc, char **argv) else fe = dddvb_fe_alloc(dd, delsys); if (!fe) { - fprintf(fout,"dddvb_fe_alloc failed\n"); + fprintf(fout,"dddvb_fe_alloc failed\n"); exit(-1); } dddvb_param_init(&p); diff --git a/lib/src/dddvb.c b/lib/src/dddvb.c index b011a04..a593101 100644 --- a/lib/src/dddvb.c +++ b/lib/src/dddvb.c @@ -30,7 +30,7 @@ LIBDDDVB_EXPORTED struct dddvb_fe *dddvb_fe_alloc_num(struct dddvb *dd, uint32_t pthread_mutex_unlock(&dd->lock); if (dddvb_fe_start(fe) < 0) { dbgprintf(DEBUG_SYS, "fe %d busy\n", fe->nr); - return 0; + return NULL; } dbgprintf(DEBUG_SYS, "Allocated fe %d = %d/%d, fd=%d\n", fe->nr, fe->anum, fe->fnum, fe->fd); @@ -40,22 +40,25 @@ LIBDDDVB_EXPORTED struct dddvb_fe *dddvb_fe_alloc_num(struct dddvb *dd, uint32_t LIBDDDVB_EXPORTED struct dddvb_fe *dddvb_fe_alloc(struct dddvb *dd, uint32_t type) { int i; - struct dddvb_fe *fe = NULL; + struct dddvb_fe *fe = NULL, *tfe; pthread_mutex_lock(&dd->lock); dbgprintf(DEBUG_SYS, "alloc_fe type %u\n", type); for (i = 0; i < dd->dvbfe_num; i++) { - fe = &dd->dvbfe[i]; - if (fe->state == 0 && - (fe->type & (1UL << type))) { + tfe = &dd->dvbfe[i]; + if (tfe->state == 0 && + (tfe->type & (1UL << type))) { fe = dddvb_fe_alloc_num(dd, type, i); if (fe) break; } } pthread_mutex_unlock(&dd->lock); + if (!fe) + dbgprintf(DEBUG_SYS, "alloc_fe type %u\n failed!", type); + else + dbgprintf(DEBUG_SYS, "alloc_fe type %u success!\n", type); return fe; - } LIBDDDVB_EXPORTED int dddvb_dvb_tune(struct dddvb_fe *fe, struct dddvb_params *p) From a2f011f62d63930f7b4a3c8e10d0d49c53e2b113 Mon Sep 17 00:00:00 2001 From: internal <> Date: Mon, 31 Jul 2023 22:08:22 +0200 Subject: [PATCH 18/24] adjust to 6.4.0 kernel change --- dvb-core/dvbdev.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/dvb-core/dvbdev.c b/dvb-core/dvbdev.c index ad1cd41..b6db62d 100644 --- a/dvb-core/dvbdev.c +++ b/dvb-core/dvbdev.c @@ -1094,7 +1094,11 @@ static int __init init_dvbdev(void) goto error; } +#if (LINUX_VERSION_CODE < KERNEL_VERSION(6,4,0)) dvb_class = class_create(THIS_MODULE, "dvb"); +#else + dvb_class = class_create("dvb"); +#endif if (IS_ERR(dvb_class)) { retval = PTR_ERR(dvb_class); goto error; From e55ef2f0fb5aa9ec355bd161ddafd18516eb475c Mon Sep 17 00:00:00 2001 From: internal <> Date: Mon, 31 Jul 2023 22:10:05 +0200 Subject: [PATCH 19/24] only warn once about zigzag scanning --- dvb-core/dvb_frontend.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dvb-core/dvb_frontend.c b/dvb-core/dvb_frontend.c index bee785a..0c462c5 100644 --- a/dvb-core/dvb_frontend.c +++ b/dvb-core/dvb_frontend.c @@ -489,8 +489,8 @@ static void dvb_frontend_swzigzag(struct dvb_frontend *fe) struct dtv_frontend_properties *c = &fe->dtv_property_cache, tmp; if (fepriv->max_drift) - dev_warn(fe->dvb->device, - "Frontend requested software zigzag, but didn't set the frequency step size\n"); + dev_warn_once(fe->dvb->device, + "Frontend requested software zigzag, but didn't set the frequency step size\n"); /* if we've got no parameters, just keep idling */ if (fepriv->state & FESTATE_IDLE) { From a233c8a6f8f205fb3d1f1133556e17172a7afa30 Mon Sep 17 00:00:00 2001 From: internal <> Date: Mon, 31 Jul 2023 22:14:53 +0200 Subject: [PATCH 20/24] cleanup --- ddbridge/Kbuild | 4 +--- ddbridge/Makefile | 12 +++++------- 2 files changed, 6 insertions(+), 10 deletions(-) diff --git a/ddbridge/Kbuild b/ddbridge/Kbuild index cec6ff1..99d3a02 100644 --- a/ddbridge/Kbuild +++ b/ddbridge/Kbuild @@ -4,9 +4,7 @@ ddbridge-objs = ddbridge-main.o ddbridge-hw.o ddbridge-i2c.o ddbridge-ns.o ddbri octonet-objs = octonet-main.o ddbridge-hw.o ddbridge-i2c.o ddbridge-ns.o ddbridge-modulator.o ddbridge-core.o ddbridge-io.o ddbridge-ci.o ddbridge-max.o ddbridge-mci.o ddbridge-sx8.o ddbridge-m4.o dvb_netstream.o -#mci-objs = ddbridge-mci.o ddbridge-sx8.o ddbridge-m4.o ddbridge-io.o - -obj-$(CONFIG_DVB_DDBRIDGE) += ddbridge.o #mci.o +obj-$(CONFIG_DVB_DDBRIDGE) += ddbridge.o ifneq ($(KERNEL_DVB_CORE),y) obj-$(CONFIG_DVB_OCTONET) += octonet.o diff --git a/ddbridge/Makefile b/ddbridge/Makefile index f67e85b..5b8aa72 100644 --- a/ddbridge/Makefile +++ b/ddbridge/Makefile @@ -1,15 +1,13 @@ # # Makefile for the ddbridge device driver # -#NOSTDINC_FLAGS += -I$(KBUILD_EXTMOD)/include -I$(KBUILD_EXTMOD)/include/linux -I$(KBUILD_EXTMOD)/dvb-frontends -I$(KBUILD_EXTMOD)/tuners -ddbridge-objs = ddbridge-main.o ddbridge-hw.o ddbridge-i2c.o ddbridge-ns.o ddbridge-modulator.o ddbridge-core.o ddbridge-ci.o ddbridge-max.o ddbridge-mci.o ddbridge-sx8.o ddbridge-m4.o dvb_netstream.o -octonet-objs = octonet-main.o ddbridge-hw.o ddbridge-i2c.o ddbridge-ns.o ddbridge-modulator.o ddbridge-core.o ddbridge-ci.o ddbridge-max.o ddbridge-mci.o ddbridge-sx8.o ddbridge-m4.o dvb_netstream.o +ddbridge-objs = ddbridge-main.o ddbridge-hw.o ddbridge-i2c.o ddbridge-ns.o ddbridge-modulator.o ddbridge-core.o ddbridge-io.o ddbridge-ci.o ddbridge-max.o ddbridge-mci.o ddbridge-sx8.o ddbridge-m4.o dvb_netstream.o +octonet-objs = octonet-main.o ddbridge-hw.o ddbridge-i2c.o ddbridge-ns.o ddbridge-modulator.o ddbridge-core.o ddbridge-io.o ddbridge-ci.o ddbridge-max.o ddbridge-mci.o ddbridge-sx8.o ddbridge-m4.o dvb_netstream.o obj-$(CONFIG_DVB_DDBRIDGE) += ddbridge.o - obj-$(CONFIG_DVB_OCTONET) += octonet.o -#ccflags-y += -Idrivers/media/include/linux/ -#ccflags-y += -Idrivers/media/dvb-frontends/ -#ccflags-y += -Idrivers/media/tuners/ +ccflags-y += -Idrivers/media/dvb-frontends/ +ccflags-y += -Idrivers/media/tuners/ + From 4d087a3b8c9c2fc90c55dc99d57bc3a1df9ab067 Mon Sep 17 00:00:00 2001 From: internal <> Date: Mon, 31 Jul 2023 22:29:08 +0200 Subject: [PATCH 21/24] change lnb and ci bases to be configurable --- ddbridge/ddbridge-ci.c | 31 +++++++++++++++++-------------- ddbridge/ddbridge-core.c | 32 ++++++++++++++++++-------------- ddbridge/ddbridge-hw.c | 38 +++++++++++++------------------------- ddbridge/ddbridge-max.c | 26 +++++++++++++++----------- ddbridge/ddbridge-regs.h | 36 +++++++++++++++++------------------- ddbridge/ddbridge.h | 7 ++++--- 6 files changed, 84 insertions(+), 86 deletions(-) diff --git a/ddbridge/ddbridge-ci.c b/ddbridge/ddbridge-ci.c index 365f8fc..d7a36aa 100644 --- a/ddbridge/ddbridge-ci.c +++ b/ddbridge/ddbridge-ci.c @@ -32,7 +32,7 @@ static int wait_ci_ready(struct ddb_ci *ci) ndelay(500); do { if (ddbreadl(ci->port->dev, - CI_CONTROL(ci->nr)) & CI_READY) + CI_CONTROL(ci)) & CI_READY) break; usleep_range(1, 2); if ((--count) == 0) @@ -50,7 +50,7 @@ static int read_attribute_mem(struct dvb_ca_en50221 *ca, if (address > CI_BUFFER_SIZE) return -1; ddbwritel(ci->port->dev, CI_READ_CMD | (1 << 16) | address, - CI_DO_READ_ATTRIBUTES(ci->nr)); + CI_DO_READ_ATTRIBUTES(ci)); wait_ci_ready(ci); val = 0xff & ddbreadl(ci->port->dev, CI_BUFFER(ci->nr) + off); return val; @@ -62,7 +62,7 @@ static int write_attribute_mem(struct dvb_ca_en50221 *ca, int slot, struct ddb_ci *ci = ca->data; ddbwritel(ci->port->dev, CI_WRITE_CMD | (value << 16) | address, - CI_DO_ATTRIBUTE_RW(ci->nr)); + CI_DO_ATTRIBUTE_RW(ci)); wait_ci_ready(ci); return 0; } @@ -75,10 +75,10 @@ static int read_cam_control(struct dvb_ca_en50221 *ca, u32 res; ddbwritel(ci->port->dev, CI_READ_CMD | address, - CI_DO_IO_RW(ci->nr)); + CI_DO_IO_RW(ci)); ndelay(500); do { - res = ddbreadl(ci->port->dev, CI_READDATA(ci->nr)); + res = ddbreadl(ci->port->dev, CI_READDATA(ci)); if (res & CI_READY) break; usleep_range(1, 2); @@ -94,7 +94,7 @@ static int write_cam_control(struct dvb_ca_en50221 *ca, int slot, struct ddb_ci *ci = ca->data; ddbwritel(ci->port->dev, CI_WRITE_CMD | (value << 16) | address, - CI_DO_IO_RW(ci->nr)); + CI_DO_IO_RW(ci)); wait_ci_ready(ci); return 0; } @@ -104,15 +104,15 @@ static int slot_reset(struct dvb_ca_en50221 *ca, int slot) struct ddb_ci *ci = ca->data; ddbwritel(ci->port->dev, CI_POWER_ON, - CI_CONTROL(ci->nr)); + CI_CONTROL(ci)); msleep(300); ddbwritel(ci->port->dev, CI_POWER_ON | CI_RESET_CAM, - CI_CONTROL(ci->nr)); + CI_CONTROL(ci)); ddbwritel(ci->port->dev, CI_ENABLE | CI_POWER_ON | CI_RESET_CAM, - CI_CONTROL(ci->nr)); + CI_CONTROL(ci)); usleep_range(20, 25); ddbwritel(ci->port->dev, CI_ENABLE | CI_POWER_ON, - CI_CONTROL(ci->nr)); + CI_CONTROL(ci)); return 0; } @@ -120,7 +120,7 @@ static int slot_shutdown(struct dvb_ca_en50221 *ca, int slot) { struct ddb_ci *ci = ca->data; - ddbwritel(ci->port->dev, 0, CI_CONTROL(ci->nr)); + ddbwritel(ci->port->dev, 0, CI_CONTROL(ci)); msleep(300); return 0; } @@ -128,17 +128,17 @@ static int slot_shutdown(struct dvb_ca_en50221 *ca, int slot) static int slot_ts_enable(struct dvb_ca_en50221 *ca, int slot) { struct ddb_ci *ci = ca->data; - u32 val = ddbreadl(ci->port->dev, CI_CONTROL(ci->nr)); + u32 val = ddbreadl(ci->port->dev, CI_CONTROL(ci)); ddbwritel(ci->port->dev, val | CI_BYPASS_DISABLE, - CI_CONTROL(ci->nr)); + CI_CONTROL(ci)); return 0; } static int poll_slot_status(struct dvb_ca_en50221 *ca, int slot, int open) { struct ddb_ci *ci = ca->data; - u32 val = ddbreadl(ci->port->dev, CI_CONTROL(ci->nr)); + u32 val = ddbreadl(ci->port->dev, CI_CONTROL(ci)); int stat = 0; if (val & CI_CAM_DETECT) @@ -162,6 +162,8 @@ static struct dvb_ca_en50221 en_templ = { static void ci_attach(struct ddb_port *port) { struct ddb_ci *ci; + const struct ddb_info *info = port->dev->link[port->lnr].info; + u32 off = info->ci_base ? info->ci_base : 0x400; ci = kzalloc(sizeof(*ci), GFP_KERNEL); if (!ci) @@ -171,6 +173,7 @@ static void ci_attach(struct ddb_port *port) port->en = &ci->en; ci->port = port; ci->nr = port->nr - 2; + ci->regs = DDB_LINK_TAG(port->lnr) | (off + 32 * ci->nr); } /* DuoFlex Dual CI support */ diff --git a/ddbridge/ddbridge-core.c b/ddbridge/ddbridge-core.c index c654a32..2726887 100644 --- a/ddbridge/ddbridge-core.c +++ b/ddbridge/ddbridge-core.c @@ -467,7 +467,7 @@ static void calc_con(struct ddb_output *output, u32 *con, u32 *con2, u32 flags) gap = output->port->gap; max_bitrate = 0; } - if (dev->link[0].info->type == DDB_OCTOPUS_CI && output->port->nr > 1) { + if (dev->link[0].info->ci_mask && output->port->nr > 1) { *con = 0x10c; if (dev->link[0].ids.regmapid >= 0x10003 && !(flags & 1)) { if (!(flags & 2)) { @@ -1596,8 +1596,7 @@ static int dvb_register_adapters(struct ddb *dev) } if (adapter_alloc >= 3 || dev->link[0].info->type == DDB_MOD || - dev->link[0].info->type == DDB_OCTONET || - dev->link[0].info->type == DDB_OCTOPRO) { + dev->link[0].info->type == DDB_OCTONET) { port = &dev->port[0]; adap = port->dvb[0].adap; ret = dvb_register_adapter(adap, "DDBridge", THIS_MODULE, @@ -2102,7 +2101,7 @@ static void ddb_port_probe(struct ddb_port *port) return; } - if (port->nr == 1 && link->info->type == DDB_OCTOPUS_CI && + if (port->nr == 1 && link->info->ci_mask && link->info->i2c_mask == 1) { port->name = "NO TAB"; port->class = DDB_PORT_NONE; @@ -2130,15 +2129,16 @@ static void ddb_port_probe(struct ddb_port *port) port->name = "DUAL MCI"; port->type_name = "MCI"; port->class = DDB_PORT_TUNER; - port->type = DDB_TUNER_MCI + link->info->mci_type; + port->type = link->info->mci_type; return; } - if (port->nr > 1 && link->info->type == DDB_OCTOPUS_CI) { + if (port->nr > 1 && (link->info->ci_mask & (1 << port->nr))) { port->name = "CI internal"; port->type_name = "INTERNAL"; port->class = DDB_PORT_CI; port->type = DDB_CI_INTERNAL; + return; } if (!port->i2c) @@ -2716,24 +2716,28 @@ static void ddb_ports_init(struct ddb *dev) continue; switch (info->type) { - case DDB_OCTOPUS_CI: - if (i >= 2) { + case DDB_OCTONET: + case DDB_OCTOPUS: + if (info->ci_mask & (1 << i)) { ddb_input_init(port, 2 + i, 0, 2 + i); ddb_input_init(port, 4 + i, 1, 4 + i); ddb_output_init(port, i); break; } - fallthrough; - case DDB_OCTONET: - case DDB_OCTOPUS: - case DDB_OCTOPRO: - ddb_input_init(port, 2 * i, 0, 2 * i); - ddb_input_init(port, 2 * i + 1, 1, 2 * i + 1); + ddb_output_init(port, i); + ddb_input_init(port, 2 * i, 0, 2 * p); + ddb_input_init(port, 2 * i + 1, 1, 2 * p + 1); ddb_output_init(port, i); break; case DDB_OCTOPUS_MAX: case DDB_OCTOPUS_MAX_CT: case DDB_OCTOPUS_MCI: + if (info->ci_mask & (1 << i)) { + ddb_input_init(port, 2 + i, 0, 2 + i); + ddb_input_init(port, 4 + i, 1, 4 + i); + ddb_output_init(port, i); + break; + } ddb_input_init(port, 2 * i, 0, 2 * p); ddb_input_init(port, 2 * i + 1, 1, 2 * p + 1); break; diff --git a/ddbridge/ddbridge-hw.c b/ddbridge/ddbridge-hw.c index b69aa43..c4e8291 100644 --- a/ddbridge/ddbridge-hw.c +++ b/ddbridge/ddbridge-hw.c @@ -246,7 +246,6 @@ static const struct ddb_regmap octopus_map = { .odma = &octopus_odma, .odma_buf = &octopus_odma_buf, .input = &octopus_input, - .output = &octopus_output, }; @@ -463,23 +462,25 @@ static const struct ddb_info ddb_satixs2v3 = { }; static const struct ddb_info ddb_ci = { - .type = DDB_OCTOPUS_CI, + .type = DDB_OCTOPUS, .name = "Digital Devices Octopus CI", .regmap = &octopus_map, .port_num = 4, .i2c_mask = 0x03, + .ci_mask = 0x0c, }; static const struct ddb_info ddb_cis = { - .type = DDB_OCTOPUS_CI, + .type = DDB_OCTOPUS, .name = "Digital Devices Octopus CI single", .regmap = &octopus_map, .port_num = 3, .i2c_mask = 0x03, + .ci_mask = 0x04, }; static const struct ddb_info ddb_ci_s2_pro = { - .type = DDB_OCTOPUS_CI, + .type = DDB_OCTOPUS, .name = "Digital Devices Octopus CI S2 Pro", .regmap = &octopus_map, .port_num = 4, @@ -487,10 +488,11 @@ static const struct ddb_info ddb_ci_s2_pro = { .board_control = 2, .board_control_2 = 4, .hw_min = 0x010007, + .ci_mask = 0x0c, }; static const struct ddb_info ddb_ci_s2_pro_a = { - .type = DDB_OCTOPUS_CI, + .type = DDB_OCTOPUS, .name = "Digital Devices Octopus CI S2 Pro Advanced", .regmap = &octopus_map, .port_num = 4, @@ -498,6 +500,7 @@ static const struct ddb_info ddb_ci_s2_pro_a = { .board_control = 2, .board_control_2 = 4, .hw_min = 0x010007, + .ci_mask = 0x0c, }; static const struct ddb_info ddb_dvbct = { @@ -621,24 +624,6 @@ static const struct ddb_info ddb_sdr_dvbt = { .tempmon_irq = 8, }; -static const struct ddb_info ddb_octopro_hdin = { - .type = DDB_OCTOPRO_HDIN, - .name = "Digital Devices OctopusNet Pro HDIN", - .regmap = &octopro_hdin_map, - .port_num = 10, - .i2c_mask = 0x3ff, - .mdio_base = 0x10020, -}; - -static const struct ddb_info ddb_octopro = { - .type = DDB_OCTOPRO, - .name = "Digital Devices OctopusNet Pro", - .regmap = &octopro_map, - .port_num = 10, - .i2c_mask = 0x3ff, - .mdio_base = 0x10020, -}; - static const struct ddb_info ddb_s2_48 = { .type = DDB_OCTOPUS_MAX, .name = "Digital Devices MAX S8 4/8", @@ -647,6 +632,7 @@ static const struct ddb_info ddb_s2_48 = { .i2c_mask = 0x01, .board_control = 1, .tempmon_irq = 24, + .lnb_base = 0x400, }; static const struct ddb_info ddb_ct2_8 = { @@ -719,8 +705,9 @@ static const struct ddb_info ddb_s2x_48 = { .i2c_mask = 0x00, .tempmon_irq = 24, .mci_ports = 4, - .mci_type = 0, + .mci_type = DDB_TUNER_MCI_SX8, .temp_num = 1, + .lnb_base = 0x400, }; static const struct ddb_info ddb_s2x_48_b = { @@ -731,8 +718,9 @@ static const struct ddb_info ddb_s2x_48_b = { .i2c_mask = 0x00, .tempmon_irq = 24, .mci_ports = 4, - .mci_type = 0, + .mci_type = DDB_TUNER_MCI_SX8, .temp_num = 1, + .lnb_base = 0x400, }; static const struct ddb_info ddb_m4 = { diff --git a/ddbridge/ddbridge-max.c b/ddbridge/ddbridge-max.c index b79a479..dcbdea6 100644 --- a/ddbridge/ddbridge-max.c +++ b/ddbridge/ddbridge-max.c @@ -49,11 +49,12 @@ MODULE_PARM_DESC(no_voltage, "Do not enable voltage on LNBH (will also disable 2 static int lnb_command(struct ddb *dev, u32 link, u32 lnb, u32 cmd) { u32 c, v = 0, tag = DDB_LINK_TAG(link); + u32 base = dev->link[link].info->lnb_base; v = LNB_TONE & (dev->link[link].lnb.tone << (15 - lnb)); - ddbwritel(dev, cmd | v, tag | LNB_CONTROL(lnb)); + ddbwritel(dev, cmd | v, tag | base | LNB_CONTROL(lnb)); for (c = 0; c < 10; c++) { - v = ddbreadl(dev, tag | LNB_CONTROL(lnb)); + v = ddbreadl(dev, tag | base | LNB_CONTROL(lnb)); if ((v & LNB_BUSY) == 0) break; msleep(20); @@ -91,6 +92,7 @@ static int max_send_master_cmd(struct dvb_frontend *fe, struct ddb *dev = port->dev; struct ddb_dvb *dvb = &port->dvb[input->nr & 1]; u32 tag = DDB_LINK_TAG(port->lnr); + u32 base = dev->link[port->lnr].info->lnb_base; int i; u32 fmode = dev->link[port->lnr].lnb.fmode; @@ -105,9 +107,9 @@ static int max_send_master_cmd(struct dvb_frontend *fe, dvb->diseqc_send_master_cmd(fe, cmd); mutex_lock(&dev->link[port->lnr].lnb.lock); - ddbwritel(dev, 0, tag | LNB_BUF_LEVEL(dvb->input)); + ddbwritel(dev, 0, tag | base | LNB_BUF_LEVEL(dvb->input)); for (i = 0; i < cmd->msg_len; i++) - ddbwritel(dev, cmd->msg[i], tag | LNB_BUF_WRITE(dvb->input)); + ddbwritel(dev, cmd->msg[i], tag | base | LNB_BUF_WRITE(dvb->input)); lnb_command(dev, port->lnr, dvb->input, LNB_CMD_DISEQC); mutex_unlock(&dev->link[port->lnr].lnb.lock); return 0; @@ -117,11 +119,12 @@ static int lnb_send_diseqc(struct ddb *dev, u32 link, u32 input, struct dvb_diseqc_master_cmd *cmd) { u32 tag = DDB_LINK_TAG(link); + u32 base = dev->link[link].info->lnb_base; int i; - ddbwritel(dev, 0, tag | LNB_BUF_LEVEL(input)); + ddbwritel(dev, 0, tag | base | LNB_BUF_LEVEL(input)); for (i = 0; i < cmd->msg_len; i++) - ddbwritel(dev, cmd->msg[i], tag | LNB_BUF_WRITE(input)); + ddbwritel(dev, cmd->msg[i], tag | base | LNB_BUF_WRITE(input)); lnb_command(dev, link, input, LNB_CMD_DISEQC); return 0; } @@ -369,6 +372,7 @@ static int max_enable_high_lnb_voltage(struct dvb_frontend *fe, long arg) struct ddb_port *port = input->port; struct ddb *dev = port->dev; u32 tag = DDB_LINK_TAG(port->lnr); + u32 base = dev->link[port->lnr].info->lnb_base; struct ddb_dvb *dvb = &port->dvb[input->nr & 1]; u32 fmode = dev->link[port->lnr].lnb.fmode; @@ -377,14 +381,14 @@ static int max_enable_high_lnb_voltage(struct dvb_frontend *fe, long arg) default: case 0: case 3: - ddbwritel(dev, arg ? 0x34 : 0x01, tag | LNB_CONTROL(dvb->input)); + ddbwritel(dev, arg ? 0x34 : 0x01, tag | base | LNB_CONTROL(dvb->input)); break; case 1: case 2: - ddbwritel(dev, arg ? 0x34 : 0x01, tag | LNB_CONTROL(0)); - ddbwritel(dev, arg ? 0x34 : 0x01, tag | LNB_CONTROL(1)); - ddbwritel(dev, arg ? 0x34 : 0x01, tag | LNB_CONTROL(2)); - ddbwritel(dev, arg ? 0x34 : 0x01, tag | LNB_CONTROL(3)); + ddbwritel(dev, arg ? 0x34 : 0x01, tag | base | LNB_CONTROL(0)); + ddbwritel(dev, arg ? 0x34 : 0x01, tag | base | LNB_CONTROL(1)); + ddbwritel(dev, arg ? 0x34 : 0x01, tag | base | LNB_CONTROL(2)); + ddbwritel(dev, arg ? 0x34 : 0x01, tag | base | LNB_CONTROL(3)); break; } mutex_unlock(&dev->link[port->lnr].lnb.lock); diff --git a/ddbridge/ddbridge-regs.h b/ddbridge/ddbridge-regs.h index 73f172e..888b684 100644 --- a/ddbridge/ddbridge-regs.h +++ b/ddbridge/ddbridge-regs.h @@ -248,8 +248,7 @@ /* ------------------------------------------------------------------------- */ -#define LNB_BASE (0x400) -#define LNB_CONTROL(i) (LNB_BASE + (i) * 0x20 + 0x00) +#define LNB_CONTROL(i) ((i) * 0x20 + 0x00) #define LNB_CMD (7ULL << 0) #define LNB_CMD_NOP 0 #define LNB_CMD_INIT 1 @@ -265,27 +264,26 @@ #define LNB_INTERRUPT_BASE 4 -#define LNB_STATUS(i) (LNB_BASE + (i) * 0x20 + 0x04) -#define LNB_VOLTAGE(i) (LNB_BASE + (i) * 0x20 + 0x08) -#define LNB_CONFIG(i) (LNB_BASE + (i) * 0x20 + 0x0c) -#define LNB_BUF_LEVEL(i) (LNB_BASE + (i) * 0x20 + 0x10) -#define LNB_BUF_WRITE(i) (LNB_BASE + (i) * 0x20 + 0x14) +#define LNB_STATUS(i) ((i) * 0x20 + 0x04) +#define LNB_VOLTAGE(i) ((i) * 0x20 + 0x08) +#define LNB_CONFIG(i) ((i) * 0x20 + 0x0c) +#define LNB_BUF_LEVEL(i) ((i) * 0x20 + 0x10) +#define LNB_BUF_WRITE(i) ((i) * 0x20 + 0x14) -#define LNB_SETTING(i) (LNB_BASE + (i) * 0x20 + 0x0c) -#define LNB_FIFO_LEVEL(i) (LNB_BASE + (i) * 0x20 + 0x10) -#define LNB_RESET_FIFO(i) (LNB_BASE + (i) * 0x20 + 0x10) -#define LNB_WRITE_FIFO(i) (LNB_BASE + (i) * 0x20 + 0x14) +#define LNB_SETTING(i) ((i) * 0x20 + 0x0c) +#define LNB_FIFO_LEVEL(i) ((i) * 0x20 + 0x10) +#define LNB_RESET_FIFO(i) ((i) * 0x20 + 0x10) +#define LNB_WRITE_FIFO(i) ((i) * 0x20 + 0x14) /* ------------------------------------------------------------------------- */ /* CI Interface (only CI-Bridge) */ -#define CI_BASE (0x400) -#define CI_CONTROL(i) (CI_BASE + (i) * 32 + 0x00) +#define CI_CONTROL(_ci) ((_ci)->regs + 0x00) -#define CI_DO_ATTRIBUTE_RW(i) (CI_BASE + (i) * 32 + 0x04) -#define CI_DO_IO_RW(i) (CI_BASE + (i) * 32 + 0x08) -#define CI_READDATA(i) (CI_BASE + (i) * 32 + 0x0c) -#define CI_DO_READ_ATTRIBUTES(i) (CI_BASE + (i) * 32 + 0x10) +#define CI_DO_ATTRIBUTE_RW(_ci) ((_ci)->regs + 0x04) +#define CI_DO_IO_RW(_ci) ((_ci)->regs + 0x08) +#define CI_READDATA(_ci) ((_ci)->regs + 0x0c) +#define CI_DO_READ_ATTRIBUTES(_ci) ((_ci)->regs + 0x10) #define CI_RESET_CAM (0x00000001) #define CI_POWER_ON (0x00000002) @@ -305,8 +303,8 @@ #define CI_READ_CMD (0x40000000) #define CI_WRITE_CMD (0x80000000) -#define CI_BLOCKIO_SEND(i) (CI_BASE + (i) * 32 + 0x14) -#define CI_BLOCKIO_RECEIVE(i) (CI_BASE + (i) * 32 + 0x18) +#define CI_BLOCKIO_SEND(_ci) ((_ci)->regs + 0x14) +#define CI_BLOCKIO_RECEIVE(_ci) ((_ci)->regs + 0x18) #define CI_BLOCKIO_SEND_COMMAND (0x80000000) #define CI_BLOCKIO_SEND_COMPLETE_ACK (0x40000000) diff --git a/ddbridge/ddbridge.h b/ddbridge/ddbridge.h index b1d3a14..75030f7 100644 --- a/ddbridge/ddbridge.h +++ b/ddbridge/ddbridge.h @@ -147,13 +147,10 @@ struct ddb_info { u32 type; #define DDB_NONE 0 #define DDB_OCTOPUS 1 -#define DDB_OCTOPUS_CI 2 #define DDB_MOD 3 #define DDB_OCTONET 4 #define DDB_OCTOPUS_MAX 5 #define DDB_OCTOPUS_MAX_CT 6 -#define DDB_OCTOPRO 7 -#define DDB_OCTOPRO_HDIN 8 #define DDB_OCTOPUS_MCI 9 u32 version; char *name; @@ -175,11 +172,14 @@ struct ddb_info { #define TS_QUIRK_ALT_OSC 8 u8 mci_ports; u8 mci_type; + u8 ci_mask; u32 tempmon_irq; u32 lostlock_irq; u32 mdio_base; u32 hw_min; + u32 ci_base; + u32 lnb_base; const struct ddb_regmap *regmap; }; @@ -247,6 +247,7 @@ struct ddb_ci { struct dvb_ca_en50221 en; struct ddb_port *port; u32 nr; + u32 regs; }; struct ddb_io { From 9698b87204d9b2ef31a3e40ee57781658707b7a4 Mon Sep 17 00:00:00 2001 From: internal <> Date: Mon, 31 Jul 2023 22:31:23 +0200 Subject: [PATCH 22/24] support alternative modulation types --- ddbridge/ddbridge-sx8.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/ddbridge/ddbridge-sx8.c b/ddbridge/ddbridge-sx8.c index c25f325..630f541 100644 --- a/ddbridge/ddbridge-sx8.c +++ b/ddbridge/ddbridge-sx8.c @@ -494,18 +494,21 @@ static int set_parameters(struct dvb_frontend *fe) stop_iq(fe); switch (p->modulation) { case APSK_256: + case APSK_256_L: mask = 0x7f; break; case APSK_128: mask = 0x3f; break; case APSK_64: + case APSK_64_L: mask = 0x1f; break; case APSK_32: mask = 0x0f; break; case APSK_16: + case APSK_16_L: mask = 0x07; break; default: From 02ded87d78c006a7495c5c596a22ad44cc55676d Mon Sep 17 00:00:00 2001 From: internal <> Date: Mon, 31 Jul 2023 22:31:44 +0200 Subject: [PATCH 23/24] support CI M2, M8 and M8A --- ddbridge/ddbridge-core.c | 3 + ddbridge/ddbridge-hw.c | 45 +++++++++++++- ddbridge/ddbridge-m4.c | 131 ++++++++++++++++++++++++++++++++++++++- ddbridge/ddbridge-main.c | 3 + ddbridge/ddbridge-max.c | 53 +++++++++++++--- ddbridge/ddbridge.h | 3 + 6 files changed, 226 insertions(+), 12 deletions(-) diff --git a/ddbridge/ddbridge-core.c b/ddbridge/ddbridge-core.c index 2726887..0bbaa56 100644 --- a/ddbridge/ddbridge-core.c +++ b/ddbridge/ddbridge-core.c @@ -1838,6 +1838,9 @@ static int dvb_input_attach(struct ddb_input *input) break; case DDB_TUNER_MCI_SX8: case DDB_TUNER_MCI_M4: + case DDB_TUNER_MCI_M8: + case DDB_TUNER_MCI_M8A: + case DDB_TUNER_MCI_M2: if (ddb_fe_attach_mci(input, port->type) < 0) return -ENODEV; break; diff --git a/ddbridge/ddbridge-hw.c b/ddbridge/ddbridge-hw.c index c4e8291..63e2cd4 100644 --- a/ddbridge/ddbridge-hw.c +++ b/ddbridge/ddbridge-hw.c @@ -731,8 +731,48 @@ static const struct ddb_info ddb_m4 = { .i2c_mask = 0x00, .tempmon_irq = 24, .mci_ports = 2, - .mci_type = 1, + .mci_type = DDB_TUNER_MCI_M4, .temp_num = 1, + .lnb_base = 0x400, +}; + +static const struct ddb_info ddb_m8 = { + .type = DDB_OCTOPUS_MCI, + .name = "Digital Devices MAX M8", + .regmap = &octopus_mci_map, + .port_num = 4, + .i2c_mask = 0x00, + .tempmon_irq = 24, + .mci_ports = 4, + .mci_type = DDB_TUNER_MCI_M8, + .temp_num = 1, + .lnb_base = 0x400, +}; + +static const struct ddb_info ddb_m8a = { + .type = DDB_OCTOPUS_MCI, + .name = "Digital Devices MAX M8A", + .regmap = &octopus_mci_map, + .port_num = 4, + .tempmon_irq = 24, + .mci_ports = 4, + .mci_type = DDB_TUNER_MCI_M8A, + .temp_num = 1, + .lnb_base = 0x400, +}; + +static const struct ddb_info ddb_ci_m2 = { + .type = DDB_OCTOPUS_MCI, + .name = "Digital Devices Octopus CI M2", + .regmap = &octopus_mci_map, + .port_num = 4, + .tempmon_irq = 24, + .mci_ports = 1, + .mci_type = DDB_TUNER_MCI_M2, + .temp_num = 1, + .ci_mask = 0x0c, + .ci_base = 0x400, + .lnb_base = 0x480, }; /****************************************************************************/ @@ -865,7 +905,10 @@ static const struct ddb_device_id ddb_device_ids[] = { DDB_DEVID(0x0012, 0x0042, ddb_ci), DDB_DEVID(0x0013, 0x0043, ddb_ci_s2_pro), DDB_DEVID(0x0013, 0x0044, ddb_ci_s2_pro_a), + DDB_DEVID(0x0014, 0x0045, ddb_ci_m2), DDB_DEVID(0x0020, 0x0012, ddb_gtl_mini), + DDB_DEVID(0x0022, 0x0052, ddb_m8), + DDB_DEVID(0x0024, 0x0053, ddb_m8a), /* Modulators */ DDB_DEVID(0x0201, 0x0001, ddb_mod), diff --git a/ddbridge/ddbridge-m4.c b/ddbridge/ddbridge-m4.c index 74ccc77..7489540 100644 --- a/ddbridge/ddbridge-m4.c +++ b/ddbridge/ddbridge-m4.c @@ -529,7 +529,134 @@ static struct mci_cfg ddb_max_m4_cfg = { .base_init = base_init, }; -struct dvb_frontend *ddb_m4_attach(struct ddb_input *input, int nr, int tuner) +static struct dvb_frontend_ops m_ops = { + .delsys = { SYS_DVBC_ANNEX_A, SYS_DVBC_ANNEX_B, SYS_DVBC_ANNEX_C, + SYS_ISDBC, + SYS_DVBT, SYS_DVBT2, SYS_ISDBT, + SYS_DVBS, SYS_DVBS2, SYS_ISDBS, }, + .info = { + .name = "M_AS", + .frequency_min_hz = 47125000, /* DVB-T: 47125000 */ + .frequency_max_hz = 2150000000, /* DVB-C: 862000000 */ + .symbol_rate_min = 100000, + .symbol_rate_max = 100000000, + .frequency_stepsize_hz = 0, + .frequency_tolerance_hz = 0, + .caps = FE_CAN_QPSK | FE_CAN_QAM_16 | FE_CAN_QAM_32 | + FE_CAN_QAM_64 | FE_CAN_QAM_128 | FE_CAN_QAM_256 | + FE_CAN_QAM_AUTO | + FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 | FE_CAN_FEC_3_4 | + FE_CAN_FEC_4_5 | + FE_CAN_FEC_5_6 | FE_CAN_FEC_7_8 | FE_CAN_FEC_AUTO | + FE_CAN_TRANSMISSION_MODE_AUTO | + FE_CAN_GUARD_INTERVAL_AUTO | FE_CAN_HIERARCHY_AUTO | + FE_CAN_RECOVER | FE_CAN_MUTE_TS | FE_CAN_2G_MODULATION + }, + .release = release, + .get_frontend_algo = get_algo, + .get_frontend = get_frontend, + .read_status = read_status, + .tune = tune, + .sleep = sleep, +}; + +static struct mci_cfg ddb_max_m_cfg = { + .type = 0, + .fe_ops = &m_ops, + .base_size = sizeof(struct m4_base), + .state_size = sizeof(struct m4), + .init = init, + .base_init = base_init, +}; + +static struct dvb_frontend_ops m_s_ops = { + .delsys = { SYS_DVBS, SYS_DVBS2, SYS_ISDBS }, + .info = { + .name = "M_S", + .frequency_min_hz = 47125000, /* DVB-T: 47125000 */ + .frequency_max_hz = 2150000000, /* DVB-C: 862000000 */ + .symbol_rate_min = 100000, + .symbol_rate_max = 100000000, + .frequency_stepsize_hz = 0, + .frequency_tolerance_hz = 0, + .caps = FE_CAN_QPSK | FE_CAN_QAM_16 | FE_CAN_QAM_32 | + FE_CAN_QAM_64 | FE_CAN_QAM_128 | FE_CAN_QAM_256 | + FE_CAN_QAM_AUTO | + FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 | FE_CAN_FEC_3_4 | + FE_CAN_FEC_4_5 | + FE_CAN_FEC_5_6 | FE_CAN_FEC_7_8 | FE_CAN_FEC_AUTO | + FE_CAN_TRANSMISSION_MODE_AUTO | + FE_CAN_GUARD_INTERVAL_AUTO | FE_CAN_HIERARCHY_AUTO | + FE_CAN_RECOVER | FE_CAN_MUTE_TS | FE_CAN_2G_MODULATION + }, + .release = release, + .get_frontend_algo = get_algo, + .get_frontend = get_frontend, + .read_status = read_status, + .tune = tune, + .sleep = sleep, +}; + +static struct mci_cfg ddb_max_m_s_cfg = { + .type = 0, + .fe_ops = &m_s_ops, + .base_size = sizeof(struct m4_base), + .state_size = sizeof(struct m4), + .init = init, + .base_init = base_init, +}; + +static struct dvb_frontend_ops m_a_ops = { + .delsys = { SYS_DVBC_ANNEX_A, SYS_DVBC_ANNEX_B, SYS_DVBC_ANNEX_C, + SYS_ISDBC, + SYS_DVBT, SYS_DVBT2, SYS_ISDBT, + }, + .info = { + .name = "M_A", + .frequency_min_hz = 47125000, /* DVB-T: 47125000 */ + .frequency_max_hz = 2150000000, /* DVB-C: 862000000 */ + .symbol_rate_min = 100000, + .symbol_rate_max = 100000000, + .frequency_stepsize_hz = 0, + .frequency_tolerance_hz = 0, + .caps = FE_CAN_QPSK | FE_CAN_QAM_16 | FE_CAN_QAM_32 | + FE_CAN_QAM_64 | FE_CAN_QAM_128 | FE_CAN_QAM_256 | + FE_CAN_QAM_AUTO | + FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 | FE_CAN_FEC_3_4 | + FE_CAN_FEC_4_5 | + FE_CAN_FEC_5_6 | FE_CAN_FEC_7_8 | FE_CAN_FEC_AUTO | + FE_CAN_TRANSMISSION_MODE_AUTO | + FE_CAN_GUARD_INTERVAL_AUTO | FE_CAN_HIERARCHY_AUTO | + FE_CAN_RECOVER | FE_CAN_MUTE_TS | FE_CAN_2G_MODULATION + }, + .release = release, + .get_frontend_algo = get_algo, + .get_frontend = get_frontend, + .read_status = read_status, + .tune = tune, + .sleep = sleep, +}; + +static struct mci_cfg ddb_max_m_a_cfg = { + .type = 0, + .fe_ops = &m_a_ops, + .base_size = sizeof(struct m4_base), + .state_size = sizeof(struct m4), + .init = init, + .base_init = base_init, +}; + +static struct mci_cfg *ddb_max_cfgs [] = { + &ddb_max_m4_cfg, + &ddb_max_m_a_cfg, + &ddb_max_m_s_cfg, + &ddb_max_m_cfg, +}; + +struct dvb_frontend *ddb_mx_attach(struct ddb_input *input, int nr, int tuner, int type) { - return ddb_mci_attach(input, &ddb_max_m4_cfg, nr, tuner); + return ddb_mci_attach(input, ddb_max_cfgs[type], nr, tuner); } + +EXPORT_SYMBOL(ddb_mx_attach); + diff --git a/ddbridge/ddbridge-main.c b/ddbridge/ddbridge-main.c index d60c7f7..a03b58a 100644 --- a/ddbridge/ddbridge-main.c +++ b/ddbridge/ddbridge-main.c @@ -417,7 +417,10 @@ static const struct pci_device_id ddb_id_table[] __devinitconst = { DDB_DEVICE_ANY(0x0011), DDB_DEVICE_ANY(0x0012), DDB_DEVICE_ANY(0x0013), + DDB_DEVICE_ANY(0x0014), DDB_DEVICE_ANY(0x0020), + DDB_DEVICE_ANY(0x0022), + DDB_DEVICE_ANY(0x0024), DDB_DEVICE_ANY(0x0201), DDB_DEVICE_ANY(0x0203), DDB_DEVICE_ANY(0x0210), diff --git a/ddbridge/ddbridge-max.c b/ddbridge/ddbridge-max.c index dcbdea6..df72e90 100644 --- a/ddbridge/ddbridge-max.c +++ b/ddbridge/ddbridge-max.c @@ -28,6 +28,10 @@ /* MAX LNB interface related module parameters */ +static int delmode; +module_param(delmode, int, 0444); +MODULE_PARM_DESC(delmode, "frontend delivery system mode"); + static int fmode; module_param(fmode, int, 0444); MODULE_PARM_DESC(fmode, "frontend emulation mode"); @@ -505,7 +509,8 @@ int ddb_fe_attach_mxl5xx(struct ddb_input *input) /* MAX MCI related functions */ struct dvb_frontend *ddb_sx8_attach(struct ddb_input *input, int nr, int tuner, int (**fn_set_input)(struct dvb_frontend *fe, int input)); -struct dvb_frontend *ddb_m4_attach(struct ddb_input *input, int nr, int tuner); +struct dvb_frontend *ddb_mx_attach(struct ddb_input *input, int nr, int tuner, int type); + int ddb_fe_attach_mci(struct ddb_input *input, u32 type) { @@ -523,11 +528,46 @@ int ddb_fe_attach_mci(struct ddb_input *input, u32 type) if (fm >= 3) tuner = 0; dvb->fe = ddb_sx8_attach(input, demod, tuner, &dvb->set_input); + dvb->input = tuner; break; case DDB_TUNER_MCI_M4: fm = 0; - dvb->fe = ddb_m4_attach(input, demod, tuner); + dvb->fe = ddb_mx_attach(input, demod, tuner, 0); + dvb->input = tuner; break; + case DDB_TUNER_MCI_M8: + fm = 3; + dvb->fe = ddb_mx_attach(input, demod, tuner, 1); + dvb->input = 0; + break; + case DDB_TUNER_MCI_M8A: + fm = 3; + dvb->fe = ddb_mx_attach(input, demod, tuner, 2); + dvb->input = 0; + break; + case DDB_TUNER_MCI_M2: + { + u32 mode, mmode; + + // delmode: 0 - sat,sat 1-cable,cable/sat + switch (delmode & 1) { + case 0: + mode = 2; + mmode = 2; + break; + case 1: + mode = 1; + mmode = demod ? 3 : 1; + break; + } + if (!demod) + ddb_mci_cmd_link_simple(link, MCI_CMD_SET_INPUT_CONFIG, + 0xff, mode | (delmode & 0x10)); + dvb->fe = ddb_mx_attach(input, demod, tuner, mmode); + dvb->input = 0; + fm = 0; + break; + } default: return -EINVAL; } @@ -535,7 +575,7 @@ int ddb_fe_attach_mci(struct ddb_input *input, u32 type) dev_err(dev->dev, "No MCI card found!\n"); return -ENODEV; } - if (input->nr < 4) { + if (!input->nr || (input->nr < 4 && type != DDB_TUNER_MCI_M8)) { lnb_command(dev, port->lnr, input->nr, LNB_CMD_INIT); lnb_set_voltage(dev, port->lnr, input->nr, SEC_VOLTAGE_OFF); } @@ -548,15 +588,10 @@ int ddb_fe_attach_mci(struct ddb_input *input, u32 type) dvb->fe->ops.diseqc_send_master_cmd = max_send_master_cmd; dvb->fe->ops.diseqc_send_burst = max_send_burst; dvb->fe->sec_priv = input; - switch (type) { - case DDB_TUNER_MCI_M4: - break; - default: + if (type == DDB_TUNER_MCI_SX8) { #ifndef KERNEL_DVB_CORE dvb->fe->ops.set_input = max_set_input; #endif - break; } - dvb->input = tuner; return 0; } diff --git a/ddbridge/ddbridge.h b/ddbridge/ddbridge.h index 75030f7..e9d24ba 100644 --- a/ddbridge/ddbridge.h +++ b/ddbridge/ddbridge.h @@ -321,6 +321,9 @@ struct ddb_port { #define DDB_TUNER_MCI 48 #define DDB_TUNER_MCI_SX8 (DDB_TUNER_MCI + 0) #define DDB_TUNER_MCI_M4 (DDB_TUNER_MCI + 1) +#define DDB_TUNER_MCI_M8 (DDB_TUNER_MCI + 2) +#define DDB_TUNER_MCI_M8A (DDB_TUNER_MCI + 3) +#define DDB_TUNER_MCI_M2 (DDB_TUNER_MCI + 4) struct ddb_input *input[2]; struct ddb_output *output; From da4938e3aa6644deb67045e9aa5e9f3436b69daf Mon Sep 17 00:00:00 2001 From: internal <> Date: Tue, 5 Sep 2023 14:28:05 +0200 Subject: [PATCH 24/24] use correct input --- ddbridge/ddbridge-max.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ddbridge/ddbridge-max.c b/ddbridge/ddbridge-max.c index df72e90..e804f07 100644 --- a/ddbridge/ddbridge-max.c +++ b/ddbridge/ddbridge-max.c @@ -564,7 +564,7 @@ int ddb_fe_attach_mci(struct ddb_input *input, u32 type) ddb_mci_cmd_link_simple(link, MCI_CMD_SET_INPUT_CONFIG, 0xff, mode | (delmode & 0x10)); dvb->fe = ddb_mx_attach(input, demod, tuner, mmode); - dvb->input = 0; + dvb->input = tuner; fm = 0; break; }