diff --git a/Lua_scripts/MultiChan.txt b/Lua_scripts/MultiChan.txt
index cc638ba..6764ffa 100644
--- a/Lua_scripts/MultiChan.txt
+++ b/Lua_scripts/MultiChan.txt
@@ -191,6 +191,7 @@
62,0,XK,X450,1,FMode,TakeOf,Emerg,3D_6G,Pict,Video
62,1,XK,X420,1,FMode,TakeOf,Emerg,3D_6G,Pict,Video,Flip,Light
62,2,XK,Cars,0,FMode,TakeOf,Emerg,3D_6G,Pict,Video,Flip,Light
+99,0,XK2,X4,0,Rate,Mode,Hover
8,0,YD717,Std,1,Flip,Light,Pict,Video,HLess
8,1,YD717,SkyWlkr,1,Flip,Light,Pict,Video,HLess
8,2,YD717,Simax4,1,Flip,Light,Pict,Video,HLess
diff --git a/Multiprotocol/Multi.txt b/Multiprotocol/Multi.txt
index 5c8ccd3..e28ef65 100644
--- a/Multiprotocol/Multi.txt
+++ b/Multiprotocol/Multi.txt
@@ -94,4 +94,5 @@
95,BlueFly
96,BumbleB
97,SGF22
-98,Kyosho3
\ No newline at end of file
+98,Kyosho3
+99,XK2
\ No newline at end of file
diff --git a/Multiprotocol/Multi_Protos.ino b/Multiprotocol/Multi_Protos.ino
index 27367df..fecf26f 100644
--- a/Multiprotocol/Multi_Protos.ino
+++ b/Multiprotocol/Multi_Protos.ino
@@ -82,6 +82,7 @@ const char STR_FX[] ="FX";
const char STR_BAYANG_RX[] ="BayanRX";
const char STR_PELIKAN[] ="Pelikan";
const char STR_XK[] ="XK";
+const char STR_XK2[] ="XK2";
const char STR_XN297DUMP[] ="XN297DP";
const char STR_FRSKYR9[] ="FrSkyR9";
const char STR_PROPEL[] ="Propel";
@@ -495,6 +496,9 @@ const mm_protocol_definition multi_protocols[] = {
#if defined(XK_CCNRF_INO)
{PROTO_XK, STR_XK, STR_SUBTYPE_XK, 3, OPTION_RFTUNE, 0, 0, SW_NRF, XK_init, XK_callback },
#endif
+ #if defined(XK2_CCNRF_INO)
+ {PROTO_XK2, STR_XK2, NO_SUBTYPE, 0, OPTION_RFTUNE, 0, 0, SW_NRF, XK2_init, XK2_callback },
+ #endif
#if defined(XN297DUMP_NRF24L01_INO)
{PROTO_XN297DUMP, STR_XN297DUMP, STR_SUBTYPE_XN297DUMP, 6, OPTION_RFCHAN, 0, 0, SW_NRF, XN297Dump_init, XN297Dump_callback },
#endif
diff --git a/Multiprotocol/Multiprotocol.h b/Multiprotocol/Multiprotocol.h
index dc302b7..3d41013 100644
--- a/Multiprotocol/Multiprotocol.h
+++ b/Multiprotocol/Multiprotocol.h
@@ -19,7 +19,7 @@
#define VERSION_MAJOR 1
#define VERSION_MINOR 3
#define VERSION_REVISION 4
-#define VERSION_PATCH_LEVEL 9
+#define VERSION_PATCH_LEVEL 10
#define MODE_SERIAL 0
@@ -126,7 +126,7 @@ enum PROTOCOLS
PROTO_BUMBLEB = 96, // =>CC2500 & NRF24L01
PROTO_SGF22 = 97, // =>NRF24L01
PROTO_KYOSHO3 = 98, // =>CYRF6936
-
+ PROTO_XK2 = 99, // =>CC2500 & NRF24L01
PROTO_NANORF = 126, // =>NRF24L01
PROTO_TEST = 127, // =>CC2500
diff --git a/Multiprotocol/Validate.h b/Multiprotocol/Validate.h
index beffa13..0e29d1d 100644
--- a/Multiprotocol/Validate.h
+++ b/Multiprotocol/Validate.h
@@ -354,6 +354,7 @@
#undef SLT_CCNRF_INO
#undef V911S_CCNRF_INO
#undef XK_CCNRF_INO
+ #undef XK2_CCNRF_INO
#endif
#if not defined(DSM_CYRF6936_INO)
#undef LOSI_CYRF6936_INO
diff --git a/Multiprotocol/XK2_ccnrf.ino b/Multiprotocol/XK2_ccnrf.ino
new file mode 100644
index 0000000..99492f6
--- /dev/null
+++ b/Multiprotocol/XK2_ccnrf.ino
@@ -0,0 +1,201 @@
+/*
+ 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 .
+ */
+// Compatible with XK TX X4 and model A160S.
+
+#if defined(XK2_CCNRF_INO)
+
+#include "iface_xn297.h"
+
+#define FORCE_XK2_ID
+
+#define XK2_RF_BIND_CHANNEL 71
+#define XK2_PAYLOAD_SIZE 9
+#define XK2_PACKET_PERIOD 4911
+#define XK2_RF_NUM_CHANNELS 4
+
+enum {
+ XK2_BIND1,
+ XK2_BIND2,
+ XK2_DATA_PREP,
+ XK2_DATA
+};
+
+static void __attribute__((unused)) XK2_send_packet()
+{
+ static uint8_t trim_ch=0;
+
+ if(IS_BIND_IN_PROGRESS)
+ {
+ packet[0] = 0x9D;
+ //TXID
+ memcpy(&packet[1], rx_tx_addr, 3);
+ //RXID
+ //memcpy(&packet[4], rx_id , 3);
+ //Unknown
+ packet[7] = 0x00;
+ //Checksum seed
+ packet[8] = 0xC0; //Constant?
+ }
+ else
+ {
+ XN297_Hopping(hopping_frequency_no);
+ hopping_frequency_no++;
+ hopping_frequency_no &= 0x03;
+ //Channels
+ packet[0] = convert_channel_16b_limit(AILERON ,0x00,0x64); //Aileron
+ packet[1] = convert_channel_16b_limit(ELEVATOR,0x00,0x64); //Elevator
+ packet[2] = convert_channel_16b_limit(THROTTLE,0x00,0x64); //Throttle
+ packet[3] = convert_channel_16b_limit(RUDDER ,0x00,0x64); //Rudder
+ //Center the trims
+ trim_ch++;
+ if(trim_ch > 2) trim_ch = 0;
+ packet[4] = 0x20 + 0x40 * trim_ch; //Trims are A=01..20..3F/E=41..60..7F/R=81..A0..BF, E0 appears when telemetry is received, C1 when p[6] changes from 00->08, C0 when p[6] changes from 08->00
+ if(trim_ch == 2) //Drive rudder trim since otherwise there is no control...
+ {
+ packet[4] = 0x80 + (convert_channel_8b(RUDDER)>>2);
+ if(packet[4] <= 0x81) packet[4] = 0x81;
+ }
+ //Flags
+ packet[5] = GET_FLAG(CH5_SW, 0x01) //Rate
+ | GET_FLAG(CH6_SW, 0x08) //Mode
+ | GET_FLAG(CH7_SW, 0x20); //Hover
+ //Telemetry not received=00, Telemetry received=01 but sometimes switch to 1 even if telemetry is not there...
+ packet[6] = 0x00;
+ //Unknown
+ packet[7] = 0x5A; //Constant?
+ //Checksum seed
+ packet[8] = 0x7F; //Constant?
+ }
+ //Checksum
+ for(uint8_t i=0; i