Fix Xduoo X3 bootloader build, and silence all warnings.

Also enable USB bootloader mode

Change-Id: I73224c2e694b9941993c89a114b48d2a907e0dfb
This commit is contained in:
Solomon Peachy 2018-12-29 10:37:47 -05:00
parent 35930ddb8d
commit 7e7ca0c858
4 changed files with 136 additions and 6 deletions

View file

@ -44,6 +44,7 @@
extern void show_logo(void); extern void show_logo(void);
extern void power_off(void); extern void power_off(void);
#ifdef HAVE_BOOTLOADER_USB_MODE
static void show_splash(int timeout, const char *msg) static void show_splash(int timeout, const char *msg)
{ {
reset_screen(); reset_screen();
@ -88,6 +89,7 @@ static void usb_mode(void)
} }
} }
} }
#endif
static int boot_rockbox(void) static int boot_rockbox(void)
{ {
@ -95,11 +97,17 @@ static int boot_rockbox(void)
void (*kernel_entry)(void); void (*kernel_entry)(void);
printf("Mounting disk...\n"); printf("Mounting disk...\n");
rc = disk_mount_all();
if (rc <= 0) while((rc = disk_mount_all()) <= 0)
{ {
verbose = true; verbose = true;
error(EDISK,rc, true); #ifdef HAVE_BOOTLOADER_USB_MODE
error(EDISK, rc, false);
usb_start_monitoring();
usb_mode();
#else
error(EDISK, rc, true);
#endif
} }
printf("Loading firmware...\n"); printf("Loading firmware...\n");
@ -119,6 +127,7 @@ static int boot_rockbox(void)
} }
} }
#if 0
static void reset_configuration(void) static void reset_configuration(void)
{ {
int rc; int rc;
@ -135,6 +144,7 @@ static void reset_configuration(void)
else else
show_splash(HZ/2, "Couldn't reset configuration!"); show_splash(HZ/2, "Couldn't reset configuration!");
} }
#endif
int main(void) int main(void)
{ {
@ -151,8 +161,6 @@ int main(void)
show_logo(); show_logo();
filesystem_init();
rc = storage_init(); rc = storage_init();
if(rc) if(rc)
{ {
@ -160,6 +168,22 @@ int main(void)
error(EATA, rc, true); error(EATA, rc, true);
} }
filesystem_init();
#ifdef HAVE_BOOTLOADER_USB_MODE
button_init_device();
int btn = button_read_device();
usb_init();
/* Enter USB mode if USB is plugged and PLAY button is pressed */
if(btn & BUTTON_PLAY) {
usb_start_monitoring();
if(usb_detect() == USB_INSERTED)
usb_mode();
}
#endif /* HAVE_BOOTLOADER_USB_MODE */
/* Don't mount the disks yet, there could be file system/partition errors /* Don't mount the disks yet, there could be file system/partition errors
which are fixable in USB mode */ which are fixable in USB mode */

View file

@ -163,6 +163,7 @@
/* enable these for the experimental usb stack */ /* enable these for the experimental usb stack */
#define HAVE_USBSTACK #define HAVE_USBSTACK
#define HAVE_BOOTLOADER_USB_MODE
/* Connect by events, not by tick polling */ /* Connect by events, not by tick polling */
#define USB_STATUS_BY_EVENT #define USB_STATUS_BY_EVENT

View file

@ -169,3 +169,106 @@ bool dbg_hw_info(void)
} }
return true; return true;
} }
#define CFG_UART_BASE UART1_BASE /* Base of the UART channel */
void serial_putc (const char c)
{
volatile u8 *uart_lsr = (volatile u8 *)(CFG_UART_BASE + OFF_LSR);
volatile u8 *uart_tdr = (volatile u8 *)(CFG_UART_BASE + OFF_TDR);
if (c == '\n') serial_putc ('\r');
/* Wait for fifo to shift out some bytes */
while ( !((*uart_lsr & (UARTLSR_TDRQ | UARTLSR_TEMT)) == 0x60) );
*uart_tdr = (u8)c;
}
void serial_puts (const char *s)
{
while (*s) {
serial_putc (*s++);
}
}
void serial_putsf(const char *format, ...)
{
static char printfbuf[256];
int len;
unsigned char *ptr;
va_list ap;
va_start(ap, format);
ptr = printfbuf;
len = vsnprintf(ptr, sizeof(printfbuf), format, ap);
va_end(ap);
(void)len;
serial_puts(ptr);
serial_putc('\n');
}
void serial_put_hex(unsigned int d)
{
char c[12];
int i;
for(i = 0; i < 8;i++)
{
c[i] = (d >> ((7 - i) * 4)) & 0xf;
if(c[i] < 10)
c[i] += 0x30;
else
c[i] += (0x41 - 10);
}
c[8] = '\n';
c[9] = 0;
serial_puts(c);
}
void serial_put_dec(unsigned int d)
{
char c[16];
int i;
int j = 0;
int x = d;
while (x /= 10)
j++;
for (i = j; i >= 0; i--) {
c[i] = d % 10;
c[i] += 0x30;
d /= 10;
}
c[j + 1] = '\n';
c[j + 2] = 0;
serial_puts(c);
}
void serial_dump_data(unsigned char* data, int len)
{
int i;
for(i=0; i<len; i++)
{
unsigned char a = ((*data)>>4) & 0xf;
if(a < 10)
a += 0x30;
else
a += (0x41 - 10);
serial_putc( a );
a = (*data) & 0xf;
if(a < 10)
a += 0x30;
else
a += (0x41 - 10);
serial_putc( a );
serial_putc( ' ' );
data++;
}
serial_putc( '\n' );
}

View file

@ -18,7 +18,7 @@
* KIND, either express or implied. * KIND, either express or implied.
* *
****************************************************************************/ ****************************************************************************/
#include "config.h" #include "config.h"
#include "system.h" #include "system.h"
#include "cpu.h" #include "cpu.h"
@ -86,11 +86,13 @@ bool button_hold(void)
int button_read_device(void) int button_read_device(void)
{ {
#ifndef BOOTLOADER
static bool hold_button = false; static bool hold_button = false;
bool hold_button_old; bool hold_button_old;
hold_button_old = hold_button; hold_button_old = hold_button;
hold_button = (__gpio_get_pin(PIN_BTN_HOLD) ? true : false); hold_button = (__gpio_get_pin(PIN_BTN_HOLD) ? true : false);
#endif
int btn = BUTTON_NONE; int btn = BUTTON_NONE;
bool gpio_btn = (__gpio_get_pin(PIN_BTN_POWER) ? false : true); bool gpio_btn = (__gpio_get_pin(PIN_BTN_POWER) ? false : true);