StuBS
Harddisk Class Reference

Simpler ATA Treiber, der 28bit Adressierung und polling über IOPorts verwendet. More...

#include <fs/harddisk.h>

Inheritance diagram for Harddisk:
[legend]
Collaboration diagram for Harddisk:
[legend]

Public Member Functions

 Harddisk (Drive drive=primary_bus_master)
 
Block fix (uint64_t block_number)
 
void unfix (Block *block)
 
int sync ()
 
int sync (Block *block)
 
- Public Member Functions inherited from BlockDevice
 BlockDevice ()
 
bool set_blocksize (unsigned int blocksize)
 
template<typename T >
divide_by_blocksize (T val) const
 
template<typename T >
modulo_blocksize (T val) const
 

Public Attributes

bool attached
 
uint32_t max_lba
 
- Public Attributes inherited from BlockDevice
unsigned int blocksize
 
unsigned int blocksize_bits
 

Private Member Functions

int read_sectors (uint64_t lba, uint8_t sectors, void *dest_buf)
 
int write_sectors (uint64_t lba, uint8_t sectors, void *src_buf)
 Schreibt Sektoren mit 28bit PIO.
 
bool wait_for_harddisk (bool delay=false) const
 Blockiert bis Festplatte bereit ist.
 
void wait_until_bsy_clear (bool delay=false)
 Identisch zu wait_for_harddisk – nur ohne Rückgabewert im Fehlerfall.
 
void drive_select (uint64_t lba_start=0)
 Selektiert die Festplatte, die nachfolgende Kommandos erhält.
 
bool is_attached ()
 Testet mit dem IDENTIFY-Kommando, ob diese Festplatte angeschlossen ist.
 
int convert_lba (uint64_t *lba, uint8_t *sectors)
 Konvertiert die gegebene lba und sectors in deren Äquivalent mit einer Sektorgröße von 512 byte. Das ist notwendig, da dies die Adressierung der IOPorts ist.
 
void transmit_command (uint64_t lba, uint8_t sectors, uint8_t command) const
 Übermittelt via IOPort das Kommando command.
 

Private Attributes

Drive drive
 
HarddiskPorts ports
 
uint8_t last_drive_select_bits = 0
 
const uint8_t dma_request_bit = 0x8
 
const uint8_t error_bit = 0x1
 
const uint8_t drive_fault_bit = 0x20
 
const uint8_t busy_bit = 0x80
 
const uint8_t error_bits = error_bit | drive_fault_bit
 

Detailed Description

Simpler ATA Treiber, der 28bit Adressierung und polling über IOPorts verwendet.

Hinweis für block_number und sector: Die block_number von fix() verwendet stets die Blockgröße, die über set_blocksize festgelegt wurde. Intern entspricht ein Sektor 512 byte, da die IOPorts diese Adressierung verwenden. block_number wird in read_sectors() oder write_sectors() per convert_lba() abhängig von this->blocksize umgewandelt.

Siehe https://wiki.osdev.org/ATA_PIO_Mode

Constructor & Destructor Documentation

◆ Harddisk()

Harddisk::Harddisk ( Drive  drive = primary_bus_master)
inlineexplicit

Member Function Documentation

◆ fix()

Block Harddisk::fix ( uint64_t  block_number)
virtual

Implements BlockDevice.

◆ unfix()

void Harddisk::unfix ( Block block)
virtual

Implements BlockDevice.

◆ sync() [1/2]

int Harddisk::sync ( )
virtual

Implements BlockDevice.

◆ sync() [2/2]

int Harddisk::sync ( Block block)
virtual

Implements BlockDevice.

◆ read_sectors()

int Harddisk::read_sectors ( uint64_t  lba,
uint8_t  sectors,
void *  dest_buf 
)
private

◆ write_sectors()

int Harddisk::write_sectors ( uint64_t  lba,
uint8_t  sectors,
void *  src_buf 
)
private

Schreibt Sektoren mit 28bit PIO.

Sehr ähnlich zu read_sectors. Allerdings wird nach jedem Schreiben noch der Cache geleert.

Parameters
lbalogical block address. Ein Sektor hat die Größe von this->blocksize.
sectorsAnzahl an Sektoren, die ab lba geschrieben werden. Wenn 0, werden 128kB geschrieben (256 Sektoren mit Blockgröße von 512byte)
src_bufSpeicheradresse, von der die Daten zum Schreiben gelesen werden
Returns
Im Fehlerfall negativer Wert aus errno.h, sonst 0.

◆ wait_for_harddisk()

bool Harddisk::wait_for_harddisk ( bool  delay = false) const
private

Blockiert bis Festplatte bereit ist.

Parameters
delayWenn true, wird das status register mehrmals gelesen, um der Festplatte genügend Zeit zum Aktualisieren der register zu geben.
Returns
false im Fehlerfall, sonst true.

◆ wait_until_bsy_clear()

void Harddisk::wait_until_bsy_clear ( bool  delay = false)
private

Identisch zu wait_for_harddisk – nur ohne Rückgabewert im Fehlerfall.

◆ drive_select()

void Harddisk::drive_select ( uint64_t  lba_start = 0)
private

Selektiert die Festplatte, die nachfolgende Kommandos erhält.

Parameters
lba_startNötig um die höchsten 4bits der 28bit-Adresse zu übermitteln.

◆ is_attached()

bool Harddisk::is_attached ( )
private

Testet mit dem IDENTIFY-Kommando, ob diese Festplatte angeschlossen ist.

Siehe https://wiki.osdev.org/ATA_PIO_Mode#IDENTIFY_command

Returns
false, falls keine Festplatte an drive angeschlossen oder ein Fehler aufgetreten ist. Sonst true.

◆ convert_lba()

int Harddisk::convert_lba ( uint64_t lba,
uint8_t sectors 
)
private

Konvertiert die gegebene lba und sectors in deren Äquivalent mit einer Sektorgröße von 512 byte. Das ist notwendig, da dies die Adressierung der IOPorts ist.

Das Ergebnis wird in die übergebenen Pointer geschrieben!

Beispiel mit this->blocksize von 1024:

  • eine lba von 1 wird zu 2
  • sectors=2 wird zu sectors=4
Returns
Im Fehlerfall negativer Wert aus errno.h, sonst 0.

◆ transmit_command()

void Harddisk::transmit_command ( uint64_t  lba,
uint8_t  sectors,
uint8_t  command 
) const
private

Übermittelt via IOPort das Kommando command.

Parameters
lbalogical block address
sectorsSektoren in 512 byte
commandzu übermittelnde Kommandobits

Member Data Documentation

◆ attached

bool Harddisk::attached

◆ max_lba

uint32_t Harddisk::max_lba

◆ drive

Drive Harddisk::drive
private

◆ ports

HarddiskPorts Harddisk::ports
private

◆ last_drive_select_bits

uint8_t Harddisk::last_drive_select_bits = 0
private

◆ dma_request_bit

const uint8_t Harddisk::dma_request_bit = 0x8
private

◆ error_bit

const uint8_t Harddisk::error_bit = 0x1
private

◆ drive_fault_bit

const uint8_t Harddisk::drive_fault_bit = 0x20
private

◆ busy_bit

const uint8_t Harddisk::busy_bit = 0x80
private

◆ error_bits

const uint8_t Harddisk::error_bits = error_bit | drive_fault_bit
private

The documentation for this class was generated from the following files: