LCD Driver, some teensy code, SDCard code, MBR/FAT32
This commit is contained in:
73
ext/sd/MBR.h
Normal file
73
ext/sd/MBR.h
Normal file
@@ -0,0 +1,73 @@
|
||||
#pragma once
|
||||
|
||||
template <typename BlockDev> class MBR {
|
||||
|
||||
BlockDev& dev;
|
||||
bool present = false;
|
||||
bool valid = false;
|
||||
|
||||
/** describes one partition */
|
||||
class Partition {
|
||||
|
||||
friend class MBR;
|
||||
|
||||
uint8_t type;
|
||||
uint32_t firstSector;
|
||||
uint32_t numSectors;
|
||||
|
||||
public:
|
||||
|
||||
bool isPresent() const {return type != 0;}
|
||||
uint8_t getType() const {return type;}
|
||||
uint32_t getFirstSector() const {return firstSector;}
|
||||
uint32_t getNumSectors() const {return numSectors;}
|
||||
|
||||
};
|
||||
|
||||
Partition partitions[4];
|
||||
|
||||
public:
|
||||
|
||||
MBR(BlockDev& dev) : dev(dev) {
|
||||
read();
|
||||
}
|
||||
|
||||
bool isPresent() const {return present;}
|
||||
bool isValid() const {return valid;}
|
||||
|
||||
Partition& getPartition(uint8_t idx) {
|
||||
return partitions[idx];
|
||||
}
|
||||
|
||||
private:
|
||||
|
||||
void read() {
|
||||
|
||||
uint8_t buf[512];
|
||||
dev.read(0x00000000, 512, buf);
|
||||
present = (buf[510] == 0x55) && (buf[511] == 0xAA);
|
||||
valid = (buf[0x01BC] == 0x00) && (buf[0x01BD] == 0x00);
|
||||
|
||||
if (present && valid) {
|
||||
|
||||
// parse all 4 partitions
|
||||
for (uint8_t i = 0; i < 4; ++i) {
|
||||
|
||||
const uint8_t* src = &buf[0x1BE + i*16];
|
||||
Partition* p = &partitions[i];
|
||||
|
||||
p->type = src[0x4];
|
||||
p->firstSector = getU32(src, 8);
|
||||
p->numSectors = getU32(src, 12);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
uint32_t getU32(const uint8_t* src, const uint8_t offset) {
|
||||
return src[offset+0]<<0 | src[offset+1]<<8 | src[offset+2]<<16 | src[offset+3]<<24;
|
||||
}
|
||||
|
||||
};
|
||||
Reference in New Issue
Block a user