summaryrefslogtreecommitdiff
path: root/bootloader/imx233.c
diff options
context:
space:
mode:
Diffstat (limited to 'bootloader/imx233.c')
-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 @@
39#include "fmradio_i2c.h" 39#include "fmradio_i2c.h"
40 40
41#include "usb.h" 41#include "usb.h"
42#include "usb-target.h"
43
44#include "clkctrl-imx233.h"
45
46#ifdef HAVE_BOOTLOADER_USB_MODE
47static void usb_mode(int connect_timeout)
48{
49 int button;
50
51 usb_init();
52 usb_start_monitoring();
53
54 /* Wait for threads to connect or cable is pulled */
55 printf("USB: Connecting");
56
57 long end_tick = current_tick + connect_timeout;
58
59 while(1)
60 {
61 button = button_get_w_tmo(HZ/10);
62
63 if(button == SYS_USB_CONNECTED)
64 break; /* Hit */
65
66 if(TIME_AFTER(current_tick, end_tick))
67 {
68 /* Timed out waiting for the connect - will happen when connected
69 * to a charger through the USB port */
70 printf("USB: Timed out");
71 break;
72 }
73
74 if(!usb_plugged())
75 break; /* Cable pulled */
76 }
77
78 if(button == SYS_USB_CONNECTED)
79 {
80 /* Got the message - wait for disconnect */
81 printf("Bootloader USB mode");
82
83 usb_acknowledge(SYS_USB_CONNECTED_ACK);
84
85 while(1)
86 {
87 button = button_get_w_tmo(HZ/2);
88 if(button == SYS_USB_DISCONNECTED)
89 break;
90 }
91 }
92
93 /* Put drivers initialized for USB connection into a known state */
94 usb_close();
95
96 system_exception_wait();
97 power_off();
98}
99#else /* !HAVE_BOOTLOADER_USB_MODE */
100static void usb_mode(int connect_timeout)
101{
102 (void) connect_timeout;
103}
104#endif /* HAVE_BOOTLOADER_USB_MODE */
42 105
43void main(uint32_t arg) NORETURN_ATTR; 106void main(uint32_t arg) NORETURN_ATTR;
44void main(uint32_t arg) 107void main(uint32_t arg)
@@ -51,6 +114,7 @@ void main(uint32_t arg)
51 system_init(); 114 system_init();
52 kernel_init(); 115 kernel_init();
53 116
117 power_init();
54 enable_irq(); 118 enable_irq();
55 119
56 lcd_init(); 120 lcd_init();
@@ -59,32 +123,32 @@ void main(uint32_t arg)
59 123
60 backlight_init(); 124 backlight_init();
61 125
62 button_init_device(); 126 button_init();
63 127
64 //button_debug_screen(); 128 //button_debug_screen();
65 printf("arg=%c%c%c%c", arg >> 24, 129 printf("arg=%x", arg);
66 (arg >> 16) & 0xff, (arg >> 8) & 0xff, (arg & 0xff)); 130
131#ifdef SANSA_FUZEPLUS
132 extern void imx233_mmc_disable_window(void);
133 if(arg == 0xfee1dead)
134 {
135 printf("Disable MMC window.");
136 imx233_mmc_disable_window();
137 }
138#endif
67 139
68 ret = storage_init(); 140 ret = storage_init();
69 if(ret < 0) 141 if(ret < 0)
70 error(EATA, ret, true); 142 error(EATA, ret, true);
71 143
72 #ifdef HAVE_BOOTLOADER_USB_MODE 144 if(usb_plugged())
73 usb_init(); 145 usb_mode(HZ * 2);
74 usb_core_enable_driver(USB_DRIVER_SERIAL, true);
75 usb_attach();
76 while(!(button_read_device() & BUTTON_POWER))
77 yield();
78 power_off();
79 #endif /* HAVE_BOOTLOADER_USB_MODE */
80 146
81 while(!disk_init(IF_MV(0))) 147 while(!disk_init(IF_MV(0)))
82 panicf("disk_init failed!"); 148 printf("disk_init failed!");
83 149
84 while((ret = disk_mount_all()) <= 0) 150 if((ret = disk_mount_all()) <= 0)
85 { 151 error(EDISK, ret, false);
86 error(EDISK, ret, true);
87 }
88 152
89 if(button_read_device() & BUTTON_VOL_UP) 153 if(button_read_device() & BUTTON_VOL_UP)
90 printf("Booting from SD card required."); 154 printf("Booting from SD card required.");