Simpler ATA Treiber, der 28bit Adressierung und polling über IOPorts verwendet.
More...
#include <harddisk.h>
Inherits BlockDevice.
|
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 .
|
|
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
◆ 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.
◆ drive_select()
void Harddisk::drive_select |
( |
uint64_t | lba_start = 0 | ) |
|
|
private |
Selektiert die Festplatte, die nachfolgende Kommandos erhält.
- Parameters
-
lba_start | Nötig um die höchsten 4bits der 28bit-Adresse zu übermitteln. |
◆ is_attached()
bool Harddisk::is_attached |
( |
| ) |
|
|
private |
◆ transmit_command()
void Harddisk::transmit_command |
( |
uint64_t | lba, |
|
|
uint8_t | sectors, |
|
|
uint8_t | command ) const |
|
private |
Übermittelt via IOPort das Kommando command
.
- Parameters
-
lba | logical block address |
sectors | Sektoren in 512 byte |
command | zu übermittelnde Kommandobits |
◆ wait_for_harddisk()
bool Harddisk::wait_for_harddisk |
( |
bool | delay = false | ) |
const |
|
private |
Blockiert bis Festplatte bereit ist.
- Parameters
-
delay | Wenn 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.
◆ 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
-
lba | logical block address. Ein Sektor hat die Größe von this->blocksize. |
sectors | Anzahl an Sektoren, die ab lba geschrieben werden. Wenn 0, werden 128kB geschrieben (256 Sektoren mit Blockgröße von 512byte) |
src_buf | Speicheradresse, von der die Daten zum Schreiben gelesen werden |
- Returns
- Im Fehlerfall negativer Wert aus errno.h, sonst 0.
The documentation for this class was generated from the following files:
- fs/harddisk.h
- fs/harddisk.cc