diff --git a/Lua_scripts/MultiChan.txt b/Lua_scripts/MultiChan.txt index 43210e7..6fa989d 100644 --- a/Lua_scripts/MultiChan.txt +++ b/Lua_scripts/MultiChan.txt @@ -136,6 +136,7 @@ 72,0,Q90C,Std,0,FMode,VTX+ 50,0,Redpine,Fast,0,sCH5,sCH6,sCH7,sCH8,sCH9,sCH10,sCH11,sCH12,sCH13,sCH14,sCH15,sCH16 50,1,Redpine,Slow,0,sCH5,sCH6,sCH7,sCH8,sCH9,sCH10,sCH11,sCH12,sCH13,sCH14,sCH15,sCH16 +74,0,RadioLink,Surface,0,CH5,CH6,CH7,CH8,FS_CH1,FS_CH2,FS_CH3,FS_CH4,FS_CH5,FS_CH6,FS_CH7,FS_CH8 21,0,SFHSS,Std,0,CH5,CH6,CH7,CH8 19,0,Shenqi,Cycle,1 68,0,Skyartec,Std,0,CH5,CH6,CH7 diff --git a/Lua_scripts/MultiChannelsUpdater.lua b/Lua_scripts/MultiChannelsUpdater.lua index ede6b4d..1b1d8f9 100644 --- a/Lua_scripts/MultiChannelsUpdater.lua +++ b/Lua_scripts/MultiChannelsUpdater.lua @@ -278,6 +278,15 @@ local function Multi_Init() ch_order = math.floor(ch_order/4) channel_names[bitand(ch_order,3)+1] = stick_names[1] end + + --Exceptions on first 4 channels... + if ( protocol == 74 and sub_protocol == 0 ) then -- RadioLink Surface + channel_names[1] = "ST" + channel_names[2] = "THR" + channel_names[3] = "CH3" + channel_names[4] = "CH4" + end + --Check MultiChan.txt local f = io.open("/SCRIPTS/TOOLS/MultiChan.txt", "r") if f == nil then return end diff --git a/Multiprotocol/Multi.txt b/Multiprotocol/Multi.txt index 6139abe..803e6e9 100644 --- a/Multiprotocol/Multi.txt +++ b/Multiprotocol/Multi.txt @@ -70,4 +70,5 @@ 70,DSM_RX 71,JJRC345 72,Q90C -73,Kyosho \ No newline at end of file +73,Kyosho +74,RadioLink,Surface \ No newline at end of file diff --git a/Multiprotocol/Multi_Names.ino b/Multiprotocol/Multi_Names.ino index f296bdc..f549c2f 100644 --- a/Multiprotocol/Multi_Names.ino +++ b/Multiprotocol/Multi_Names.ino @@ -87,6 +87,7 @@ const char STR_FRSKYR9[] ="FrSkyR9"; const char STR_PROPEL[] ="Propel"; const char STR_SKYARTEC[] ="Skyartc"; const char STR_KYOSHO[] ="Kyosho"; +const char STR_RLINK[] ="RadLink"; const char STR_TEST[] ="Test"; const char STR_FAKE[] ="Fake"; @@ -140,6 +141,7 @@ const char STR_SUBTYPE_WFLY[] = "\x06""WFR0xS"; const char STR_SUBTYPE_HOTT[] = "\x07""Sync\0 ""No_Sync"; const char STR_SUBTYPE_PELIKAN[] = "\x04""Pro\0""Lite"; const char STR_SUBTYPE_V761[] = "\x03""3CH""4CH"; +const char STR_SUBTYPE_RLINK[] = "\x07""Surface"; enum { @@ -324,6 +326,9 @@ const mm_protocol_definition multi_protocols[] = { #if defined(REDPINE_CC2500_INO) {PROTO_REDPINE, STR_REDPINE, 2, STR_SUBTYPE_REDPINE, OPTION_RFTUNE }, #endif + #if defined(RLINK_CC2500_INO) + {PROTO_RLINK, STR_RLINK, 1, STR_SUBTYPE_RLINK, OPTION_RFTUNE }, + #endif #if defined(SCANNER_CC2500_INO) // {PROTO_SCANNER, STR_SCANNER, 0, NO_SUBTYPE, OPTION_NONE }, #endif diff --git a/Multiprotocol/Multiprotocol.h b/Multiprotocol/Multiprotocol.h index 581eb4a..b42da70 100644 --- a/Multiprotocol/Multiprotocol.h +++ b/Multiprotocol/Multiprotocol.h @@ -19,7 +19,7 @@ #define VERSION_MAJOR 1 #define VERSION_MINOR 3 #define VERSION_REVISION 1 -#define VERSION_PATCH_LEVEL 42 +#define VERSION_PATCH_LEVEL 43 //****************** // Protocols @@ -100,6 +100,7 @@ enum PROTOCOLS PROTO_JJRC345 = 71, // =>NRF24L01 PROTO_Q90C = 72, // =>NRF24L01 or CC2500 PROTO_KYOSHO = 73, // =>A7105 + PROTO_RLINK = 74, // =>CC2500 PROTO_FAKE = 126, // =>CC2500+NRF24L01 PROTO_TEST = 127, // =>CC2500 @@ -801,6 +802,7 @@ Serial: 100000 Baud 8e2 _ xxxx xxxx p -- JJRC345 71 Q90C 72 KYOSHO 73 + RLINK 74 BindBit=> 0x80 1=Bind/0=No AutoBindBit=> 0x40 1=Yes /0=No RangeCheck=> 0x20 1=Yes /0=No diff --git a/Multiprotocol/Multiprotocol.ino b/Multiprotocol/Multiprotocol.ino index 0ece78f..9fdc022 100644 --- a/Multiprotocol/Multiprotocol.ino +++ b/Multiprotocol/Multiprotocol.ino @@ -768,7 +768,7 @@ bool Update_All() update_led_status(); #if defined(TELEMETRY) #if ( !( defined(MULTI_TELEMETRY) || defined(MULTI_STATUS) ) ) - if((protocol == PROTO_BAYANG_RX) || (protocol == PROTO_AFHDS2A_RX) || (protocol == PROTO_FRSKY_RX) || (protocol == PROTO_SCANNER) || (protocol==PROTO_FRSKYD) || (protocol==PROTO_BAYANG) || (protocol==PROTO_NCC1701) || (protocol==PROTO_BUGS) || (protocol==PROTO_BUGSMINI) || (protocol==PROTO_HUBSAN) || (protocol==PROTO_AFHDS2A) || (protocol==PROTO_FRSKYX) || (protocol==PROTO_FRSKYX2) || (protocol==PROTO_DSM) || (protocol==PROTO_CABELL) || (protocol==PROTO_HITEC) || (protocol==PROTO_HOTT) || (protocol==PROTO_PROPEL) || (protocol==PROTO_DEVO) || (protocol==PROTO_DSM_RX) || (protocol==PROTO_FRSKY_R9)) + if((protocol == PROTO_BAYANG_RX) || (protocol == PROTO_AFHDS2A_RX) || (protocol == PROTO_FRSKY_RX) || (protocol == PROTO_SCANNER) || (protocol==PROTO_FRSKYD) || (protocol==PROTO_BAYANG) || (protocol==PROTO_NCC1701) || (protocol==PROTO_BUGS) || (protocol==PROTO_BUGSMINI) || (protocol==PROTO_HUBSAN) || (protocol==PROTO_AFHDS2A) || (protocol==PROTO_FRSKYX) || (protocol==PROTO_FRSKYX2) || (protocol==PROTO_DSM) || (protocol==PROTO_CABELL) || (protocol==PROTO_HITEC) || (protocol==PROTO_HOTT) || (protocol==PROTO_PROPEL) || (protocol==PROTO_DEVO) || (protocol==PROTO_DSM_RX) || (protocol==PROTO_FRSKY_R9) || (protocol==PROTO_RLINK)) #endif if(IS_DISABLE_TELEM_off) TelemetryUpdate(); @@ -1254,6 +1254,14 @@ static void protocol_init() remote_callback = ESKY150V2_callback; break; #endif + #if defined(RLINK_CC2500_INO) + case PROTO_RLINK: + PE1_off; + PE2_on; //antenna RF2 + next_callback = initRLINK(); + remote_callback = RLINK_callback; + break; + #endif #endif #ifdef CYRF6936_INSTALLED #if defined(DSM_CYRF6936_INO) @@ -2191,7 +2199,7 @@ void pollBoot() #if defined(TELEMETRY) void PPM_Telemetry_serial_init() { - if( (protocol==PROTO_FRSKYD) || (protocol==PROTO_HUBSAN) || (protocol==PROTO_AFHDS2A) || (protocol==PROTO_BAYANG)|| (protocol==PROTO_NCC1701) || (protocol==PROTO_CABELL) || (protocol==PROTO_HITEC) || (protocol==PROTO_BUGS) || (protocol==PROTO_BUGSMINI) || (protocol==PROTO_PROPEL) + if( (protocol==PROTO_FRSKYD) || (protocol==PROTO_HUBSAN) || (protocol==PROTO_AFHDS2A) || (protocol==PROTO_BAYANG)|| (protocol==PROTO_NCC1701) || (protocol==PROTO_CABELL) || (protocol==PROTO_HITEC) || (protocol==PROTO_BUGS) || (protocol==PROTO_BUGSMINI) || (protocol==PROTO_PROPEL) || (protocol==PROTO_RLINK) #ifdef TELEMETRY_FRSKYX_TO_FRSKYD || (protocol==PROTO_FRSKYX) || (protocol==PROTO_FRSKYX2) #endif diff --git a/Multiprotocol/RadioLink_cc2500.ino b/Multiprotocol/RadioLink_cc2500.ino new file mode 100644 index 0000000..6c62a33 --- /dev/null +++ b/Multiprotocol/RadioLink_cc2500.ino @@ -0,0 +1,209 @@ +/* + This project is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + Multiprotocol is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Multiprotocol. If not, see . + */ +// Radiolink surface protocol. TXs: RC4GS,RC6GS. Compatible RXs:R7FG(Std),R6FG,R6F,R8EF,R8FM,R8F,R4FGM + +#if defined(RLINK_CC2500_INO) + +#include "iface_cc2500.h" + +#define RLINK_FORCE_ID + +#define RLINK_TX_PACKET_LEN 33 +#define RLINK_RX_PACKET_LEN 15 +#define RLINK_TX_ID_LEN 4 + +enum { + RLINK_DATA = 0x00, + RLINK_RX1 = 0x01, + RLINK_RX2 = 0x02, +}; + +const PROGMEM uint8_t RLINK_init_values[] = { + /* 00 */ 0x5B, 0x06, 0x5C, 0x07, 0xAB, 0xCD, 0x40, 0x04, + /* 08 */ 0x45, 0x00, 0x00, 0x06, 0x00, 0x5C, 0x62, 0x76, + /* 10 */ 0x7A, 0x7F, 0x13, 0x23, 0xF8, 0x44, 0x07, 0x30, + /* 18 */ 0x18, 0x16, 0x6C, 0x43, 0x40, 0x91, 0x87, 0x6B, + /* 20 */ 0xF8, 0x56, 0x10, 0xA9, 0x0A, 0x00, 0x11 +}; + +static void __attribute__((unused)) RLINK_init() +{ + rf_ch_num=(random(0xfefefefe)&0x0F)+1; // 0x01..0x10 + memcpy(hopping_frequency,"\x12\xBA\x66\x72\x1E\x42\x06\x4E\x36\xAE\x8A\xA2\x2A\x7E\x96\x5A",16); + hopping_frequency[rf_ch_num]=0xC6; + #ifdef RLINK_FORCE_ID + memcpy(rx_tx_addr,"\x3A\x99\x22\x3A",RLINK_TX_ID_LEN); + #endif +} + +static void __attribute__((unused)) RLINK_rf_init() +{ + CC2500_Strobe(CC2500_SIDLE); + + for (uint8_t i = 0; i < 39; ++i) + CC2500_WriteReg(i, pgm_read_byte_near(&RLINK_init_values[i])); + + prev_option = option; + CC2500_WriteReg(CC2500_0C_FSCTRL0, option); + + CC2500_SetTxRxMode(TX_EN); + CC2500_SetPower(); +} + +static void __attribute__((unused)) RLINK_tune_freq() +{ + if ( prev_option != option ) + { + CC2500_WriteReg(CC2500_0C_FSCTRL0, option); + prev_option = option ; + } +} + +static void __attribute__((unused)) RLINK_TIMING_RFSEND_packet() +{ + uint32_t pseudo=0, bits = 0; + uint8_t bitsavailable = 0; + uint8_t idx = 6; + + CC2500_Strobe(CC2500_SIDLE); + + // packet length + packet[0] = RLINK_TX_PACKET_LEN; + // header + packet[1] = packet_count>3?0x03:0x01; // packet type: 0x01 normal, 0x03 request telemetry + //if(RX_num) packet[1] |= ((RX_num+2)<<4)+4; // RX number limited to 10 values, 0 is a wildcard + + // ID + memcpy(&packet[2],rx_tx_addr,RLINK_TX_ID_LEN); + + // pack 16 channels on 11 bits values between 170 and 1876, 1023 middle. The last 8 channels are failsafe values associated to the first 8 values. + for (uint8_t i = 0; i < 16; i++) + { + uint32_t val = convert_channel_16b_nolimit(i,170,1876); // allow extended limits + if (val & 0x8000) + val = 0; + else if (val > 2047) + val=2047; + + bits |= val << bitsavailable; + bitsavailable += 11; + while (bitsavailable >= 8) { + packet[idx++] = bits & 0xff; + bits >>= 8; + bitsavailable -= 8; + } + } + + // hop + pseudo=((pseudo * 0xAA) + 3) % 0x7673; // calc next pseudo random value + CC2500_WriteReg(CC2500_0A_CHANNR, hopping_frequency[pseudo &0x0F]); + packet[28]= pseudo; + packet[29]= pseudo >> 8; + packet[30]= 0x00; // unknown + packet[31]= 0x00; // unknown + packet[32]= rf_ch_num; // value equal to 0xC6 in the RF table + + // check + uint8_t sum=0; + for(uint8_t i=0;i<33;i++) + sum+=packet[i]; + packet[33]=sum; + + // send packet + CC2500_WriteData(packet, RLINK_TX_PACKET_LEN+1); + + // packets type + packet_count++; + if(packet_count>6) packet_count=0; +} + +#define RLINK_TIMING_PROTO 20000 +#define RLINK_TIMING_RFSEND 10223 +#define RLINK_TIMING_CHECK 2000 +uint16_t RLINK_callback() +{ + switch(phase) + { + case RLINK_DATA: + #ifdef MULTI_SYNC + telemetry_set_input_sync(RLINK_TIMING_PROTO); + #endif + RLINK_tune_freq(); + RLINK_TIMING_RFSEND_packet(); +#if not defined RLINK_HUB_TELEMETRY + return RLINK_TIMING_PROTO; +#else + if(packet[1]==0x01) + return RLINK_TIMING_PROTO; + phase++; // RX1 + return RLINK_TIMING_RFSEND; + case RLINK_RX1: + CC2500_Strobe(CC2500_SIDLE); + CC2500_Strobe(CC2500_SFRX); + CC2500_SetTxRxMode(RX_EN); + CC2500_Strobe(CC2500_SRX); + phase++; // RX2 + return RLINK_TIMING_PROTO-RLINK_TIMING_RFSEND-RLINK_TIMING_CHECK; + case RLINK_RX2: + len = CC2500_ReadReg(CC2500_3B_RXBYTES | CC2500_READ_BURST) & 0x7F; + if (len == RLINK_RX_PACKET_LEN + 1 + 2) //Telemetry frame is 15 bytes + 1 byte for length + 2 bytes for RSSI&LQI&CRC + { + //debug("Telem:"); + CC2500_ReadData(packet_in, len); + if(packet_in[0]==RLINK_RX_PACKET_LEN && (packet_in[len-1] & 0x80) && memcmp(&packet[2],rx_tx_addr,RLINK_TX_ID_LEN)==0 && packet_in[6]==0x03) + {//Correct telemetry received: length, CRC, ID and type + //Debug + //for(uint8_t i=0;i=128) + TX_RSSI -= 128; + else + TX_RSSI += 128; + RX_RSSI=packet_in[7]; //Should be packet_in[7]-256 but since it's an uint8_t... + v_lipo1=packet_in[8]; + v_lipo2=packet_in[9]; + telemetry_link=1; //Send telemetry out + pps_counter++; + packet_count=0; + } + //debugln(""); + } + if (millis() - pps_timer >= 2000) + {//1 packet every 20ms + pps_timer = millis(); + debugln("%d pps", pps_counter); + TX_LQI = pps_counter; //Max=100% + pps_counter = 0; + } + CC2500_SetTxRxMode(TX_EN); + phase=RLINK_DATA; // DATA + return RLINK_TIMING_CHECK; +#endif + } + return 0; +} + +uint16_t initRLINK() +{ + BIND_DONE; // Not a TX bind protocol + RLINK_init(); + RLINK_rf_init(); + packet_count = 0; + phase = RLINK_DATA; + return 10000; +} + +#endif \ No newline at end of file diff --git a/Multiprotocol/Telemetry.ino b/Multiprotocol/Telemetry.ino index d89c7cf..a043609 100644 --- a/Multiprotocol/Telemetry.ino +++ b/Multiprotocol/Telemetry.ino @@ -531,7 +531,7 @@ void frsky_link_frame() telemetry_link |= 2 ; // Send hub if available } else - {//PROTO_HUBSAN, PROTO_AFHDS2A, PROTO_BAYANG, PROTO_NCC1701, PROTO_CABELL, PROTO_HITEC, PROTO_BUGS, PROTO_BUGSMINI, PROTO_FRSKYX, PROTO_FRSKYX2, PROTO_PROPEL, PROTO_DEVO + {//PROTO_HUBSAN, PROTO_AFHDS2A, PROTO_BAYANG, PROTO_NCC1701, PROTO_CABELL, PROTO_HITEC, PROTO_BUGS, PROTO_BUGSMINI, PROTO_FRSKYX, PROTO_FRSKYX2, PROTO_PROPEL, PROTO_DEVO, PROTO_RLINK frame[1] = v_lipo1; frame[2] = v_lipo2; frame[3] = RX_RSSI; @@ -952,7 +952,7 @@ void TelemetryUpdate() #endif if( telemetry_link & 1 ) - { // FrSkyD + Hubsan + AFHDS2A + Bayang + Cabell + Hitec + Bugs + BugsMini + NCC1701 + PROPEL + { // FrSkyD + Hubsan + AFHDS2A + Bayang + Cabell + Hitec + Bugs + BugsMini + NCC1701 + PROPEL + RLINK // FrSkyX telemetry if in PPM frsky_link_frame(); return; diff --git a/Multiprotocol/Validate.h b/Multiprotocol/Validate.h index f74730c..bb3a9d1 100644 --- a/Multiprotocol/Validate.h +++ b/Multiprotocol/Validate.h @@ -243,6 +243,7 @@ #undef HITEC_CC2500_INO #undef HOTT_CC2500_INO #undef REDPINE_CC2500_INO + #undef RLINK_CC2500_INO #undef SCANNER_CC2500_INO #undef SFHSS_CC2500_INO #undef SKYARTEC_CC2500_INO @@ -332,6 +333,7 @@ #undef BAYANG_RX_NRF24L01_INO #undef DEVO_HUB_TELEMETRY #undef PROPEL_HUB_TELEMETRY + #undef RLINK_HUB_TELEMETRY #undef DSM_RX_CYRF6936_INO #else #if defined(MULTI_TELEMETRY) && defined(MULTI_STATUS) @@ -371,6 +373,9 @@ #if not defined(CABELL_NRF24L01_INO) #undef CABELL_HUB_TELEMETRY #endif + #if not defined(RLINK_CC2500_INO) + #undef RLINK_HUB_TELEMETRY + #endif #if not defined(HUBSAN_A7105_INO) #undef HUBSAN_HUB_TELEMETRY #endif @@ -398,7 +403,7 @@ #if not defined(HOTT_CC2500_INO) #undef HOTT_FW_TELEMETRY #endif - #if not defined(HOTT_FW_TELEMETRY) && not defined(DSM_TELEMETRY) && not defined(SPORT_TELEMETRY) && not defined(HUB_TELEMETRY) && not defined(HUBSAN_HUB_TELEMETRY) && not defined(BUGS_HUB_TELEMETRY) && not defined(NCC1701_HUB_TELEMETRY) && not defined(BAYANG_HUB_TELEMETRY) && not defined(CABELL_HUB_TELEMETRY) && not defined(AFHDS2A_HUB_TELEMETRY) && not defined(AFHDS2A_FW_TELEMETRY) && not defined(MULTI_TELEMETRY) && not defined(MULTI_STATUS) && not defined(HITEC_HUB_TELEMETRY) && not defined(HITEC_FW_TELEMETRY) && not defined(SCANNER_TELEMETRY) && not defined(FRSKY_RX_TELEMETRY) && not defined(AFHDS2A_RX_TELEMETRY) && not defined(BAYANG_RX_TELEMETRY) && not defined(DEVO_HUB_TELEMETRY) && not defined(PROPEL_HUB_TELEMETRY) + #if not defined(HOTT_FW_TELEMETRY) && not defined(DSM_TELEMETRY) && not defined(SPORT_TELEMETRY) && not defined(HUB_TELEMETRY) && not defined(HUBSAN_HUB_TELEMETRY) && not defined(BUGS_HUB_TELEMETRY) && not defined(NCC1701_HUB_TELEMETRY) && not defined(BAYANG_HUB_TELEMETRY) && not defined(CABELL_HUB_TELEMETRY) && not defined(RLINK_HUB_TELEMETRY) && not defined(AFHDS2A_HUB_TELEMETRY) && not defined(AFHDS2A_FW_TELEMETRY) && not defined(MULTI_TELEMETRY) && not defined(MULTI_STATUS) && not defined(HITEC_HUB_TELEMETRY) && not defined(HITEC_FW_TELEMETRY) && not defined(SCANNER_TELEMETRY) && not defined(FRSKY_RX_TELEMETRY) && not defined(AFHDS2A_RX_TELEMETRY) && not defined(BAYANG_RX_TELEMETRY) && not defined(DEVO_HUB_TELEMETRY) && not defined(PROPEL_HUB_TELEMETRY) #undef TELEMETRY #undef INVERT_TELEMETRY #undef MULTI_TELEMETRY diff --git a/Multiprotocol/_Config.h b/Multiprotocol/_Config.h index 0cc829d..a118190 100644 --- a/Multiprotocol/_Config.h +++ b/Multiprotocol/_Config.h @@ -197,6 +197,7 @@ #define SFHSS_CC2500_INO #define SKYARTEC_CC2500_INO #define REDPINE_CC2500_INO +#define RLINK_CC2500_INO //The protocols below need a NRF24L01 to be installed #define ASSAN_NRF24L01_INO @@ -313,6 +314,7 @@ #define NCC1701_HUB_TELEMETRY // Use FrSkyD Hub format to send telemetry to TX #define PROPEL_HUB_TELEMETRY // Use FrSkyD Hub format to send telemetry to TX #define CABELL_HUB_TELEMETRY // Use FrSkyD Hub format to send telemetry to TX +#define RLINK_HUB_TELEMETRY // Use FrSkyD Hub format to send telemetry to TX #define HITEC_HUB_TELEMETRY // Use FrSkyD Hub format to send basic telemetry to the radios which can decode it like er9x, erskyTX and OpenTX #define HITEC_FW_TELEMETRY // Forward received telemetry packets to be decoded by erskyTX and OpenTX #define SCANNER_TELEMETRY // Forward spectrum scanner data to TX @@ -699,6 +701,8 @@ const PPM_Parameters PPM_prot[14*NBR_BANKS]= { PROTO_REDPINE RED_FAST RED_SLOW + PROTO_RLINK + NONE PROTO_SCANNER NONE PROTO_SFHSS diff --git a/Protocols_Details.md b/Protocols_Details.md index b22b2a7..9401445 100644 --- a/Protocols_Details.md +++ b/Protocols_Details.md @@ -117,6 +117,7 @@ CFlie|38|CFlie||||||||NRF24L01| [Q2X2](Protocols_Details.md#Q2X2---29)|29|Q222|Q242|Q282||||||NRF24L01| [Q303](Protocols_Details.md#Q303---31)|31|Q303|CX35|CX10D|CX10WD|||||NRF24L01|XN297 [Q90C](Protocols_Details.md#Q90C---72)|72|Q90C*||||||||NRF24L01|XN297 +[RadioLink](Protocols_Details.md#RadioLink---74)|74|Surface||||||||CC2500| [Redpine](Protocols_Details.md#Redpine---50)|50|FAST|SLOW|||||||NRF24L01| [Scanner](Protocols_Details.md#Scanner---54)|54|||||||||CC2500| [SFHSS](Protocols_Details.md#SFHSS---21)|21|SFHSS||||||||CC2500| @@ -545,6 +546,24 @@ You should definitively upgrade your receivers/sensors to the latest firmware ve ## Scanner - *54* 2.4GHz scanner accessible using the OpenTX 2.3 Spectrum Analyser tool. +## RadioLink - *74* + +Extended limits + +Option for this protocol corresponds to fine frequency tuning. This value is different for each Module and **must** be accurate otherwise the link will not be stable. +Check the [Frequency Tuning page](/docs/Frequency_Tuning.md) to determine it. + +CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9|CH10|CH11|CH12|CH13|CH14|CH15|CH16 +---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|--- +CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|FS_CH1|FS_CH2|FS_CH3|FS_CH4|FS_CH5|FS_CH6|FS_CH7|FS_CH8 + +FS=FailSafe + +### Sub_protocol Surface - *0* +Surface protocol. TXs: RC4GS,RC6GS. Compatible RXs:R7FG(Std),R6FG,R6F,R8EF,R8FM,R8F,R4FGM + +CH1=Steering, CH2=Throttle, CH8=Gyro gain + ## SFHSS - *21* Models: Futaba RXs and XK models.