StuBS
|
Simpler ATA Treiber, der 28bit Adressierung und polling über IOPorts verwendet. More...
#include <fs/harddisk.h>
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 > | |
T | divide_by_blocksize (T val) const |
template<typename T > | |
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 |
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.
|
inlineexplicit |
Implements BlockDevice.
|
virtual |
Implements BlockDevice.
|
virtual |
Implements BlockDevice.
|
virtual |
Implements BlockDevice.
Schreibt Sektoren mit 28bit PIO.
Sehr ähnlich zu read_sectors. Allerdings wird nach jedem Schreiben noch der Cache geleert.
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 |
|
private |
Blockiert bis Festplatte bereit ist.
delay | Wenn true, wird das status register mehrmals gelesen, um der Festplatte genügend Zeit zum Aktualisieren der register zu geben. |
|
private |
Identisch zu wait_for_harddisk – nur ohne Rückgabewert im Fehlerfall.
|
private |
Selektiert die Festplatte, die nachfolgende Kommandos erhält.
lba_start | Nötig um die höchsten 4bits der 28bit-Adresse zu übermitteln. |
|
private |
Testet mit dem IDENTIFY-Kommando, ob diese Festplatte angeschlossen ist.
Siehe https://wiki.osdev.org/ATA_PIO_Mode#IDENTIFY_command
drive
angeschlossen oder ein Fehler aufgetreten ist. Sonst true. 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:
Übermittelt via IOPort das Kommando command
.
lba | logical block address |
sectors | Sektoren in 512 byte |
command | zu übermittelnde Kommandobits |
bool Harddisk::attached |
uint32_t Harddisk::max_lba |
|
private |
|
private |
|
private |
|
private |
|
private |
|
private |
|
private |
|
private |