Skip to content

Add sketch for reading MBR and partitions on SPIF #507

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Jun 22, 2022
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,129 @@
#include <BlockDevice.h>

struct __attribute__((packed)) mbrEntry {
uint8_t status;
uint8_t chsStart[3];
uint8_t type;
uint8_t chsStop[3];
uint32_t lbaOffset;
uint32_t lbaSize;
};

struct __attribute__((packed)) mbrTable {
mbrEntry entries[4];
uint8_t signature[2];
};

using namespace mbed;

unsigned long allocatedSpace {};

void setup()
{
Serial.begin(115200);
for (const auto timeout = millis() + 2500; !Serial && millis() < timeout; delay(250))
;

auto bd = BlockDevice::get_default_instance();
auto ret = bd->init();
if (ret) {
Serial.println("ERROR! Unable to read the Block Device.");
while (true)
;
}

// Allocate smallest buffer necessary to write MBR
auto buffer_size = std::max<uint32_t>(bd->get_program_size(), sizeof(mbrTable));

// Prevent alignment issues
if (buffer_size % bd->get_program_size() != 0) {
buffer_size += bd->get_program_size() - (buffer_size % bd->get_program_size());
}

auto buffer = new uint8_t[buffer_size];

// Check for existing MBR
ret = bd->read(buffer, 512 - buffer_size, buffer_size);
if (ret) {
Serial.println("ERROR! Unable to read the Master Boot Record");

delete[] buffer;
while (true)
;
}

auto table_start_offset = buffer_size - sizeof(mbrTable);
auto table = reinterpret_cast<mbrTable*>(&buffer[table_start_offset]);

Serial.println();
Serial.print("Looking for Partitions on the Flash Memory... ");

if (table->signature[0] != 0x55 || table->signature[1] != 0xAA) {
Serial.println("MBR Not Found");
Serial.println("Flash Memory doesn't have partitions.");
} else {

Serial.println("MBR Found");
Serial.print("Boot Signature: 0x");
Serial.print(table->signature[0], HEX);
Serial.println(table->signature[1], HEX);

Serial.println();
Serial.println("Printing Partitions Table and Info...");

auto part { 1u };
for (auto const& entry : table->entries) {
Serial.println("================================");
Serial.print("Partition: ");
Serial.println(part++);

Serial.print("Bootable: ");
Serial.println(entry.status == 0 ? "No" : "Yes");

Serial.print("Type: 0x");
if (entry.type < 0x10)
Serial.print(0);
Serial.println(entry.type, HEX);

if (entry.type == 0x00)
continue;

Serial.print("Size [KBytes]: ");
Serial.println((entry.lbaSize * 4096) >> 10);

allocatedSpace += entry.lbaSize * 4096;

Serial.print("Start [C/H/S]: ");
Serial.print(entry.chsStart[0]);
Serial.print("/");
Serial.print(entry.chsStart[1]);
Serial.print("/");
Serial.println(entry.chsStart[2]);

Serial.print("Stop [C/H/S]: ");
Serial.print(entry.chsStop[0]);
Serial.print("/");
Serial.print(entry.chsStop[1]);
Serial.print("/");
Serial.println(entry.chsStop[2]);

Serial.println();
}

Serial.println();
Serial.println("No more partitions are present.");
}

Serial.println();
Serial.print("Total Space [KBytes]: ");
Serial.println(bd->size() >> 10);
Serial.print("Allocated Space [KBytes]: ");
Serial.println(allocatedSpace >> 10);
Serial.print("Unallocated Space [KBytes]: ");
Serial.println((bd->size() - allocatedSpace) >> 10);
}

void loop()
{
delay(10000);
}