Merge into main the new state of the operating system/kernel #1
21
src/kernel/filesytems/FAT32/BiosParameterBlock.h
Normal file
21
src/kernel/filesytems/FAT32/BiosParameterBlock.h
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
#pragma once
|
||||||
|
#include <stdint.h>
|
||||||
|
#include "./ExtendBootRecord.h"
|
||||||
|
|
||||||
|
struct BiosParameterBlock {
|
||||||
|
uint8_t BootLoaderCodeSection [3];
|
||||||
|
uint8_t OEM_id [8];
|
||||||
|
uint16_t BytesPerSector ; // I suspect would be 512
|
||||||
|
uint8_t SectorsPerCluster ;
|
||||||
|
uint16_t ReservedSectors;
|
||||||
|
uint8_t NumberOfFileAllocationTables; // Probably equals 2
|
||||||
|
uint16_t NumberOfDirectoryEntries; // Root directory must contain entire sectors
|
||||||
|
uint16_t TotalSectorsInLogicalVolume ; // 0 means >65535 sectors in volume , actual count can be found in LargeSectorCount
|
||||||
|
uint8_t MediaDescriptor ; // Indication the media descriptor type
|
||||||
|
uint16_t NumberOfSectorsPerFAT;// only in FAT12 / FAT 16
|
||||||
|
uint16_t NumberOfSectorsPerTrack;
|
||||||
|
uint16_t NumberOfHeadsOnMedia;
|
||||||
|
uint32_t NumberOfHiddenSectors;
|
||||||
|
uint32_t LargeSectorCount;
|
||||||
|
ExtendedBootRecord_FAT16 ebpb;
|
||||||
|
}__attribute__((packed));
|
32
src/kernel/filesytems/FAT32/ExtendBootRecord.h
Normal file
32
src/kernel/filesytems/FAT32/ExtendBootRecord.h
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
#pragma once
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
struct ExtendedBootRecord_FAT16{
|
||||||
|
uint8_t DriveNumber;
|
||||||
|
uint8_t Reserved;
|
||||||
|
uint8_t Signature;
|
||||||
|
const uint32_t VOLUME_ID_SERIAL_NUMBER;
|
||||||
|
uint8_t volume_label [11];
|
||||||
|
uint8_t Identifier_string [8];
|
||||||
|
uint8_t bootCode [448];
|
||||||
|
uint16_t partitionSignature;
|
||||||
|
}__attribute__((packed));
|
||||||
|
|
||||||
|
struct ExtendedBootRecord_FAT32{
|
||||||
|
uint32_t SectorsPerFAT;
|
||||||
|
uint16_t Flags;
|
||||||
|
const uint16_t FAT_VERSION_NUMBER;
|
||||||
|
uint32_t rootDirectory_clusterNumber;// Often set to 2;
|
||||||
|
uint16_t FSInfo_SectorNumber;
|
||||||
|
uint16_t backup_bpb_sectorNumber;
|
||||||
|
uint8_t Reserved [12];
|
||||||
|
uint8_t DriveNumber;
|
||||||
|
uint8_t Reserved2;
|
||||||
|
uint8_t Signature; // must be 0x28 or 0x29
|
||||||
|
uint32_t VOLUME_ID_SERIAL;
|
||||||
|
uint8_t volume_label[11];
|
||||||
|
uint8_t SystemIdentifierString [8]; // ALWAYS "FAT32 " but spec says do not trust
|
||||||
|
uint8_t BootCode [420]; // NICE
|
||||||
|
uint16_t PartitionSignature; // 0xAA55
|
||||||
|
|
||||||
|
}__attribute__((packed));
|
@ -44,40 +44,84 @@ extern "C" void kernel_main (void);
|
|||||||
init_serial();
|
init_serial();
|
||||||
print_serial("Serial port initialized!");
|
print_serial("Serial port initialized!");
|
||||||
|
|
||||||
|
RSDPTR* rsd = FindRSD();
|
||||||
|
RSDT* rsd_table = getRSDT(rsd);
|
||||||
|
|
||||||
|
|
||||||
// Enumerate the PCI bus
|
// Enumerate the PCI bus
|
||||||
PCI_Enumerate();
|
PCI_Enumerate();
|
||||||
|
TestIDEController();
|
||||||
|
|
||||||
|
|
||||||
TestIDEController();
|
|
||||||
|
|
||||||
int devNumber = 0 ;
|
int devNumber = 0 ;
|
||||||
for ( auto device : ide_devices){
|
for ( auto device : ide_devices){
|
||||||
if (!device.Reserved)
|
if (!device.Reserved)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
|
||||||
printf("Device %d\n" , devNumber);
|
printf("Device %d\n" , devNumber);
|
||||||
printf (" Device on Channel: (0x%x) %s\n" ,device.Channel, device.Channel == 0 ? "Primary" : "Secondary");
|
printf (" Device on Channel: (0x%x) %s\n" ,device.Channel, device.Channel == 0 ? "Primary" : "Secondary");
|
||||||
printf (" Device drive:(0x%x) %s\n" , device.Drive, device.Drive? "Slave" : "Master");
|
printf (" Device drive:(0x%x) %s\n" , device.Drive, device.Drive? "Slave" : "Master");
|
||||||
printf (" Device Type:(0x%x) %s\n" , device.Type, device.Type ? "ATAPI" : "ATA");
|
printf (" Device Type:(0x%x) %s\n" , device.Type, device.Type ? "ATAPI" : "ATA");
|
||||||
devNumber ++;
|
devNumber ++;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// ATAPI_DEVICE::isPacketDevice();
|
enum BUS_PORT {
|
||||||
|
Primary= 0x1f0,
|
||||||
|
Secondary = 0x170
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
ATAPI_DEVICE::Identify(ATA_SECONDARY, DEVICE_DRIVE::MASTER);
|
|
||||||
|
ATA_DEVICE::Identify((uint16_t) BUS_PORT::Primary, DEVICE_DRIVE::MASTER);
|
||||||
|
|
||||||
|
const int C = 0;
|
||||||
|
const int H = 0;
|
||||||
|
const int HPC = 16;
|
||||||
|
const int SPT = 63;
|
||||||
|
|
||||||
|
int S = 1;
|
||||||
|
uint32_t LBA = (C*HPC+H) * SPT + (S-1);
|
||||||
|
printf("LBA: %d\n" , LBA);
|
||||||
|
uint16_t buffer [256];
|
||||||
|
|
||||||
|
|
||||||
|
ATA_DEVICE::Read(BUS_PORT::Primary, DEVICE_DRIVE::MASTER, LBA, buffer);
|
||||||
|
|
||||||
|
MBR* mbr = (MBR*) buffer;
|
||||||
|
|
||||||
|
printf("BootSector: 0x%x\n", mbr->ValidBootsector );
|
||||||
|
for( int i = 0 ; i < 4 ; i ++){
|
||||||
|
PartitionTableEntry PT = mbr->TableEntries[i];
|
||||||
|
|
||||||
|
printf("Partition %d [ %d sectors, PartitionType: %x, 0x%x, \nLBA Start: 0x%x ]\n" ,
|
||||||
|
i, PT.Number_sectors_inPartition, PT.PartitionType, mbr->uniqueID, PT.LBA_partition_start );
|
||||||
|
}
|
||||||
|
|
||||||
|
// Find the super block
|
||||||
|
uint16_t superBlock[256];
|
||||||
|
ATA_DEVICE::Read(BUS_PORT::Primary, DEVICE_DRIVE::MASTER, mbr->TableEntries[0].LBA_partition_start, superBlock);
|
||||||
|
|
||||||
|
BiosParameterBlock* bpb = (BiosParameterBlock*) superBlock;
|
||||||
|
|
||||||
|
|
||||||
|
printf("\nBPB: Bytes per Sector %d\n", bpb->BytesPerSector );
|
||||||
|
printf("OEM ID: %s\n", bpb->OEM_id);
|
||||||
|
printf("Bytes per sector: %d\n", bpb->BytesPerSector);
|
||||||
|
printf("Sectors per cluster: %d\n", bpb->SectorsPerCluster);
|
||||||
|
printf("Reserved sectors: %d\n", bpb->ReservedSectors);
|
||||||
|
printf("Number of FAT: %d\n", bpb->NumberOfFileAllocationTables);
|
||||||
|
printf("Number of Dir entries: %d\n", bpb->NumberOfDirectoryEntries);
|
||||||
|
printf("Total Sectors in volume: %d\n", bpb->TotalSectorsInLogicalVolume);
|
||||||
|
printf("Sectors per FAT: %d\n", bpb->NumberOfSectorsPerFAT);
|
||||||
|
|
||||||
|
uint32_t PartitionAddress = mbr->TableEntries[0].LBA_partition_start *512 ;
|
||||||
|
uint32_t RootDirAddress = PartitionAddress + ((bpb->ReservedSectors + bpb->NumberOfSectorsPerFAT * bpb->NumberOfFileAllocationTables ) * bpb->BytesPerSector);
|
||||||
|
uint32_t RootDirLBA =RootDirAddress/512;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
uint16_t RootDir [16];
|
||||||
|
ATA_DEVICE::Read(BUS_PORT::Primary, DEVICE_DRIVE::MASTER,RootDirLBA, (uint16_t*) RootDir );
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -20,8 +20,12 @@ extern "C"{
|
|||||||
#include "serial.h"
|
#include "serial.h"
|
||||||
#include "pci.h"
|
#include "pci.h"
|
||||||
#include "ide/ide.h"
|
#include "ide/ide.h"
|
||||||
#include "drivers/atapi/atapiDevice.h"
|
//#include "drivers/atapi/atapiDevice.h"
|
||||||
|
#include "drivers/ata/ataDevice.h"
|
||||||
|
#include "./PartitionTable/MBR/MasterBootRecord.h"
|
||||||
|
#include "./filesytems/FAT32/BiosParameterBlock.h"
|
||||||
|
#include "./filesytems/FAT32/ExtendBootRecord.h"
|
||||||
|
#include "./drivers/rsdp/rsdp.h"
|
||||||
|
|
||||||
|
|
||||||
#define CHECK_FLAG(flags, bit) ((flags) & (1 <<(bit)))
|
#define CHECK_FLAG(flags, bit) ((flags) & (1 <<(bit)))
|
||||||
|
Loading…
Reference in New Issue
Block a user