static int boot_menu(void) { const char* strings[] = {"Boot Rockbox", "Boot OF", "USB mode", "Reset Rockbox configuration"}; int button, touch, poweroff_repeat = 0; unsigned int i; verbose = true; adc_init(); redraw: lcd_clear_display(); for(i=0; i<ARRAYLEN(strings); i++) { lcd_drawrect(RECT_X, RECT_Y(i), RECT_WIDTH, RECT_HEIGHT); lcd_putsxy(TEXT_X(i), TEXT_Y(i), strings[i]); } lcd_update(); while(1) { button = button_get_w_tmo(HZ/4); if(button & BUTTON_TOUCHSCREEN) { touch = button_get_data(); unsigned int x = touch & 0xFFFF, y = touch >> 16; int found = -1; for(i=0; i<ARRAYLEN(strings); i++) { if(x > RECT_X && x < RECT_X+RECT_WIDTH && y > RECT_Y(i) && y < RECT_Y(i)+RECT_HEIGHT) { found = i; break; } } switch(found) { case 0: reset_screen(); boot_rockbox(); break; case 1: reset_screen(); boot_of(); break; case 2: usb_mode(); break; case 3: reset_configuration(); break; } if(found != -1) goto redraw; } else if(button & BUTTON_POWER)
void main(uint32_t arg, uint32_t addr) { unsigned char* loadbuffer; int buffer_size; void(*kernel_entry)(void); int ret; system_init(); kernel_init(); power_init(); enable_irq(); lcd_init(); lcd_clear_display(); lcd_update(); backlight_init(); button_init(); //button_debug_screen(); printf("Boot version: %s", RBVERSION); printf("arg=%x addr=%x", arg, addr); #ifdef SANSA_FUZEPLUS extern void imx233_mmc_disable_window(void); if(arg == 0xfee1dead) { printf("Disable MMC window."); imx233_mmc_disable_window(); } #endif ret = storage_init(); if(ret < 0) error(EATA, ret, true); /* NOTE: allow disk_init and disk_mount_all to fail since we can do USB after. * We need this order to determine the correct logical sector size */ while(!disk_init(IF_MV(0))) printf("disk_init failed!"); if((ret = disk_mount_all()) <= 0) error(EDISK, ret, false); if(usb_detect() == USB_INSERTED) usb_mode(HZ); printf("Loading firmware"); loadbuffer = (unsigned char*)loadaddress; buffer_size = (int)(loadaddressend - loadaddress); while((ret = load_firmware(loadbuffer, BOOTFILE, buffer_size)) < 0) { error(EBOOTFILE, ret, true); } kernel_entry = (void*) loadbuffer; printf("Executing"); disable_interrupt(IRQ_FIQ_STATUS); commit_discard_idcache(); kernel_entry(); printf("ERR: Failed to boot"); /* never returns */ while(1) ; }