Exemplo n.º 1
0
Arquivo: txrx_uhd.c Projeto: GREO/uhd
int
main(void)
{
  u2_init();
#ifdef BOOTLOADER
  putstr("\nUSRP N210 UDP bootloader\n");
#else
  putstr("\nTxRx-UHD-ZPU\n");
#endif
  printf("FPGA compatibility number: %d\n", USRP2_FPGA_COMPAT_NUM);
  printf("Firmware compatibility number: %d\n", USRP2_FW_COMPAT_NUM);
  
#ifdef BOOTLOADER
  //load the production FPGA image or firmware if appropriate
  do_the_bootload_thing();
  //if we get here we've fallen through to safe firmware
  set_default_mac_addr();
  set_default_ip_addr();
#endif

  print_mac_addr(ethernet_mac_addr()); newline();
  print_ip_addr(get_ip_addr()); newline();

  //1) register the addresses into the network stack
  register_addrs(ethernet_mac_addr(), get_ip_addr());
  pkt_ctrl_program_inspector(get_ip_addr(), USRP2_UDP_DSP0_PORT);

  //2) register callbacks for udp ports we service
  init_udp_listeners();
  register_udp_listener(USRP2_UDP_CTRL_PORT, handle_udp_ctrl_packet);
  register_udp_listener(USRP2_UDP_DSP0_PORT, handle_udp_data_packet);
  register_udp_listener(USRP2_UDP_ERR0_PORT, handle_udp_data_packet);
  register_udp_listener(USRP2_UDP_DSP1_PORT, handle_udp_data_packet);
#ifdef USRP2P
  register_udp_listener(USRP2_UDP_UPDATE_PORT, handle_udp_fw_update_packet);
#endif

  //3) set the routing mode to slave to set defaults
  pkt_ctrl_set_routing_mode(PKT_CTRL_ROUTING_MODE_SLAVE);

  //4) setup ethernet hardware to bring the link up
  ethernet_register_link_changed_callback(link_changed_callback);
  ethernet_init();

  while(true){

    size_t num_lines;
    void *buff = pkt_ctrl_claim_incoming_buffer(&num_lines);
    if (buff != NULL){
        handle_inp_packet((uint32_t *)buff, num_lines);
        pkt_ctrl_release_incoming_buffer();
    }

    pic_interrupt_handler();
    int pending = pic_regs->pending;		// poll for under or overrun

    if (pending & PIC_UNDERRUN_INT){
      pic_regs->pending = PIC_UNDERRUN_INT;	// clear interrupt
      putchar('U');
    }

    if (pending & PIC_OVERRUN_INT){
      pic_regs->pending = PIC_OVERRUN_INT;	// clear interrupt
      putchar('O');
    }
  }
}
Exemplo n.º 2
0
int main(void){

    /*
     * Initializations
     */
    cli();

    // Make sure interrupts belong to us
    MCUCR = (1<<IVCE);
    MCUCR = 0;

    // Initialize global variables
    g_ext_ref_present = false;
    g_gps_present = false;
    g_switch_pos = PREFER_INTERNAL;
    g_ref = NO_REF;

    // Atmega128
    setup_atmel_io_ports();

    // Reset ClkDist chip
    reset_TI_CDCE18005();

    // GPSDO communication
    usart_init();

    // Ethernet stack
    network_init();
    register_udp_listener(OCTOCLOCK_UDP_CTRL_PORT,  handle_udp_ctrl_packet);
    register_udp_listener(OCTOCLOCK_UDP_GPSDO_PORT, handle_udp_gpsdo_packet);

    // Timers
    TIMER1_INIT(); // Network
    TIMER3_INIT(); // External reference check

    // Debug (does nothing when not in debug mode)
    DEBUG_INIT();
    DEBUG_LOG(" "); // Force a newline between runs

    leds_off();

    sei();

    // Check if GPS present (should only need to happen once)
    g_gps_present = (PIND & (1<<DDD4));

    // State of previous iteration
    prev_ref           = NO_REF;
    prev_switch_pos    = PREFER_EXTERNAL;
    cli();
    prev_ICR3          = ICR3;
    sei();
    prev_num_overflows = 0;

    /*
     * Main loop
     */
    while(true){
        // Check switch position
        g_switch_pos = (PINC & (1<<DDC1)) ? PREFER_EXTERNAL : PREFER_INTERNAL;

        /*
         * Check input capture pin for external reference detection.
         *
         * 16-bit reads could be corrupted during an interrupt, so
         * disable interrupts for safety.
         */
        cli();
        current_ICR3          = ICR3;
        current_num_overflows = num_overflows;
        sei();

        // Signal detected, reset timer
        if(current_ICR3 != prev_ICR3){
            cli();
            TCNT3 = 0;
            num_overflows = 0;
            sei();
            g_ext_ref_present = true;
        }

        // Timeout, no external reference detected
        if(current_num_overflows >= EXT_REF_TIMEOUT){
            g_ext_ref_present = false;
        }

        // Determine and set reference based on state
        if(!g_gps_present && !g_ext_ref_present)     g_ref = NO_REF;
        else if(g_gps_present && !g_ext_ref_present) g_ref = INTERNAL;
        else if(!g_gps_present && g_ext_ref_present) g_ref = EXTERNAL;
        else g_ref = (g_switch_pos == PREFER_INTERNAL) ? INTERNAL : EXTERNAL;

        if((g_ref != prev_ref) || (g_switch_pos != prev_switch_pos)){
            if(g_switch_pos == PREFER_INTERNAL) prefer_internal();
            else prefer_external();
        }

        // Record this iteration's state
        prev_ref           = g_ref;
        prev_switch_pos    = g_switch_pos;
        prev_ICR3          = current_ICR3;
        prev_num_overflows = current_num_overflows;

        // Handle incoming Ethernet packets
        network_check();
    }
}