forked from len0rd/rockbox
		
	This reverts commit 9d92d161d8.
Reason for revert: going to end up changing this might as well just revert
Change-Id: I914f61a5e79f80ff1bf40c06253c85dba25cc305
		
	
			
		
			
				
	
	
		
			814 lines
		
	
	
	
		
			21 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			814 lines
		
	
	
	
		
			21 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /***************************************************************************
 | |
|  *             __________               __   ___.
 | |
|  *   Open      \______   \ ____   ____ |  | _\_ |__   _______  ___
 | |
|  *   Source     |       _//  _ \_/ ___\|  |/ /| __ \ /  _ \  \/  /
 | |
|  *   Jukebox    |    |   (  <_> )  \___|    < | \_\ (  <_> > <  <
 | |
|  *   Firmware   |____|_  /\____/ \___  >__|_ \|___  /\____/__/\_ \
 | |
|  *                     \/            \/     \/    \/            \/
 | |
|  * $Id$
 | |
|  *
 | |
|  * Copyright (C) 2002 Björn Stenberg
 | |
|  *
 | |
|  * This program is free software; you can redistribute it and/or
 | |
|  * modify it under the terms of the GNU General Public License
 | |
|  * as published by the Free Software Foundation; either version 2
 | |
|  * of the License, or (at your option) any later version.
 | |
|  *
 | |
|  * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
 | |
|  * KIND, either express or implied.
 | |
|  *
 | |
|  ****************************************************************************/
 | |
| #include "config.h"
 | |
| #include "system.h"
 | |
| 
 | |
| #include "version.h"
 | |
| #include "gcc_extensions.h"
 | |
| #include "storage.h"
 | |
| #include "disk.h"
 | |
| #include "file_internal.h"
 | |
| #include "lcd.h"
 | |
| #include "rtc.h"
 | |
| #include "debug.h"
 | |
| #include "led.h"
 | |
| #include "../kernel-internal.h"
 | |
| #include "button.h"
 | |
| #include "core_keymap.h"
 | |
| #include "tree.h"
 | |
| #include "filetypes.h"
 | |
| #include "panic.h"
 | |
| #include "menu.h"
 | |
| #include "usb.h"
 | |
| #include "wifi.h"
 | |
| #include "powermgmt.h"
 | |
| #include "adc.h"
 | |
| #include "i2c.h"
 | |
| #ifndef DEBUG
 | |
| #include "serial.h"
 | |
| #endif
 | |
| #include "audio.h"
 | |
| #include "settings.h"
 | |
| #include "backlight.h"
 | |
| #include "status.h"
 | |
| #include "debug_menu.h"
 | |
| #include "font.h"
 | |
| #include "language.h"
 | |
| #include "wps.h"
 | |
| #include "playlist.h"
 | |
| #include "core_alloc.h"
 | |
| #include "rolo.h"
 | |
| #include "screens.h"
 | |
| #include "usb_screen.h"
 | |
| #include "power.h"
 | |
| #include "talk.h"
 | |
| #include "plugin.h"
 | |
| #include "misc.h"
 | |
| #include "dircache.h"
 | |
| #ifdef HAVE_TAGCACHE
 | |
| #include "tagcache.h"
 | |
| #include "tagtree.h"
 | |
| #endif
 | |
| #include "lang.h"
 | |
| #include "string.h"
 | |
| #include "splash.h"
 | |
| #include "eeprom_settings.h"
 | |
| #include "icon.h"
 | |
| #include "viewport.h"
 | |
| #include "skin_engine/skin_engine.h"
 | |
| #include "statusbar-skinned.h"
 | |
| #include "bootchart.h"
 | |
| #include "logdiskf.h"
 | |
| #include "bootdata.h"
 | |
| #if defined(HAVE_DEVICEDATA)
 | |
| #include "devicedata.h"
 | |
| #endif
 | |
| 
 | |
| #if (CONFIG_PLATFORM & PLATFORM_ANDROID)
 | |
| #include "notification.h"
 | |
| #endif
 | |
| #include "shortcuts.h"
 | |
| 
 | |
| #ifdef IPOD_ACCESSORY_PROTOCOL
 | |
| #include "iap.h"
 | |
| #endif
 | |
| 
 | |
| #include "audio_thread.h"
 | |
| #include "playback.h"
 | |
| #include "tdspeed.h"
 | |
| #if defined(HAVE_RECORDING) && !defined(SIMULATOR)
 | |
| #include "pcm_record.h"
 | |
| #endif
 | |
| 
 | |
| #ifdef BUTTON_REC
 | |
|     #define SETTINGS_RESET BUTTON_REC
 | |
| #elif (CONFIG_KEYPAD == GIGABEAT_PAD)
 | |
|     #define SETTINGS_RESET BUTTON_A
 | |
| #endif
 | |
| 
 | |
| #if CONFIG_TUNER
 | |
| #include "radio.h"
 | |
| #endif
 | |
| #if (CONFIG_STORAGE & STORAGE_MMC)
 | |
| #include "ata_mmc.h"
 | |
| #endif
 | |
| 
 | |
| #ifdef HAVE_REMOTE_LCD
 | |
| #include "lcd-remote.h"
 | |
| #endif
 | |
| 
 | |
| #if CONFIG_USBOTG == USBOTG_ISP1362
 | |
| #include "isp1362.h"
 | |
| #endif
 | |
| 
 | |
| #if CONFIG_USBOTG == USBOTG_M5636
 | |
| #include "m5636.h"
 | |
| #endif
 | |
| 
 | |
| #ifdef HAVE_HARDWARE_CLICK
 | |
| #include "piezo.h"
 | |
| #endif
 | |
| 
 | |
| #if (CONFIG_PLATFORM & PLATFORM_NATIVE)
 | |
| #define MAIN_NORETURN_ATTR NORETURN_ATTR
 | |
| #else
 | |
| /* gcc adds an implicit 'return 0;' at the end of main(), causing a warning
 | |
|  * with noreturn attribute */
 | |
| #define MAIN_NORETURN_ATTR
 | |
| #endif
 | |
| 
 | |
| #if (CONFIG_PLATFORM & PLATFORM_HOSTED)
 | |
| #ifdef HAVE_MULTIVOLUME
 | |
| #include "pathfuncs.h" /* for init_volume_names */
 | |
| #endif
 | |
| #endif
 | |
| 
 | |
| #if (CONFIG_PLATFORM & (PLATFORM_SDL|PLATFORM_MAEMO|PLATFORM_PANDORA))
 | |
| #ifdef SIMULATOR
 | |
| #include "sim_tasks.h"
 | |
| #endif
 | |
| #include "system-sdl.h"
 | |
| #define HAVE_ARGV_MAIN
 | |
| /* Don't use SDL_main on windows -> no more stdio redirection */
 | |
| #if defined(WIN32)
 | |
| #undef main
 | |
| #endif
 | |
| #endif /* SDL|MAEMO|PAMDORA */
 | |
| 
 | |
| /*#define AUTOROCK*/ /* define this to check for "autostart.rock" on boot */
 | |
| 
 | |
| static void init(void);
 | |
| /* main(), and various functions called by main() and init() may be
 | |
|  * be INIT_ATTR. These functions must not be called after the final call
 | |
|  * to root_menu() at the end of main()
 | |
|  * see definition of INIT_ATTR in config.h */
 | |
| #ifdef HAVE_ARGV_MAIN
 | |
| int main(int argc, char *argv[]) INIT_ATTR MAIN_NORETURN_ATTR ;
 | |
| int main(int argc, char *argv[])
 | |
| {
 | |
|     sys_handle_argv(argc, argv);
 | |
| #else
 | |
| int main(void) INIT_ATTR MAIN_NORETURN_ATTR;
 | |
| int main(void)
 | |
| {
 | |
| #endif
 | |
|     CHART(">init");
 | |
|     init();
 | |
|     CHART("<init");
 | |
|     FOR_NB_SCREENS(i)
 | |
|     {
 | |
|         screens[i].clear_display();
 | |
|         screens[i].update();
 | |
|     }
 | |
|     list_init();
 | |
|     tree_init();
 | |
| #if defined(HAVE_DEVICEDATA) && !defined(BOOTLOADER) /* SIMULATOR */
 | |
|     verify_device_data();
 | |
| #endif
 | |
|     /* Keep the order of this 3
 | |
|      * Must be done before any code uses the multi-screen API */
 | |
| #ifdef HAVE_USBSTACK
 | |
|     /* All threads should be created and public queues registered by now */
 | |
|     usb_start_monitoring();
 | |
| #endif
 | |
| 
 | |
| #if !defined(DISABLE_ACTION_REMAP) && defined(CORE_KEYREMAP_FILE)
 | |
|     if (file_exists(CORE_KEYREMAP_FILE))
 | |
|     {
 | |
|         int mapct = core_load_key_remap(CORE_KEYREMAP_FILE);
 | |
|         if (mapct <= 0)
 | |
|             splashf(HZ, "key remap failed: %d,  %s", mapct, CORE_KEYREMAP_FILE);
 | |
|     }
 | |
| #endif
 | |
| 
 | |
| #if !defined(BOOTLOADER)
 | |
|     allocate_playback_log();
 | |
|     if (!file_exists(ROCKBOX_DIR"/playername.txt"))
 | |
|     {
 | |
|         int fd = open(ROCKBOX_DIR"/playername.txt", O_CREAT|O_WRONLY|O_TRUNC, 0666);
 | |
|         if(fd >= 0)
 | |
|         {
 | |
|             fdprintf(fd, "%s", MODEL_NAME);
 | |
|             close(fd);
 | |
|         }
 | |
|     }
 | |
| #endif
 | |
| 
 | |
| #ifdef AUTOROCK
 | |
|     {
 | |
|         char filename[MAX_PATH];
 | |
|         const char *file =
 | |
| #ifdef APPLICATION
 | |
|                                 ROCKBOX_DIR
 | |
| #else
 | |
|                                 PLUGIN_APPS_DIR
 | |
| #endif
 | |
|                                     "/autostart.rock";
 | |
|         if(file_exists(file)) /* no complaint if it doesn't exist */
 | |
|         {
 | |
|             plugin_load(file, NULL); /* start if it does */
 | |
|         }
 | |
|     }
 | |
| #endif /* #ifdef AUTOROCK */
 | |
| 
 | |
|     global_status.last_volume_change = 0;
 | |
|     /* no calls INIT_ATTR functions after this point anymore!
 | |
|      * see definition of INIT_ATTR in config.h */
 | |
|     CHART(">root_menu");
 | |
|     root_menu();
 | |
| }
 | |
| 
 | |
| /* The disk isn't ready at boot, rblogo is stored in bin and erased after boot */
 | |
| int show_logo_boot( void ) INIT_ATTR;
 | |
| int show_logo_boot( void )
 | |
| {
 | |
|     unsigned char version[32];
 | |
|     int font_h, ver_w;
 | |
|     snprintf(version, sizeof(version), "Ver. %s", rbversion);
 | |
|     ver_w = font_getstringsize(version, NULL, &font_h, FONT_SYSFIXED);
 | |
|     lcd_clear_display();
 | |
|     lcd_setfont(FONT_SYSFIXED);
 | |
| #if defined(SANSA_CLIP) || defined(SANSA_CLIPV2) || defined(SANSA_CLIPPLUS)
 | |
|     /* display the logo in the blue area of the screen (bottom 48 pixels) */
 | |
|     if (ver_w > LCD_WIDTH)
 | |
|         lcd_putsxy(0, 0, rbversion);
 | |
|     else
 | |
|         lcd_putsxy((LCD_WIDTH/2) - (ver_w/2), 0, version);
 | |
|     lcd_bmp(&bm_rockboxlogo, (LCD_WIDTH - BMPWIDTH_rockboxlogo) / 2, 16);
 | |
| #else
 | |
|     lcd_bmp(&bm_rockboxlogo, (LCD_WIDTH - BMPWIDTH_rockboxlogo) / 2, 10);
 | |
|     if (ver_w > LCD_WIDTH)
 | |
|         lcd_putsxy(0, LCD_HEIGHT-font_h, rbversion);
 | |
|     else
 | |
|         lcd_putsxy((LCD_WIDTH/2) - (ver_w/2), LCD_HEIGHT-font_h, version);
 | |
| #endif
 | |
|     lcd_setfont(FONT_UI);
 | |
|     lcd_update();
 | |
| #ifdef HAVE_REMOTE_LCD
 | |
|     lcd_remote_clear_display();
 | |
|     lcd_remote_bmp(&bm_remote_rockboxlogo, 0, 10);
 | |
|     lcd_remote_setfont(FONT_SYSFIXED);
 | |
|     if (ver_w > LCD_REMOTE_WIDTH)
 | |
|         lcd_remote_putsxy(0, LCD_REMOTE_HEIGHT-font_h, rbversion);
 | |
|     else
 | |
|         lcd_remote_putsxy((LCD_REMOTE_WIDTH/2) - (ver_w/2),
 | |
|                       LCD_REMOTE_HEIGHT-font_h, version);
 | |
|     lcd_remote_setfont(FONT_UI);
 | |
|     lcd_remote_update();
 | |
| #endif
 | |
| #ifdef SIMULATOR
 | |
|     sleep(HZ); /* sim is too fast to see logo */
 | |
| #endif
 | |
|     return 0;
 | |
| }
 | |
| 
 | |
| #ifdef HAVE_DIRCACHE
 | |
| static int INIT_ATTR init_dircache(bool preinit)
 | |
| {
 | |
|     if (preinit)
 | |
|         dircache_init(MAX(global_status.dircache_size, 0));
 | |
| 
 | |
|     if (!global_settings.dircache)
 | |
|         return -1;
 | |
| 
 | |
|     int result = -1;
 | |
| 
 | |
| #ifdef HAVE_EEPROM_SETTINGS
 | |
|     if (firmware_settings.initialized &&
 | |
|         firmware_settings.disk_clean &&
 | |
|         preinit)
 | |
|     {
 | |
|         result = dircache_load();
 | |
|         if (result < 0)
 | |
|             firmware_settings.disk_clean = false;
 | |
|     }
 | |
|     else
 | |
| #endif /* HAVE_EEPROM_SETTINGS */
 | |
|     if (!preinit)
 | |
|     {
 | |
|         result = dircache_enable();
 | |
|         if (result != 0)
 | |
|         {
 | |
|             if (result > 0)
 | |
|             {
 | |
|                 /* Print "Scanning disk..." to the display. */
 | |
|                 splash(0, str(LANG_SCANNING_DISK));
 | |
|                 dircache_wait();
 | |
|                 backlight_on();
 | |
|                 show_logo_boot();
 | |
|             }
 | |
| 
 | |
|             struct dircache_info info;
 | |
|             dircache_get_info(&info);
 | |
|             global_status.dircache_size = info.size;
 | |
|             status_save(true);
 | |
|         }
 | |
|         /* else don't wait or already enabled by load */
 | |
|     }
 | |
| 
 | |
|     return result;
 | |
| }
 | |
| #endif /* HAVE_DIRCACHE */
 | |
| 
 | |
| #ifdef HAVE_TAGCACHE
 | |
| static void init_tagcache(void) INIT_ATTR;
 | |
| static void init_tagcache(void)
 | |
| {
 | |
|     bool clear = false;
 | |
| #if 0
 | |
|     long talked_tick = 0;
 | |
| #endif
 | |
|     tagcache_init();
 | |
| 
 | |
|     while (!tagcache_is_initialized())
 | |
|     {
 | |
|         int ret = tagcache_get_commit_step();
 | |
| 
 | |
|         if (ret > 0)
 | |
|         {
 | |
| #if 0 /* FIXME: Audio isn't even initialized yet! */
 | |
|             /* hwcodec can't use voice here, as the database commit
 | |
|              * uses the audio buffer. */
 | |
|             if(global_settings.talk_menu
 | |
|                && (talked_tick == 0
 | |
|                    || TIME_AFTER(current_tick, talked_tick+7*HZ)))
 | |
|             {
 | |
|                 talked_tick = current_tick;
 | |
|                 talk_id(LANG_TAGCACHE_INIT, false);
 | |
|                 talk_number(ret, true);
 | |
|                 talk_id(VOICE_OF, true);
 | |
|                 talk_number(tagcache_get_max_commit_step(), true);
 | |
|             }
 | |
| #endif
 | |
|             if (lang_is_rtl())
 | |
|             {
 | |
|                 splash_progress(ret, tagcache_get_max_commit_step(),
 | |
|                                "[%d/%d] %s", ret, tagcache_get_max_commit_step(),
 | |
|                                str(LANG_TAGCACHE_INIT));
 | |
|             }
 | |
|             else
 | |
|             {
 | |
|                 splash_progress(ret, tagcache_get_max_commit_step(),
 | |
|                                 "%s [%d/%d]", str(LANG_TAGCACHE_INIT), ret,
 | |
|                                 tagcache_get_max_commit_step());
 | |
|             }
 | |
|             clear = true;
 | |
|         }
 | |
|         sleep(HZ/4);
 | |
|     }
 | |
|     tagtree_init();
 | |
| 
 | |
|     if (clear)
 | |
|     {
 | |
|         backlight_on();
 | |
|         show_logo_boot();
 | |
|     }
 | |
| }
 | |
| #endif /* HAVE_TAGCACHE */
 | |
| 
 | |
| #if (CONFIG_PLATFORM & PLATFORM_HOSTED)
 | |
| 
 | |
| static void init(void)
 | |
| {
 | |
|     system_init();
 | |
|     core_allocator_init();
 | |
|     kernel_init();
 | |
| #ifdef APPLICATION
 | |
|     paths_init();
 | |
| #endif
 | |
|     enable_irq();
 | |
|     lcd_init();
 | |
| #ifdef HAVE_REMOTE_LCD
 | |
|     lcd_remote_init();
 | |
| #endif
 | |
|     FOR_NB_SCREENS(i)
 | |
|         global_status.font_id[i] = FONT_SYSFIXED;
 | |
|     font_init();
 | |
|     show_logo_boot();
 | |
|     button_init();
 | |
|     powermgmt_init();
 | |
|     backlight_init();
 | |
|     unicode_init();
 | |
| #ifdef HAVE_MULTIVOLUME
 | |
|     init_volume_names();
 | |
| #endif
 | |
| #ifdef SIMULATOR
 | |
|     sim_tasks_init();
 | |
| #endif
 | |
| #if (CONFIG_PLATFORM & PLATFORM_ANDROID)
 | |
|     notification_init();
 | |
| #endif
 | |
|     lang_init(core_language_builtin, language_strings,
 | |
|               LANG_LAST_INDEX_IN_ARRAY);
 | |
| #ifdef DEBUG
 | |
|     debug_init();
 | |
| #endif
 | |
| #if CONFIG_TUNER
 | |
|     radio_init();
 | |
| #endif
 | |
|     /* Keep the order of this 3 (viewportmanager handles statusbars)
 | |
|      * Must be done before any code uses the multi-screen API */
 | |
|     gui_syncstatusbar_init(&statusbars);
 | |
|     gui_sync_skin_init();
 | |
|     sb_skin_init();
 | |
|     viewportmanager_init();
 | |
| 
 | |
|     storage_init();
 | |
|     pcm_init();
 | |
|     dsp_init();
 | |
|     settings_reset();
 | |
|     settings_load();
 | |
|     settings_apply(true);
 | |
|     init_battery_tables();
 | |
| #ifdef HAVE_DIRCACHE
 | |
|     init_dircache(true);
 | |
|     init_dircache(false);
 | |
| #endif
 | |
| #ifdef HAVE_TAGCACHE
 | |
|     init_tagcache();
 | |
| #endif
 | |
|     tree_mem_init();
 | |
|     filetype_init();
 | |
|     playlist_init();
 | |
|     shortcuts_init();
 | |
| 
 | |
|     audio_init();
 | |
|     talk_announce_voice_invalid(); /* notify user w/ voice prompt if voice file invalid */
 | |
|     settings_apply_skins();
 | |
| 
 | |
| /* do USB last so prompt (if enabled) can work correctly if USB was inserted with device off,
 | |
|  * also doesn't hurt that it will display the nice pretty backdrop this way too. */
 | |
| #ifndef USB_NONE
 | |
|     usb_init();
 | |
|     usb_start_monitoring();
 | |
| #endif
 | |
| }
 | |
| 
 | |
| #else /* ! (CONFIG_PLATFORM & PLATFORM_HOSTED) */
 | |
| 
 | |
| #include "errno.h"
 | |
| 
 | |
| static void init(void) INIT_ATTR;
 | |
| static void init(void)
 | |
| {
 | |
|     int rc;
 | |
|     bool mounted = false;
 | |
| 
 | |
|     system_init();
 | |
|     core_allocator_init();
 | |
|     kernel_init();
 | |
| 
 | |
| #if defined(HAVE_BOOTDATA) && !defined(BOOTLOADER)
 | |
|     verify_boot_data();
 | |
| #endif
 | |
| 
 | |
| #if defined(HAVE_DEVICEDATA) && !defined(BOOTLOADER)
 | |
|     verify_device_data();
 | |
| #endif
 | |
| 
 | |
|     /* early early early! */
 | |
|     filesystem_init();
 | |
| 
 | |
| #ifdef HAVE_ADJUSTABLE_CPU_FREQ
 | |
|     set_cpu_frequency(CPUFREQ_NORMAL);
 | |
| #ifdef CPU_COLDFIRE
 | |
|     coldfire_set_pllcr_audio_bits(DEFAULT_PLLCR_AUDIO_BITS);
 | |
| #endif
 | |
|     cpu_boost(true);
 | |
| #endif
 | |
| 
 | |
|     i2c_init();
 | |
| 
 | |
|     power_init();
 | |
| 
 | |
|     enable_irq();
 | |
| #if defined(CPU_ARM_CLASSIC)
 | |
|     enable_fiq();
 | |
| #endif
 | |
|     /* current_tick should be ticking by now */
 | |
|     CHART("ticking");
 | |
| 
 | |
|     unicode_init();
 | |
|     lcd_init();
 | |
| #ifdef HAVE_REMOTE_LCD
 | |
|     lcd_remote_init();
 | |
| #endif
 | |
|     FOR_NB_SCREENS(i)
 | |
|         global_status.font_id[i] = FONT_SYSFIXED;
 | |
|     font_init();
 | |
| 
 | |
|     settings_reset();
 | |
| 
 | |
|     CHART(">show_logo");
 | |
|     show_logo_boot();
 | |
|     CHART("<show_logo");
 | |
|     lang_init(core_language_builtin, language_strings,
 | |
|               LANG_LAST_INDEX_IN_ARRAY);
 | |
| 
 | |
| #ifdef DEBUG
 | |
|     debug_init();
 | |
| #else
 | |
| #ifdef HAVE_SERIAL
 | |
|     serial_setup();
 | |
| #endif
 | |
| #endif
 | |
| 
 | |
| #if CONFIG_RTC
 | |
|     rtc_init();
 | |
| #endif
 | |
| 
 | |
|     adc_init();
 | |
| 
 | |
|     usb_init();
 | |
| #if CONFIG_USBOTG == USBOTG_ISP1362
 | |
|     isp1362_init();
 | |
| #elif CONFIG_USBOTG == USBOTG_M5636
 | |
|     m5636_init();
 | |
| #endif
 | |
| 
 | |
|     backlight_init();
 | |
| 
 | |
|     button_init();
 | |
| 
 | |
|     /* Don't initialize power management here if it could incorrectly
 | |
|      * measure battery voltage, and it's not needed for charging. */
 | |
| #if !defined(NEED_ATA_POWER_BATT_MEASURE) || \
 | |
|     (CONFIG_CHARGING > CHARGING_MONITOR)
 | |
|     powermgmt_init();
 | |
| #endif
 | |
| 
 | |
| #if CONFIG_TUNER
 | |
|     radio_init();
 | |
| #endif
 | |
| 
 | |
| #ifdef HAVE_HARDWARE_CLICK
 | |
|     piezo_init();
 | |
| #endif
 | |
| 
 | |
|     /* Keep the order of this 3 (viewportmanager handles statusbars)
 | |
|      * Must be done before any code uses the multi-screen API */
 | |
|     CHART(">gui_syncstatusbar_init");
 | |
|     gui_syncstatusbar_init(&statusbars);
 | |
|     CHART("<gui_syncstatusbar_init");
 | |
|     CHART(">sb_skin_init");
 | |
|     sb_skin_init();
 | |
|     CHART("<sb_skin_init");
 | |
|     CHART(">gui_sync_wps_init");
 | |
|     gui_sync_skin_init();
 | |
|     CHART("<gui_sync_wps_init");
 | |
|     CHART(">viewportmanager_init");
 | |
|     viewportmanager_init();
 | |
|     CHART("<viewportmanager_init");
 | |
| 
 | |
|     CHART(">storage_init");
 | |
|     rc = storage_init();
 | |
|     CHART("<storage_init");
 | |
|     if(rc)
 | |
|     {
 | |
|         lcd_clear_display();
 | |
|         lcd_putsf(0, 1, "ATA error: %d", rc);
 | |
|         lcd_puts(0, 3, "Press button to debug");
 | |
|         lcd_update();
 | |
|         while(!(button_get(true) & BUTTON_REL)); /* DO NOT CHANGE TO ACTION SYSTEM */
 | |
|         dbg_ports();
 | |
|         panicf("ata: %d", rc);
 | |
|     }
 | |
| 
 | |
| #if defined(NEED_ATA_POWER_BATT_MEASURE) && \
 | |
|     (CONFIG_CHARGING <= CHARGING_MONITOR)
 | |
|     /* After storage_init(), ATA power must be on, so battery voltage
 | |
|      * can be measured. Initialize power management if it was delayed. */
 | |
|     powermgmt_init();
 | |
| #endif
 | |
| #ifdef HAVE_EEPROM_SETTINGS
 | |
|     CHART(">eeprom_settings_init");
 | |
|     eeprom_settings_init();
 | |
|     CHART("<eeprom_settings_init");
 | |
| #endif
 | |
| 
 | |
| #ifndef HAVE_USBSTACK
 | |
|     usb_start_monitoring();
 | |
|     while (usb_detect() == USB_INSERTED)
 | |
|     {
 | |
| #ifdef HAVE_EEPROM_SETTINGS
 | |
|         firmware_settings.disk_clean = false;
 | |
| #endif
 | |
|         /* enter USB mode early, before trying to mount */
 | |
|         if (button_get_w_tmo(HZ/10) == SYS_USB_CONNECTED)
 | |
| #if (CONFIG_STORAGE & STORAGE_MMC)
 | |
|             if (!mmc_touched() ||
 | |
|                 (mmc_remove_request() == SYS_HOTSWAP_EXTRACTED))
 | |
| #endif
 | |
|             {
 | |
|                 gui_usb_screen_run(true);
 | |
|                 mounted = true; /* mounting done @ end of USB mode */
 | |
|             }
 | |
| #ifdef HAVE_USB_POWER
 | |
|         /* if there is no host or user requested no USB, skip this */
 | |
|         if (usb_powered_only())
 | |
|             break;
 | |
| #endif
 | |
|     }
 | |
| #endif
 | |
| 
 | |
|     if (!mounted)
 | |
|     {
 | |
|         CHART(">disk_mount_all");
 | |
|         rc = disk_mount_all();
 | |
|         CHART("<disk_mount_all");
 | |
|         if (rc<=0)
 | |
|         {
 | |
|             int line=0;
 | |
|             lcd_clear_display();
 | |
|             lcd_putsf(0, line++, "No partition found (%d).", rc);
 | |
| #ifndef USB_NONE
 | |
|             lcd_puts(0, line++, "Insert USB cable");
 | |
|             lcd_puts(0, line++, "and fix it.");
 | |
| #elif !defined(DEBUG) && !(CONFIG_STORAGE & STORAGE_RAMDISK)
 | |
|             lcd_puts(0, line++, "Rebooting in 5s");
 | |
| #endif
 | |
|             lcd_puts(0, line++, rbversion);
 | |
| 
 | |
|             struct partinfo pinfo;
 | |
|             for (int i = 0 ; i < NUM_VOLUMES ; i++) {
 | |
|                 disk_partinfo(i, &pinfo);
 | |
|                 if (pinfo.type)
 | |
|                     lcd_putsf(0, line++, "P%d T%02x S%08lx",
 | |
|                               i, pinfo.type, pinfo.size);
 | |
|             }
 | |
|             lcd_update();
 | |
| 
 | |
| #if defined(MAX_VIRT_SECTOR_SIZE) && defined(DEFAULT_VIRT_SECTOR_SIZE)
 | |
| #ifdef HAVE_MULTIDRIVE
 | |
|             for (int i = 0 ; i < NUM_DRIVES ; i++)
 | |
| #endif
 | |
|                 disk_set_sector_multiplier(IF_MD(i,) DEFAULT_VIRT_SECTOR_SIZE/SECTOR_SIZE);
 | |
| #endif
 | |
| 
 | |
| #ifndef USB_NONE
 | |
|             usb_start_monitoring();
 | |
|             while(button_get(true) != SYS_USB_CONNECTED) {};
 | |
|             gui_usb_screen_run(true);
 | |
| #elif !defined(DEBUG) && !(CONFIG_STORAGE & STORAGE_RAMDISK)
 | |
|             sleep(HZ*5);
 | |
| #endif
 | |
| 
 | |
| #if !defined(DEBUG) && !(CONFIG_STORAGE & STORAGE_RAMDISK)
 | |
|             system_reboot();
 | |
| #else
 | |
|             rc = disk_mount_all();
 | |
|             if (rc <= 0) {
 | |
|                 lcd_putsf(0, 4, "Error mounting: %08x", rc);
 | |
|                 lcd_update();
 | |
|                 sleep(HZ*5);
 | |
|                 system_reboot();
 | |
|             }
 | |
| #endif
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     pcm_init();
 | |
|     dsp_init();
 | |
| 
 | |
|     CHART(">settings_load");
 | |
|     settings_load();
 | |
|     CHART("<settings_load");
 | |
| 
 | |
| #if defined(BUTTON_REC) || \
 | |
|     (CONFIG_KEYPAD == GIGABEAT_PAD) || \
 | |
|     (CONFIG_KEYPAD == IPOD_4G_PAD) || \
 | |
|     (CONFIG_KEYPAD == IRIVER_H10_PAD)
 | |
|     if (global_settings.clear_settings_on_hold &&
 | |
| #ifdef SETTINGS_RESET
 | |
|     /* Reset settings if holding the reset button. (Rec on Archos,
 | |
|        A on Gigabeat) */
 | |
|     ((button_status() & SETTINGS_RESET) == SETTINGS_RESET))
 | |
| #else
 | |
|     /* Reset settings if the hold button is turned on */
 | |
|     (button_hold()))
 | |
| #endif
 | |
|     {
 | |
|         splash(HZ*2, str(LANG_RESET_DONE_CLEAR));
 | |
|         settings_reset();
 | |
|     }
 | |
| #endif
 | |
|     CHART(">init_battery_tables");
 | |
|     init_battery_tables();
 | |
|     CHART("<init_battery_tables");
 | |
| #ifdef HAVE_DIRCACHE
 | |
|     CHART(">init_dircache(true)");
 | |
|     rc = init_dircache(true);
 | |
|     CHART("<init_dircache(true)");
 | |
| #ifdef HAVE_TAGCACHE
 | |
|     if (rc < 0)
 | |
|         tagcache_remove_statefile();
 | |
| #endif /* HAVE_TAGCACHE */
 | |
| #endif /* HAVE_DIRCACHE */
 | |
| 
 | |
|     CHART(">settings_apply(true)");
 | |
|     settings_apply(true);
 | |
|     CHART("<settings_apply(true)");
 | |
| #ifdef HAVE_DIRCACHE
 | |
|     CHART(">init_dircache(false)");
 | |
|     init_dircache(false);
 | |
|     CHART("<init_dircache(false)");
 | |
| #endif
 | |
| #ifdef HAVE_TAGCACHE
 | |
|     CHART(">init_tagcache");
 | |
|     init_tagcache();
 | |
|     CHART("<init_tagcache");
 | |
| #endif
 | |
| 
 | |
| #ifdef HAVE_EEPROM_SETTINGS
 | |
|     if (firmware_settings.initialized)
 | |
|     {
 | |
|         /* In case we crash. */
 | |
|         firmware_settings.disk_clean = false;
 | |
|         CHART(">eeprom_settings_store");
 | |
|         eeprom_settings_store();
 | |
|         CHART("<eeprom_settings_store");
 | |
|     }
 | |
| #endif
 | |
|     playlist_init();
 | |
|     tree_mem_init();
 | |
|     filetype_init();
 | |
| 
 | |
|     shortcuts_init();
 | |
| 
 | |
|     CHART(">audio_init");
 | |
|     audio_init();
 | |
|     CHART("<audio_init");
 | |
|     talk_announce_voice_invalid(); /* notify user w/ voice prompt if voice file invalid */
 | |
| 
 | |
| #ifdef HAVE_WIFI
 | |
|     wifi_init();
 | |
| #endif
 | |
| 
 | |
|     /* runtime database has to be initialized after audio_init() */
 | |
|     cpu_boost(false);
 | |
| 
 | |
| #if CONFIG_CHARGING
 | |
|     car_adapter_mode_init();
 | |
| #endif
 | |
| #ifdef IPOD_ACCESSORY_PROTOCOL
 | |
|     iap_setup(global_settings.serial_bitrate);
 | |
| #endif
 | |
| #ifdef HAVE_ACCESSORY_SUPPLY
 | |
|     accessory_supply_set(global_settings.accessory_supply);
 | |
| #endif
 | |
| #ifdef HAVE_LINEOUT_POWEROFF
 | |
|     lineout_set(global_settings.lineout_active);
 | |
| #endif
 | |
| #ifdef HAVE_HOTSWAP_STORAGE_AS_MAIN
 | |
|     CHART("<check_bootfile(false)");
 | |
|     check_bootfile(false); /* remember write time and filesize */
 | |
|     CHART(">check_bootfile(false)");
 | |
| #endif
 | |
|     CHART("<settings_apply_skins");
 | |
|     settings_apply_skins();
 | |
|     CHART(">settings_apply_skins");
 | |
| }
 | |
| 
 | |
| #ifdef CPU_PP
 | |
| void cop_main(void) MAIN_NORETURN_ATTR;
 | |
| void cop_main(void)
 | |
| {
 | |
| /* This is the entry point for the coprocessor
 | |
|    Anyone not running an upgraded bootloader will never reach this point,
 | |
|    so it should not be assumed that the coprocessor be usable even on
 | |
|    platforms which support it.
 | |
| 
 | |
|    A kernel thread is initially setup on the coprocessor and immediately
 | |
|    destroyed for purposes of continuity. The cop sits idle until at least
 | |
|    one thread exists on it. */
 | |
| 
 | |
| #if NUM_CORES > 1
 | |
|     system_init();
 | |
|     kernel_init();
 | |
|     /* This should never be reached */
 | |
| #endif
 | |
|     while(1) {
 | |
|         sleep_core(COP);
 | |
|     }
 | |
| }
 | |
| #endif /* CPU_PP */
 | |
| 
 | |
| #endif /* CONFIG_PLATFORM & PLATFORM_HOSTED */
 |