summaryrefslogtreecommitdiffstats
path: root/bootloader
diff options
context:
space:
mode:
authorAmaury Pouly <pamaury@rockbox.org>2011-09-05 11:29:32 +0000
committerAmaury Pouly <pamaury@rockbox.org>2011-09-05 11:29:32 +0000
commit7d4fed53cc1e8b0e5aa250ebea3a1b53fc3a50b2 (patch)
tree236a72d742675715fd599daaa98af8f4eeb45ad8 /bootloader
parent11e1f71612f6c1ef8c17f8ceea17f69fd4bc7b02 (diff)
downloadrockbox-7d4fed53cc1e8b0e5aa250ebea3a1b53fc3a50b2.tar.gz
rockbox-7d4fed53cc1e8b0e5aa250ebea3a1b53fc3a50b2.tar.bz2
rockbox-7d4fed53cc1e8b0e5aa250ebea3a1b53fc3a50b2.zip
imx233:fuze+: major memory and usb rework
- now identity map dram uncached and have a cached and buffered virtual alias - rework dma to handle virtual to physical pointers conversion - fix lcd frame pointer - implement usb detection properly - implement bootloader usb properly - allow the bootloader to disable MMC windowing (useful for recovery) git-svn-id: svn://svn.rockbox.org/rockbox/trunk@30432 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'bootloader')
-rw-r--r--bootloader/imx233.c96
1 files changed, 80 insertions, 16 deletions
diff --git a/bootloader/imx233.c b/bootloader/imx233.c
index f6c5ad9cf4..b160c79702 100644
--- a/bootloader/imx233.c
+++ b/bootloader/imx233.c
@@ -39,6 +39,69 @@
#include "fmradio_i2c.h"
#include "usb.h"
+#include "usb-target.h"
+
+#include "clkctrl-imx233.h"
+
+#ifdef HAVE_BOOTLOADER_USB_MODE
+static void usb_mode(int connect_timeout)
+{
+ int button;
+
+ usb_init();
+ usb_start_monitoring();
+
+ /* Wait for threads to connect or cable is pulled */
+ printf("USB: Connecting");
+
+ long end_tick = current_tick + connect_timeout;
+
+ while(1)
+ {
+ button = button_get_w_tmo(HZ/10);
+
+ if(button == SYS_USB_CONNECTED)
+ break; /* Hit */
+
+ if(TIME_AFTER(current_tick, end_tick))
+ {
+ /* Timed out waiting for the connect - will happen when connected
+ * to a charger through the USB port */
+ printf("USB: Timed out");
+ break;
+ }
+
+ if(!usb_plugged())
+ break; /* Cable pulled */
+ }
+
+ if(button == SYS_USB_CONNECTED)
+ {
+ /* Got the message - wait for disconnect */
+ printf("Bootloader USB mode");
+
+ usb_acknowledge(SYS_USB_CONNECTED_ACK);
+
+ while(1)
+ {
+ button = button_get_w_tmo(HZ/2);
+ if(button == SYS_USB_DISCONNECTED)
+ break;
+ }
+ }
+
+ /* Put drivers initialized for USB connection into a known state */
+ usb_close();
+
+ system_exception_wait();
+ power_off();
+}
+#else /* !HAVE_BOOTLOADER_USB_MODE */
+static void usb_mode(int connect_timeout)
+{
+ (void) connect_timeout;
+}
+#endif /* HAVE_BOOTLOADER_USB_MODE */
void main(uint32_t arg) NORETURN_ATTR;
void main(uint32_t arg)
@@ -51,6 +114,7 @@ void main(uint32_t arg)
system_init();
kernel_init();
+ power_init();
enable_irq();
lcd_init();
@@ -59,32 +123,32 @@ void main(uint32_t arg)
backlight_init();
- button_init_device();
+ button_init();
//button_debug_screen();
- printf("arg=%c%c%c%c", arg >> 24,
- (arg >> 16) & 0xff, (arg >> 8) & 0xff, (arg & 0xff));
+ printf("arg=%x", arg);
+
+#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);
- #ifdef HAVE_BOOTLOADER_USB_MODE
- usb_init();
- usb_core_enable_driver(USB_DRIVER_SERIAL, true);
- usb_attach();
- while(!(button_read_device() & BUTTON_POWER))
- yield();
- power_off();
- #endif /* HAVE_BOOTLOADER_USB_MODE */
+ if(usb_plugged())
+ usb_mode(HZ * 2);
while(!disk_init(IF_MV(0)))
- panicf("disk_init failed!");
+ printf("disk_init failed!");
- while((ret = disk_mount_all()) <= 0)
- {
- error(EDISK, ret, true);
- }
+ if((ret = disk_mount_all()) <= 0)
+ error(EDISK, ret, false);
if(button_read_device() & BUTTON_VOL_UP)
printf("Booting from SD card required.");