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; } }
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 }
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; } }