Rename Frsky protocols/Fix for FrskyV

This commit is contained in:
midelic 2016-09-03 14:19:31 +01:00 committed by GitHub
parent 48046158ec
commit caa9e1c12f
7 changed files with 88 additions and 74 deletions

View File

@ -3,20 +3,29 @@
it under the terms of the GNU General Public License as published by it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or the Free Software Foundation, either version 3 of the License, or
(at your option) any later version. (at your option) any later version.
Multiprotocol is distributed in the hope that it will be useful, Multiprotocol is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details. GNU General Public License for more details.
You should have received a copy of the GNU General Public License You should have received a copy of the GNU General Public License
along with Multiprotocol. If not, see <http://www.gnu.org/licenses/>. along with Multiprotocol. If not, see <http://www.gnu.org/licenses/>.
*/ */
#if defined(FRSKY1_CC2500_INO) #if defined(FRSKYV_CC2500_INO)
#define FRSKYV_BIND_COUNT 200
enum {
FRSKYV_DATA1=0,
FRSKYV_DATA2,
FRSKYV_DATA3,
FRSKYV_DATA4,
FRSKYV_DATA5
};
#include "iface_cc2500.h" #include "iface_cc2500.h"
const PROGMEM uint8_t FRSKY1_cc2500_conf[][2]={ const PROGMEM uint8_t FRSKYV_cc2500_conf[][2]={
{ CC2500_17_MCSM1, 0x0c }, { CC2500_17_MCSM1, 0x0c },
{ CC2500_18_MCSM0, 0x18 }, { CC2500_18_MCSM0, 0x18 },
{ CC2500_06_PKTLEN, 0xff }, { CC2500_06_PKTLEN, 0xff },
@ -36,12 +45,12 @@ const PROGMEM uint8_t FRSKY1_cc2500_conf[][2]={
{ CC2500_15_DEVIATN, 0x41 } { CC2500_15_DEVIATN, 0x41 }
}; };
static void __attribute__((unused)) FRSKY1_init() static void __attribute__((unused)) FRSKYV_init()
{ {
for(uint8_t i=0;i<17;i++) for(uint8_t i=0;i<17;i++)
{ {
uint8_t reg=pgm_read_byte_near(&FRSKY1_cc2500_conf[i][0]); uint8_t reg=pgm_read_byte_near(&FRSKYV_cc2500_conf[i][0]);
uint8_t val=pgm_read_byte_near(&FRSKY1_cc2500_conf[i][1]); uint8_t val=pgm_read_byte_near(&FRSKYV_cc2500_conf[i][1]);
if(reg==CC2500_0C_FSCTRL0) if(reg==CC2500_0C_FSCTRL0)
val=option; val=option;
CC2500_WriteReg(reg,val); CC2500_WriteReg(reg,val);
@ -60,33 +69,37 @@ static void __attribute__((unused)) FRSKY1_init()
CC2500_Strobe(CC2500_SIDLE); // Go to idle... CC2500_Strobe(CC2500_SIDLE); // Go to idle...
} }
static uint8_t __attribute__((unused)) FRSKY1_crc8(uint8_t result, uint8_t *data, uint8_t len, uint8_t polynomial) static uint8_t __attribute__((unused)) FRSKYV_crc8(uint8_t result, uint8_t *data, uint8_t len)
{ {
for(uint8_t i = 0; i < len; i++) for(uint8_t i = 0; i < len; i++)
{ {
result = result ^ data[i]; result = result ^ data[i];
for(uint8_t j = 0; j < 8; j++) for(uint8_t j = 0; j < 8; j++)
if(result & 0x80) if(result & 0x80)
result = (result << 1) ^ polynomial; result = (result << 1) ^ 0x07;
else else
result = result << 1; result = result << 1;
} }
return result; return result;
} }
static uint8_t __attribute__((unused)) FRSKY1_crc8_le(uint8_t init, uint8_t *data, uint8_t len) static uint8_t __attribute__((unused)) FRSKYV_crc8_le(uint8_t *data, uint8_t len)
{ {
uint8_t result = 0; uint8_t result = 0xD6;
for(uint8_t i = 0; i < 8; i++) for(uint8_t i = 0; i < len; i++)
{ {
result = (result << 1) | (init & 0x01); result = result ^ data[i];
init >>= 1; for(uint8_t j = 0; j < 8; j++)
if(result & 0x01)
result = (result >> 1) ^ 0x83;
else
result = result >> 1;
} }
return FRSKY1_crc8(result,data,len,0x83); return result;
} }
static void __attribute__((unused)) FRSKY1_build_bind_packet() static void __attribute__((unused)) FRSKYV_build_bind_packet()
{ {
//0e 03 01 57 12 00 06 0b 10 15 1a 00 00 00 61 //0e 03 01 57 12 00 06 0b 10 15 1a 00 00 00 61
packet[0] = 0x0e; //Length packet[0] = 0x0e; //Length
@ -94,7 +107,7 @@ static void __attribute__((unused)) FRSKY1_build_bind_packet()
packet[2] = 0x01; //Packet type packet[2] = 0x01; //Packet type
packet[3] = rx_tx_addr[3]; packet[3] = rx_tx_addr[3];
packet[4] = rx_tx_addr[2]; packet[4] = rx_tx_addr[2];
packet[5] = ((state - FRSKY_BIND) % 10) * 5; packet[5] = (binding_idx % 10) * 5;
packet[6] = packet[5] * 5 + 6; packet[6] = packet[5] * 5 + 6;
packet[7] = packet[5] * 5 + 11; packet[7] = packet[5] * 5 + 11;
packet[8] = packet[5] * 5 + 16; packet[8] = packet[5] * 5 + 16;
@ -103,10 +116,10 @@ static void __attribute__((unused)) FRSKY1_build_bind_packet()
packet[11] = 0x00; packet[11] = 0x00;
packet[12] = 0x00; packet[12] = 0x00;
packet[13] = 0x00; packet[13] = 0x00;
packet[14] = FRSKY1_crc8(0x93, packet, 14, 0x07); packet[14] = FRSKYV_crc8(0x93, packet, 14);
} }
static uint8_t __attribute__((unused)) FRSKY1_calc_channel() static uint8_t __attribute__((unused)) FRSKYV_calc_channel()
{ {
uint32_t temp=seed; uint32_t temp=seed;
temp = (temp * 0xaa) % 0x7673; temp = (temp * 0xaa) % 0x7673;
@ -114,81 +127,80 @@ static uint8_t __attribute__((unused)) FRSKY1_calc_channel()
return (seed & 0xff) % 0x32; return (seed & 0xff) % 0x32;
} }
static void __attribute__((unused)) FRSKY1_build_data_packet() static void __attribute__((unused)) FRSKYV_build_data_packet()
{ {
uint8_t idx = 0; // transmit lower channels
packet[0] = 0x0e; packet[0] = 0x0e;
packet[1] = rx_tx_addr[3]; packet[1] = rx_tx_addr[3];
packet[2] = rx_tx_addr[2]; packet[2] = rx_tx_addr[2];
packet[3] = seed & 0xff; packet[3] = seed & 0xff;
packet[4] = seed >> 8; packet[4] = seed >> 8;
if (state == FRSKY_DATA1 || state == FRSKY_DATA3) if (phase == FRSKYV_DATA1 || phase == FRSKYV_DATA3)
packet[5] = 0x0f; packet[5] = 0x0f;
else else
if(state == FRSKY_DATA2 || state == FRSKY_DATA4) if(phase == FRSKYV_DATA2 || phase == FRSKYV_DATA4)
{
packet[5] = 0xf0; packet[5] = 0xf0;
idx=4; // transmit upper channels
}
else else
packet[5] = 0x00; packet[5] = 0x00;
uint8_t idx = 0; //= (state == FRSKY_DATA1) ? 4 : 0;
for(uint8_t i = 0; i < 4; i++) for(uint8_t i = 0; i < 4; i++)
{ {
uint16_t value = convert_channel_frsky(i+idx); uint16_t value = convert_channel_frsky(i+idx);
packet[2*i + 6] = value & 0xff; packet[2*i + 6] = value & 0xff;
packet[2*i + 7] = value >> 8; packet[2*i + 7] = value >> 8;
} }
packet[14] = FRSKY1_crc8(crc8, packet, 14, 0x07); packet[14] = FRSKYV_crc8(crc8, packet, 14);
} }
static uint16_t ReadFRSKY1() uint16_t ReadFRSKYV()
{ {
if (state < FRSKY_BIND_DONE) if(IS_BIND_DONE_on)
{ { // Normal operation
FRSKY1_build_bind_packet(); uint8_t chan = FRSKYV_calc_channel();
CC2500_Strobe(CC2500_SIDLE);
CC2500_WriteReg(CC2500_0A_CHANNR, 0x00);
CC2500_WriteData(packet, packet[0]+1);
state++;
return 53460;
}
if (state == FRSKY_BIND_DONE)
{
state++;
BIND_DONE;
}
if (state >= FRSKY_DATA1)
{
CC2500_Strobe(CC2500_SIDLE); CC2500_Strobe(CC2500_SIDLE);
if (option != prev_option) if (option != prev_option)
{ {
CC2500_WriteReg(CC2500_0C_FSCTRL0, option); CC2500_WriteReg(CC2500_0C_FSCTRL0, option);
prev_option=option; prev_option=option;
} }
uint8_t chan = FRSKY1_calc_channel();
CC2500_WriteReg(CC2500_0A_CHANNR, chan * 5 + 6); CC2500_WriteReg(CC2500_0A_CHANNR, chan * 5 + 6);
FRSKY1_build_data_packet(); FRSKYV_build_data_packet();
CC2500_WriteData(packet, packet[0]+1); if (phase == FRSKYV_DATA5)
if (state == FRSKY_DATA5)
{ {
CC2500_SetPower(); CC2500_SetPower();
state = FRSKY_DATA1; phase = FRSKYV_DATA1;
} }
else else
state++; phase++;
CC2500_WriteData(packet, packet[0]+1);
return 9006; return 9006;
} }
return 0; // Bind mode
FRSKYV_build_bind_packet();
CC2500_Strobe(CC2500_SIDLE);
CC2500_WriteReg(CC2500_0A_CHANNR, 0x00);
CC2500_WriteData(packet, packet[0]+1);
binding_idx++;
if(binding_idx>=FRSKYV_BIND_COUNT)
BIND_DONE;
return 53460;
} }
uint16_t initFRSKY1() uint16_t initFRSKYV()
{ {
//u8 data[2] = {(fixed_id >> 8) & 0xff, fixed_id & 0xff}; //ID is 15 bits. Using rx_tx_addr[2] and rx_tx_addr[3] since we want to use RX_Num for model match
crc8 = FRSKY1_crc8_le(0x6b, rx_tx_addr+2, 2); // Use rx_tx_addr[2] and rx_tx_addr[3] since we want to use RX_Num rx_tx_addr[2]&=0x7F;
FRSKY1_init(); crc8 = FRSKYV_crc8_le(rx_tx_addr+2, 2);
FRSKYV_init();
seed = 1; seed = 1;
if(IS_AUTOBIND_FLAG_on) binding_idx=0;
state = FRSKY_BIND; phase = FRSKYV_DATA1;
else
state = FRSKY_DATA1;
return 10000; return 10000;
} }

View File

@ -31,7 +31,7 @@ enum PROTOCOLS
MODE_SERIAL = 0, // Serial commands MODE_SERIAL = 0, // Serial commands
MODE_FLYSKY = 1, // =>A7105 MODE_FLYSKY = 1, // =>A7105
MODE_HUBSAN = 2, // =>A7105 MODE_HUBSAN = 2, // =>A7105
MODE_FRSKY = 3, // =>CC2500 MODE_FRSKYD = 3, // =>CC2500
MODE_HISKY = 4, // =>NRF24L01 MODE_HISKY = 4, // =>NRF24L01
MODE_V2X2 = 5, // =>NRF24L01 MODE_V2X2 = 5, // =>NRF24L01
MODE_DSM2 = 6, // =>CYRF6936 MODE_DSM2 = 6, // =>CYRF6936
@ -53,7 +53,7 @@ enum PROTOCOLS
MODE_J6PRO = 22, // =>CYRF6936 MODE_J6PRO = 22, // =>CYRF6936
MODE_FQ777 = 23, // =>NRF24L01 MODE_FQ777 = 23, // =>NRF24L01
MODE_ASSAN = 24, // =>NRF24L01 MODE_ASSAN = 24, // =>NRF24L01
MODE_FRSKY1 = 25 // =>CC2500 MODE_FRSKYV = 25 // =>CC2500
}; };
enum Flysky enum Flysky

View File

@ -444,7 +444,7 @@ void Update_All()
update_led_status(); update_led_status();
#if defined(TELEMETRY) #if defined(TELEMETRY)
uint8_t protocol=cur_protocol[0]&0x1F; uint8_t protocol=cur_protocol[0]&0x1F;
if( (protocol==MODE_FRSKY) || (protocol==MODE_HUBSAN) || (protocol==MODE_FRSKYX) || (protocol==MODE_DSM2) ) if( (protocol==MODE_FRSKYD) || (protocol==MODE_HUBSAN) || (protocol==MODE_FRSKYX) || (protocol==MODE_DSM2) )
TelemetryUpdate(); TelemetryUpdate();
#endif #endif
} }
@ -583,7 +583,7 @@ static void protocol_init()
break; break;
#endif #endif
#if defined(FRSKY_CC2500_INO) #if defined(FRSKY_CC2500_INO)
case MODE_FRSKY: case MODE_FRSKYD:
CTRL1_off; //antenna RF2 CTRL1_off; //antenna RF2
CTRL2_on; CTRL2_on;
next_callback = initFrSky_2way(); next_callback = initFrSky_2way();
@ -591,11 +591,11 @@ static void protocol_init()
break; break;
#endif #endif
#if defined(FRSKY1_CC2500_INO) #if defined(FRSKY1_CC2500_INO)
case MODE_FRSKY1: case MODE_FRSKYV:
CTRL1_off; //antenna RF2 CTRL1_off; //antenna RF2
CTRL2_on; CTRL2_on;
next_callback = initFRSKY1(); next_callback = initFRSKYV();
remote_callback = ReadFRSKY1; remote_callback = ReadFRSKYV;
break; break;
#endif #endif
#if defined(FRSKYX_CC2500_INO) #if defined(FRSKYX_CC2500_INO)

View File

@ -22,7 +22,7 @@ enum PROTOCOLS
MODE_SERIAL = 0, // Serial commands MODE_SERIAL = 0, // Serial commands
MODE_FLYSKY = 1, // =>A7105 MODE_FLYSKY = 1, // =>A7105
MODE_HUBSAN = 2, // =>A7105 MODE_HUBSAN = 2, // =>A7105
MODE_FRSKY = 3, // =>CC2500 MODE_FRSKYD = 3, // =>CC2500
MODE_HISKY = 4, // =>NRF24L01 MODE_HISKY = 4, // =>NRF24L01
MODE_V2X2 = 5, // =>NRF24L01 MODE_V2X2 = 5, // =>NRF24L01
MODE_DSM2 = 6, // =>CYRF6936 MODE_DSM2 = 6, // =>CYRF6936
@ -44,7 +44,7 @@ enum PROTOCOLS
MODE_J6PRO=22, // =>CYRF6936 MODE_J6PRO=22, // =>CYRF6936
MODE_FQ777=23, // =>NRF24L01 MODE_FQ777=23, // =>NRF24L01
MODE_ASSAN=24, // =>NRF24L01 MODE_ASSAN=24, // =>NRF24L01
MODE_FRSKY1 = 25 // =>CC2500 MODE_FRSKYV = 25 // =>CC2500
}; };
enum Flysky enum Flysky
@ -145,6 +145,8 @@ struct PPM_Parameters
#define OCR1A TIMER2_BASE->CCR1 #define OCR1A TIMER2_BASE->CCR1
#define TCNT1 TIMER2_BASE->CNT #define TCNT1 TIMER2_BASE->CNT
#define UDR0 USART2_BASE->DR #define UDR0 USART2_BASE->DR
#define TIFR1 TIMER2_BASE->SR
#define OCF1A_bm TIMER_SR_CC1IF
#define UCSR0B USART2_BASE->CR1 #define UCSR0B USART2_BASE->CR1
#define RXCIE0 USART_CR1_RXNEIE_BIT #define RXCIE0 USART_CR1_RXNEIE_BIT
#define TXCIE0 USART_CR1_TXEIE_BIT #define TXCIE0 USART_CR1_TXEIE_BIT

View File

@ -22,7 +22,7 @@ enum PROTOCOLS
MODE_SERIAL = 0, // Serial commands MODE_SERIAL = 0, // Serial commands
MODE_FLYSKY = 1, // =>A7105 MODE_FLYSKY = 1, // =>A7105
MODE_HUBSAN = 2, // =>A7105 MODE_HUBSAN = 2, // =>A7105
MODE_FRSKY = 3, // =>CC2500 MODE_FRSKYD = 3, // =>CC2500
MODE_HISKY = 4, // =>NRF24L01 MODE_HISKY = 4, // =>NRF24L01
MODE_V2X2 = 5, // =>NRF24L01 MODE_V2X2 = 5, // =>NRF24L01
MODE_DSM2 = 6, // =>CYRF6936 MODE_DSM2 = 6, // =>CYRF6936
@ -44,7 +44,7 @@ enum PROTOCOLS
MODE_J6PRO=22, // =>CYRF6936 MODE_J6PRO=22, // =>CYRF6936
MODE_FQ777=23, // =>NRF24L01 MODE_FQ777=23, // =>NRF24L01
MODE_ASSAN=24, // =>NRF24L01 MODE_ASSAN=24, // =>NRF24L01
MODE_FRSKY1 = 25 // =>CC2500 MODE_FRSKYV = 25 // =>CC2500
}; };

View File

@ -111,7 +111,7 @@ void frsky_check_telemetry(uint8_t *pkt,uint8_t len)
void frsky_link_frame() void frsky_link_frame()
{ {
frame[0] = 0xFE; frame[0] = 0xFE;
if ((cur_protocol[0]&0x1F)==MODE_FRSKY) if ((cur_protocol[0]&0x1F)==MODE_FRSKYD)
{ {
compute_RSSIdbm(); compute_RSSIdbm();
frame[1] = pktt[3]; frame[1] = pktt[3];
@ -452,7 +452,7 @@ void TelemetryUpdate()
return; return;
} }
#if defined HUB_TELEMETRY #if defined HUB_TELEMETRY
if(!telemetry_link && (cur_protocol[0]&0x1F) == MODE_FRSKY) if(!telemetry_link && (cur_protocol[0]&0x1F) == MODE_FRSKYD)
{ // FrSky { // FrSky
frsky_user_frame(); frsky_user_frame();
return; return;

View File

@ -20,7 +20,7 @@
//#define XMEGA //#define XMEGA
/*******************/ /*******************/
#ifdef STM32_board #ifdef STM32_board
//#undef __cplusplus #undef __cplusplus
#include "Multiprotocol_STM32.h" #include "Multiprotocol_STM32.h"
#include <EEPROM.h> #include <EEPROM.h>
#include <libmaple/usart.h> #include <libmaple/usart.h>
@ -59,8 +59,8 @@
#define J6PRO_CYRF6936_INO #define J6PRO_CYRF6936_INO
#endif #endif
#ifdef CC2500_INSTALLED #ifdef CC2500_INSTALLED
#define FRSKY_CC2500_INO #define FRSKYD_CC2500_INO
#define FRSKY1_CC2500_INO #define FRSKYV_CC2500_INO
#define FRSKYX_CC2500_INO #define FRSKYX_CC2500_INO
#define SFHSS_CC2500_INO #define SFHSS_CC2500_INO
#endif #endif
@ -97,7 +97,7 @@
#if defined FRSKYX_CC2500_INO #if defined FRSKYX_CC2500_INO
#define SPORT_TELEMETRY #define SPORT_TELEMETRY
#endif #endif
#if defined FRSKY_CC2500_INO #if defined FRSKYD_CC2500_INO
#define HUB_TELEMETRY #define HUB_TELEMETRY
#endif #endif
#endif #endif
@ -160,7 +160,7 @@ const PPM_Parameters PPM_prot[15]= {
// Dial Protocol Sub protocol RX_Num Power Auto Bind Option // Dial Protocol Sub protocol RX_Num Power Auto Bind Option
/* 1 */ {MODE_FLYSKY, Flysky , 0 , P_HIGH , NO_AUTOBIND , 0 }, /* 1 */ {MODE_FLYSKY, Flysky , 0 , P_HIGH , NO_AUTOBIND , 0 },
/* 2 */ {MODE_HUBSAN, 0 , 0 , P_HIGH , NO_AUTOBIND , 0 }, /* 2 */ {MODE_HUBSAN, 0 , 0 , P_HIGH , NO_AUTOBIND , 0 },
/* 3 */ {MODE_FRSKY , 0 , 0 , P_HIGH , NO_AUTOBIND , 40 }, // D7 fine tuning /* 3 */ {MODE_FRSKYD, 0 , 0 , P_HIGH , NO_AUTOBIND , 40 }, // D7 fine tuning
/* 4 */ {MODE_HISKY , Hisky , 0 , P_HIGH , NO_AUTOBIND , 0 }, /* 4 */ {MODE_HISKY , Hisky , 0 , P_HIGH , NO_AUTOBIND , 0 },
/* 5 */ {MODE_V2X2 , 0 , 0 , P_HIGH , NO_AUTOBIND , 0 }, /* 5 */ {MODE_V2X2 , 0 , 0 , P_HIGH , NO_AUTOBIND , 0 },
/* 6 */ {MODE_DSM2 , DSM2 , 0 , P_HIGH , NO_AUTOBIND , 6 }, // 6 channels @ 11ms /* 6 */ {MODE_DSM2 , DSM2 , 0 , P_HIGH , NO_AUTOBIND , 6 }, // 6 channels @ 11ms