diff --git a/bootloader/x1000/boot.c b/bootloader/x1000/boot.c index 60fb864d19..9e22192516 100644 --- a/bootloader/x1000/boot.c +++ b/bootloader/x1000/boot.c @@ -29,6 +29,10 @@ #include "boot-x1000.h" #include #include +#if defined(EROS_QN) +# include "lcd-x1000.c" +# include "backlight-target.h" +#endif void boot_rockbox(void) { @@ -201,6 +205,24 @@ void boot_of_helper(uint32_t addr, uint32_t flash_size, const char* args) gui_shutdown(); +/* The Eros Q needs the LCD initialized in the bootloader */ +#if defined(EROS_QN) + /* enable LCD if it's not yet on, but keep the backlight off to avoid a white flash */ + init_lcd(); + backlight_hw_off(); + + /* TODO: this doesn't work for some reason */ + //lcd_clear_display(); + //lcd_update(); + //lcd_wait_frame(); + + /* disable irq and dma */ + lcd_enable(false); + + /* set up LCD in a config compatible with OF */ + lcd_tgt_enable_of(1); +#endif + x1000_dualboot_load_pdma_fw(); x1000_dualboot_cleanup(); x1000_dualboot_init_clocktree(); diff --git a/bootloader/x1000/x1000bootloader.h b/bootloader/x1000/x1000bootloader.h index 1fba9a29a1..81c7f2aaa4 100644 --- a/bootloader/x1000/x1000bootloader.h +++ b/bootloader/x1000/x1000bootloader.h @@ -99,6 +99,19 @@ struct uimage_header; # define BL_QUIT_NAME "POWER" # define BL_SCREENSHOT_NAME "MENU" # define BOOTBACKUP_FILE "/erosqnative-boot.bin" +# define OF_PLAYER_NAME "Aigo Player" +# define OF_PLAYER_ADDR 0x300000 +# define OF_PLAYER_LENGTH (6 * 1024 * 1024) +# define OF_PLAYER_ARGS OF_RECOVERY_ARGS \ + " init=/linuxrc ubi.mtd=4 root=ubi0:rootfs ubi.mtd=5 rootfstype=ubifs \ +sn_no=00000000000000000000000000000000 bt_mac=xxxxxxxxxxxx wifi_mac=xxxxxxxxxxxx rw" +# define OF_PLAYER_BTN BUTTON_PLAY +/* Note: OF Recovery boots, but is otherwise untested. */ +//# define OF_RECOVERY_NAME "Aigo Recovery" +//# define OF_RECOVERY_ADDR 0x900000 +//# define OF_RECOVERY_LENGTH (7 * 1024 * 1024) +# define OF_RECOVERY_ARGS \ + "console=ttyS2,115200n8 mem=32M@0x0 no_console_suspend lpj=5009408 ip=off" #else # error "Missing keymap!" #endif diff --git a/firmware/target/mips/ingenic_x1000/erosqnative/lcd-erosqnative.c b/firmware/target/mips/ingenic_x1000/erosqnative/lcd-erosqnative.c index 19da722898..0d43a3f010 100644 --- a/firmware/target/mips/ingenic_x1000/erosqnative/lcd-erosqnative.c +++ b/firmware/target/mips/ingenic_x1000/erosqnative/lcd-erosqnative.c @@ -102,6 +102,19 @@ static const uint32_t erosqnative_lcd_cmd_enable[] = { LCD_INSTR_END, }; +static const uint32_t erosqnative_lcd_of_compat_cmd[] = { + /* Pixel Format Set */ + LCD_INSTR_CMD, 0x3a, + LCD_INSTR_DAT, 0x66, /* 18 bpp */ + /* Exit Sleep */ + LCD_INSTR_CMD, 0x11, + LCD_INSTR_UDELAY, 120000, + /* Display On */ + LCD_INSTR_CMD, 0x29, + LCD_INSTR_UDELAY, 20000, + LCD_INSTR_END, +}; + /* sleep and wake copied directly from m3k */ static const uint32_t erosqnative_lcd_cmd_sleep[] = { /* Display OFF */ @@ -180,6 +193,15 @@ void lcd_tgt_enable(bool enable) } } +void lcd_tgt_enable_of(bool enable) +{ + /* silence the unused parameter warning */ + if (enable) + {} + + lcd_exec_commands(&erosqnative_lcd_of_compat_cmd[0]); +} + void lcd_tgt_sleep(bool sleep) { if(sleep) diff --git a/firmware/target/mips/ingenic_x1000/lcd-x1000.h b/firmware/target/mips/ingenic_x1000/lcd-x1000.h index 749fac8240..e88a8733ed 100644 --- a/firmware/target/mips/ingenic_x1000/lcd-x1000.h +++ b/firmware/target/mips/ingenic_x1000/lcd-x1000.h @@ -105,6 +105,14 @@ extern void lcd_exec_commands(const uint32_t* cmdseq); */ extern void lcd_tgt_enable(bool on); +/* Enable/disable the LCD controller, but intended for booting the OF. + * + * This is only used for the Eros Q Native port, as the OF seems to be + * unable to initialize the LCD in the kernel boot rather than having + * the bootloader do it. + */ +extern void lcd_tgt_enable_of(bool on); + /* Enter or exit sleep mode to save power, normally by sending the necessary * commands with lcd_exec_commands(). */