commit c85a09a89c720d64a9259f1c96cceee805212d96 Author: GaryOderNichts <12049776+GaryOderNichts@users.noreply.github.com> Date: Wed Aug 17 00:27:28 2022 +0200 Initial commit diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..062626e --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +/.vscode +/build +*.elf +*.rpx diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..e42cabe --- /dev/null +++ b/Makefile @@ -0,0 +1,135 @@ +#------------------------------------------------------------------------------- +.SUFFIXES: +#------------------------------------------------------------------------------- + +ifeq ($(strip $(DEVKITPRO)),) +$(error "Please set DEVKITPRO in your environment. export DEVKITPRO=/devkitpro") +endif + +TOPDIR ?= $(CURDIR) + +include $(DEVKITPRO)/wut/share/wut_rules + +#------------------------------------------------------------------------------- +# TARGET is the name of the output +# BUILD is the directory where object files & intermediate files will be placed +# SOURCES is a list of directories containing source code +# DATA is a list of directories containing data files +# INCLUDES is a list of directories containing header files +#------------------------------------------------------------------------------- +TARGET := $(notdir $(CURDIR)) +BUILD := build +SOURCES := . +DATA := data +INCLUDES := include + +#------------------------------------------------------------------------------- +# options for code generation +#------------------------------------------------------------------------------- +CFLAGS := -Wall -O2 -ffunction-sections \ + $(MACHDEP) + +CFLAGS += $(INCLUDE) -D__WIIU__ -D__WUT__ + +CXXFLAGS := $(CFLAGS) + +ASFLAGS := $(ARCH) +LDFLAGS = $(ARCH) $(RPXSPECS) -Wl,-Map,$(notdir $*.map) + +LIBS := -liosuhax -lwut + +#------------------------------------------------------------------------------- +# list of directories containing libraries, this must be the top level +# containing include and lib +#------------------------------------------------------------------------------- +LIBDIRS := $(PORTLIBS) $(WUT_ROOT) $(WUT_ROOT)/usr + + +#------------------------------------------------------------------------------- +# no real need to edit anything past this point unless you need to add additional +# rules for different file extensions +#------------------------------------------------------------------------------- +ifneq ($(BUILD),$(notdir $(CURDIR))) +#------------------------------------------------------------------------------- + +export OUTPUT := $(CURDIR)/$(TARGET) +export TOPDIR := $(CURDIR) + +export VPATH := $(foreach dir,$(SOURCES),$(CURDIR)/$(dir)) \ + $(foreach dir,$(DATA),$(CURDIR)/$(dir)) + +export DEPSDIR := $(CURDIR)/$(BUILD) + +CFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.c))) +CPPFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.cpp))) +SFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.s))) +BINFILES := $(foreach dir,$(DATA),$(notdir $(wildcard $(dir)/*.*))) + +#------------------------------------------------------------------------------- +# use CXX for linking C++ projects, CC for standard C +#------------------------------------------------------------------------------- +ifeq ($(strip $(CPPFILES)),) +#------------------------------------------------------------------------------- + export LD := $(CC) +#------------------------------------------------------------------------------- +else +#------------------------------------------------------------------------------- + export LD := $(CXX) +#------------------------------------------------------------------------------- +endif +#------------------------------------------------------------------------------- + +export OFILES_BIN := $(addsuffix .o,$(BINFILES)) +export OFILES_SRC := $(CPPFILES:.cpp=.o) $(CFILES:.c=.o) $(SFILES:.s=.o) +export OFILES := $(OFILES_BIN) $(OFILES_SRC) +export HFILES_BIN := $(addsuffix .h,$(subst .,_,$(BINFILES))) + +export INCLUDE := $(foreach dir,$(INCLUDES),-I$(CURDIR)/$(dir)) \ + $(foreach dir,$(LIBDIRS),-I$(dir)/include) \ + -I$(CURDIR)/$(BUILD) + +export LIBPATHS := $(foreach dir,$(LIBDIRS),-L$(dir)/lib) + +.PHONY: $(BUILD) clean all + +#------------------------------------------------------------------------------- +all: $(BUILD) + +$(BUILD): + @[ -d $@ ] || mkdir -p $@ + @$(MAKE) --no-print-directory -C $(BUILD) -f $(CURDIR)/Makefile + +#------------------------------------------------------------------------------- +clean: + @echo clean ... + @rm -fr $(BUILD) $(TARGET).rpx $(TARGET).elf + +#------------------------------------------------------------------------------- +else +.PHONY: all + +DEPENDS := $(OFILES:.o=.d) + +#------------------------------------------------------------------------------- +# main targets +#------------------------------------------------------------------------------- +all : $(OUTPUT).rpx + +$(OUTPUT).rpx : $(OUTPUT).elf +$(OUTPUT).elf : $(OFILES) + +$(OFILES_SRC) : $(HFILES_BIN) + +#------------------------------------------------------------------------------- +# you need a rule like this for each extension you use as binary data +#------------------------------------------------------------------------------- +%.bin.o %_bin.h : %.bin +#------------------------------------------------------------------------------- + @echo $(notdir $<) + @$(bin2o) + +-include $(DEPENDS) + +#------------------------------------------------------------------------------- +endif +#------------------------------------------------------------------------------- diff --git a/README.md b/README.md new file mode 100644 index 0000000..bc5b047 --- /dev/null +++ b/README.md @@ -0,0 +1,12 @@ +# mdinfo + +Quick and dirty tool to display info about IOSU's memory devices. +Can be used to figure out what eMMC chip is built into a console. + +**Note: You need the [MochaPayload](https://github.com/wiiu-env/MochaPayload) for this to work** + +## Currently displays: +* Manufacturer ID + -> Shows known name and type for that ID +* Product Revision +* Product Name diff --git a/idsdb.h b/idsdb.h new file mode 100644 index 0000000..c55e559 --- /dev/null +++ b/idsdb.h @@ -0,0 +1,204 @@ +#pragma once + +// from https://kernel.googlesource.com/pub/scm/utils/mmc/mmc-utils/+/refs/heads/master/lsmmc.c + +struct ids_database { + char *type; + int id; + char *manufacturer; +}; + +static struct ids_database unk_db = { + .type = "unk", + .manufacturer = "Unknown", +}; + +static struct ids_database database[] = { + { + .type = "sd", + .id = 0x01, + .manufacturer = "Panasonic", + }, + { + .type = "sd", + .id = 0x02, + .manufacturer = "Toshiba/Kingston/Viking", + }, + { + .type = "sd", + .id = 0x03, + .manufacturer = "SanDisk", + }, + { + .type = "sd", + .id = 0x08, + .manufacturer = "Silicon Power", + }, + { + .type = "sd", + .id = 0x18, + .manufacturer = "Infineon", + }, + { + .type = "sd", + .id = 0x1b, + .manufacturer = "Transcend/Samsung", + }, + { + .type = "sd", + .id = 0x1c, + .manufacturer = "Transcend", + }, + { + .type = "sd", + .id = 0x1d, + .manufacturer = "Corsair/AData", + }, + { + .type = "sd", + .id = 0x1e, + .manufacturer = "Transcend", + }, + { + .type = "sd", + .id = 0x1f, + .manufacturer = "Kingston", + }, + { + .type = "sd", + .id = 0x27, + .manufacturer = "Delkin/Phison", + }, + { + .type = "sd", + .id = 0x28, + .manufacturer = "Lexar", + }, + { + .type = "sd", + .id = 0x30, + .manufacturer = "SanDisk", + }, + { + .type = "sd", + .id = 0x31, + .manufacturer = "Silicon Power", + }, + { + .type = "sd", + .id = 0x33, + .manufacturer = "STMicroelectronics", + }, + { + .type = "sd", + .id = 0x41, + .manufacturer = "Kingston", + }, + { + .type = "sd", + .id = 0x6f, + .manufacturer = "STMicroelectronics", + }, + { + .type = "sd", + .id = 0x74, + .manufacturer = "Transcend", + }, + { + .type = "sd", + .id = 0x76, + .manufacturer = "Patriot", + }, + { + .type = "sd", + .id = 0x82, + .manufacturer = "Gobe/Sony", + }, + { + .type = "sd", + .id = 0x89, + .manufacturer = "Unknown", + }, + { + .type = "mmc", + .id = 0x00, + .manufacturer = "SanDisk", + }, + { + .type = "mmc", + .id = 0x02, + .manufacturer = "Kingston/SanDisk", + }, + { + .type = "mmc", + .id = 0x03, + .manufacturer = "Toshiba", + }, + { + .type = "mmc", + .id = 0x05, + .manufacturer = "Unknown", + }, + { + .type = "mmc", + .id = 0x06, + .manufacturer = "Unknown", + }, + { + .type = "mmc", + .id = 0x11, + .manufacturer = "Toshiba", + }, + { + .type = "mmc", + .id = 0x13, + .manufacturer = "Micron", + }, + { + .type = "mmc", + .id = 0x15, + .manufacturer = "Samsung/SanDisk/LG", + }, + { + .type = "mmc", + .id = 0x37, + .manufacturer = "KingMax", + }, + { + .type = "mmc", + .id = 0x44, + .manufacturer = "SanDisk", + }, + { + .type = "mmc", + .id = 0x2c, + .manufacturer = "Kingston", + }, + { + .type = "mmc", + .id = 0x70, + .manufacturer = "Kingston", + }, + { + .type = "mmc", + .id = 0xfe, + .manufacturer = "Micron", + }, + { + .type = "mmc", + .id = 0x90, + .manufacturer = "Hynix", + }, +}; + +static inline struct ids_database *find_by_id(int id) +{ + unsigned int ids_cnt = sizeof(database) / sizeof(struct ids_database); + for (int i = 0; i < ids_cnt; ++i) { + if (database[i].id == id) { + return &database[i]; + } + } + + return &unk_db; +} diff --git a/main.c b/main.c new file mode 100644 index 0000000..43e2955 --- /dev/null +++ b/main.c @@ -0,0 +1,79 @@ +#include +#include +#include +#include + +#include + +#include "idsdb.h" + +struct SALDeviceParams { + uint32_t usrptr; + uint32_t mid_prv; + uint32_t device_type; + uint32_t unk[16]; + char name0[128]; + char name1[128]; + char name2[128]; + uint32_t functions[12]; +}; + +struct MDBlkDriver { + int32_t registered; + int32_t unk[2]; + struct SALDeviceParams params; + uint8_t unk2[204]; +}; +static_assert(sizeof(struct MDBlkDriver) == 724, "MDBlkDriver: wrong size"); + +#define MDBLK_DRIVER_ADDRESS 0x11c39e78 + +struct MDBlkDriver blkDrivers[2] = { 0 }; + +int main(int argc, char const *argv[]) +{ + WHBProcInit(); + WHBLogUdpInit(); + WHBLogConsoleInit(); + + if (IOSUHAX_Open(NULL) >= 0) { + if (IOSUHAX_kern_read32(MDBLK_DRIVER_ADDRESS, (uint32_t *) blkDrivers, sizeof(blkDrivers) / 4) >= 0) { + for (int i = 0; i < 2; ++i) { + struct MDBlkDriver *drv = &blkDrivers[i]; + WHBLogPrintf("** Instance %d: (%s) **", i + 1, drv->registered ? "Attached" : "Detached"); + if (drv->registered) { + uint16_t mid = drv->params.mid_prv >> 16; + uint16_t prv = drv->params.mid_prv & 0xff; + struct ids_database *db = find_by_id(mid); + + WHBLogPrintf("Manufacturer ID: 0x%02x, Product revision: 0x%02x", mid, prv); + WHBLogPrintf(" -> Manufacturer: '%s' Type: '%s'", db->manufacturer, db->type); + WHBLogPrintf("Name 0: '%s' Name 1: '%s' Name 2: '%s'", drv->params.name0, drv->params.name1, drv->params.name2); + + /* + for (int j = 0; j < 4; ++j) { + WHBLogPrintf("Unk %d: %08x %08x %08x %08x", j, drv->params.unk[j * 4 + 0], drv->params.unk[j * 4 + 1], drv->params.unk[j * 4 + 2], drv->params.unk[j * 4 + 3]); + } + */ + } + + WHBLogPrintf("================================================="); + } + } else { + WHBLogPrintf("Failed to read driver data"); + } + + IOSUHAX_Close(); + } else { + WHBLogPrintf("Failed to open IOSUHAX"); + } + + while (WHBProcIsRunning()) { + WHBLogConsoleDraw(); + } + + WHBLogConsoleFree(); + WHBLogUdpDeinit(); + WHBProcShutdown(); + return 0; +}