1. A breve aggiorneremo la piattaforma di Reboot per risolvere alcuni problemi con i plug-in, quindi chiediamo ancora un po' di pazienza, Lo staff di Reboot

[Guida] Come creare un sistema operativo - Il driver ATA (Parte 2)

Discussione in 'Software' iniziata da iostream, 2 Ago 2017.

  1. iostream

    iostream Phoenix Wright

    Iscritto:
    13 Ago 2016
    Messaggi:
    4.913
    Like ricevuti:
    1.639
    Richiesta la lettura della prima parte

    Il driver ATA

    Per prima cosa vedremo le modalità di indirizzamento. Tutti i drive ATA usano un LBA assoluto (cioè inizia dal primo settore dell'HDD, quindi senza le partizioni). Poi ci sono diversi registri, con offset della porta (viste nella puntata scorsa le porte). Quindi i valori da aggiungere sono:

    0 = Porta Dati
    1 = Funzioni ed errori (Usata di solito nei CD)
    2 = Settori da scrivere o leggere
    3 = Settori / LbaLow
    4 = Primi 4 bit dei cilindi / LbaMiddle
    5 = Ultimi 4 bit dei cilindri / LbaHigh
    6 = Disco
    7 = Porta comandi / Porta stato

    La porta 7 ha i seguenti bit:
    0 = ERR = Indica che c'è stato errore, inviare nuovo comando per cancellare lo stato
    3 = DRQ = Impostare quando il disco deve leggere o scrivere dati
    4 = SRV = Richiesta di un servizio in modalità sovrapposta
    5 = DS = Fallimento del disco (non imposta ERR)
    6 = RDY = Il bit è 0 quando l'unità viene espulsa o dopo un errore. Altrimenti è 1.
    7 = BSY = Indica che il driver si sta preparando, se va in loop bisogna fare un soft reset

    Su tutti i bus c'è un altro registro, l'Alternate Status o Device Control. Sul bus primario ha porta 0x3F6. I suoi bit sono:
    0 = nIEN = Impostare a 1 per disattivare gli interrupt
    2 = SRST = Software Reset. Resetta tutti i dischi sul bus
    7 = HOB = Impostarlo per leggere il byte alto dell''ultimo valore LBA48 inviato

    L'interrupt ATA PIO avvisa che si può scrivere e leggere di nuovo sul disco.

    Il driver PIO (questo), anche se semplice, è molto lento. Si consiglia di passare al DMA


    Proviamo a leggere un settore con LBA a 28 bit

    - Inviamo 0xE0 (master) o 0xF0 (slave) OR i quattro bit maggiori del numero alla porta 0x1F6
    - Se vuoi invia 0x00 a 0x1F1
    - Invia il settore a 0x1F2
    - Invia (unsigned char)LBA a 0x1F3
    - Invia (unsigned char)LBA << 8 a 0x1F4
    - Invia (unsigned char)LBA << 16 a 0x1F5
    - Invia il comando 0x20 a 0x1F7
    - Aspetta l'interrupt
    - Trasferisci 256 volte un unsigned short dalla porta 0x1F0
    - Rifai il procedimento (con il delay di 400ns) per tutti i settori successivi

    Per scrivere usare il comando 0x30


    Il driver ATA a 48 bit è molto simile, bisogna solo mandare il segnale a 0x1F2, 0x1F3, 0x1F4, 0x1F5 due volte per completare tutti i bit.
    Conclusione

    E per quest'ultima parte e puntata è tutto. Se volete farmi domande fatemele. Ci vediamo domani con il PDF
     
    #1
    A zoomx, DoctorD90 e MODD3R piace questo elemento.
Sto caricando...

Condividi questa Pagina