From ccc7069122a0cecf19bcded5c05e36e077e95d57 Mon Sep 17 00:00:00 2001 From: sorenhede Date: Thu, 13 Jun 2019 22:18:19 +0200 Subject: [PATCH 1/4] Added FEC and Modulation type for DVB-S2X (Specified in ETSI EN 302 307-2) --- apps/Makefile | 5 ++- apps/modcod.c | 61 ++++++++++++++++++++++++++++++++++++ ddbridge/ddbridge-mci.c | 42 +++++++++++++++++++++++-- include/linux/dvb/frontend.h | 29 +++++++++++++++++ 4 files changed, 134 insertions(+), 3 deletions(-) create mode 100644 apps/modcod.c diff --git a/apps/Makefile b/apps/Makefile index 31a1ed5..01d5d25 100644 --- a/apps/Makefile +++ b/apps/Makefile @@ -1,4 +1,4 @@ -all: cit citin flashprog modt ddtest setmod ddflash setmod2 pls setmod3 +all: cit citin flashprog modt ddtest setmod ddflash setmod2 pls setmod3 modcod cit: cit.c $(CC) -o cit cit.c -lpthread @@ -15,6 +15,9 @@ setmod2: setmod2.c setmod3: setmod3.c $(CC) -o setmod3 setmod3.c -I../include/ +modcod: modcod.c + $(CC) -o modcod modcod.c -I../include/ + %.o: %.c $(CC) $(CFLAGS) -o $@ $< diff --git a/apps/modcod.c b/apps/modcod.c new file mode 100644 index 0000000..d983aa6 --- /dev/null +++ b/apps/modcod.c @@ -0,0 +1,61 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +int main() +{ + const enum fe_modulation modcod2modS2X[0x3D] = { + MODULATION_NONE, MODULATION_NONE, //2 + QPSK, QPSK, QPSK, //3 + APSK_8, APSK_8,APSK_8,APSK_8,APSK_8, //5 + APSK_16,APSK_16,APSK_16,APSK_16,APSK_16,APSK_16,APSK_16,APSK_16,APSK_16,APSK_16,APSK_16,APSK_16,APSK_16,//13 + APSK_32,MODULATION_NONE,APSK_32,APSK_32,APSK_32,//5 + APSK_64, APSK_64, MODULATION_NONE, APSK_64,MODULATION_NONE, APSK_64,MODULATION_NONE ,APSK_64,//8 + APSK_128, APSK_128, + APSK_256, APSK_256,APSK_256,APSK_256,APSK_256,APSK_256, + QPSK, QPSK,QPSK,QPSK,QPSK,QPSK, + PSK_8,PSK_8,PSK_8,PSK_8, + APSK_16,APSK_16,APSK_16,APSK_16,APSK_16, + APSK_32,APSK_32, + }; + + const enum fe_code_rate modcod2fecS2X[0x3D] = { + FEC_NONE, FEC_NONE, //2 + FEC_13_45, FEC_9_20, FEC_11_20, //3 + FEC_5_9_L, FEC_26_45_L, FEC_23_36, FEC_25_36, FEC_13_18, //5 + FEC_1_2_L, FEC_8_15_L, FEC_5_9_L, FEC_26_45, FEC_3_5, FEC_3_5_L, FEC_28_45, FEC_23_36,FEC_2_3_L, FEC_25_36, FEC_13_18,FEC_7_9, FEC_77_90, //13 + FEC_2_3_L, FEC_NONE, FEC_32_45, FEC_11_15, FEC_7_9, + FEC_32_45_L, FEC_11_15,FEC_NONE ,FEC_7_9, FEC_NONE, FEC_4_5, FEC_NONE, FEC_5_6, //8 + FEC_3_4,FEC_7_9, FEC_29_45_L,FEC_2_3_L,FEC_31_45_L,FEC_32_45,FEC_11_15_L, + FEC_3_4,FEC_11_45,FEC_4_15,FEC_14_45,FEC_7_15,FEC_8_15, + FEC_32_45,FEC_7_15,FEC_8_15,FEC_26_45,FEC_32_45,FEC_7_15, + FEC_8_15,FEC_26_45,FEC_3_5,FEC_32_45,FEC_2_3,FEC_32_45, + }; + +uint8_t modcod; +modcod = 248; +if(modcod2modS2X[((modcod & 0x7F) >> 1)] == APSK_32) + printf("modcod2modS2X OK\r\n"); +if(modcod2fecS2X[((modcod & 0x7F) >> 1)] == FEC_32_45) + printf("modcod2modS2X OK\r\n"); + +modcod = 132; +if(modcod2modS2X[((modcod & 0x7F) >> 1)] == QPSK) + printf("modcod2modS2X OK\r\n"); +if(modcod2fecS2X[((modcod & 0x7F) >> 1)] == FEC_13_45) + printf("modcod2modS2X OK\r\n"); +//printf("test mod=%u value= %d APSK_32=%d \n",mod, modcod2modS2X[((mod & 0x7F) >> 1)], APSK_32); +//printf("test mod=%u value= %d FEC_32_45=%d \n",mod, modcod2fecS2X[((mod & 0x7F) >> 1)], FEC_32_45); + +} + diff --git a/ddbridge/ddbridge-mci.c b/ddbridge/ddbridge-mci.c index dec7861..42486e9 100644 --- a/ddbridge/ddbridge-mci.c +++ b/ddbridge/ddbridge-mci.c @@ -228,6 +228,35 @@ void ddb_mci_proc_info(struct mci *mci, struct dtv_frontend_properties *p) ROLLOFF_35, ROLLOFF_25, ROLLOFF_20, ROLLOFF_10, ROLLOFF_5, ROLLOFF_15, ROLLOFF_35, ROLLOFF_35 }; + + const enum fe_modulation modcod2modS2X[0x3D] = { + MODULATION_NONE, MODULATION_NONE, //2 + QPSK, QPSK, QPSK, //3 + APSK_8, APSK_8,APSK_8,APSK_8,APSK_8, //5 + APSK_16,APSK_16,APSK_16,APSK_16,APSK_16,APSK_16,APSK_16,APSK_16,APSK_16,APSK_16,APSK_16,APSK_16,APSK_16,//13 + APSK_32,MODULATION_NONE,APSK_32,APSK_32,APSK_32,//5 + APSK_64, APSK_64, MODULATION_NONE, APSK_64,MODULATION_NONE, APSK_64,MODULATION_NONE ,APSK_64,//8 + APSK_128, APSK_128, + APSK_256, APSK_256,APSK_256,APSK_256,APSK_256,APSK_256, + QPSK, QPSK,QPSK,QPSK,QPSK,QPSK, + PSK_8,PSK_8,PSK_8,PSK_8, + APSK_16,APSK_16,APSK_16,APSK_16,APSK_16, + APSK_32,APSK_32, + }; + + const enum fe_code_rate modcod2fecS2X[0x3D] = { + FEC_NONE, FEC_NONE, //2 + FEC_13_45, FEC_9_20, FEC_11_20, //3 + FEC_5_9_L, FEC_26_45_L, FEC_23_36, FEC_25_36, FEC_13_18, //5 + FEC_1_2_L, FEC_8_15_L, FEC_5_9_L, FEC_26_45, FEC_3_5, FEC_3_5_L, FEC_28_45, FEC_23_36,FEC_2_3_L, FEC_25_36, FEC_13_18,FEC_7_9, FEC_77_90, //13 + FEC_2_3_L, FEC_NONE, FEC_32_45, FEC_11_15, FEC_7_9, + FEC_32_45_L, FEC_11_15,FEC_NONE ,FEC_7_9, FEC_NONE, FEC_4_5, FEC_NONE, FEC_5_6, //8 + FEC_3_4,FEC_7_9, FEC_29_45_L,FEC_2_3_L,FEC_31_45_L,FEC_32_45,FEC_11_15_L, + FEC_3_4,FEC_11_45,FEC_4_15,FEC_14_45,FEC_7_15,FEC_8_15, + FEC_32_45,FEC_7_15,FEC_8_15,FEC_26_45,FEC_32_45,FEC_7_15, + FEC_8_15,FEC_26_45,FEC_3_5,FEC_32_45,FEC_2_3,FEC_32_45, + }; + p->frequency = mci->signal_info.dvbs2_signal_info.frequency; @@ -252,8 +281,17 @@ void ddb_mci_proc_info(struct mci *mci, struct dtv_frontend_properties *p) ro_lut[mci->signal_info. dvbs2_signal_info.roll_off & 7]; p->pilot = (pls_code & 1) ? PILOT_ON : PILOT_OFF; - p->fec_inner = modcod2fec[modcod]; - p->modulation = modcod2mod[modcod]; + if(modcod & 0x80) //DVB-S2X + { + uint8_t modcodS2X = (modcod & 0x7F) >> 1; + p->fec_inner = modcod2fecS2X[modcodS2X]; + p->modulation = modcod2modS2X[modcodS2X]; + } + else + { + p->fec_inner = modcod2fec[modcod]; + p->modulation = modcod2mod[modcod]; + } p->transmission_mode = pls_code; } else { p->delivery_system = SYS_DVBS; diff --git a/include/linux/dvb/frontend.h b/include/linux/dvb/frontend.h index c9d2e14..5c5c744 100644 --- a/include/linux/dvb/frontend.h +++ b/include/linux/dvb/frontend.h @@ -314,6 +314,33 @@ enum fe_code_rate { FEC_2_5, FEC_1_4, FEC_1_3, + FEC_13_45, + FEC_9_20, + FEC_11_20, + FEC_5_9_L, + FEC_26_45_L, + FEC_23_36, + FEC_25_36, + FEC_13_18, + FEC_1_2_L, + FEC_8_15_L, + FEC_26_45, + FEC_3_5_L, + FEC_28_45, + FEC_2_3_L, + FEC_7_9, + FEC_32_45_L, + FEC_77_90, + FEC_32_45, + FEC_11_15, + FEC_29_45_L, + FEC_31_45_L, + FEC_11_15_L, + FEC_11_45, + FEC_4_15, + FEC_14_45, + FEC_7_15, + FEC_8_15, }; /** @@ -354,6 +381,8 @@ enum fe_modulation { APSK_64, APSK_128, APSK_256, + APSK_8, + MODULATION_NONE, }; /** From f1348429b3166cab8bb3c621ba9a8df972213687 Mon Sep 17 00:00:00 2001 From: trumandk Date: Thu, 13 Jun 2019 23:08:07 +0200 Subject: [PATCH 2/4] Added modulation2text and fec2text --- apps/modcod.c | 156 ++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 150 insertions(+), 6 deletions(-) diff --git a/apps/modcod.c b/apps/modcod.c index d983aa6..4e5ab3b 100644 --- a/apps/modcod.c +++ b/apps/modcod.c @@ -12,6 +12,143 @@ #include +char* modulation2text(const enum fe_modulation mod) +{ + switch(mod) + { + case QPSK: + return "QPSK"; + case QAM_16: + return "16QAM"; + case QAM_32: + return "32QAM"; + case QAM_64: + return "64QAM"; + case QAM_128: + return "128QAM"; + case QAM_256: + return "256QAM"; + case QAM_AUTO: + return "QAM_AUTO"; + case VSB_8: + return "8VSB"; + case VSB_16: + return "16VSB"; + case PSK_8: + return "8PSK"; + case APSK_16: + return "16APSK"; + case APSK_32: + return "32APSK"; + case DQPSK: + return "DQPSK"; + case QAM_4_NR: + return "QAM_4_NR"; + case APSK_64: + return "64APSK"; + case APSK_128: + return "128APSK"; + case APSK_256: + return "256APSK"; + case APSK_8: + return "8APSK"; + default: + return "MODULATION_NONE"; + }; +} + +char* fec2text(const enum fe_code_rate fec) +{ + switch(fec) + { + case FEC_1_2: + return "1/2"; + case FEC_2_3: + return "2/3"; + case FEC_3_4: + return "3/4"; + case FEC_4_5: + return "4/5"; + case FEC_5_6: + return "5/6"; + case FEC_6_7: + return "6/7"; + case FEC_7_8: + return "7/8"; + case FEC_8_9: + return "8/9"; + case FEC_AUTO: + return "FEC_AUTO"; + case FEC_3_5: + return "3/5"; + case FEC_9_10: + return "9/10"; + case FEC_2_5: + return "2/5"; + case FEC_1_4: + return "1/4"; + case FEC_1_3: + return "1/3"; + case FEC_13_45: + return "13/45"; + case FEC_9_20: + return "9/20"; + case FEC_11_20: + return "11/20"; + case FEC_5_9_L: + return "5/9-L"; + case FEC_26_45_L: + return "26/45-L"; + case FEC_23_36: + return "23/36"; + case FEC_25_36: + return "25/36"; + case FEC_13_18: + return "13/18"; + case FEC_1_2_L: + return "1/2-L"; + case FEC_8_15_L: + return "8/15-L"; + case FEC_26_45: + return "26/45"; + case FEC_3_5_L: + return "3/5-L"; + case FEC_28_45: + return "28/45"; + case FEC_2_3_L: + return "2/3-L"; + case FEC_7_9: + return "7/9"; + case FEC_32_45_L: + return "32/45-L"; + case FEC_77_90: + return "77/90"; + case FEC_32_45: + return "32/45"; + case FEC_11_15: + return "11/15"; + case FEC_29_45_L: + return "29/45-L"; + case FEC_31_45_L: + return "31/45-L"; + case FEC_11_15_L: + return "11/15-L"; + case FEC_11_45: + return "11/45"; + case FEC_4_15: + return "4/15"; + case FEC_14_45: + return "14/45"; + case FEC_7_15: + return "7/15"; + case FEC_8_15: + return "8/15"; + default: + return "FEC_NONE"; + }; + +} + int main() { const enum fe_modulation modcod2modS2X[0x3D] = { @@ -42,20 +179,27 @@ int main() FEC_8_15,FEC_26_45,FEC_3_5,FEC_32_45,FEC_2_3,FEC_32_45, }; + + uint8_t modcod; modcod = 248; if(modcod2modS2X[((modcod & 0x7F) >> 1)] == APSK_32) - printf("modcod2modS2X OK\r\n"); + printf("modcod2modS2X OK APSK_32=%s \r\n", modulation2text(modcod2modS2X[((modcod & 0x7F) >> 1)] ) ); if(modcod2fecS2X[((modcod & 0x7F) >> 1)] == FEC_32_45) - printf("modcod2modS2X OK\r\n"); + printf("modcod2modS2X OK FEC_32_45=%s\r\n", fec2text(modcod2fecS2X[((modcod & 0x7F) >> 1)])); + modcod = 132; if(modcod2modS2X[((modcod & 0x7F) >> 1)] == QPSK) - printf("modcod2modS2X OK\r\n"); + printf("modcod2modS2X OK QPSK=%s \r\n", modulation2text(modcod2modS2X[((modcod & 0x7F) >> 1)] ) ); if(modcod2fecS2X[((modcod & 0x7F) >> 1)] == FEC_13_45) - printf("modcod2modS2X OK\r\n"); -//printf("test mod=%u value= %d APSK_32=%d \n",mod, modcod2modS2X[((mod & 0x7F) >> 1)], APSK_32); -//printf("test mod=%u value= %d FEC_32_45=%d \n",mod, modcod2fecS2X[((mod & 0x7F) >> 1)], FEC_32_45); + printf("modcod2modS2X OK FEC_13_45=%s\r\n", fec2text(modcod2fecS2X[((modcod & 0x7F) >> 1)])); + +modcod = 184; +if(modcod2modS2X[((modcod & 0x7F) >> 1)] == APSK_64) + printf("modcod2modS2X OK 64APSK=%s \r\n", modulation2text(modcod2modS2X[((modcod & 0x7F) >> 1)] ) ); +if(modcod2fecS2X[((modcod & 0x7F) >> 1)] == FEC_32_45_L) + printf("modcod2modS2X OK FEC_32_45_L=%s\r\n", fec2text(modcod2fecS2X[((modcod & 0x7F) >> 1)])); } From b62f424644ec26c538abd5ee50c29ecee4699ddc Mon Sep 17 00:00:00 2001 From: trumandk Date: Fri, 14 Jun 2019 10:58:06 +0200 Subject: [PATCH 3/4] Fixed bug in FEC and Modulation for DVB-S2X --- ddbridge/ddbridge-mci.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ddbridge/ddbridge-mci.c b/ddbridge/ddbridge-mci.c index 42486e9..d121998 100644 --- a/ddbridge/ddbridge-mci.c +++ b/ddbridge/ddbridge-mci.c @@ -274,21 +274,21 @@ void ddb_mci_proc_info(struct mci *mci, struct dtv_frontend_properties *p) (mci->signal_info.dvbs2_signal_info.standard == 2) ? SYS_DVBS2 : SYS_DVBS; if (mci->signal_info.dvbs2_signal_info.standard == 2) { - u32 modcod = (0x7c & pls_code) >> 2; p->delivery_system = SYS_DVBS2; p->rolloff = ro_lut[mci->signal_info. dvbs2_signal_info.roll_off & 7]; p->pilot = (pls_code & 1) ? PILOT_ON : PILOT_OFF; - if(modcod & 0x80) //DVB-S2X + if(pls_code & 0x80) //DVB-S2X { - uint8_t modcodS2X = (modcod & 0x7F) >> 1; + uint8_t modcodS2X = (pls_code & 0x7F) >> 1; p->fec_inner = modcod2fecS2X[modcodS2X]; p->modulation = modcod2modS2X[modcodS2X]; } else { + u32 modcod = (0x7c & pls_code) >> 2; p->fec_inner = modcod2fec[modcod]; p->modulation = modcod2mod[modcod]; } From 03b20992b601eb5a9d23b109e45daa7fca977dd6 Mon Sep 17 00:00:00 2001 From: trumandk Date: Sat, 29 Jun 2019 22:38:10 +0200 Subject: [PATCH 4/4] Added tool for checking SX8 support given modcod --- apps/modcod.c | 56 +++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 54 insertions(+), 2 deletions(-) diff --git a/apps/modcod.c b/apps/modcod.c index 4e5ab3b..24667fe 100644 --- a/apps/modcod.c +++ b/apps/modcod.c @@ -9,9 +9,57 @@ #include #include #include - +#include #include + +bool supportedsx8(const enum fe_modulation mod, const enum fe_code_rate fec) +{ + switch(mod) + { + case QPSK: + if(fec == FEC_1_2 || fec == FEC_3_5 || fec == FEC_2_3 || fec == FEC_3_4 || fec == FEC_4_5 || fec == FEC_5_6 || fec == FEC_8_9 || fec == FEC_9_10 /**/ || fec == FEC_1_4 || fec == FEC_1_3 || fec == FEC_2_5 || fec == FEC_11_45 || fec == FEC_4_15 || fec == FEC_14_45 || fec == FEC_7_15 || fec == FEC_8_15 || fec == FEC_32_45 ) + { + return true; + } + else + return false; + case PSK_8: + if(fec == FEC_3_5 || fec == FEC_2_3 || fec == FEC_3_4 || fec == FEC_5_6 || fec == FEC_8_9 || fec == FEC_9_10 /**/ || fec == FEC_7_15 || fec == FEC_8_15 || fec == FEC_26_45 || fec == FEC_32_45) + return true; + else + return false; + case APSK_16: + if(fec == FEC_2_3 || fec == FEC_3_4 || fec == FEC_4_5 || fec == FEC_5_6 || fec == FEC_8_9 || fec == FEC_9_10 /**/ || fec == FEC_7_15 || fec == FEC_8_15 || fec == FEC_26_45 || fec == FEC_3_5 || fec == FEC_32_45) + return true; + else + return false; + case APSK_32: + if(fec == FEC_3_4 || fec == FEC_4_5 || fec == FEC_5_6 || fec == FEC_8_9 || fec == FEC_9_10 /**/ || fec == FEC_2_3 || fec == FEC_32_45) + return true; + else + return false; + case APSK_64: + if(fec == FEC_32_45_L || fec == FEC_11_15 || fec == FEC_7_9 || fec == FEC_4_5 || fec == FEC_5_6) + return true; + else + return false; + case APSK_128: + if(fec == FEC_3_4 || fec == FEC_7_9 || fec == FEC_29_45_L || fec == FEC_2_3_L) + return true; + else + return false; + case APSK_256: + if(fec == FEC_31_45_L || fec == FEC_32_45 || fec == FEC_11_15_L || fec == FEC_3_4) + return true; + else + return false; + default: + return false; + }; + return false; +} + char* modulation2text(const enum fe_modulation mod) { switch(mod) @@ -182,24 +230,28 @@ int main() uint8_t modcod; + modcod = 248; if(modcod2modS2X[((modcod & 0x7F) >> 1)] == APSK_32) printf("modcod2modS2X OK APSK_32=%s \r\n", modulation2text(modcod2modS2X[((modcod & 0x7F) >> 1)] ) ); if(modcod2fecS2X[((modcod & 0x7F) >> 1)] == FEC_32_45) printf("modcod2modS2X OK FEC_32_45=%s\r\n", fec2text(modcod2fecS2X[((modcod & 0x7F) >> 1)])); - +printf("supported=%d\r\n\r\n", (uint16_t)supportedsx8(modcod2modS2X[((modcod & 0x7F) >> 1)], modcod2fecS2X[((modcod & 0x7F) >> 1)])); modcod = 132; if(modcod2modS2X[((modcod & 0x7F) >> 1)] == QPSK) printf("modcod2modS2X OK QPSK=%s \r\n", modulation2text(modcod2modS2X[((modcod & 0x7F) >> 1)] ) ); if(modcod2fecS2X[((modcod & 0x7F) >> 1)] == FEC_13_45) printf("modcod2modS2X OK FEC_13_45=%s\r\n", fec2text(modcod2fecS2X[((modcod & 0x7F) >> 1)])); +printf("supported=%d\r\n\r\n", (uint16_t)supportedsx8(modcod2modS2X[((modcod & 0x7F) >> 1)], modcod2fecS2X[((modcod & 0x7F) >> 1)])); modcod = 184; if(modcod2modS2X[((modcod & 0x7F) >> 1)] == APSK_64) printf("modcod2modS2X OK 64APSK=%s \r\n", modulation2text(modcod2modS2X[((modcod & 0x7F) >> 1)] ) ); if(modcod2fecS2X[((modcod & 0x7F) >> 1)] == FEC_32_45_L) printf("modcod2modS2X OK FEC_32_45_L=%s\r\n", fec2text(modcod2fecS2X[((modcod & 0x7F) >> 1)])); +printf("supported=%d\r\n\r\n", (uint16_t)supportedsx8(modcod2modS2X[((modcod & 0x7F) >> 1)], modcod2fecS2X[((modcod & 0x7F) >> 1)])); + }