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 wibo_init(uint8_t channel, uint16_t pan_id, uint16_t short_addr, uint64_t ieee_addr)
{
#if defined(WIBO_FLAVOUR_KEYPRESS) || defined(WIBO_FLAVOUR_MAILBOX)
	uint8_t run_bootloader = 0;
#endif

	/* only stay in bootloader if key is pressed */
#if defined(WIBO_FLAVOUR_KEYPRESS)
#if defined(NO_KEYS)
#error "No Keys defined for WIBO_FLAVOUR_KEYPRESS"
#endif
	KEY_INIT();
	if(KEY_GET() != 0)
	{
		run_bootloader = 1;
	}
#endif /* defined(WIBO_FLAVOUR_KEYPRESS) */

#if defined(WIBO_FLAVOUR_MAILBOX)

#if !defined(WIBO_FLAVOUR_MAILBOX_REGISTER) || !defined(WIBO_FLAVOUR_MAILBOX_CODE)
#error "WIBO_FLAVOUR_MAILBOX not defined correctly"
#endif
	if(WIBO_FLAVOUR_MAILBOX_REGISTER == WIBO_FLAVOUR_MAILBOX_CODE)
	{
		run_bootloader = 1;
	}
	//WIBO_MAILBOX_CLR();
#endif /* defined(WIBO_FLAVOUR_MAILBOX) */

#if defined(WIBO_FLAVOUR_KEYPRESS) || defined(WIBO_FLAVOUR_MAILBOX)
	if(run_bootloader == 0)
	{
		app();
	}
#endif

#if !defined(NO_LEDS)
LED_INIT();
LED_SET(PROGLED);
#endif

	nodeconfig.channel=channel;
	nodeconfig.pan_id=pan_id;
	nodeconfig.short_addr=short_addr;
	nodeconfig.ieee_addr = ieee_addr;

	trx_io_init(DEFAULT_SPI_RATE);
	TRX_RESET_LOW();
	TRX_SLPTR_LOW();
	TRX_RESET_HIGH();

#if defined(DI_TRX_IRQ)
	DI_TRX_IRQ();
#endif
	trx_reg_write(RG_TRX_STATE, CMD_FORCE_TRX_OFF);

#if (RADIO_TYPE == RADIO_AT86RF230A) || (RADIO_TYPE == RADIO_AT86RF230B)
	trx_reg_write(RG_PHY_TX_PWR, 0x80); /* set TX_AUTO_CRC bit, and TX_PWR = max */
#else
	trx_reg_write(RG_TRX_CTRL_1, 0x20); /* set TX_AUTO_CRC bit */
#endif

	/* setup network addresses for auto modes */
	pingrep.hdr.pan = nodeconfig.pan_id;
	pingrep.hdr.src = nodeconfig.short_addr;

	trx_set_panid(nodeconfig.pan_id);
	trx_set_shortaddr(nodeconfig.short_addr);

	/* use register write to save code space, overwrites Bits CCA_REQUEST CCA_MODE[1] CCA_MODE[0]
	 * which is accepted
	 */
	trx_reg_write(RG_PHY_CC_CCA, nodeconfig.channel);

#if RADIO_TYPE == RADIO_AT86RF212

	/* reset value, BPSK-40 */
	/* trx_reg_write(RG_TRX_CTRL_2, 0x24); */

	/* +5dBm acc. to datasheet AT86RF212 table 7-15 */
	trx_reg_write(RG_PHY_TX_PWR, 0x84);
#endif /* RADIO_TYPE == RADIO_AT86RF212 */

	trx_reg_write(RG_CSMA_SEED_0, nodeconfig.short_addr); /* some seeding */
	trx_reg_write(RG_TRX_STATE, CMD_RX_AACK_ON);
	trx_reg_write(RG_IRQ_STATUS, TRX_IRQ_RX_END); /* clear the flag */

#if defined(_DEBUG_SERIAL_)
	void sendchar(char c);
	static FILE usart_stdio = FDEV_SETUP_STREAM(sendchar, NULL, _FDEV_SETUP_WRITE);

	stdout = stderr = &usart_stdio;
	printf("WIBO Bootlapp Serial Debug"EOL);
	printf("PANID=%04X SHORTADDR=%04X CHANNEL=%d"EOL,
			nodeconfig.pan_id, nodeconfig.short_addr, nodeconfig.channel);
#endif
}
Exemplo n.º 3
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;
    }
}