Exemplo n.º 1
0
void radio_set_param(radio_attribute_t attr, radio_param_t parm)
{
	switch (attr)
	{
	case phyCurrentChannel:
		if (((int)parm.channel >= TRX_MIN_CHANNEL) &&
				((int)parm.channel <= TRX_MAX_CHANNEL))
		{
#ifdef CHINABAND
			trx_reg_write(RG_CC_CTRL_1, CCBAND);
			trx_reg_write(RG_CC_CTRL_0, parm.channel*2+CCNUMBER);
#else
			trx_bit_write(SR_CHANNEL, parm.channel);
#endif
			radiostatus.channel = parm.channel;
		}
		else
		{
			radio_error(SET_PARM_FAILED);
		}
		break;

	case phyTransmitPower:
#if RADIO_TYPE == RADIO_AT86RF212
#ifdef CHINABAND
		if (parm.tx_pwr >= -11 && parm.tx_pwr <= 8)
		{
			/** @todo move this into a radio-specific header file */
			static const uint8_t pwrtable[] =
			{
					0x0A, 0x09, 0x08,             /* -11...-9 dBm */
					0x07, 0x06, 0x05,			/* -8...-6 dBm */
					0x04, 0x03, 0x25,                   /* -5...-3 dBm */
					0x46, 0xAC, 0xAB,                   /* -2...0 dBm */
					0xAA,                         /* 1 dBm */
					0xCA,                         /* 2 dBm */
					0xEA,                         /* 3 dBm */
					0xE9,                         /* 4 dBm */
					0xE8,                         /* 5 dBm */
					0xE6,                         /* 6 dBm */
					0xE5,                         /* 7 dBm */
					0xE4,                         /* 8 dBm */
			};
			radiostatus.tx_pwr = parm.tx_pwr;
			uint8_t idx = parm.tx_pwr + 11;
			uint8_t pwrval = pgm_read_byte(pwrtable[idx]);
			trx_reg_write(RG_PHY_TX_PWR, pwrval);
		}
		else
			{
				radio_error(SET_PARM_FAILED);
			}
#endif//chinaband
#else
		if (parm.tx_pwr >= -17 && parm.tx_pwr <= 3)
		{
			/** @todo move this into a radio-specific header file */
			static const uint8_t pwrtable[] =
			{
					0x0F, 0x0F, 0x0F, 0x0F, 0x0F, /* -17...-13 dBm */
					0x0E, 0x0E, 0x0E,             /* -12...-10 dBm */
					0x0D, 0x0D,                   /* -9...-8 dBm */
					0x0C, 0x0C,                   /* -7...-6 dBm */
					0x0B,                         /* -5 dBm */
					0x0A,                         /* -4 dBm */
					0x09,                         /* -3 dBm */
					0x08,                         /* -2 dBm */
					0x07,                         /* -1 dBm */
					0x06,                         /* 0 dBm */
					0x04,                         /* 1 dBm */
					0x02,                         /* 2 dBm */
					0x00                          /* 3 dBm */
			};
			radiostatus.tx_pwr = parm.tx_pwr;
			uint8_t idx = parm.tx_pwr + 17;
			uint8_t pwrval = pgm_read_byte(pwrtable[idx]);
			trx_bit_write(SR_TX_PWR, pwrval);

		}

		else
		{
			radio_error(SET_PARM_FAILED);
		}

#endif//rf212
		break;
	case phyCCAMode:
		if (parm.cca_mode <= 3)
		{
			radiostatus.cca_mode = parm.cca_mode;
			trx_bit_write(SR_CCA_MODE, radiostatus.cca_mode);
		}
		else
		{
			radio_error(SET_PARM_FAILED);
		}
		break;

        case phyIdleState:
            radiostatus.idle_state = parm.idle_state;
            radio_set_state(parm.idle_state);
            break;

        case phyChannelsSupported:
            break;

        case phyPanId:
            trx_set_panid(parm.pan_id);
            break;

        case phyShortAddr:
            trx_set_shortaddr(parm.short_addr);
            break;

        case phyLongAddr:
        {
            uint8_t regno, *ap;
            for (regno = RG_IEEE_ADDR_0, ap = (uint8_t *)parm.long_addr;
                 regno <= RG_IEEE_ADDR_7;
                 regno++, ap++)
                trx_reg_write(regno, *ap);
            break;
        }

        case phyDataRate:
            trx_set_datarate(parm.data_rate);
            break;

        default:
            radio_error(SET_PARM_FAILED);
            break;
    }
}
Exemplo n.º 2
0
void radio_set_param(radio_attribute_t attr, radio_param_t parm)
{
    switch (attr)
    {
        case phyCurrentChannel:
            if (((int)parm.channel >= TRX_MIN_CHANNEL) &&
                ((int)parm.channel <= TRX_MAX_CHANNEL))
            {
                trx_bit_write(SR_CHANNEL, parm.channel);
                radiostatus.channel = parm.channel;
            }
            else
            {
                radio_error(SET_PARM_FAILED);
            }
            break;

        case phyTransmitPower:
            if (parm.tx_pwr >= -17 && parm.tx_pwr <= 3)
            {
                /** @todo move this into a radio-specific header file */
                static const uint8_t pwrtable[] =
                {
                    0x0F, 0x0F, 0x0F, 0x0F, 0x0F, /* -17...-13 dBm */
                    0x0E, 0x0E, 0x0E,             /* -12...-10 dBm */
                    0x0D, 0x0D,                   /* -9...-8 dBm */
                    0x0C, 0x0C,                   /* -7...-6 dBm */
                    0x0B,                         /* -5 dBm */
                    0x0A,                         /* -4 dBm */
                    0x09,                         /* -3 dBm */
                    0x08,                         /* -2 dBm */
                    0x07,                         /* -1 dBm */
                    0x06,                         /* 0 dBm */
                    0x04,                         /* 1 dBm */
                    0x02,                         /* 2 dBm */
                    0x00                          /* 3 dBm */
                };
                radiostatus.tx_pwr = parm.tx_pwr;
                uint8_t idx = parm.tx_pwr + 17;
                uint8_t pwrval = pgm_read_byte(pwrtable[idx]);
                trx_bit_write(SR_TX_PWR, pwrval);
            }
            else
            {
                radio_error(SET_PARM_FAILED);
            }
            break;

        case phyCCAMode:
            if (parm.cca_mode <= 3)
            {
                radiostatus.cca_mode = parm.cca_mode;
                trx_bit_write(SR_CCA_MODE, radiostatus.cca_mode);
            }
            else
            {
                radio_error(SET_PARM_FAILED);
            }
            break;

        case phyIdleState:
            radiostatus.idle_state = parm.idle_state;
            radio_set_state(parm.idle_state);
            break;

        case phyChannelsSupported:
            break;

        case phyPanId:
            trx_set_panid(parm.pan_id);
            break;

        case phyShortAddr:
            trx_set_shortaddr(parm.short_addr);
            break;

        case phyLongAddr:
        {
            uint8_t regno, *ap;
            for (regno = RG_IEEE_ADDR_0, ap = (uint8_t *)parm.long_addr;
                 regno <= RG_IEEE_ADDR_7;
                 regno++, ap++)
                trx_reg_write(regno, *ap);
            break;
        }

        case phyDataRate:
            trx_set_datarate(parm.data_rate);
            break;

#ifdef TRX_TX_PA_EI
        case phyTxPa:
            radiostatus.tx_pa = parm.tx_pa;
            break;
#endif
#ifdef TRX_RX_LNA_EI
        case phyRxLna:
            radiostatus.rx_lna = parm.rx_lna;
            break;
#endif

        default:
            radio_error(SET_PARM_FAILED);
            break;
    }
}