mirror of
				https://github.com/pascallanger/DIY-Multiprotocol-TX-Module.git
				synced 2025-10-31 11:21:06 +00:00 
			
		
		
		
	New Redpine protocol
Protocol Redpine: 50 Sub protocol: Fast=0, Slow=1 Option=freq tunning
This commit is contained in:
		
							parent
							
								
									9d50171034
								
							
						
					
					
						commit
						d940a7e49a
					
				| @ -47,4 +47,5 @@ | ||||
| 47,GD00X,GD_V1,GD_V2 | ||||
| 48,V761 | ||||
| 49,KF606 | ||||
| 50,REDPINE,FAST,SLOW | ||||
| 63,XN_DUMP,250K,1M,2M | ||||
|  | ||||
| @ -19,7 +19,7 @@ | ||||
| #define VERSION_MAJOR		1 | ||||
| #define VERSION_MINOR		2 | ||||
| #define VERSION_REVISION	1 | ||||
| #define VERSION_PATCH_LEVEL	61 | ||||
| #define VERSION_PATCH_LEVEL	62 | ||||
| 
 | ||||
| //******************
 | ||||
| // Protocols
 | ||||
| @ -76,6 +76,7 @@ enum PROTOCOLS | ||||
| 	PROTO_GD00X		= 47,	// =>NRF24L01
 | ||||
| 	PROTO_V761		= 48,	// =>NRF24L01
 | ||||
| 	PROTO_KF606		= 49,	// =>NRF24L01
 | ||||
| 	PROTO_REDPINE	= 50,	// =>CC2500
 | ||||
| 	PROTO_XN297DUMP	= 63,	// =>NRF24L01
 | ||||
| }; | ||||
| 
 | ||||
| @ -270,6 +271,11 @@ enum BUGSMINI | ||||
| 	BUGSMINI= 0, | ||||
| 	BUGS3H	= 1, | ||||
| }; | ||||
| enum REDPINE | ||||
| { | ||||
| 	RED_FAST= 0, | ||||
| 	RED_SLOW= 1, | ||||
| }; | ||||
| #define NONE 		0 | ||||
| #define P_HIGH		1 | ||||
| #define P_LOW		0 | ||||
| @ -613,6 +619,7 @@ Serial: 100000 Baud 8e2      _ xxxx xxxx p -- | ||||
| 					GD00X		47 | ||||
| 					V761		48 | ||||
| 					KF606		49 | ||||
| 					REDPINE		50 | ||||
|    BindBit=>		0x80	1=Bind/0=No | ||||
|    AutoBindBit=>	0x40	1=Yes /0=No | ||||
|    RangeCheck=>		0x20	1=Yes /0=No | ||||
| @ -749,6 +756,9 @@ Serial: 100000 Baud 8e2      _ xxxx xxxx p -- | ||||
| 		sub_protocol==GD00X | ||||
| 			GD_V1		0 | ||||
| 			GD_V2		1 | ||||
| 		sub_protocol==REDPINE | ||||
| 			RED_FAST	0 | ||||
| 			RED_SLOW	1 | ||||
| 
 | ||||
|    Power value => 0x80	0=High/1=Low | ||||
|   Stream[3]   = option_protocol; | ||||
|  | ||||
| @ -113,7 +113,7 @@ uint8_t  len; | ||||
| uint8_t  armed, arm_flags, arm_channel_previous; | ||||
| 
 | ||||
| #ifdef CC2500_INSTALLED | ||||
| 	uint8_t calData[48]; | ||||
| 	uint8_t calData[50]; | ||||
| #endif | ||||
| 
 | ||||
| #ifdef CHECK_FOR_BOOTLOADER | ||||
| @ -442,6 +442,11 @@ void setup() | ||||
| 				option			=	FORCE_CORONA_TUNING;		// Use config-defined tuning value for CORONA
 | ||||
| 			else | ||||
| 		#endif | ||||
| 		#if defined(FORCE_REDPINE_TUNING) && defined(REDPINE_CC2500_INO) | ||||
| 			if (protocol==PROTO_REDPINE) | ||||
| 				option			=	FORCE_REDPINE_TUNING;		// Use config-defined tuning value for REDPINE
 | ||||
| 			else | ||||
| 		#endif | ||||
| 		#if defined(FORCE_HITEC_TUNING) && defined(HITEC_CC2500_INO) | ||||
| 			if (protocol==PROTO_HITEC) | ||||
| 				option			=	FORCE_HITEC_TUNING;		// Use config-defined tuning value for HITEC
 | ||||
| @ -969,6 +974,14 @@ static void protocol_init() | ||||
| 						remote_callback = ReadCORONA; | ||||
| 						break; | ||||
| 				#endif | ||||
| 				#if defined(REDPINE_CC2500_INO) | ||||
| 					case PROTO_REDPINE: | ||||
| 						PE1_off;	//antenna RF2
 | ||||
| 						PE2_on; | ||||
| 						next_callback = initREDPINE(); | ||||
| 						remote_callback = ReadREDPINE; | ||||
| 						break; | ||||
| 				#endif | ||||
| 				#if defined(HITEC_CC2500_INO) | ||||
| 					case PROTO_HITEC: | ||||
| 						PE1_off;	//antenna RF2
 | ||||
| @ -1321,6 +1334,11 @@ void update_serial_data() | ||||
| 			option=FORCE_CORONA_TUNING;	// Use config-defined tuning value for CORONA
 | ||||
| 		else | ||||
| 	#endif | ||||
| 	#if defined(FORCE_REDPINE_TUNING) && defined(REDPINE_CC2500_INO) | ||||
| 		if (protocol==PROTO_REDPINE) | ||||
| 			option=FORCE_REDPINE_TUNING;	// Use config-defined tuning value for REDPINE
 | ||||
| 		else | ||||
| 	#endif | ||||
| 	#if defined(FORCE_HITEC_TUNING) && defined(HITEC_CC2500_INO) | ||||
| 		if (protocol==PROTO_HITEC) | ||||
| 			option=FORCE_HITEC_TUNING;	// Use config-defined tuning value for HITEC
 | ||||
|  | ||||
							
								
								
									
										242
									
								
								Multiprotocol/Redpine_cc2500.ino
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										242
									
								
								Multiprotocol/Redpine_cc2500.ino
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,242 @@ | ||||
| /*
 | ||||
|  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 <http://www.gnu.org/licenses/>.
 | ||||
|  */ | ||||
| 
 | ||||
| #if defined(REDPINE_CC2500_INO) | ||||
| 
 | ||||
| #include "iface_cc2500.h" | ||||
| 
 | ||||
| #define REDPINE_LOOPTIME_FAST 9		//9ms
 | ||||
| #define REDPINE_LOOPTIME_SLOW 22	//22ms
 | ||||
| 
 | ||||
| #define REDPINE_BIND 1000 | ||||
| #define REDPINE_PACKET_SIZE 11 | ||||
| #define REDPINE_FEC false  // from cc2500 datasheet: The convolutional coder is a rate 1/2 code with a constraint length of m=4
 | ||||
| #define REDPINE_NUM_HOPS 50 | ||||
| 
 | ||||
| static void REDPINE_set_channel(uint8_t ch) | ||||
| { | ||||
|     CC2500_Strobe(CC2500_SIDLE); | ||||
|     CC2500_WriteReg(CC2500_25_FSCAL1, calData[ch]); | ||||
|     CC2500_WriteReg(CC2500_0A_CHANNR, hopping_frequency[ch]); | ||||
| } | ||||
| 
 | ||||
| static void REDPINE_build_bind_packet() | ||||
| { | ||||
|     memset(&packet[0], 0, REDPINE_PACKET_SIZE); | ||||
| 
 | ||||
|     packet[0] = REDPINE_PACKET_SIZE - 1; | ||||
|     packet[1] = 0x03; | ||||
|     packet[2] = 0x01; | ||||
|     packet[3] = rx_tx_addr[2]; | ||||
|     packet[4] = rx_tx_addr[3];	// Use RX_Num
 | ||||
|     uint16_t idx = ((REDPINE_BIND - bind_counter) % 10) * 5; | ||||
|     packet[5] = idx; | ||||
|     packet[6] = hopping_frequency[idx++]; | ||||
|     packet[7] = hopping_frequency[idx++]; | ||||
|     packet[8] = hopping_frequency[idx++]; | ||||
|     packet[9] = hopping_frequency[idx++]; | ||||
|     packet[10] = hopping_frequency[idx++]; | ||||
|     // packet[11] = 0x02;
 | ||||
|     // packet[12] = RXNUM;
 | ||||
| } | ||||
| 
 | ||||
| static uint16_t Redpine_Scale(uint8_t chan) | ||||
| { | ||||
|     uint16_t chan_val=Channel_data[chan];	// -125%..+125% <=> 0..2047
 | ||||
| 	if (chan_val > 2046)   chan_val = 2046; | ||||
|     else if (chan_val < 10) chan_val = 10; | ||||
|     return chan_val; | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| static void REDPINE_data_frame() { | ||||
|     uint16_t chan[4]; | ||||
| 
 | ||||
|     memset(&packet[0], 0, REDPINE_PACKET_SIZE); | ||||
| 
 | ||||
|     packet[0] = REDPINE_PACKET_SIZE - 1; | ||||
|     packet[1] = rx_tx_addr[2]; | ||||
|     packet[2] = rx_tx_addr[3];	// Use RX_Num
 | ||||
| 
 | ||||
|     chan[0] = Redpine_Scale(0); | ||||
|     chan[1] = Redpine_Scale(1); | ||||
|     chan[2] = Redpine_Scale(2); | ||||
|     chan[3] = Redpine_Scale(3); | ||||
| 
 | ||||
|     packet[3] = chan[0]; | ||||
|     packet[4] = (((chan[0] >> 8) & 0x07) | (chan[1] << 4)) | GET_FLAG(CH5_SW, 0x08); | ||||
|     packet[5] = ((chan[1] >> 4) & 0x7F) | GET_FLAG(CH6_SW, 0x80); | ||||
|     packet[6] = chan[2]; | ||||
|     packet[7] = (((chan[2] >> 8) & 0x07) | (chan[3] << 4))  | GET_FLAG(CH7_SW, 0x08); | ||||
|     packet[8] = ((chan[3] >> 4) & 0x7F) | GET_FLAG(CH8_SW, 0x80); | ||||
|     packet[9] = GET_FLAG(CH9_SW, 0x01) | ||||
|             | GET_FLAG(CH10_SW, 0x02) | ||||
|             | GET_FLAG(CH11_SW, 0x04) | ||||
|             | GET_FLAG(CH12_SW, 0x08) | ||||
|             | GET_FLAG(CH13_SW, 0x10) | ||||
|             | GET_FLAG(CH14_SW, 0x20) | ||||
|             | GET_FLAG(CH15_SW, 0x40) | ||||
|             | GET_FLAG(CH16_SW, 0x80); | ||||
| 
 | ||||
|     if (sub_protocol==0) | ||||
|         packet[10] = REDPINE_LOOPTIME_FAST; | ||||
|     else | ||||
|         packet[10] = REDPINE_LOOPTIME_SLOW; | ||||
| } | ||||
| 
 | ||||
| static uint16_t ReadREDPINE() | ||||
| { | ||||
| 	if ( prev_option != option ) | ||||
| 	{ // Frequency adjust
 | ||||
| 		CC2500_WriteReg(CC2500_0C_FSCTRL0, option); | ||||
| 		prev_option = option ; | ||||
| 	} | ||||
| 	if(IS_BIND_IN_PROGRESS) | ||||
| 	{ | ||||
| 		if(bind_counter== REDPINE_BIND) | ||||
| 			REDPINE_init(0); | ||||
| 		if(state == REDPINE_BIND/2) | ||||
| 			REDPINE_init(1); | ||||
| 		REDPINE_set_channel(49); | ||||
| 		CC2500_SetPower(); | ||||
| 		CC2500_Strobe(CC2500_SFRX); | ||||
| 		REDPINE_build_bind_packet(); | ||||
| 		CC2500_Strobe(CC2500_SIDLE); | ||||
| 		CC2500_WriteData(packet, REDPINE_PACKET_SIZE); | ||||
| 		if(--bind_counter==0) | ||||
| 		{ | ||||
| 			BIND_DONE; | ||||
| 			REDPINE_init(sub_protocol); | ||||
| 		} | ||||
| 		return 9000; | ||||
| 	} | ||||
| 	else | ||||
| 	{ | ||||
| 		CC2500_SetTxRxMode(TX_EN); | ||||
| 		REDPINE_set_channel(hopping_frequency_no); | ||||
| 		CC2500_SetPower(); | ||||
| 		CC2500_Strobe(CC2500_SFRX); | ||||
| 		REDPINE_data_frame(); | ||||
| 		CC2500_Strobe(CC2500_SIDLE); | ||||
| 		hopping_frequency_no = (hopping_frequency_no + 1) % 49; | ||||
| 		CC2500_WriteData(packet, REDPINE_PACKET_SIZE); | ||||
| 		if (sub_protocol==0) | ||||
| 			return REDPINE_LOOPTIME_FAST*100; | ||||
| 		else | ||||
| 			return REDPINE_LOOPTIME_SLOW*100; | ||||
| 	} | ||||
| 	return 1; | ||||
| } | ||||
| 
 | ||||
| // register, fast 250k, slow
 | ||||
| static const uint8_t REDPINE_init_data[][3] = { | ||||
|     {CC2500_00_IOCFG2,    0x06, 0x06}, | ||||
|     {CC2500_02_IOCFG0,    0x06, 0x06}, | ||||
|     {CC2500_03_FIFOTHR,   0x07, 0x07}, | ||||
|     {CC2500_07_PKTCTRL1,  0x04, 0x04}, | ||||
|     {CC2500_08_PKTCTRL0,  0x05, 0x05}, | ||||
|     {CC2500_09_ADDR,      0x00, 0x00}, | ||||
|     {CC2500_0B_FSCTRL1,   0x0A, 0x0A}, | ||||
|     {CC2500_0C_FSCTRL0,   0x00, 0x00}, | ||||
|     {CC2500_0D_FREQ2,     0x5D, 0x5c}, | ||||
|     {CC2500_0E_FREQ1,     0x93, 0x76}, | ||||
|     {CC2500_0F_FREQ0,     0xB1, 0x27}, | ||||
|     {CC2500_10_MDMCFG4,   0x2D, 0x7B}, | ||||
|     {CC2500_11_MDMCFG3,   0x3B, 0x61}, | ||||
|     {CC2500_12_MDMCFG2,   0x73, 0x13}, | ||||
|     #ifdef REDPINE_FEC     | ||||
|         {CC2500_13_MDMCFG1,   0xA3, 0xA3}, | ||||
|     #else | ||||
|         {CC2500_13_MDMCFG1,   0x23, 0x23}, | ||||
|     #endif | ||||
|     {CC2500_14_MDMCFG0,   0x56, 0x7a},  // Chan space
 | ||||
|     {CC2500_15_DEVIATN,   0x00, 0x51}, | ||||
|     {CC2500_17_MCSM1,     0x0c, 0x0c}, | ||||
|     {CC2500_18_MCSM0,     0x08, 0x08}, //??? 0x18, 0x18},
 | ||||
|     {CC2500_19_FOCCFG,    0x1D, 0x16}, | ||||
|     {CC2500_1A_BSCFG,     0x1C, 0x6c}, | ||||
|     {CC2500_1B_AGCCTRL2,  0xC7, 0x43}, | ||||
|     {CC2500_1C_AGCCTRL1,  0x00, 0x40}, | ||||
|     {CC2500_1D_AGCCTRL0,  0xB0, 0x91}, | ||||
|     {CC2500_21_FREND1,    0xB6, 0x56}, | ||||
|     {CC2500_22_FREND0,    0x10, 0x10}, | ||||
|     {CC2500_23_FSCAL3,    0xEA, 0xA9}, | ||||
|     {CC2500_24_FSCAL2,    0x0A, 0x0A}, | ||||
|     {CC2500_25_FSCAL1,    0x00, 0x00}, | ||||
|     {CC2500_26_FSCAL0,    0x11, 0x11}, | ||||
|     {CC2500_29_FSTEST,    0x59, 0x59}, | ||||
|     {CC2500_2C_TEST2,     0x88, 0x88}, | ||||
|     {CC2500_2D_TEST1,     0x31, 0x31}, | ||||
|     {CC2500_2E_TEST0,     0x0B, 0x0B}, | ||||
|     {CC2500_3E_PATABLE,   0xff, 0xff} | ||||
| }; | ||||
| 
 | ||||
| static void REDPINE_init(uint8_t format) | ||||
| { | ||||
| 	CC2500_Reset(); | ||||
| 
 | ||||
| 	CC2500_WriteReg(CC2500_06_PKTLEN, REDPINE_PACKET_SIZE); | ||||
| 
 | ||||
| 	for (uint8_t i=0; i < ((sizeof REDPINE_init_data) / (sizeof REDPINE_init_data[0])); i++) | ||||
| 		CC2500_WriteReg(REDPINE_init_data[i][0], REDPINE_init_data[i][format+1]); | ||||
| 
 | ||||
| 	prev_option = option; | ||||
| 	CC2500_WriteReg(CC2500_0C_FSCTRL0, option); | ||||
| 	CC2500_Strobe(CC2500_SIDLE); | ||||
| 
 | ||||
| 	// calibrate hop channels
 | ||||
| 	for (uint8_t c = 0; c < REDPINE_NUM_HOPS; c++) | ||||
| 	{ | ||||
| 		CC2500_Strobe(CC2500_SIDLE); | ||||
| 		CC2500_WriteReg(CC2500_0A_CHANNR, hopping_frequency[c]); | ||||
| 		CC2500_Strobe(CC2500_SCAL); | ||||
| 		delayMicroseconds(900); | ||||
| 		calData[c] = CC2500_ReadReg(CC2500_25_FSCAL1); | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| static uint16_t initREDPINE() | ||||
| { | ||||
| 	hopping_frequency_no = 0; | ||||
| 	// Used from kn_nrf24l01.c : kn_calculate_freqency_hopping_channels
 | ||||
| 	uint32_t idx = 0; | ||||
| 	uint32_t rnd = MProtocol_id; | ||||
| 	#define REDPINE_MAX_RF_CHANNEL 255 | ||||
| 	hopping_frequency[idx++] = 1; | ||||
| 	while (idx < REDPINE_NUM_HOPS-1) | ||||
| 	{ | ||||
| 		uint32_t i; | ||||
| 		rnd = rnd * 0x0019660D + 0x3C6EF35F;  // Randomization
 | ||||
| 		// Drop least-significant byte for better randomization. Start from 1
 | ||||
| 		uint8_t next_ch = (rnd >> 8) % REDPINE_MAX_RF_CHANNEL + 1; | ||||
| 		// Check that it's not duplicate nor adjacent nor channel 0 or 1
 | ||||
| 		for (i = 0; i < idx; i++) | ||||
| 		{ | ||||
| 			uint8_t ch = hopping_frequency[i]; | ||||
| 			if ((ch <= next_ch + 1) && (ch >= next_ch - 1) && (ch > 1)) | ||||
| 				break; | ||||
| 		} | ||||
| 		if (i != idx) | ||||
| 			continue; | ||||
| 		hopping_frequency[idx++] = next_ch; | ||||
| 	} | ||||
| 	hopping_frequency[49] = 0;  // Last channel is the bind channel at hop 0
 | ||||
| 
 | ||||
| 	bind_counter=REDPINE_BIND; | ||||
| 	REDPINE_init(sub_protocol); | ||||
| 	CC2500_SetTxRxMode(TX_EN);  // enable PA
 | ||||
| 	return 10000; | ||||
| } | ||||
| #endif | ||||
| @ -87,6 +87,11 @@ | ||||
| 		#error "The CORONA forced frequency tuning value is outside of the range -127..127." | ||||
| 	#endif | ||||
| #endif | ||||
| #ifdef FORCE_REDPINE_TUNING | ||||
| 	#if ( FORCE_REDPINE_TUNING < -127 ) || ( FORCE_REDPINE_TUNING > 127 ) | ||||
| 		#error "The REDPINE forced frequency tuning value is outside of the range -127..127." | ||||
| 	#endif | ||||
| #endif | ||||
| #ifdef FORCE_HITEC_TUNING | ||||
| 	#if ( FORCE_HITEC_TUNING < -127 ) || ( FORCE_HITEC_TUNING > 127 ) | ||||
| 		#error "The HITEC forced frequency tuning value is outside of the range -127..127." | ||||
| @ -154,6 +159,7 @@ | ||||
| 	#undef	FRSKYX_CC2500_INO | ||||
| 	#undef	SFHSS_CC2500_INO | ||||
| 	#undef	CORONA_CC2500_INO | ||||
| 	#undef	REDPINE_CC2500_INO | ||||
| 	#undef	HITEC_CC2500_INO | ||||
| 	#undef	XN297L_CC2500_EMU | ||||
| #endif | ||||
|  | ||||
| @ -87,8 +87,8 @@ | ||||
| //#define ORANGE_TX_BLUE
 | ||||
| 
 | ||||
| /** CC2500 Fine Frequency Tuning **/ | ||||
| //For optimal performance the CC2500 RF module used by the FrSkyD, FrSkyV, FrSkyX, SFHSS, CORONA and Hitec protocols needs to be tuned for each protocol.
 | ||||
| //Initial tuning should be done via the radio menu with a genuine FrSky/Futaba/CORONA/Hitec receiver.  
 | ||||
| //For optimal performance the CC2500 RF module used by the FrSkyD, FrSkyV, FrSkyX, SFHSS, CORONA, Redpine and Hitec protocols needs to be tuned for each protocol.
 | ||||
| //Initial tuning should be done via the radio menu with a genuine FrSky/Futaba/CORONA/Hitec/Redpine receiver.  
 | ||||
| //Once a good tuning value is found it can be set here and will override the radio's 'option' setting for all existing and new models which use that protocol.
 | ||||
| //For more information: https://github.com/pascallanger/DIY-Multiprotocol-TX-Module/tree/master/docs/Frequency_Tuning.md
 | ||||
| //Uncomment the lines below (remove the "//") and set an appropriate value (replace the "0") to enable. Valid range is -127 to +127.
 | ||||
| @ -98,6 +98,7 @@ | ||||
| //#define FORCE_SFHSS_TUNING	0
 | ||||
| //#define FORCE_CORONA_TUNING	0
 | ||||
| //#define FORCE_HITEC_TUNING	0
 | ||||
| //#define FORCE_REDPINE_TUNING	0
 | ||||
| 
 | ||||
| /** A7105 Fine Frequency Tuning **/ | ||||
| //This is required in rare cases where some A7105 modules and/or RXs have an inaccurate crystal oscillator.
 | ||||
| @ -164,6 +165,7 @@ | ||||
| #define	J6PRO_CYRF6936_INO | ||||
| #define	WFLY_CYRF6936_INO | ||||
| #define	WK2x01_CYRF6936_INO | ||||
| 
 | ||||
| //#define TRAXXAS_CYRF6936_INO
 | ||||
| 
 | ||||
| //The protocols below need a CC2500 to be installed
 | ||||
| @ -173,6 +175,7 @@ | ||||
| #define	FRSKYX_CC2500_INO | ||||
| #define	HITEC_CC2500_INO | ||||
| #define	SFHSS_CC2500_INO | ||||
| #define	REDPINE_CC2500_INO | ||||
| 
 | ||||
| //The protocols below need a NRF24L01 to be installed
 | ||||
| #define	ASSAN_NRF24L01_INO | ||||
| @ -598,6 +601,9 @@ const PPM_Parameters PPM_prot[14*NBR_BANKS]=	{ | ||||
| 		CX35 | ||||
| 		CX10D | ||||
| 		CX10WD | ||||
| 	PROTO_REDPINE | ||||
| 		RED_FAST | ||||
| 		RED_SLOW | ||||
| 	PROTO_SFHSS | ||||
| 		NONE | ||||
| 	PROTO_SHENQI | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user