diff --git a/nyx/nyx_gui/frontend/gui_info.c b/nyx/nyx_gui/frontend/gui_info.c index 14b814b5..26680fd4 100644 --- a/nyx/nyx_gui/frontend/gui_info.c +++ b/nyx/nyx_gui/frontend/gui_info.c @@ -412,51 +412,63 @@ typedef struct _hw_info_t hw_info_t *hw_info = NULL; +//! TODO: Limits assumed based on known samples. +#define WAFER_20NM_X_MIN -9 +#define WAFER_20NM_X_MAX 15 +#define WAFER_20NM_Y_MIN 1 +#define WAFER_20NM_Y_MAX 24 + +// Limits validated based on known samples. +#define WAFER_16NM_X_MIN -11 +#define WAFER_16NM_X_MAX 17 +#define WAFER_16NM_Y_MIN 0 +#define WAFER_16NM_Y_MAX 27 + void _hw_info_wafer(int die_x, int die_y) { static lv_img_dsc_t wafer_desc = { 0 }; - int radius; + int diameter; if (h_cfg.t210b01) { - //! TODO: Limits based on known samples. - if (die_x < -11 || die_x > 17 || die_y > 27) - die_x = -12; + if (die_x < WAFER_16NM_X_MIN || die_x > WAFER_16NM_X_MAX || + die_y < WAFER_16NM_Y_MIN || die_y > WAFER_16NM_Y_MAX) + die_x = WAFER_16NM_X_MIN - 1; - radius = 29; - die_x += 11; + die_x += -WAFER_16NM_X_MIN; + diameter = 29; } else { - //! TODO: Limits based on known samples. - if (die_x < -10 || die_x > 15 || die_y > 24) - die_x = -11; + if (die_x < WAFER_20NM_X_MIN || die_x > WAFER_20NM_X_MAX || + die_y < 0 || die_y > WAFER_20NM_Y_MAX) + die_x = WAFER_20NM_X_MIN - 1; - radius = 26; - die_x += 10; + die_x += -WAFER_20NM_X_MIN; + diameter = 26; } const u32 die_size = 2; const u32 die_side = die_size + 1; - const u32 die_line = die_side * radius + 1; - const int align_off = (die_size - 2) * radius; + const u32 die_line = die_side * diameter + 1; + const int align_off = (die_size - 2) * diameter; const u32 die_color = (die_x == -1) ? 0xFFFF0000 : 0x30FFFFFF; // Red for OOB. const u32 str_color = 0x10FFFFFF; const u32 hit_color = 0xFFFF8000; u32 *wafer_map = calloc(1, die_line * die_line * sizeof(u32)); - for (int y = 0; y < radius; y++) + for (int y = 0; y < diameter; y++) { u32 wafer_row_next = -1; u32 wafer_row = h_cfg.t210b01 ? wafer16nm[y] : wafer20nm[y]; - if ((y + 1) < radius) + if ((y + 1) < diameter) wafer_row_next = h_cfg.t210b01 ? wafer16nm[y + 1] : wafer20nm[y + 1]; // Paint the first row of dies. int pos_y = y * die_line * die_side + die_line; - for (int x = 0; x < radius; x++) + for (int x = 0; x < diameter; x++) { bool die_found = x == die_x && die_y == y; bool in_wafer = wafer_row & (1u << x); @@ -512,7 +524,7 @@ void _hw_info_wafer(int die_x, int die_y) lv_obj_t *wafer_txt = lv_label_create(lv_scr_act(), NULL); lv_label_set_style(wafer_txt, &monospace_text); - lv_label_set_static_text(wafer_txt, "Wafer"); + lv_label_set_static_text(wafer_txt, (die_x == -1) ? "Error" : "Wafer"); lv_obj_align(wafer_txt, wafer_img, LV_ALIGN_OUT_BOTTOM_MID, 0, 0); hw_info->wafer_txt = wafer_txt; } @@ -1987,6 +1999,9 @@ static lv_res_t _create_window_emmc_info_status(lv_obj_t *btn) strcat(txt_buf, "SanDisk "); lv_win_add_btn(win, NULL, SYMBOL_FILE_ALT" Device Report", _create_mbox_emmc_sandisk_report); break; + case 0x89: // Unofficial. + strcat(txt_buf, "Silicon Motion "); + break; case 0x90: strcat(txt_buf, "SK Hynix "); break;