diff --git a/bdk/gfx/di.c b/bdk/gfx/di.c index 9d95349..74cae96 100644 --- a/bdk/gfx/di.c +++ b/bdk/gfx/di.c @@ -221,7 +221,7 @@ void display_init() // Get Chip ID. bool tegra_t210 = hw_get_chip_id() == GP_HIDREV_MAJOR_T210; - // T210B01: Power on SD2 regulator for supplying LD0. + // T210B01: Power on SD2 regulator for supplying LDO0. if (!tegra_t210) { // Set SD2 regulator voltage. @@ -600,7 +600,7 @@ skip_panel_deinit: void display_end() { _display_panel_and_hw_end(false); }; -u16 display_get_decoded_lcd_id() +u16 display_get_decoded_panel_id() { return _display_id; } diff --git a/bdk/gfx/di.h b/bdk/gfx/di.h index e304fb6..abc05c4 100644 --- a/bdk/gfx/di.h +++ b/bdk/gfx/di.h @@ -671,10 +671,12 @@ * 20h: InnoLux Corporation * 30h: AU Optronics * 40h: Unknown1 + * 50h: Unknown2 (OLED? Samsung? LG?) * * Boards, Panel Size: * 0Fh: Icosa/Iowa, 6.2" * 10h: Hoag, 5.5" + * 20h: Unknown, x.x" */ enum @@ -694,7 +696,7 @@ void display_backlight_pwm_init(); void display_end(); /*! Get Display panel ID. */ -u16 display_get_decoded_lcd_id(); +u16 display_get_decoded_panel_id(); /*! Show one single color on the display. */ void display_color_screen(u32 color); diff --git a/bdk/input/joycon.c b/bdk/input/joycon.c index 9a3e11a..7be5f2d 100644 --- a/bdk/input/joycon.c +++ b/bdk/input/joycon.c @@ -816,10 +816,10 @@ void jc_init_hw() jc_l.uart = UART_C; jc_r.uart = UART_B; +#if !defined(DEBUG_UART_PORT) || !(DEBUG_UART_PORT) if (fuse_read_hw_type() == FUSE_NX_HW_TYPE_HOAG) return; -#ifndef DEBUG_UART_PORT jc_power_supply(UART_C, true); jc_power_supply(UART_B, true); diff --git a/bdk/libs/lv_conf.h b/bdk/libs/lv_conf.h index dcc437d..7af36a4 100644 --- a/bdk/libs/lv_conf.h +++ b/bdk/libs/lv_conf.h @@ -155,7 +155,7 @@ /*Log settings*/ -#ifdef DEBUG_UART_PORT +#ifdef DEBUG_UART_LV_LOG # define USE_LV_LOG 1 /*Enable/disable the log module*/ #else # define USE_LV_LOG 0 /*Enable/disable the log module*/ diff --git a/bdk/libs/lvgl/lv_misc/lv_log.c b/bdk/libs/lvgl/lv_misc/lv_log.c index d2db0c7..9cd3d49 100644 --- a/bdk/libs/lvgl/lv_misc/lv_log.c +++ b/bdk/libs/lvgl/lv_misc/lv_log.c @@ -63,7 +63,7 @@ void lv_log_add(lv_log_level_t level, const char * file, int line, const char * if(level >= LV_LOG_LEVEL) { -#if LV_LOG_PRINTF +#if LV_LOG_PRINTF && defined(DEBUG_UART_PORT) static const char * lvl_prefix[] = {"Trace", "Info", "Warn", "Error"}; char *log = (char *)malloc(0x1000); s_printf(log, "%s: %s \t(%s #%d)\r\n", lvl_prefix[level], dsc, file, line); diff --git a/bdk/power/max7762x.c b/bdk/power/max7762x.c index c32cf76..6102ee1 100644 --- a/bdk/power/max7762x.c +++ b/bdk/power/max7762x.c @@ -57,7 +57,7 @@ static const max77620_regulator_t _pmic_regulators[] = { { REGULATOR_LDO, "ldo1", 0x00, 25000, 800000, 1050000, 1050000, MAX77620_REG_LDO1_CFG, MAX77620_REG_LDO1_CFG2, MAX77620_LDO_VOLT_MASK, MAX77620_LDO_POWER_MODE_MASK, MAX77620_LDO_POWER_MODE_SHIFT, 0x00, MAX77620_REG_FPS_LDO1, 3, 7, 0 }, { REGULATOR_LDO, "ldo2", 0x00, 50000, 800000, 1800000, 3300000, MAX77620_REG_LDO2_CFG, MAX77620_REG_LDO2_CFG2, MAX77620_LDO_VOLT_MASK, MAX77620_LDO_POWER_MODE_MASK, MAX77620_LDO_POWER_MODE_SHIFT, 0x00, MAX77620_REG_FPS_LDO2, 3, 7, 0 }, { REGULATOR_LDO, "ldo3", 0x00, 50000, 800000, 3100000, 3100000, MAX77620_REG_LDO3_CFG, MAX77620_REG_LDO3_CFG2, MAX77620_LDO_VOLT_MASK, MAX77620_LDO_POWER_MODE_MASK, MAX77620_LDO_POWER_MODE_SHIFT, 0x00, MAX77620_REG_FPS_LDO3, 3, 7, 0 }, - { REGULATOR_LDO, "ldo4", 0x00, 12500, 800000, 850000, 850000, MAX77620_REG_LDO4_CFG, MAX77620_REG_LDO4_CFG2, MAX77620_LDO_VOLT_MASK, MAX77620_LDO_POWER_MODE_MASK, MAX77620_LDO_POWER_MODE_SHIFT, 0x00, MAX77620_REG_FPS_LDO4, 0, 7, 1 }, + { REGULATOR_LDO, "ldo4", 0x00, 12500, 800000, 850000, 1000000, MAX77620_REG_LDO4_CFG, MAX77620_REG_LDO4_CFG2, MAX77620_LDO_VOLT_MASK, MAX77620_LDO_POWER_MODE_MASK, MAX77620_LDO_POWER_MODE_SHIFT, 0x00, MAX77620_REG_FPS_LDO4, 0, 7, 1 }, { REGULATOR_LDO, "ldo5", 0x00, 50000, 800000, 1800000, 1800000, MAX77620_REG_LDO5_CFG, MAX77620_REG_LDO5_CFG2, MAX77620_LDO_VOLT_MASK, MAX77620_LDO_POWER_MODE_MASK, MAX77620_LDO_POWER_MODE_SHIFT, 0x00, MAX77620_REG_FPS_LDO5, 3, 7, 0 }, { REGULATOR_LDO, "ldo6", 0x00, 50000, 800000, 2900000, 2900000, MAX77620_REG_LDO6_CFG, MAX77620_REG_LDO6_CFG2, MAX77620_LDO_VOLT_MASK, MAX77620_LDO_POWER_MODE_MASK, MAX77620_LDO_POWER_MODE_SHIFT, 0x00, MAX77620_REG_FPS_LDO6, 3, 7, 0 }, { REGULATOR_LDO, "ldo7", 0x00, 50000, 800000, 1050000, 1050000, MAX77620_REG_LDO7_CFG, MAX77620_REG_LDO7_CFG2, MAX77620_LDO_VOLT_MASK, MAX77620_LDO_POWER_MODE_MASK, MAX77620_LDO_POWER_MODE_SHIFT, 0x00, MAX77620_REG_FPS_LDO7, 1, 4, 3 }, diff --git a/bdk/sec/se.c b/bdk/sec/se.c index 49ba807..3a97ddd 100644 --- a/bdk/sec/se.c +++ b/bdk/sec/se.c @@ -1,6 +1,6 @@ /* * Copyright (c) 2018 naehrwert - * Copyright (c) 2018 CTCaer + * Copyright (c) 2018-2020 CTCaer * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, diff --git a/bdk/soc/hw_init.c b/bdk/soc/hw_init.c index dd79dc6..f4b7aaf 100644 --- a/bdk/soc/hw_init.c +++ b/bdk/soc/hw_init.c @@ -285,6 +285,10 @@ static void _config_se_brom() static void _config_regulators(bool tegra_t210) { + // Set RTC/AO domain to POR voltage. + if (tegra_t210) + max77620_regulator_set_voltage(REGULATOR_LDO4, 1000000); + // Disable low battery shutdown monitor. max77620_low_battery_monitor_config(false); @@ -396,12 +400,12 @@ void hw_init() // Initialize I2C1 for various power related devices. i2c_init(I2C_1); - // Enable charger in case it's disabled. - bq24193_enable_charger(); - // Initialize various regulators based on Erista/Mariko platform. _config_regulators(tegra_t210); + // Enable charger in case it's disabled. + bq24193_enable_charger(); + _config_pmc_scratch(); // Missing from 4.x+ // Set BPMP/SCLK to PLLP_OUT (408MHz). diff --git a/bdk/soc/i2c.c b/bdk/soc/i2c.c index 099a182..0906adc 100644 --- a/bdk/soc/i2c.c +++ b/bdk/soc/i2c.c @@ -136,10 +136,10 @@ static int _i2c_send_single(u32 i2c_idx, u32 dev_addr, u8 *buf, u32 size) // Initiate transaction on normal mode. base[I2C_CNFG] = (base[I2C_CNFG] & 0xFFFFF9FF) | NORMAL_MODE_GO; - u32 timeout = get_tmr_ms() + 400; // Actual for max 8 bytes at 100KHz is 0.74ms. + u32 timeout = get_tmr_us() + 200000; // Actual for max 8 bytes at 100KHz is 0.74ms. while (base[I2C_STATUS] & I2C_STATUS_BUSY) { - if (get_tmr_ms() > timeout) + if (get_tmr_us() > timeout) return 0; } @@ -168,10 +168,10 @@ static int _i2c_recv_single(u32 i2c_idx, u8 *buf, u32 size, u32 dev_addr) // Initiate transaction on normal mode. base[I2C_CNFG] = (base[I2C_CNFG] & 0xFFFFF9FF) | NORMAL_MODE_GO; - u32 timeout = get_tmr_ms() + 400; // Actual for max 8 bytes at 100KHz is 0.74ms. + u32 timeout = get_tmr_us() + 200000; // Actual for max 8 bytes at 100KHz is 0.74ms. while (base[I2C_STATUS] & I2C_STATUS_BUSY) { - if (get_tmr_ms() > timeout) + if (get_tmr_us() > timeout) return 0; } diff --git a/bdk/storage/mmc.h b/bdk/storage/mmc.h index efa9e10..976ded4 100644 --- a/bdk/storage/mmc.h +++ b/bdk/storage/mmc.h @@ -142,7 +142,10 @@ c : clear by read #define R1_SWITCH_ERROR (1 << 7) /* sx, c */ #define R1_EXCEPTION_EVENT (1 << 6) /* sr, a */ #define R1_APP_CMD (1 << 5) /* sr, c */ +#define R1_SKIP_STATE_CHECK (1 << 4) /* Custom state to skip expected state check */ +#define R1_AKE_SEQ_ERROR (1 << 3) +/* R1_CURRENT_STATE 12:9 */ #define R1_STATE_IDLE 0 #define R1_STATE_READY 1 #define R1_STATE_IDENT 2 diff --git a/bdk/storage/sd.h b/bdk/storage/sd.h index a780ec8..848a679 100644 --- a/bdk/storage/sd.h +++ b/bdk/storage/sd.h @@ -34,14 +34,16 @@ #define SD_APP_SEND_SCR 51 /* adtc R1 */ /* OCR bit definitions */ +#define SD_OCR_CCS (1 << 30) /* Card Capacity Status */ +#define SD_OCR_XPC (1 << 28) /* SDXC power control */ #define SD_OCR_S18R (1 << 24) /* 1.8V switching request */ #define SD_ROCR_S18A SD_OCR_S18R /* 1.8V switching accepted by card */ -#define SD_OCR_XPC (1 << 28) /* SDXC power control */ -#define SD_OCR_CCS (1 << 30) /* Card Capacity Status */ #define SD_OCR_VDD_27_34 (0x7F << 15) /* VDD voltage 2.7 ~ 3.4 */ #define SD_OCR_VDD_32_33 (1 << 20) /* VDD voltage 3.2 ~ 3.3 */ #define SD_OCR_VDD_18 (1 << 7) /* VDD voltage 1.8 */ +#define SD_VHD_27_36 (1 << 8) /* VDD voltage 2.7 ~ 3.6 */ + /* * SD_SWITCH argument format: * diff --git a/bdk/storage/sdmmc.c b/bdk/storage/sdmmc.c index 43f837d..6cde1b4 100644 --- a/bdk/storage/sdmmc.c +++ b/bdk/storage/sdmmc.c @@ -45,7 +45,7 @@ static inline u32 unstuff_bits(u32 *resp, u32 start, u32 size) * Common functions for SD and MMC. */ -static int _sdmmc_storage_check_result(u32 res) +static int _sdmmc_storage_check_card_status(u32 res) { //Error mask: //TODO: R1_SWITCH_ERROR can be skipped for certain card types. @@ -66,15 +66,15 @@ static int _sdmmc_storage_execute_cmd_type1_ex(sdmmc_storage_t *storage, u32 *re { sdmmc_cmd_t cmdbuf; sdmmc_init_cmd(&cmdbuf, cmd, arg, SDMMC_RSP_TYPE_1, check_busy); - if (!sdmmc_execute_cmd(storage->sdmmc, &cmdbuf, 0, 0)) + if (!sdmmc_execute_cmd(storage->sdmmc, &cmdbuf, NULL, NULL)) return 0; sdmmc_get_rsp(storage->sdmmc, resp, 4, SDMMC_RSP_TYPE_1); if (mask) *resp &= ~mask; - if (_sdmmc_storage_check_result(*resp)) - if (expected_state == 0x10 || R1_CURRENT_STATE(*resp) == expected_state) + if (_sdmmc_storage_check_card_status(*resp)) + if (expected_state == R1_SKIP_STATE_CHECK || R1_CURRENT_STATE(*resp) == expected_state) return 1; return 0; @@ -91,34 +91,34 @@ static int _sdmmc_storage_go_idle_state(sdmmc_storage_t *storage) sdmmc_cmd_t cmd; sdmmc_init_cmd(&cmd, MMC_GO_IDLE_STATE, 0, SDMMC_RSP_TYPE_0, 0); - return sdmmc_execute_cmd(storage->sdmmc, &cmd, 0, 0); + return sdmmc_execute_cmd(storage->sdmmc, &cmd, NULL, NULL); } static int _sdmmc_storage_get_cid(sdmmc_storage_t *storage, void *buf) { sdmmc_cmd_t cmd; sdmmc_init_cmd(&cmd, MMC_ALL_SEND_CID, 0, SDMMC_RSP_TYPE_2, 0); - if (!sdmmc_execute_cmd(storage->sdmmc, &cmd, 0, 0)) + if (!sdmmc_execute_cmd(storage->sdmmc, &cmd, NULL, NULL)) return 0; - sdmmc_get_rsp(storage->sdmmc, buf, 0x10, SDMMC_RSP_TYPE_2); + sdmmc_get_rsp(storage->sdmmc, buf, 16, SDMMC_RSP_TYPE_2); return 1; } static int _sdmmc_storage_select_card(sdmmc_storage_t *storage) { - return _sdmmc_storage_execute_cmd_type1(storage, MMC_SELECT_CARD, storage->rca << 16, 1, 0x10); + return _sdmmc_storage_execute_cmd_type1(storage, MMC_SELECT_CARD, storage->rca << 16, 1, R1_SKIP_STATE_CHECK); } static int _sdmmc_storage_get_csd(sdmmc_storage_t *storage, void *buf) { sdmmc_cmd_t cmdbuf; sdmmc_init_cmd(&cmdbuf, MMC_SEND_CSD, storage->rca << 16, SDMMC_RSP_TYPE_2, 0); - if (!sdmmc_execute_cmd(storage->sdmmc, &cmdbuf, 0, 0)) + if (!sdmmc_execute_cmd(storage->sdmmc, &cmdbuf, NULL, NULL)) return 0; - sdmmc_get_rsp(storage->sdmmc, buf, 0x10, SDMMC_RSP_TYPE_2); + sdmmc_get_rsp(storage->sdmmc, buf, 16, SDMMC_RSP_TYPE_2); return 1; } @@ -306,7 +306,7 @@ static int _mmc_storage_get_op_cond_inner(sdmmc_storage_t *storage, u32 *pout, u } sdmmc_init_cmd(&cmd, MMC_SEND_OP_COND, arg, SDMMC_RSP_TYPE_3, 0); - if (!sdmmc_execute_cmd(storage->sdmmc, &cmd, 0, 0)) + if (!sdmmc_execute_cmd(storage->sdmmc, &cmd, NULL, NULL)) return 0; return sdmmc_get_rsp(storage->sdmmc, pout, 4, SDMMC_RSP_TYPE_3); @@ -340,7 +340,7 @@ static int _mmc_storage_get_op_cond(sdmmc_storage_t *storage, u32 power) static int _mmc_storage_set_relative_addr(sdmmc_storage_t *storage) { - return _sdmmc_storage_execute_cmd_type1(storage, MMC_SET_RELATIVE_ADDR, storage->rca << 16, 0, 0x10); + return _sdmmc_storage_execute_cmd_type1(storage, MMC_SET_RELATIVE_ADDR, storage->rca << 16, 0, R1_SKIP_STATE_CHECK); } static void _mmc_storage_parse_cid(sdmmc_storage_t *storage) @@ -432,19 +432,19 @@ static int _mmc_storage_get_ext_csd(sdmmc_storage_t *storage, void *buf) reqbuf.is_multi_block = 0; reqbuf.is_auto_cmd12 = 0; - if (!sdmmc_execute_cmd(storage->sdmmc, &cmdbuf, &reqbuf, 0)) + if (!sdmmc_execute_cmd(storage->sdmmc, &cmdbuf, &reqbuf, NULL)) return 0; u32 tmp = 0; sdmmc_get_rsp(storage->sdmmc, &tmp, 4, SDMMC_RSP_TYPE_1); _mmc_storage_parse_ext_csd(storage, buf); - return _sdmmc_storage_check_result(tmp); + return _sdmmc_storage_check_card_status(tmp); } static int _mmc_storage_switch(sdmmc_storage_t *storage, u32 arg) { - return _sdmmc_storage_execute_cmd_type1(storage, MMC_SWITCH, arg, 1, 0x10); + return _sdmmc_storage_execute_cmd_type1(storage, MMC_SWITCH, arg, 1, R1_SKIP_STATE_CHECK); } static int _mmc_storage_switch_buswidth(sdmmc_storage_t *storage, u32 bus_width) @@ -688,53 +688,60 @@ static int _sd_storage_execute_app_cmd_type1(sdmmc_storage_t *storage, u32 *resp static int _sd_storage_send_if_cond(sdmmc_storage_t *storage) { sdmmc_cmd_t cmdbuf; - sdmmc_init_cmd(&cmdbuf, SD_SEND_IF_COND, 0x1AA, SDMMC_RSP_TYPE_5, 0); - if (!sdmmc_execute_cmd(storage->sdmmc, &cmdbuf, 0, 0)) + u16 vhd_pattern = SD_VHD_27_36 | 0xAA; + sdmmc_init_cmd(&cmdbuf, SD_SEND_IF_COND, vhd_pattern, SDMMC_RSP_TYPE_5, 0); + if (!sdmmc_execute_cmd(storage->sdmmc, &cmdbuf, NULL, NULL)) return 1; // The SD Card is version 1.X + // Card version is >= 2.0, parse results. u32 resp = 0; if (!sdmmc_get_rsp(storage->sdmmc, &resp, 4, SDMMC_RSP_TYPE_5)) - return 2; + return 2; // Failed. - return (resp & 0xFF) == 0xAA ? 0 : 2; + // Check if VHD was accepted and pattern was properly returned. + if ((resp & 0xFFF) == vhd_pattern) + return 0; + + // Failed. + return 2; } -static int _sd_storage_get_op_cond_once(sdmmc_storage_t *storage, u32 *cond, int is_version_1, int bus_low_voltage_support) +static int _sd_storage_get_op_cond_once(sdmmc_storage_t *storage, u32 *cond, int is_version_1, int bus_uhs_support) { sdmmc_cmd_t cmdbuf; // Support for Current > 150mA - u32 arg = (~is_version_1 & 1) ? SD_OCR_XPC : 0; + u32 arg = !is_version_1 ? SD_OCR_XPC : 0; // Support for handling block-addressed SDHC cards - arg |= (~is_version_1 & 1) ? SD_OCR_CCS : 0; + arg |= !is_version_1 ? SD_OCR_CCS : 0; // Support for 1.8V - arg |= (bus_low_voltage_support & ~is_version_1 & 1) ? SD_OCR_S18R : 0; + arg |= (bus_uhs_support && !is_version_1) ? SD_OCR_S18R : 0; // This is needed for most cards. Do not set bit7 even if 1.8V is supported. arg |= SD_OCR_VDD_32_33; sdmmc_init_cmd(&cmdbuf, SD_APP_OP_COND, arg, SDMMC_RSP_TYPE_3, 0); - if (!_sd_storage_execute_app_cmd(storage, 0x10, is_version_1 ? 0x400000 : 0, &cmdbuf, 0, 0)) + if (!_sd_storage_execute_app_cmd(storage, R1_SKIP_STATE_CHECK, is_version_1 ? R1_ILLEGAL_COMMAND : 0, &cmdbuf, NULL, NULL)) return 0; return sdmmc_get_rsp(storage->sdmmc, cond, 4, SDMMC_RSP_TYPE_3); } -static int _sd_storage_get_op_cond(sdmmc_storage_t *storage, int is_version_1, int bus_low_voltage_support) +static int _sd_storage_get_op_cond(sdmmc_storage_t *storage, int is_version_1, int bus_uhs_support) { u32 timeout = get_tmr_ms() + 1500; while (1) { u32 cond = 0; - if (!_sd_storage_get_op_cond_once(storage, &cond, is_version_1, bus_low_voltage_support)) + if (!_sd_storage_get_op_cond_once(storage, &cond, is_version_1, bus_uhs_support)) break; if (cond & MMC_CARD_BUSY) { -DPRINTF("[SD] cond: %08X, lv: %d\n", cond, bus_low_voltage_support); +DPRINTF("[SD] op cond: %08X, lv: %d\n", cond, bus_uhs_support); if (cond & SD_OCR_CCS) storage->has_sector_access = 1; // Check if card supports 1.8V signaling. - if (cond & SD_ROCR_S18A && bus_low_voltage_support) + if (cond & SD_ROCR_S18A && bus_uhs_support) { //The low voltage regulator configuration is valid for SDMMC1 only. if (storage->sdmmc->id == SDMMC_1 && @@ -771,7 +778,7 @@ static int _sd_storage_get_rca(sdmmc_storage_t *storage) while (1) { - if (!sdmmc_execute_cmd(storage->sdmmc, &cmdbuf, 0, 0)) + if (!sdmmc_execute_cmd(storage->sdmmc, &cmdbuf, NULL, NULL)) break; u32 resp = 0; @@ -822,7 +829,7 @@ int _sd_storage_get_scr(sdmmc_storage_t *storage, u8 *buf) reqbuf.is_multi_block = 0; reqbuf.is_auto_cmd12 = 0; - if (!_sd_storage_execute_app_cmd(storage, R1_STATE_TRAN, 0, &cmdbuf, &reqbuf, 0)) + if (!_sd_storage_execute_app_cmd(storage, R1_STATE_TRAN, 0, &cmdbuf, &reqbuf, NULL)) return 0; u32 tmp = 0; @@ -1127,7 +1134,7 @@ DPRINTF("[SD] ssr: Card lacks mandatory SD Status function\n"); return 0; } - if (!_sd_storage_execute_app_cmd(storage, R1_STATE_TRAN, 0, &cmdbuf, &reqbuf, 0)) + if (!_sd_storage_execute_app_cmd(storage, R1_STATE_TRAN, 0, &cmdbuf, &reqbuf, NULL)) return 0; u32 tmp = 0; @@ -1143,7 +1150,7 @@ DPRINTF("[SD] ssr: Card lacks mandatory SD Status function\n"); _sd_storage_parse_ssr(storage); //gfx_hexdump(0, storage->raw_ssr, 64); - return _sdmmc_storage_check_result(tmp); + return _sdmmc_storage_check_card_status(tmp); } static void _sd_storage_parse_cid(sdmmc_storage_t *storage) @@ -1186,7 +1193,7 @@ static void _sd_storage_parse_csd(sdmmc_storage_t *storage) } } -static bool _sdmmc_storage_get_low_voltage_support(u32 bus_width, u32 type) +static bool _sdmmc_storage_get_bus_uhs_support(u32 bus_width, u32 type) { switch (type) { @@ -1235,13 +1242,13 @@ DPRINTF("[SD] after init\n"); DPRINTF("[SD] went to idle state\n"); is_version_1 = _sd_storage_send_if_cond(storage); - if (is_version_1 == 2) + if (is_version_1 == 2) // Failed. return 0; DPRINTF("[SD] after send if cond\n"); - bool bus_low_voltage_support = _sdmmc_storage_get_low_voltage_support(bus_width, type); + bool bus_uhs_support = _sdmmc_storage_get_bus_uhs_support(bus_width, type); - if (!_sd_storage_get_op_cond(storage, is_version_1, bus_low_voltage_support)) + if (!_sd_storage_get_op_cond(storage, is_version_1, bus_uhs_support)) return 0; DPRINTF("[SD] got op cond\n"); @@ -1310,6 +1317,7 @@ DPRINTF("[SD] switched to wide bus width\n"); } else { + bus_width = SDMMC_BUS_WIDTH_1; DPRINTF("[SD] SD does not support wide bus width\n"); } @@ -1321,7 +1329,7 @@ DPRINTF("[SD] enabled UHS\n"); sdmmc_card_clock_powersave(sdmmc, SDMMC_POWER_SAVE_ENABLE); } - else if (type != SDHCI_TIMING_SD_DS12 && (storage->scr.sda_vsn & 0xF) != 0) + else if (type != SDHCI_TIMING_SD_DS12 && (storage->scr.sda_vsn & 0xF)) // Not default speed and not SD Version 1.x { if (!_sd_storage_enable_hs_high_volt(storage, buf)) return 0; @@ -1368,7 +1376,7 @@ int _gc_storage_custom_cmd(sdmmc_storage_t *storage, void *buf) reqbuf.is_multi_block = 0; reqbuf.is_auto_cmd12 = 0; - if (!sdmmc_execute_cmd(storage->sdmmc, &cmdbuf, &reqbuf, 0)) + if (!sdmmc_execute_cmd(storage->sdmmc, &cmdbuf, &reqbuf, NULL)) { sdmmc_stop_transmission(storage->sdmmc, &resp); return 0; @@ -1376,7 +1384,7 @@ int _gc_storage_custom_cmd(sdmmc_storage_t *storage, void *buf) if (!sdmmc_get_rsp(storage->sdmmc, &resp, 4, SDMMC_RSP_TYPE_1)) return 0; - if (!_sdmmc_storage_check_result(resp)) + if (!_sdmmc_storage_check_card_status(resp)) return 0; return _sdmmc_storage_check_status(storage); } diff --git a/bdk/storage/sdmmc.h b/bdk/storage/sdmmc.h index 68d70f0..76d2f91 100644 --- a/bdk/storage/sdmmc.h +++ b/bdk/storage/sdmmc.h @@ -107,6 +107,7 @@ typedef struct _sdmmc_storage_t u32 sec_cnt; int is_low_voltage; u32 partition; + int initialized; u8 raw_cid[0x10]; u8 raw_csd[0x10]; u8 raw_scr[8]; @@ -116,16 +117,15 @@ typedef struct _sdmmc_storage_t mmc_ext_csd_t ext_csd; sd_scr_t scr; sd_ssr_t ssr; - int initialized; } sdmmc_storage_t; -int sdmmc_storage_end(sdmmc_storage_t *storage); -int sdmmc_storage_read(sdmmc_storage_t *storage, u32 sector, u32 num_sectors, void *buf); -int sdmmc_storage_write(sdmmc_storage_t *storage, u32 sector, u32 num_sectors, void *buf); -int sdmmc_storage_init_mmc(sdmmc_storage_t *storage, sdmmc_t *sdmmc, u32 bus_width, u32 type); -int sdmmc_storage_set_mmc_partition(sdmmc_storage_t *storage, u32 partition); +int sdmmc_storage_end(sdmmc_storage_t *storage); +int sdmmc_storage_read(sdmmc_storage_t *storage, u32 sector, u32 num_sectors, void *buf); +int sdmmc_storage_write(sdmmc_storage_t *storage, u32 sector, u32 num_sectors, void *buf); +int sdmmc_storage_init_mmc(sdmmc_storage_t *storage, sdmmc_t *sdmmc, u32 bus_width, u32 type); +int sdmmc_storage_set_mmc_partition(sdmmc_storage_t *storage, u32 partition); void sdmmc_storage_init_wait_sd(); -int sdmmc_storage_init_sd(sdmmc_storage_t *storage, sdmmc_t *sdmmc, u32 bus_width, u32 type); -int sdmmc_storage_init_gc(sdmmc_storage_t *storage, sdmmc_t *sdmmc); +int sdmmc_storage_init_sd(sdmmc_storage_t *storage, sdmmc_t *sdmmc, u32 bus_width, u32 type); +int sdmmc_storage_init_gc(sdmmc_storage_t *storage, sdmmc_t *sdmmc); #endif diff --git a/bdk/storage/sdmmc_driver.c b/bdk/storage/sdmmc_driver.c index 3eaded0..bd49c1c 100644 --- a/bdk/storage/sdmmc_driver.c +++ b/bdk/storage/sdmmc_driver.c @@ -501,7 +501,7 @@ int sdmmc_get_rsp(sdmmc_t *sdmmc, u32 *rsp, u32 size, u32 type) break; case SDMMC_RSP_TYPE_2: - if (size < 0x10) + if (size < 16) return 0; rsp[0] = sdmmc->rsp[0]; rsp[1] = sdmmc->rsp[1]; @@ -1052,7 +1052,7 @@ DPRINTF("rsp(%d): %08X, %08X, %08X, %08X\n", result, if (!result) { #ifdef ERROR_EXTRA_PRINTING - EPRINTFARGS("SDMMC: DMA Update failed (%08X)!", result); + EPRINTF("SDMMC: DMA Update failed!"); #endif } } diff --git a/bootloader/hos/hos.c b/bootloader/hos/hos.c index b6183c1..a65b8c1 100644 --- a/bootloader/hos/hos.c +++ b/bootloader/hos/hos.c @@ -286,10 +286,6 @@ void hos_eks_save(u32 kb) u8 *keys = (u8 *)calloc(0x1000, 1); se_get_aes_keys(keys + 0x800, keys, 0x10); - // Set SBK back. - if (FUSE(FUSE_PRIVATE_KEY0) == 0xFFFFFFFF) - se_aes_key_set(14, keys + 14 * 0x10, 0x10); - // Set magic and personalized info. h_cfg.eks->magic = HOS_EKS_MAGIC; h_cfg.eks->enabled[key_idx] = kb; diff --git a/bootloader/hos/pkg2.c b/bootloader/hos/pkg2.c index 9757c37..93bfe59 100644 --- a/bootloader/hos/pkg2.c +++ b/bootloader/hos/pkg2.c @@ -384,11 +384,11 @@ KERNEL_PATCHSET_DEF(_kernel_10_patchset, { ATM_SYSM_INCR, 0x66950, _MOVZW(19, 0x1D80, LSL16), NULL }, // System memory pool increase. { ATM_GEN_PATCH, ID_SND_OFF_1000, _B(ID_SND_OFF_1000, FREE_CODE_OFF_1ST_1000), NULL}, // Send process id branch. { ATM_ARR_PATCH, FREE_CODE_OFF_1ST_1000, sizeof(PRC_ID_SND_1000) >> 2, PRC_ID_SND_1000}, // Send process id code. - { ATM_GEN_PATCH, FREE_CODE_OFF_1ST_1000 + sizeof(PRC_ID_SND_1000), // Branch back and skip 4 instructions. + { ATM_GEN_PATCH, FREE_CODE_OFF_1ST_1000 + sizeof(PRC_ID_SND_1000), // Branch back and skip 4 instructions. _B(FREE_CODE_OFF_1ST_1000 + sizeof(PRC_ID_SND_1000), ID_SND_OFF_1000 + sizeof(u32) * 4), NULL}, { ATM_GEN_PATCH, ID_RCV_OFF_1000, _B(ID_RCV_OFF_1000, FREE_CODE_OFF_2ND_1000), NULL}, // Receive process id branch. { ATM_ARR_PATCH, FREE_CODE_OFF_2ND_1000, sizeof(PRC_ID_RCV_1000) >> 2, PRC_ID_RCV_1000}, // Receive process id code. - { ATM_GEN_PATCH, FREE_CODE_OFF_2ND_1000 + sizeof(PRC_ID_RCV_1000), // Branch back and skip 4 instructions. + { ATM_GEN_PATCH, FREE_CODE_OFF_2ND_1000 + sizeof(PRC_ID_RCV_1000), // Branch back and skip 4 instructions. _B(FREE_CODE_OFF_2ND_1000 + sizeof(PRC_ID_RCV_1000), ID_RCV_OFF_1000 + sizeof(u32) * 4), NULL} ); @@ -400,11 +400,11 @@ KERNEL_PATCHSET_DEF(_kernel_11_patchset, { ATM_SYSM_INCR, 0x490C4, _MOVZW(21, 0x1D80, LSL16), NULL }, // System memory pool increase. { ATM_GEN_PATCH, ID_SND_OFF_1100, _B(ID_SND_OFF_1100, FREE_CODE_OFF_1ST_1100), NULL}, // Send process id branch. { ATM_ARR_PATCH, FREE_CODE_OFF_1ST_1100, sizeof(PRC_ID_SND_1100) >> 2, PRC_ID_SND_1100}, // Send process id code. - { ATM_GEN_PATCH, FREE_CODE_OFF_1ST_1100 + sizeof(PRC_ID_SND_1100), // Branch back and skip 4 instructions. + { ATM_GEN_PATCH, FREE_CODE_OFF_1ST_1100 + sizeof(PRC_ID_SND_1100), // Branch back and skip 4 instructions. _B(FREE_CODE_OFF_1ST_1100 + sizeof(PRC_ID_SND_1100), ID_SND_OFF_1100 + sizeof(u32) * 4), NULL}, { ATM_GEN_PATCH, ID_RCV_OFF_1100, _B(ID_RCV_OFF_1100, FREE_CODE_OFF_2ND_1100), NULL}, // Receive process id branch. { ATM_ARR_PATCH, FREE_CODE_OFF_2ND_1100, sizeof(PRC_ID_RCV_1100) >> 2, PRC_ID_RCV_1100}, // Receive process id code. - { ATM_GEN_PATCH, FREE_CODE_OFF_2ND_1100 + sizeof(PRC_ID_RCV_1100), // Branch back and skip 4 instructions. + { ATM_GEN_PATCH, FREE_CODE_OFF_2ND_1100 + sizeof(PRC_ID_RCV_1100), // Branch back and skip 4 instructions. _B(FREE_CODE_OFF_2ND_1100 + sizeof(PRC_ID_RCV_1100), ID_RCV_OFF_1100 + sizeof(u32) * 4), NULL} ); diff --git a/bootloader/hos/secmon_exo.c b/bootloader/hos/secmon_exo.c index a3720bb..60f152f 100644 --- a/bootloader/hos/secmon_exo.c +++ b/bootloader/hos/secmon_exo.c @@ -292,7 +292,6 @@ void config_exosphere(launch_ctxt_t *ctxt, u32 warmboot_base, bool exo_new) exo_cfg->magic = EXO_MAGIC_VAL; exo_cfg->fwno = exoFwNo; exo_cfg->flags[0] = exoFlags; - exo_cfg->flags[1] = 0; // If warmboot is lp0fw, add in RSA modulus. volatile wb_cfg_t *wb_cfg = (wb_cfg_t *)(warmboot_base + ATM_WB_HEADER_OFF); @@ -342,10 +341,10 @@ void config_exosphere(launch_ctxt_t *ctxt, u32 warmboot_base, bool exo_new) memset((void *)ATM_EXO_FATAL_ADDR, 0, ATM_EXO_FATAL_SIZE); if (ctxt->exofatal) memcpy((void *)ATM_EXO_FATAL_ADDR, ctxt->exofatal, ctxt->exofatal_size); - } - // Set display id. - exo_cfg->display_id = display_get_decoded_lcd_id(); + // Set display id. + exo_cfg->display_id = display_get_decoded_panel_id(); + } } static const char *get_error_desc(u32 error_desc) diff --git a/bootloader/main.c b/bootloader/main.c index 870070d..fd589e3 100644 --- a/bootloader/main.c +++ b/bootloader/main.c @@ -689,9 +689,7 @@ void nyx_load_run() sd_end(); - u32 expected_nyx_ver = ((NYX_VER_MJ + '0') << 24) | ((NYX_VER_MN + '0') << 16) | ((NYX_VER_HF + '0') << 8); - u32 nyx_ver = byte_swap_32(*(u32 *)(nyx + NYX_VER_OFF)); - + // Show loading logo. gfx_clear_grey(0x1B); u8 *BOOTLOGO = (void *)malloc(0x4000); blz_uncompress_srcdest(BOOTLOGO_BLZ, SZ_BOOTLOGO_BLZ, BOOTLOGO, SZ_BOOTLOGO); @@ -700,6 +698,8 @@ void nyx_load_run() display_backlight_brightness(h_cfg.backlight, 1000); // Check if Nyx version is old. + u32 expected_nyx_ver = ((NYX_VER_MJ + '0') << 24) | ((NYX_VER_MN + '0') << 16) | ((NYX_VER_HF + '0') << 8); + u32 nyx_ver = byte_swap_32(*(u32 *)(nyx + NYX_VER_OFF)); if (nyx_ver < expected_nyx_ver) { h_cfg.errors |= ERR_SYSOLD_NYX; @@ -713,7 +713,10 @@ void nyx_load_run() btn_wait(); } + // Set hekate errors. nyx_str->info.errors = h_cfg.errors; + + // Set Nyx mode. nyx_str->cfg = 0; if (b_cfg.extra_cfg) { @@ -735,6 +738,7 @@ void nyx_load_run() } } + // Set hekate version used to boot Nyx. nyx_str->version = ipl_ver.version - 0x303030; // Convert ASCII to numbers. //memcpy((u8 *)nyx_str->irama, (void *)IRAM_BASE, 0x8000); diff --git a/nyx/nyx_gui/hos/hos.c b/nyx/nyx_gui/hos/hos.c index 7b08f7b..8be8e00 100644 --- a/nyx/nyx_gui/hos/hos.c +++ b/nyx/nyx_gui/hos/hos.c @@ -231,10 +231,6 @@ void hos_eks_save(u32 kb) u8 *keys = (u8 *)calloc(0x1000, 1); se_get_aes_keys(keys + 0x800, keys, 0x10); - // Set SBK back. - if (h_cfg.sbk_set) - se_aes_key_set(14, keys + 14 * 0x10, 0x10); - // Set magic and personalized info. h_cfg.eks->magic = HOS_EKS_MAGIC; h_cfg.eks->enabled[key_idx] = kb;