diff options
Diffstat (limited to 'bootloader/imx233.c')
-rw-r--r-- | bootloader/imx233.c | 96 |
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 | ||
47 | static 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 */ | ||
100 | static void usb_mode(int connect_timeout) | ||
101 | { | ||
102 | (void) connect_timeout; | ||
103 | } | ||
104 | #endif /* HAVE_BOOTLOADER_USB_MODE */ | ||
42 | 105 | ||
43 | void main(uint32_t arg) NORETURN_ATTR; | 106 | void main(uint32_t arg) NORETURN_ATTR; |
44 | void main(uint32_t arg) | 107 | void 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."); |