static int test_user_abort(void) { char c; printf("Automatic boot in 2 seconds...\n"); printf("Q/ESC: abort boot\n"); printf("F7: boot from serial\n"); #ifdef MINIMAC_BASE printf("F8: boot from network\n"); #endif timer0_en_write(0); timer0_reload_write(0); timer0_load_write(identifier_frequency_read()*2); timer0_en_write(1); timer0_update_value_write(1); while(timer0_value_read()) { if(readchar_nonblock()) { c = readchar(); if((c == 'Q')||(c == '\e')) { puts("Aborted"); return 0; } if(c == 0x06) { serialboot(); return 0; } #ifdef MINIMAC_BASE if(c == 0x07) { netboot(); return 0; } #endif } timer0_update_value_write(1); }
static int check_ack(void) { int recognized; static const char str[SFL_MAGIC_LEN] = SFL_MAGIC_ACK; timer0_en_write(0); timer0_reload_write(0); timer0_load_write(identifier_frequency_read()/4); timer0_en_write(1); timer0_update_value_write(1); recognized = 0; while(timer0_value_read()) { if(uart_read_nonblock()) { char c; c = uart_read(); if(c == str[recognized]) { recognized++; if(recognized == SFL_MAGIC_LEN) return 1; } else { if(c == str[0]) recognized = 1; else recognized = 0; } } timer0_update_value_write(1); } return 0; }
static void status_service(void) { static int last_event; if(elapsed(&last_event, identifier_frequency_read())) { if(status_enabled) { status_print(); printf("\r\n"); } } }
void encoder_service(void) { static int last_event; static int last_fps_event; static int frame_cnt; static int can_start; if(encoder_enabled) { if(elapsed(&last_event, identifier_frequency_read()/encoder_target_fps)) can_start = 1; if(can_start & encoder_done()) { encoder_init(encoder_quality); encoder_start(processor_h_active, processor_v_active); encoder_reader_dma_length_write(processor_h_active*processor_v_active*2); encoder_reader_dma_shoot_write(1); frame_cnt++; } if(elapsed(&last_fps_event, identifier_frequency_read())) { encoder_fps = frame_cnt; frame_cnt = 0; } } }
static int wait_idelays(void) { int ev; ev = 0; elapsed(&ev, 1); while(hdmi_in1_data0_cap_dly_busy_read() || hdmi_in1_data1_cap_dly_busy_read() || hdmi_in1_data2_cap_dly_busy_read()) { if(elapsed(&ev, identifier_frequency_read() >> 6) == 0) { printf("dvisampler1: IDELAY busy timeout\r\n"); return 0; } } return 1; }
void hdmi_in1_service(void) { static int last_event; if(hdmi_in1_connected) { if(!hdmi_in1_edid_hpd_notif_read()) { if(hdmi_in1_debug) printf("dvisampler1: disconnected\r\n"); hdmi_in1_connected = 0; hdmi_in1_locked = 0; hdmi_in1_clocking_pll_reset_write(1); hdmi_in1_clear_framebuffers(); } else { if(hdmi_in1_locked) { if(hdmi_in1_clocking_locked_filtered()) { if(elapsed(&last_event, identifier_frequency_read()/2)) { hdmi_in1_adjust_phase(); if(hdmi_in1_debug) hdmi_in1_print_status(); } } else { if(hdmi_in1_debug) printf("dvisampler1: lost PLL lock\r\n"); hdmi_in1_locked = 0; hdmi_in1_clear_framebuffers(); } } else { if(hdmi_in1_clocking_locked_filtered()) { if(hdmi_in1_debug) printf("dvisampler1: PLL locked\r\n"); hdmi_in1_phase_startup(); if(hdmi_in1_debug) hdmi_in1_print_status(); hdmi_in1_locked = 1; } } } } else { if(hdmi_in1_edid_hpd_notif_read()) { if(hdmi_in1_debug) printf("dvisampler1: connected\r\n"); hdmi_in1_connected = 1; hdmi_in1_clocking_pll_reset_write(0); } } hdmi_in1_check_overflow(); }
void dvisampler_service(void) { static int last_event; if(dvisampler_connected) { if(!dvisampler_edid_hpd_notif_read()) { if(dvisampler_debug) printf("dvisampler: disconnected\n"); dvisampler_connected = 0; dvisampler_locked = 0; dvisampler_clocking_pll_reset_write(1); dvisampler_clear_framebuffers(); } else { if(dvisampler_locked) { if(dvisampler_clocking_locked_filtered()) { if(elapsed(&last_event, identifier_frequency_read()/2)) { dvisampler_adjust_phase(); if(dvisampler_debug) dvisampler_print_status(); } } else { if(dvisampler_debug) printf("dvisampler: lost PLL lock\n"); dvisampler_locked = 0; dvisampler_clear_framebuffers(); } } else { if(dvisampler_clocking_locked_filtered()) { if(dvisampler_debug) printf("dvisampler: PLL locked\n"); dvisampler_phase_startup(); if(dvisampler_debug) dvisampler_print_status(); dvisampler_locked = 1; } } } } else { if(dvisampler_edid_hpd_notif_read()) { if(dvisampler_debug) printf("dvisampler: connected\n"); dvisampler_connected = 1; dvisampler_clocking_pll_reset_write(0); } } dvisampler_check_overflow(); }
static int hdmi_in1_clocking_locked_filtered(void) { static int lock_start_time; static int lock_status; if(hdmi_in1_clocking_locked_read()) { switch(lock_status) { case 0: elapsed(&lock_start_time, -1); lock_status = 1; break; case 1: if(elapsed(&lock_start_time, identifier_frequency_read()/4)) lock_status = 2; break; case 2: return 1; } } else lock_status = 0; return 0; }
unsigned int get_system_frequency(void) { return identifier_frequency_read(); }