diff --git a/bdk/soc/hw_init.c b/bdk/soc/hw_init.c index d48bd70..fd6eda7 100644 --- a/bdk/soc/hw_init.c +++ b/bdk/soc/hw_init.c @@ -88,6 +88,7 @@ static void _config_oscillators() CLOCK(CLK_RST_CONTROLLER_CLK_SYSTEM_RATE) = 2; // Set HCLK div to 1 and PCLK div to 3. } +// The uart is skipped for Copper, Hoag and Calcio. Used in Icosa, Iowa and Aula. static void _config_gpios(bool nx_hoag) { // Clamp inputs when tristated. @@ -420,7 +421,7 @@ void hw_init() bpmp_mmu_enable(); } -void hw_reinit_workaround(bool coreboot, u32 magic) +void hw_reinit_workaround(bool coreboot, u32 bl_magic) { // Disable BPMP max clock. bpmp_clk_rate_set(BPMP_CLK_NORMAL); @@ -462,11 +463,22 @@ void hw_reinit_workaround(bool coreboot, u32 magic) PMC(APBDEV_PMC_NO_IOPOWER) &= ~(PMC_NO_IOPOWER_SDMMC1_IO_EN); } - // Power off display. - display_end(); + // Seamless display or display power off. + switch (bl_magic) + { + case BL_MAGIC_CRBOOT_SLD:; + // Set pwm to 0%, switch to gpio mode and restore pwm duty. + u32 brightness = display_get_backlight_brightness(); + display_backlight_brightness(0, 1000); + gpio_config(GPIO_PORT_V, GPIO_PIN_0, GPIO_MODE_GPIO); + display_backlight_brightness(brightness, 0); + break; + default: + display_end(); + } // Enable clock to USBD and init SDMMC1 to avoid hangs with bad hw inits. - if (magic == 0xBAADF00D) + if (bl_magic == BL_MAGIC_BROKEN_HWI) { CLOCK(CLK_RST_CONTROLLER_CLK_ENB_L_SET) = BIT(CLK_L_USBD); sdmmc_init(&sd_sdmmc, SDMMC_1, SDMMC_POWER_3_3, SDMMC_BUS_WIDTH_1, SDHCI_TIMING_SD_ID, 0); diff --git a/bdk/soc/hw_init.h b/bdk/soc/hw_init.h index 8888824..a1b2dfc 100644 --- a/bdk/soc/hw_init.h +++ b/bdk/soc/hw_init.h @@ -20,6 +20,9 @@ #include +#define BL_MAGIC_CRBOOT_SLD 0x30444C53 // SLD0, seamless display type 0. +#define BL_MAGIC_BROKEN_HWI 0xBAADF00D // Broken hwinit. + void hw_init(); void hw_reinit_workaround(bool coreboot, u32 magic); u32 hw_get_chip_id(); diff --git a/bootloader/main.c b/bootloader/main.c index a190308..c8c8f4d 100644 --- a/bootloader/main.c +++ b/bootloader/main.c @@ -143,6 +143,7 @@ void check_power_off_from_hos() #define EXT_PAYLOAD_ADDR 0xC0000000 #define RCM_PAYLOAD_ADDR (EXT_PAYLOAD_ADDR + ALIGN(PATCHED_RELOC_SZ, 0x10)) #define COREBOOT_END_ADDR 0xD0000000 +#define COREBOOT_VER_OFF 0x41 #define CBFS_DRAM_EN_ADDR 0x4003e000 #define CBFS_DRAM_MAGIC 0x4452414D // "DRAM" @@ -268,7 +269,12 @@ int launch_payload(char *path, bool update) else { reloc_patcher(PATCHED_RELOC_ENTRY, EXT_PAYLOAD_ADDR, 0x7000); - hw_reinit_workaround(true, 0); + + // Get coreboot seamless display magic. + u32 magic = 0; + char *magic_ptr = buf + COREBOOT_VER_OFF; + memcpy(&magic, magic_ptr + strlen(magic_ptr) - 4, 4); + hw_reinit_workaround(true, magic); } // Some cards (Sandisk U1), do not like a fast power cycle. Wait min 100ms.