nyx: info: improve emmc info
And also add maintenance (bkops) info.
This commit is contained in:
@@ -1929,9 +1929,9 @@ error:
|
|||||||
if (error)
|
if (error)
|
||||||
{
|
{
|
||||||
if (error == -1)
|
if (error == -1)
|
||||||
s_printf(txt_buf + strlen(txt_buf), "\n#FFDD00 Aborted!#");
|
s_printf(txt_buf + strlen(txt_buf), "\n#FFDD00 Aborted! #");
|
||||||
else
|
else
|
||||||
s_printf(txt_buf + strlen(txt_buf), "\n#FFDD00 IO Error occurred!#");
|
s_printf(txt_buf + strlen(txt_buf), "\n#FFDD00 IO Error occurred! #");
|
||||||
|
|
||||||
lv_label_set_text(lbl_status, txt_buf);
|
lv_label_set_text(lbl_status, txt_buf);
|
||||||
lv_obj_align(lbl_status, NULL, LV_ALIGN_CENTER, 0, 0);
|
lv_obj_align(lbl_status, NULL, LV_ALIGN_CENTER, 0, 0);
|
||||||
@@ -2014,16 +2014,16 @@ static lv_res_t _create_window_emmc_info_status(lv_obj_t *btn)
|
|||||||
goto out_error;
|
goto out_error;
|
||||||
}
|
}
|
||||||
|
|
||||||
u32 speed = 0;
|
u32 bus_clock = 0;
|
||||||
char *rsvd_blocks;
|
char *rsvd_blocks;
|
||||||
char life_a_txt[8];
|
char life_a_txt[8];
|
||||||
char life_b_txt[8];
|
char life_b_txt[8];
|
||||||
|
char bkops[64];
|
||||||
u32 cache = emmc_storage.ext_csd.cache_size;
|
u32 cache = emmc_storage.ext_csd.cache_size;
|
||||||
u32 life_a = emmc_storage.ext_csd.dev_life_est_a;
|
u32 life_a = emmc_storage.ext_csd.dev_life_est_a;
|
||||||
u32 life_b = emmc_storage.ext_csd.dev_life_est_b;
|
u32 life_b = emmc_storage.ext_csd.dev_life_est_b;
|
||||||
u16 card_type = emmc_storage.ext_csd.card_type;
|
u16 card_type = emmc_storage.ext_csd.card_type;
|
||||||
char card_type_support[96];
|
char *max_bus_support = "Unknown";
|
||||||
card_type_support[0] = 0;
|
|
||||||
|
|
||||||
// Identify manufacturer. Only official eMMCs.
|
// Identify manufacturer. Only official eMMCs.
|
||||||
switch (emmc_storage.cid.manfid)
|
switch (emmc_storage.cid.manfid)
|
||||||
@@ -2057,50 +2057,69 @@ static lv_res_t _create_window_emmc_info_status(lv_obj_t *btn)
|
|||||||
emmc_storage.cid.prv & 0xF, emmc_storage.cid.prv >> 4,
|
emmc_storage.cid.prv & 0xF, emmc_storage.cid.prv >> 4,
|
||||||
emmc_storage.cid.serial, emmc_storage.cid.month, emmc_storage.cid.year);
|
emmc_storage.cid.serial, emmc_storage.cid.month, emmc_storage.cid.year);
|
||||||
|
|
||||||
if (card_type & EXT_CSD_CARD_TYPE_HS_26)
|
|
||||||
{
|
|
||||||
strcat(card_type_support, "HS26");
|
|
||||||
speed = (26 << 16) | 26;
|
|
||||||
}
|
|
||||||
if (card_type & EXT_CSD_CARD_TYPE_HS_52)
|
|
||||||
{
|
|
||||||
strcat(card_type_support, ", HS52");
|
|
||||||
speed = (52 << 16) | 52;
|
|
||||||
}
|
|
||||||
if (card_type & EXT_CSD_CARD_TYPE_DDR_1_8V)
|
|
||||||
{
|
|
||||||
strcat(card_type_support, ", DDR52 1.8V");
|
|
||||||
speed = (52 << 16) | 104;
|
|
||||||
}
|
|
||||||
if (card_type & EXT_CSD_CARD_TYPE_HS200_1_8V)
|
|
||||||
{
|
|
||||||
strcat(card_type_support, ", HS200 1.8V");
|
|
||||||
speed = (200 << 16) | 200;
|
|
||||||
}
|
|
||||||
if (card_type & EXT_CSD_CARD_TYPE_HS400_1_8V)
|
if (card_type & EXT_CSD_CARD_TYPE_HS400_1_8V)
|
||||||
|
max_bus_support = "HS400";
|
||||||
|
else if (card_type & EXT_CSD_CARD_TYPE_HS200_1_8V)
|
||||||
|
max_bus_support = "HS200";
|
||||||
|
else if (card_type & EXT_CSD_CARD_TYPE_DDR_1_8V)
|
||||||
|
max_bus_support = "DDR52";
|
||||||
|
else if (card_type & EXT_CSD_CARD_TYPE_HS_52)
|
||||||
|
max_bus_support = "HS52";
|
||||||
|
else if (card_type & EXT_CSD_CARD_TYPE_HS_26)
|
||||||
|
max_bus_support = "HS26";
|
||||||
|
|
||||||
|
if (emmc_storage.csd.busspeed == 400)
|
||||||
|
bus_clock = 200;
|
||||||
|
else
|
||||||
|
bus_clock = emmc_storage.csd.busspeed; // Except DDR52 where it's 26 MHz.
|
||||||
|
|
||||||
|
strcpy(bkops, "-");
|
||||||
|
if (emmc_storage.ext_csd.bkops)
|
||||||
{
|
{
|
||||||
strcat(card_type_support, ", HS400 1.8V");
|
if (emmc_storage.ext_csd.bkops_en & EXT_CSD_BKOPS_AUTO)
|
||||||
speed = (200 << 16) | 400;
|
{
|
||||||
|
strcpy(bkops, "Auto");
|
||||||
|
if (emmc_storage.ext_csd.bkops_en & EXT_CSD_BKOPS_MANUAL)
|
||||||
|
strcat(bkops, " + Manual");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
strcpy(bkops, "Off");
|
||||||
|
strcat(bkops, ": ");
|
||||||
|
|
||||||
|
switch (emmc_storage.raw_ext_csd[EXT_CSD_BKOPS_STATUS])
|
||||||
|
{
|
||||||
|
case 0:
|
||||||
|
strcat(bkops, "OK");
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
strcat(bkops, "Minor");
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
strcat(bkops, "#FFDD00 Degraded#");
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
strcat(bkops, "#FFDD00 Critical#");
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
strcpy(life_a_txt, "-");
|
strcpy(life_a_txt, "-");
|
||||||
strcpy(life_b_txt, "-");
|
strcpy(life_b_txt, "-");
|
||||||
|
|
||||||
// Normalize cells life.
|
// Normalize cells life (Used -> Left).
|
||||||
if (life_a) // SK Hynix is 0 (undefined).
|
if (life_a) // If 0 no NAND Type A.
|
||||||
{
|
{
|
||||||
life_a--;
|
life_a = (10 - (life_a - 1)) * 10;
|
||||||
life_a = (10 - life_a) * 10;
|
|
||||||
s_printf(life_a_txt, "%d%%", life_a);
|
s_printf(life_a_txt, "%d%%", life_a);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (life_b) // Toshiba is 0 (undefined).
|
if (life_b) // If 0 no NAND Type B.
|
||||||
{
|
{
|
||||||
life_b--;
|
life_b = (10 - (life_b - 1)) * 10;
|
||||||
life_b = (10 - life_b) * 10;
|
|
||||||
s_printf(life_b_txt, "%d%%", life_b);
|
s_printf(life_b_txt, "%d%%", life_b);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Reserved blocks used.
|
||||||
switch (emmc_storage.ext_csd.pre_eol_info)
|
switch (emmc_storage.ext_csd.pre_eol_info)
|
||||||
{
|
{
|
||||||
case 1:
|
case 1:
|
||||||
@@ -2118,12 +2137,13 @@ static lv_res_t _create_window_emmc_info_status(lv_obj_t *btn)
|
|||||||
}
|
}
|
||||||
|
|
||||||
s_printf(txt_buf + strlen(txt_buf),
|
s_printf(txt_buf + strlen(txt_buf),
|
||||||
"#00DDFF V1.%d (rev 1.%d)#\n%02X\n%d MB/s (%d MHz)\n%d MB/s\n%s\n%d %s\n%d MiB\nA: %s, B: %s\n%s",
|
"#00DDFF V1.%d (rev 1.%d)#\n%02X\n%s\n%d MB/s (%d MHz)\n%d MiB\n%d %s\n\n%s\nA: %s, B: %s\n%s",
|
||||||
emmc_storage.ext_csd.ext_struct, emmc_storage.ext_csd.rev,
|
emmc_storage.ext_csd.ext_struct, emmc_storage.ext_csd.rev,
|
||||||
emmc_storage.csd.cmdclass, speed & 0xFFFF, (speed >> 16) & 0xFFFF,
|
emmc_storage.csd.cmdclass, max_bus_support,
|
||||||
emmc_storage.csd.busspeed, card_type_support,
|
emmc_storage.csd.busspeed, bus_clock,
|
||||||
!(cache % 1024) ? (cache / 1024) : cache, !(cache % 1024) ? "MiB" : "KiB",
|
|
||||||
emmc_storage.ext_csd.max_enh_mult * EMMC_BLOCKSIZE / 1024,
|
emmc_storage.ext_csd.max_enh_mult * EMMC_BLOCKSIZE / 1024,
|
||||||
|
!(cache % 1024) ? (cache / 1024) : cache, !(cache % 1024) ? "MiB" : "KiB",
|
||||||
|
bkops,
|
||||||
life_a_txt, life_b_txt, rsvd_blocks);
|
life_a_txt, life_b_txt, rsvd_blocks);
|
||||||
|
|
||||||
lv_label_set_static_text(lb_desc,
|
lv_label_set_static_text(lb_desc,
|
||||||
@@ -2135,25 +2155,25 @@ static lv_res_t _create_window_emmc_info_status(lv_obj_t *btn)
|
|||||||
"Month/Year:\n\n"
|
"Month/Year:\n\n"
|
||||||
"#00DDFF Ext CSD:#\n"
|
"#00DDFF Ext CSD:#\n"
|
||||||
"Cmd Classes:\n"
|
"Cmd Classes:\n"
|
||||||
"Max Rate:\n"
|
"Max Bus Rate:\n"
|
||||||
"Current Rate:\n"
|
"Current Rate:\n"
|
||||||
"Type Support:\n\n"
|
|
||||||
"Write Cache:\n"
|
|
||||||
"Enhanced Area:\n"
|
"Enhanced Area:\n"
|
||||||
|
"Write Cache:\n\n"
|
||||||
|
"Maintenance:\n"
|
||||||
"Estimated Life:\n"
|
"Estimated Life:\n"
|
||||||
"Reserved Used:"
|
"Reserved Used:"
|
||||||
);
|
);
|
||||||
lv_obj_set_width(lb_desc, lv_obj_get_width(desc));
|
lv_obj_set_width(lb_desc, lv_obj_get_width(desc));
|
||||||
|
|
||||||
lv_obj_t *val = lv_cont_create(win, NULL);
|
lv_obj_t *info = lv_cont_create(win, NULL);
|
||||||
lv_obj_set_size(val, LV_HOR_RES / 11 * 3, LV_VER_RES - (LV_DPI * 11 / 7) - 5);
|
lv_obj_set_size(info, LV_HOR_RES / 11 * 3, LV_VER_RES - (LV_DPI * 11 / 7) - 5);
|
||||||
|
|
||||||
lv_obj_t * lb_val = lv_label_create(val, lb_desc);
|
lv_obj_t * lb_val = lv_label_create(info, lb_desc);
|
||||||
|
|
||||||
lv_label_set_text(lb_val, txt_buf);
|
lv_label_set_text(lb_val, txt_buf);
|
||||||
|
|
||||||
lv_obj_set_width(lb_val, lv_obj_get_width(val));
|
lv_obj_set_width(lb_val, lv_obj_get_width(info));
|
||||||
lv_obj_align(val, desc, LV_ALIGN_OUT_RIGHT_MID, 0, 0);
|
lv_obj_align(info, desc, LV_ALIGN_OUT_RIGHT_MID, 0, 0);
|
||||||
|
|
||||||
lv_obj_t *desc2 = lv_cont_create(win, NULL);
|
lv_obj_t *desc2 = lv_cont_create(win, NULL);
|
||||||
lv_obj_set_size(desc2, LV_HOR_RES / 2 / 4 * 4, LV_VER_RES - (LV_DPI * 11 / 7) - 5);
|
lv_obj_set_size(desc2, LV_HOR_RES / 2 / 4 * 4, LV_VER_RES - (LV_DPI * 11 / 7) - 5);
|
||||||
@@ -2209,7 +2229,7 @@ static lv_res_t _create_window_emmc_info_status(lv_obj_t *btn)
|
|||||||
|
|
||||||
lv_label_set_text(lb_desc2, txt_buf);
|
lv_label_set_text(lb_desc2, txt_buf);
|
||||||
lv_obj_set_width(lb_desc2, lv_obj_get_width(desc2));
|
lv_obj_set_width(lb_desc2, lv_obj_get_width(desc2));
|
||||||
lv_obj_align(desc2, val, LV_ALIGN_OUT_RIGHT_MID, LV_DPI / 6, 0);
|
lv_obj_align(desc2, info, LV_ALIGN_OUT_RIGHT_MID, LV_DPI / 6, 0);
|
||||||
|
|
||||||
emmc_errors = emmc_get_error_count();
|
emmc_errors = emmc_get_error_count();
|
||||||
if (emmc_get_mode() < EMMC_MMC_HS400 ||
|
if (emmc_get_mode() < EMMC_MMC_HS400 ||
|
||||||
|
|||||||
Reference in New Issue
Block a user