Beispiel #1
0
void init_zigbee(u8 _channel, u16 pan_id, u16 short_address)
{
    mrf24j40_setup_io();
    mrf24j40_init();
    // RB : 30-08-2013 - Uncommented following lines
    mrf24j40_set_pan_id(pan_id);
    mrf24j40_set_short_address(short_address);
    mrf24j40_set_channel(_channel);
}
Beispiel #2
0
uns8 mrf24j40_scan_for_lowest_channel_ed() {

uns8 rssi;
uns8 _channel;
uns16 scan_count;
uns8 highest_on_channel;
uns8 lowest_channel = MRF_LAST_CHANNEL;
uns8 lowest_ed = 0xff;
uns8 bbreg6;	

	// We should really ignore all packets here (do to)
	
	#if defined(ENABLE_PA_LNA)
		mrf24j40_long_addr_write(TESTMODE, 0x08);          // Disable automatic switch on PA/LNA
		mrf24j40_short_addr_write(TRISGPIO, 0x0F);        // Set GPIO direction
		mrf24j40_short_addr_write(GPIO, 0x0C);           // Enable LNA
	#endif

	
	for (_channel = MRF_FIRST_CHANNEL; _channel <= MRF_LAST_CHANNEL; _channel++) {
		
		// switch channel
		mrf24j40_set_channel(_channel);
		
		highest_on_channel = 0;
		for (scan_count = 0; scan_count < 1000; scan_count++) {
			mrf24j40_short_addr_write(BBREG6, 1 << BBREG6_RSSIMODE1);
			do {
				bbreg6 = mrf24j40_short_addr_read(BBREG6);
			} while (!test_bit(bbreg6, BBREG6_RSSIRDY));
			rssi = mrf24j40_long_addr_read(RSSI);
			if (rssi > highest_on_channel) {
				highest_on_channel = rssi;
			}	
		}
		
		if (highest_on_channel < lowest_ed) {
			lowest_ed = highest_on_channel;
			lowest_channel = _channel;
		}	
	}
	mrf24j40_short_addr_write(BBREG6, 1 << BBREG6_RSSIMODE2);	// Back to mode 2 (rssi in pkt)
	
	// Should stop ignoring all packets now if we started ignoring them earlier
	// (to do)
	
	#if defined(ENABLE_PA_LNA)
		mrf24j40_short_addr_write(GPIO, 0);
		mrf24j40_short_addr_write(TRISGPIO, 0x00);
		mrf24j40_long_addr_write(TESTMODE, 0x0F);
	#endif

	
	return lowest_channel;
}
Beispiel #3
0
/*---------------------------------------------------------------------------*/
void
init_net(uint8_t node_id)
{
  uint16_t shortaddr;
  uint64_t longaddr;
  linkaddr_t addr;
#if WITH_UIP6
  uip_ds6_addr_t *lladdr;
  uip_ipaddr_t ipaddr;
#endif

  uint8_t i;

  memset(&shortaddr, 0, sizeof(shortaddr));
  memset(&longaddr, 0, sizeof(longaddr));
  *((uint8_t *)&shortaddr) = node_id >> 8;
  *((uint8_t *)&shortaddr + 1) = node_id;
  *((uint8_t *)&longaddr) = node_id >> 8;
  *((uint8_t *)&longaddr + 1) = node_id;
  for(i = 2; i < sizeof(longaddr); ++i) {
    ((uint8_t *)&longaddr)[i] = random_rand();
  }

  PRINTF("SHORT MAC ADDRESS %02x:%02x\n",
         *((uint8_t *) & shortaddr), *((uint8_t *) & shortaddr + 1));

  PRINTF("EXTENDED MAC ADDRESS %02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x\n",
         *((uint8_t *)&longaddr),
         *((uint8_t *)&longaddr + 1),
         *((uint8_t *)&longaddr + 2),
         *((uint8_t *)&longaddr + 3),
         *((uint8_t *)&longaddr + 4),
         *((uint8_t *)&longaddr + 5),
         *((uint8_t *)&longaddr + 6),
         *((uint8_t *)&longaddr + 7));

  memset(&addr, 0, sizeof(linkaddr_t));

  for(i = 0; i < sizeof(addr.u8); ++i) {
    addr.u8[i] = ((uint8_t *)&longaddr)[i];
  }

  linkaddr_set_node_addr(&addr);

  PRINTF("Rime started with address: ");
  for(i = 0; i < sizeof(addr.u8) - 1; ++i) {
    PRINTF("%d.", addr.u8[i]);
  }
  PRINTF("%d\n", addr.u8[i]);

  queuebuf_init();

  NETSTACK_RADIO.init();

  mrf24j40_set_channel(RF_CHANNEL);
  mrf24j40_set_panid(IEEE802154_PANID);
  mrf24j40_set_short_mac_addr(shortaddr);
  mrf24j40_set_extended_mac_addr(longaddr);

  NETSTACK_RDC.init();
  NETSTACK_MAC.init();
  NETSTACK_NETWORK.init();

  PRINTF("%s %s, channel check rate %d Hz, radio channel %u\n",
         NETSTACK_MAC.name, NETSTACK_RDC.name,
         CLOCK_SECOND / (NETSTACK_RDC.channel_check_interval() == 0 ? 1 :
                         NETSTACK_RDC.channel_check_interval()), RF_CHANNEL);

#if WITH_UIP6

#if LINKADDR_CONF_SIZE == 2
  memset(&uip_lladdr.addr, 0, sizeof(uip_lladdr.addr));
  uip_lladdr.addr[3] = 0xff;
  uip_lladdr.addr[4]= 0xfe;
  memcpy(&uip_lladdr.addr[6], &shortaddr, sizeof(shortaddr));
#else
  memcpy(&uip_lladdr.addr, &longaddr, sizeof(uip_lladdr.addr));
#endif

  process_start(&tcpip_process, NULL);

  lladdr = uip_ds6_get_link_local(-1);

  PRINTF("Tentative link-local IPv6 address ");

  for(i = 0; i < 7; ++i) {
    PRINTF("%02x%02x:", lladdr->ipaddr.u8[i * 2], lladdr->ipaddr.u8[i * 2 + 1]);
  }

  PRINTF("%02x%02x\n", lladdr->ipaddr.u8[14], lladdr->ipaddr.u8[15]);

  if(!UIP_CONF_IPV6_RPL) {
    uip_ip6addr(&ipaddr, 0x2001, 0x1418, 0x100, 0x823c, 0, 0, 0, 0);
    uip_ds6_set_addr_iid(&ipaddr, &uip_lladdr);
    uip_ds6_addr_add(&ipaddr, 0, ADDR_TENTATIVE);

    PRINTF("Tentative global IPv6 address ");

    for(i = 0; i < 7; ++i) {
      PRINTF("%02x%02x:", ipaddr.u8[i * 2], ipaddr.u8[i * 2 + 1]);
    }

    PRINTF("%02x%02x\n", ipaddr.u8[7 * 2], ipaddr.u8[7 * 2 + 1]);
  }
#endif
}