static void cmd_handler (void) { /* Handle commands and filenames */ if (ieee_data.ieeeflags & COMMAND_RECVD) { # ifdef HAVE_HOTPLUG /* This seems to be a nice point to handle card changes */ if (disk_state != DISK_OK) { set_busy_led(1); /* If the disk was changed the buffer contents are useless */ if (disk_state == DISK_CHANGED || disk_state == DISK_REMOVED) { free_multiple_buffers(FMB_ALL); change_init(); filesystem_init(0); } else { /* Disk state indicated an error, try to recover by initialising */ filesystem_init(1); } update_leds(); } # endif if (ieee_data.secondary_address == 0x0f) { parse_doscommand(); /* Command channel */ } else { datacrc = 0xffff; /* Filename in command buffer */ file_open(ieee_data.secondary_address); } command_length = 0; ieee_data.ieeeflags &= (uint8_t) ~COMMAND_RECVD; } /* COMMAND_RECVD */ /* We're done, clean up unused buffers */ free_multiple_buffers(FMB_UNSTICKY); d64_bam_commit(); }
int main(void) { /* Early system initialisation */ board_init(); system_init_early(); leds_init(); set_busy_led(1); set_dirty_led(0); /* Due to an erratum in the LPC17xx chips anything that may change */ /* peripheral clock scalers must come before system_init_late() */ uart_init(); #ifndef SPI_LATE_INIT spi_init(SPI_SPEED_SLOW); #endif timer_init(); bus_interface_init(); i2c_init(); /* Second part of system initialisation, switches to full speed on ARM */ system_init_late(); enable_interrupts(); /* Internal-only initialisation, called here because it's faster */ buffers_init(); buttons_init(); /* Anything that does something which needs the system clock */ /* should be placed after system_init_late() */ bus_init(); // needs delay rtc_init(); // accesses I2C disk_init(); // accesses card read_configuration(); fatops_init(0); change_init(); uart_puts_P(PSTR("\r\nsd2iec " VERSION " #")); uart_puthex(device_address); uart_putcrlf(); #ifdef CONFIG_REMOTE_DISPLAY /* at this point all buffers should be free, */ /* so just use the data area of the first to build the string */ uint8_t *strbuf = buffers[0].data; ustrcpy_P(strbuf, versionstr); ustrcpy_P(strbuf+ustrlen(strbuf), longverstr); if (display_init(ustrlen(strbuf), strbuf)) { display_address(device_address); display_current_part(0); } #endif set_busy_led(0); #if defined(HAVE_SD) && BUTTON_PREV != 0 /* card switch diagnostic aid - hold down PREV button to use */ if (!(buttons_read() & BUTTON_PREV)) { while (buttons_read() & BUTTON_NEXT) { set_dirty_led(sdcard_detect()); # ifndef SINGLE_LED set_busy_led(sdcard_wp()); # endif } reset_key(0xff); } #endif bus_mainloop(); while (1); }