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'); } } }
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(); } }