Forum: Mikrocontroller und Digitale Elektronik HDD Festplatte ATA IDE an AVR µC Mikrocontroller ATmega1284p Assembler - viele Fragen


von Bernhard S. (bernhard)


Angehängte Dateien:

Lesenswert?

Geschätztes Forum,

diese kleine Schaltung und ein ATmega1284p steuert eine Festplatte.

Sleep, Reset, Sector read funktioniert schon ganz gut.

Diese Erklärungen waren sehr hilfreich:
https://www.mikrocontroller.net/articles/Festplatte

Doch nun tauchen die ersten Probleme und viele Fragen auf ^^

Sector read (funktioniert),
es werden exakt die Daten gelesen,die im "Sector-Count-Register" 
geschrieben worden sind (z.B: Sector Count=1 --> 512 Bytes):
1. Sector Count schreiben
2. Sector Number schreiben
3. Cylinder Low schreiben
4. Cylinder High schreiben
5. Device Register schreiben
6. Den Command Code ins Command Register schreiben
7. Das Status-Register abfragen
8. Wenn BSY = 1, gehe zu 7
9. Das Daten-Register lesen (16 Bit!)
10.Das Status-Register lesen
11.Wenn DRQ = 1 ist, dann gehe zu 9
12.fertsch!



Nun zu den ersten Fragen:

- wie muss Sector write ablaufen?

Bei mir arbeite das Write sehr unzuverlässig, manchmal,
nach 3. oder 4. Writevorgang setzte
sich Bushy nicht zurück (permanent 1) Nur wenn ich nach jedem Sector 
write ein HDD-Reset durchführte lief alles problemlos.
Muss das so sein ?


- wie wird "Identify Device" abgerufen?

- müssen an den unbeschalteten IDE-Anschlüssen (s.Schaltplan)
nicht doch High oder Low angelegt werden?

Bernhard

: Bearbeitet durch User
von c-hater (Gast)


Lesenswert?

Bernhard S. schrieb:

> diese kleine Schaltung und ein ATmega1284p steuert eine Festplatte.

Das glaube ich kaum, jedenfalls bezüglich des Schaltplans. Wie soll das 
funktionieren, wenn überhaupt keinerlei Datenleitung der 
IDE-Schnittstelle mit dem Controller verbunden ist?

Davon, das man irgendwelche Namen dranschreibt, sind die noch nicht 
verbunden. Außerdem ist es eine Zumutung an den geneigten Leser, sich 
den Sachverhalt aus den Namen der Pins abzuleiten. Nö, genau dafür, die 
tatsächliche Verdrahtung zu repräsentieren, wurden Schaltpläne 
erfunden...

> Sleep, Reset, Sector read funktioniert schon ganz gut.

Was heißt: "ganz gut"? Entweder es geht, oder es geht nicht. IDE ist 
sehr unkritisch, weil es keine Timing-Constraints gibt. Man kann die 
Schnittstelle beliebig langsam benutzen. D.h.: es sollte auch mit einem 
AVR8 nie zu irgendeinem Problem kommen.

> Nun zu den ersten Fragen:

> - wie muss Sector write ablaufen?
> - wie wird "Identify Device" abgerufen?

Das alles klärt eine Beschreibung der IDE-Schnittstelle. Googeln darfst 
du selber.

> - müssen an den unbeschalteten IDE-Anschlüssen (s.Schaltplan)
> nicht doch High oder Low angelegt werden?

Auch das klärt die Schnittstellenbeschreibung. Kurzfassung: Eigentlich 
nicht.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

c-hater schrieb:
> Das glaube ich kaum, jedenfalls bezüglich des Schaltplans. Wie soll das
> funktionieren, wenn überhaupt keinerlei Datenleitung der
> IDE-Schnittstelle mit dem Controller verbunden ist?

Soll ich Dein Zitat aus dem Nero-Thread hier anbringen?

Der "Schaltplan" ist in der Tat nicht berauschend, aber Deine sogenannte 
"Kritik" kannst Du für Dich behalten, solange Deine Umgangsformen so 
beschissen bleiben.

von Michael U. (amiga)


Angehängte Dateien:

Lesenswert?

Hallo,

Bernhard S. schrieb:
> diese kleine Schaltung und ein ATmega1284p steuert eine Festplatte.

oha... Das muß ja 15 Jahre her sein bei mir.
Im silbernen SubD-Stecker mit dem Cinchkabel dran wohnt ein MAS3507D 
MP3-Decoder. Ich habe allerdings nicht auf die HD geschrieben, nur 
gelesen.
Heute würde ich mir keinen Grund mehr zurechtreden können, um sowas zu 
machen...

Trotzdem viel Erfolg.

Gruß aus Berlin
Michael

von Jim M. (turboj)


Lesenswert?

Bernhard S. schrieb:
> - wie wird "Identify Device" abgerufen?

Viel Spass, die ATA-Spec included IIRC einfach die SCSI-Spec, und die 
ist nicht öffentlich AFAIK.

Wieso man sich das antut, wenn es SDHC Karten mit bis zu 32GB und Chan 
FATFS zwecks Ansteuerung gibt - das erschliesst sich mir auch nicht 
recht.

von Michael U. (amiga)


Lesenswert?

Hallo,

Jim M. schrieb:
> Viel Spass, die ATA-Spec included IIRC einfach die SCSI-Spec, und die
> ist nicht öffentlich AFAIK.

Eine PATA-IDE-HD im LBA-Mode am AVR anzusteuern ist kein Hexenwerk, 
Souren findet man im Internet, meine ASM-Source ist zumindest nicht mehr 
auf der HD. Ist alles so aus 2000-2008, eben ewig her...

Inzwischen findet man doch kaum noch PATA-HDs.

Gruß aus Berlin
Michael

: Bearbeitet durch User
von Michael B. (laberkopp)


Lesenswert?

Bernhard S. schrieb:
> - wie muss Sector write ablaufen?

https://wiki.osdev.org/ATA_read/write_sectors

http://ww1.microchip.com/downloads/en/DeviceDoc/ATA_HardDrive.pdf

Bernhard S. schrieb:
> Muss das so sein ?

Nein.

Mach erst mal ein Identify device information

Jim M. schrieb:
> Viel Spass, die ATA-Spec included IIRC einfach die SCSI-Spec, und die
> ist nicht öffentlich AFAIK.

ftp://ftp.seagate.com/acrobat/reference/111-1c.pdf

von IDE Programmierer (Gast)


Lesenswert?

Bernhard S. schrieb:
> Bei mir arbeite das Write sehr unzuverlässig, manchmal,
> nach 3. oder 4. Writevorgang setzte
> sich Bushy nicht zurück (permanent 1)

Aus alter, schmerzvoller Erfahrung: irgendwo hast du das
CS  IORD  IOWR Timing verletzt bzw die einzelnen Signale
haben am Ende der Leitung (also Richtung Festplatte)
störende Doppeflanken die den Byte- oder Sektor-Zähler
der Platte durcheinander bringen.

Das Busy- und DRQ-Handling muss beim Schreiben natürlich
auch berücksichtigt werden.

Bernhard S. schrieb:
> Nur wenn ich nach jedem Sector write ein HDD-Reset durchführte

Wenn du so etwas brauchst machst du grob etwas falsch.
Da du deinen Code nicht zeigst kann man auch keine klaren
Ausagen dazu machen.

von Bernhard S. (bernhard)



Lesenswert?

@IDE Programmierer (Gast)

>störende Doppeflanken die den Byte- oder Sektor-Zähler
>der Platte durcheinander bringen.

Das ist ein sehr guter Tipp, das werde ich noch genauer untersuchen.

>Da du deinen Code nicht zeigst kann man auch keine klaren
>Ausagen dazu machen.

Anbei der HDD Assemly Code (Codeschnipsel Version1) als 
Diskussionsgrundlage.

@Michael Bertrandt

sehr wertvolle Links, ich lege mal einige Manuels mit bei, falls die 
Links nach einiger Zeit nicht mehr gültig sind.


@Gast

>Wie soll das funktionieren, wenn überhaupt keinerlei Datenleitung der
>IDE-Schnittstelle mit dem Controller verbunden ist?

...WLAN- und Bluetooth Verbindungen schaffen die kurzen Distancen 
problemlos ^^


@Michael U

>Heute würde ich mir keinen Grund mehr zurechtreden können, um sowas zu
>machen...

Manch alte Festplatten werden durch die neuen Betriebssysteme bzw. 
SATA/IDE  Adaper nicht mehr erkannt (s.Bild).

von Bernhard S. (bernhard)


Lesenswert?

Sector write:
es werden exakt die Daten geschieben,die im "Sector-Count-Register"
geschrieben worden sind (z.B: Sector Count=1 --> 512 Bytes):

1. Sector Count schreiben
2. Sector Number schreiben
3. Cylinder Low schreiben
4. Cylinder High schreiben
5. Device Register schreiben
6. Den Command Code ins Command Register schreiben
7. Das Status-Register abfragen
8. Wenn BSY = 1, gehe zu 7
9. Das Daten-Register schreiben (16 Bit!)
10.Das Status-Register lesen
11.Wenn BSY = 1, gehe zu 10
12.Wenn DRQ = 1 ist, dann gehe zu 9
13.fertsch!

von IDE Programmierer (Gast)


Lesenswert?

Ich will deine Code gar nicht erst bis aufs letze
verstehen, das Assemblern ist mir zu blöd (ich habe
das beim Apple lang genug gemacht), nur soviel was
ich auf die Schnelle als Fehler sehe:

- Ein Sektor wird ohne Register Handshake geschrieben
oder gelesen. Beim Schreiben ist der Puffer einfach
bereit gefüllt zu werden, beim Lesen ist der Puffer
gefüllt und kann blind abgeholt werden (nach Data
Ready Flag valid).

- Der CS muss bei jedem 16 Bit Wort einmal low und
wieder high gezogen werden. Ebenso wie bei allen
anderen Register-Zugriffen (dia ja 8-bittig sind)

In C könntest du das viel leichter und übersichtlicher
lösen und du würdest keinen Geschwindigkeitsverlust
haben. So machst du dir nur das Leben schwer.
Bit Bang geht auch in C gut und schnell.

Ja dein "wait BUSHY" ist auch sehr lustig.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

IDE Programmierer schrieb:
> Ja dein "wait BUSHY" ist auch sehr lustig.

Ron Bushy war der Drummer von Iron Butterfly ("In-a-gadda-da-vida").

von Bernhard S. (bernhard)


Angehängte Dateien:

Lesenswert?

... die hoffentlich übersichtlichere HDD Festplatten IDE Beschaltung

Anmerkung:

CS0 CS1 A0 A1 A2 steuern nebenbei noch ein LCD.

Mit einer Schaltungsmodifikation wäre USART (RS232), SPI, TWI/I2C 
nutzbar

: Bearbeitet durch User
von IDE Programmierer (Gast)


Lesenswert?

Rufus Τ. F. schrieb:
> Ron Bushy war der Drummer von Iron Butterfly ("In-a-gadda-da-vida").

Bin zwar aus der "Altersklasse" aber mit der Band habe
ich weniger beschäftigt - die Musik war mir zu grob und
zu einfältig. Daher ist mir Ron Bushy kein Begriff.

von Bernhard S. (bernhard)


Lesenswert?

IDE Programmierer schrieb:
> Ja dein "wait BUSHY" ist auch sehr lustig.

Das Alternate Status Register (Ohne den Interrupt zu löschen) wird 
permanent abgefragt und das STATUS_BSY-Bit ausgewertet und nebenbei

eine LED angesteuert... das blinkt so schön ^^

Was ist daran lustig?

>das Assemblern ist mir zu blöd

Beitrag:

HDD Festplatte ATA IDE an AVR µC Mikrocontroller ATmega1284p Assembler 
- viele Fragen


>Der CS muss bei jedem 16 Bit Wort einmal low und
>wieder high gezogen werden.

Ist damit CSEL (PIN28 am IDE-Stecker) gemeint?

>beim Lesen ist der Puffer
>gefüllt und kann blind abgeholt werden (nach Data
>Ready Flag valid).


In welchem Register befindet sich das "Data Ready Flag" ?

Im Status Register?

: Bearbeitet durch User
von IDE Programmierer (Gast)


Lesenswert?

Bernhard S. schrieb:
> Ist damit CSEL (PIN28 am IDE-Stecker) gemeint?

Nein. CSEL wird im programmierten I/O nicht genutzt, soweit
ich mich erinnere war das für den DMA I/O.

Bernhard S. schrieb:
> In welchem Register befindet sich das "Data Ready Flag" ?

Ich meinte zu wissen im Status-Register, also DRQ.
Ist lange her ...

Bernhard S. schrieb:
> Das Alternate Status Register (Ohne den Interrupt zu löschen) wird
> permanent abgefragt

Kostet unendlich viel Zeit die du ja durchs Assemblern
sparen willst.

Beitrag #5392105 wurde von einem Moderator gelöscht.
Beitrag #5392169 wurde von einem Moderator gelöscht.
von Sascha W. (sascha-w)


Lesenswert?

Bernhard S. schrieb:
> ... die hoffentlich übersichtlichere HDD Festplatten IDE Beschaltung
>
> Anmerkung:
>
> CS0 CS1 A0 A1 A2 steuern nebenbei noch ein LCD.
>
> Mit einer Schaltungsmodifikation wäre USART (RS232), SPI, TWI/I2C
> nutzbar
Also die CS der IDE auch als Datenleitung für das LCD zu nehmen halte 
ich für mutig. Wenn du ans LCD Daten schreibst meint dann die Festplatte 
für sie währe auch was dabei? Dann doch lieber die Adress- oder 
Datenleitungen der IDE verwenden.

Sascha

von guest (Gast)


Lesenswert?

Bernhard S. schrieb:
> ... die hoffentlich übersichtlichere HDD Festplatten IDE Beschaltung

Warum ist denn IDE_A1 am µC mit A2 am Stecker verbunden?

von IDE Programmierer (Gast)


Lesenswert?

Sascha W. schrieb:
> Also die CS der IDE auch als Datenleitung für das LCD zu nehmen halte
> ich für mutig.

Das CS der Festplatte alleine zu togglen stört diese nicht.
Aber die offene Zusatz-Leitung zum LCD könnte störende
Reflexionen verursachen.

guest schrieb:
> Warum ist denn IDE_A1 am µC mit A2 am Stecker verbunden?

Ist sie ja nicht. Nur der Text ist damit verbunden und
hat keinen elektrischen Einfluss.

Ist sozusagen ein Dreckfuhler.

von Bernhard S. (bernhard)


Angehängte Dateien:

Lesenswert?

Michael B. schrieb:

> Mach erst mal ein Identify device information

Danke für den Tipp :-)

Nun stehen u.a. folgende Informationen zur Verfügung:

-Number of cylinders
-Number of heads
-Number of sectors per track
-Serial number
-Model number(40 ASCII characters)

Beitrag #5397175 wurde von einem Moderator gelöscht.
von IDEschlumpf (Gast)


Lesenswert?

> -Number of cylinders
> -Number of heads
> -Number of sectors per track
> -Serial number
> -Model number(40 ASCII characters)

Alles unnuetzes Zeug.

Wichtig ist die Anzahl der adressierbaren Sektoren im LBA-Modus.

von Michael U. (amiga)


Lesenswert?

Hallo,

IDEschlumpf schrieb:
> Wichtig ist die Anzahl der adressierbaren Sektoren im LBA-Modus.

Zustimmung, C/H/S nutz man nichtmehr freiwillig.
Prinzipell kann man den HDs fast beliebige Kombinationen als C/H/S-Werte 
schicken, die rechnet das dann ohnehin in den LBA-Sektor um.

Gruß aus Berlin
Michael

von Nik Bamert (Gast)


Angehängte Dateien:

Lesenswert?

Hi Bernhard,

Es gab um 2000-2004 mal die Yampp MP3 Player, welche eine ATA Festplatte 
benutzten. Damals war der Code noch zugaenglich, heute scheint nur noch 
eine vorcompilierte Library verfuegbar zu sein [1].

Ich habe damals ein aehnliches Projekt verfolgt und habe Yampp's Code 
als er noch zugaenglich war uebernommen und bearbeitet. Ich weiss nicht 
mehr wieviel davon von mir ist und wieviel noch der urspruengliche Code 
und ich erhebe daher keine Ansprueche auf irgendwas ;-)

Ich habe mal angehaengt was ich habe und was 2004 funktioniert hat,
ggf hilfts.

Viele Gruesse,
Nik

[1] https://www.mictronics.de/projects/yammp3usb/

von Anal Ysator (Gast)


Lesenswert?

Nik Bamert schrieb:
> Ich habe mal angehaengt was ich habe

Ausgereifte Sache!
1
  for (h = 0; h < 255; h++) {

von Nik Bamert (Gast)


Lesenswert?

Wie gesagt der Code ist von ~2000. Derjenige den ihn urspruenglich 
geschrieben hat, war wohl aus der Ära vor C99. Also noch kein for(int 
h=...) moeglich. H ist aber dennoch durchaus definiert.

von Anal Ysator (Gast)


Lesenswert?

Nik Bamert schrieb:
> Also noch kein for(int
> h=...) moeglich. H ist aber dennoch durchaus definiert.

Selbst auf Hinweis siehst du nicht die "Ausgereiftheit".

von Michael U. (amiga)


Lesenswert?

Hallo,

Anal Ysator schrieb:
> Selbst auf Hinweis siehst du nicht die "Ausgereiftheit".

naja, ist doch aber schon ziemlich dicht dran an 512 Byte...

Gruß aus Berlin
Michael

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Einfacher versteht man den "Witz", wenn man sieht, daß "h" als "uint8_t" 
deklariert ist.

von Michael U. (amiga)


Lesenswert?

Hallo,

wenn ich jetzt nicht völlig daneben liege, ist das ja nur bedingt ein 
"Witz",
for (h = 0; h < 255; h++) {
funktioniert ja für uint8_t durchaus richtig, eben von 0 bis 254.
Ich vermisse da eher das fehlende letzte Word bzw. die beiden letzten 
Bytes.

Gruß aus Berlin
Michael

von Nik Bamert (Gast)


Lesenswert?

Anal Ysator schrieb:
> Selbst auf Hinweis siehst du nicht die "Ausgereiftheit".

<trollfutter>
Bei dem Namen kommt man halt auf den Gedanken es müsse sich um etwas 
noch trivialeres handeln. </trollfutter>

BTT. Nein ist klar das kann nicht stimmen. Bernhard gings allerdings um 
die Reihenfolge der cmds des sector read/write bevor die Daten kommen 
und der Teil sollte passen.

von Tim S. (Firma: tsx89) (freak_ts) Benutzerseite


Lesenswert?

Michael U. schrieb:
> Inzwischen findet man doch kaum noch PATA-HDs.

Kann man eigentlich auch einen PATA auf SATA-Adapter verwenden?
[Und neue Platten mit x Terrabyte Speicher an den AVR hängen?]
Gruß tsx

von Michael U. (amiga)


Lesenswert?

Hallo,

Tim S. schrieb:
> Kann man eigentlich auch einen PATA auf SATA-Adapter verwenden?
> [Und neue Platten mit x Terrabyte Speicher an den AVR hängen?]

theoretisch könnte es gehen, es muß ja nur PIO-Mode0 umgesetzt werden.
Aber wozu sollte man sowas machen wollen?

Gruß aus Berlin
Michael

Beitrag #5398138 wurde von einem Moderator gelöscht.
von Horst S. (Gast)


Angehängte Dateien:

Lesenswert?

Nik Bamert schrieb:
> Ich habe mal angehaengt was ich habe und was 2004 funktioniert hat,
> ggf hilfts.

Habe mal das Gesamtprojekt für die Nachwelt angehängt.

Beitrag #5399260 wurde von einem Moderator gelöscht.
von Bernhard S. (bernhard)


Angehängte Dateien:

Lesenswert?

IDEschlumpf schrieb:
> Wichtig ist die Anzahl der adressierbaren Sektoren im LBA-Modus.

Im Word 60-61 (Identify device information) steht bei einigen 
Festplatten der Wert 0x0000, bei anderen der Wert, der auch auf der HDD 
aufgefruckt ist... grübel

Kann es sein, daß sehr nostalgische Platten den LBA Modus nicht kennen?

Bei den "0x0000" HDD ist das Bit 8+9 im Word 49 ="0", bei den anderen 
"1".

Ist LBA und DMA das gleiche?

Auf einer HDD Seagate ST310232A steht folgendes:

16.383 Cyl, 16 Heads, 63 Sec
20.005.650 Adressable Sectors

Multipliziert man alles, dann ergibt sich aber ein ganz anderer Wert:

16.383 x 16 Heads x 63 = 16.514.064

Wie kommt das ?

: Bearbeitet durch User
von IDEschlumpf (Gast)


Lesenswert?

> Kann es sein, daß sehr nostalgische Platten den LBA Modus nicht kennen?
Ja.

> Ist LBA und DMA das gleiche?
Nein.

> Wie kommt das ?
Keine Ahnung.

LBA und DMA waren etwa zur gleichen Zeit bei Platten verfuegbar.
Vorher war PIO angesagt.

von IDEschlumpf (Gast)


Lesenswert?

P.S.:

> 16.383 Cyl, 16 Heads, 63 Sec
Das waere wohl das, was die Platte im CHS-Modus adressieren koennte.

> 20.005.650 Adressable Sectors
Das waere wohl das, was die Platte im LBA-Modus adressieren koennte.

von IDEschlumpf (Gast)


Lesenswert?

2. P.S.:

Platten die nur CHS koennen, waeren wohl fuer Bastelprojekte
zumindest bei mir nicht relevant. Zu klein, zu langsam und zu
mickrig.
Wenn man schon eine richtige Platte in der Box hat, will
man auch den Platz.

Wenn ich mich dunkel erinnere, liegt die Grenze bei 8.4 GB oder so.
Was groesser ist, geht nur mit LBA richtig.

Die 8.4 GB ueberschreitet deine (Beispiel-)Platte ja grade knapp.

von S. R. (svenska)


Lesenswert?

Bernhard S. schrieb:
> Kann es sein, daß sehr nostalgische Platten den LBA Modus nicht kennen?

Festplatten unter 500 MB können ziemlich sicher kein LBA.
Festplatten größer als 5 GB können ziemlich sicher LBA.
Dazwischen ist beides möglich, aber LBA könnte buggy sein.

Bernhard S. schrieb:
> Ist LBA und DMA das gleiche?

Nein. LBA hat mit der Adressierung der Sektoren zu tun, DMA beschreibt 
den Datentransfer zwischen Host und Platte.

Bernhard S. schrieb:
> 16.383 Cyl, 16 Heads, 63 Sec
> 20.005.650 Adressable Sectors

Es gibt Grenzen für die Anzahl der Zylinder, die Anzahl der Köpfe und 
die Anzahl der Sektoren pro Spur. Diese kommen teilweise von ATA selbst 
(max. 1024 Zylinder, später erweitert), teilweise vom BIOS (max. 16383 
oder 65535 Zylinder), teilweise von Bugs in DOS (max. 255 Köpfe).

Das führt dazu, dass es zwar genau einen physikalischen CHS-Wert gibt, 
der aber vom BIOS auf verschiedene Weisen abgebildet werden kann (je 
nach Fähigkeiten des BIOS und dem eingesetzten Betriebssystem ist das 
sogar zwingend nötig). Überschreitet man gewisse Grenzen, riskiert man 
Datenverlust oder sogar einen Absturz des BIOS bei der 
Festplattenerkennung. Daher vermeiden Festplatten solche Werte oder 
haben einen Jumper, um bestimmte Grenzen zu erzwingen.

Daraus ergeben sich:
- garantiert funktionieren tut alles bis 1024x16x63 (504 MB);
- es gibt ein 8 GB-Limit bei 8032 MB (1024x255x63);
- es gibt ein weiteres 8 GB-Limit bei 8063 MB (16383x16x63);
- ein 32 GB-Limit bei 65535x16x63;
- ein 128 GB-Limit bei 65535x16x255.

Dadurch ist - je nach Festplatte, BIOS und Betriebssystem - nicht jeder 
Bereich bootfähig (der Bootloader konnte oft nur 1024 Zylinder 
zuverlässig ansprechen). Ob das theoretische Maximum von 2 TB 
(65535*255*255) mit CHS möglich ist, weiß ich nicht.

Deine Festplatte geht im CHS-Modus exakt an übliche Grenzwerte: (2^14)-1 
Zylinder, 2^4 Köpfe, (2^6)-1 Sektoren pro Kopf, ergibt 8063 MB. Deine 
Festplatte hat insgesamt 9768 MB, ist also im CHS-Modus schlicht nicht 
vollständig ansprechbar. Deine Festplatte verzichtet lieber auf die 
hinteren 1705 MB, statt einen BIOS-Crash zu provozieren.

von Michael U. (amiga)


Lesenswert?

Hallo,

24Bit LBA und 48Bit LBA kommt auch noch dazu, die 128GB Grenze.
Außerdem nutzen größere Platten (für damalige Verhältnisse!) keine 
konstante Anzahl Sektoren/Track mehr, es wird außen mehr als innen 
geschrieben.

Spätestens ab diesem Zeitpunkt wurde intern immer LBA benutzt, Angaben 
auf der HD oder per Identify waren ab da nur ein Vorschlag.
Man konnte der Platte im CHS-Mode jede Kombination CHS mitteilen, 
solange diese nicht die obeigen Grenzwerte von Norm, BIOS usw. einhielt.
Die Platte hat intern immer den LBA berechnet.
Konnte man mit alten BIOS-Versionen die noch kein LBA konnten schön 
durchspeilen, man durfte nur nicht über die maximale LBA-Sektoanzahl 
kommen, dann lief die HD mit jeder sinnvollen Kombination von 
CHS-Werten.
Ich habe damals am AVR nur LBA benutzt.

Gruß aus Berlin
Michael

von pata (Gast)


Lesenswert?

Michael U. schrieb:
> Tim S. schrieb:
>> Kann man eigentlich auch einen PATA auf SATA-Adapter verwenden?
>> [Und neue Platten mit x Terrabyte Speicher an den AVR hängen?]
>
> theoretisch könnte es gehen, es muß ja nur PIO-Mode0 umgesetzt werden.
> Aber wozu sollte man sowas machen wollen?
>
Ein wesentlicher Grund so etwas zu tun kann der Wunsch / die 
Notwendigkeit sein, dem Zwang der SD Association zur Verwendung des 
FAT32/ExFAT - Dateisystems auf SD-Karten zu entgehen.
Manche Entwickler implementieren lieber ihr eigenes Filesystem auf einer 
SATA-SSD als sich diesem Zwang zu beugen und dafür dann auch noch fette 
Lizensgebühren (auch zusätzlich noch an Microsoft) zu zahlen.

von Michael U. (amiga)


Lesenswert?

Hallo,

pata schrieb:
> Ein wesentlicher Grund so etwas zu tun kann der Wunsch / die
> Notwendigkeit sein, dem Zwang der SD Association zur Verwendung des
> FAT32/ExFAT - Dateisystems auf SD-Karten zu entgehen.
Oh, haben die vergessen sich bei mir zu melden?

> Manche Entwickler implementieren lieber ihr eigenes Filesystem auf einer
> SATA-SSD als sich diesem Zwang zu beugen und dafür dann auch noch fette
> Lizensgebühren (auch zusätzlich noch an Microsoft) zu zahlen.
Stimmt. LG hat sogar auf der SATA-SSD, die an meinem TV für permanent 
Timeshift und Aufnahmen hängt, einfach ein Linux-Filesystem 
installiert...
Obwohl... manche behaupten ja, das machen die TV-Hersteller nur, damit 
man nicht an die Aufnahmen kommt.

Gruß aus Berlin
Michael

: Bearbeitet durch User
von pata (Gast)


Lesenswert?

Michael U. schrieb:
> Oh, haben die vergessen sich bei mir zu melden?

Wahrscheinlich gibts Dein Produkt noch nicht lange genug und in 
hunderttausender Stückzahlen auf dem Weltmarkt ;) denn sonst hätten sie 
Dich (zumindestens nach meiner üblen Erfahrung) schon längst am Haken 
...

Gruß ausm Pott
R.

von Markus F. (mfro)


Lesenswert?

Tim S. schrieb:
> [Und neue Platten mit x Terrabyte Speicher an den AVR hängen?]

Terabyte, bitte.

(Ist zwar groß, aber nicht planetengross).

von Joachim B. (jar)


Lesenswert?

Michael U. schrieb:
> for (h = 0; h < 255; h++) {
> funktioniert ja für uint8_t durchaus richtig, eben von 0 bis 254.

wieso das denn?

254 ist kleiner als 255 somit wird h++ noch ausgeführt!

das würde ich gerne von dir erklärt haben warum es nur von 0-254 gehen 
soll.

Beitrag #5402789 wurde von einem Moderator gelöscht.
von Bernhard S. (bernhard)


Lesenswert?

Wozu wird das SEEK Comand benötigt ?

Die Daten von der HDD können auch ohne SEEK gelesen und geschrieben 
werden, nur bei SEEK klappert die Platte etwas und es dauert länger.

Wie könnte man zuverlässsig herausfinden, ob die HDD nur im 
3-dimensionaler Form (CHS) angesproche werde kann?

Forschläge:

A: Word 60-61 auswerten, wenn Null, dann nur CHS

B: Word 49 auswerten, wenn DMA=0, dann nur CHS

C: Platte im LBS Modus initialisieren,
   Sector Number Register=Null setzen,
   dann Sector lesen,
   bei Error ----> nur CHS

Beitrag #5405349 wurde von einem Moderator gelöscht.
von Bernhard S. (bernhard)


Angehängte Dateien:

Lesenswert?

Ein Excel Beispiel für Umrechnung / Konvertierung CHS nach LBA.

Frage:

Wie könnte man prinzipiell LBA nach CHS umrechen?

Ich möchte z.B. den SEKTOR "5039" im CHS-Modus auslesen.

Zahl der Leseköpfe  H=16
Zahl der Sektoren  S=63

Das Ergebnis müsste lauten:

Sektornummer  =63
Headnummer    =15
Zylindernummer=4


Hat jemand von Euch eine Idee?

von Michael U. (amiga)


Lesenswert?

Hallo,

ich glaube, Du baust an der falschen Baustelle. Wenn Du nicht uralte 
IDE-HS aus den ersten Generatinen hast, könne die alle LBA.
Deine 80MB usw. können es bestimmt.

Die erste Grenze der CHS-Adressierung waren 512MB, 16 Köpfe, 64 Sektoren 
und 124 Zylinder bei Sektorgröße 512Byte.

Limitierung war die Register/bit-Zuordnung der alten IDE-HDs, außerdem 
gab es noch Probleme mit alten PC-BIOS-Versionen, die konnten nur 63 
Sektoren/15 Köpfe richtig übermitteln. Dann kam LBA auf, in der gleichen 
24Bit-Begrenzung.
Das wären 16GB gewesen, dummerweise rechneten die PC-BIOS-versionen mit 
Signed, also konnten nur 8GB real adressiert werden.

Du kannst jetzt eine HD nehmen, die LBA kann und nimmst eine bleibeige 
Kombination von CHS-Werten (innerhalb der zulässigen Maximalwerte, da 
müßte ich nachkramen...), die die maximale LBA-Sektoranzhal nicht 
überschreiten.
Mit diesen Werten (konnten man in alten PC-BIOS-Versionen gut einstellen 
wenn es keine Auoterkennung gab) und formatierst jetzt diese HD mit 
einem Dateisystem.
Wenn Du die jetzt in einen anderen PC einbaust und die identischen CHS 
Werte angibst, hast Du Zugriff auf das Dateisystem.
Du kannst sie auch mit völlig anderen Werten im BIOS anmelden, dann mußt 
Du sie eben neu formatieren und das Dateisystem ist eben jetzt nur mit 
den neuen Werten erreichbar.

Du adressierst also letztlich immer mit dem LBA-Sektor, der Rest ist 
Interpretation der darüberliegenden Schichten, Dateisystem usw.

Ich hatte damals das FFS des Amiga genutzt, der hat mir auch die 
CHS-Translation geliefert, die er gut fand.
Mit diesen Werten habe ich auf dem AVR eben in einer Subroutine die LBA 
berechnet und diesen Sektor gelesen.
Der Umweg war (ist) deshalb nötig, weil es da (alte) Festlegungen gibt 
eben wie Bootsektor in Track 0 Sektor 0, Länge 32 Sektoren. 
Direktorystruktur ab Track 2 usw. usw.

Wenn Du also eine bereits eingerichtete HD lesen willst, mußt Du genau 
mit den CHS-Werten rechnen, mit denen sie eingerichtet wurde, sonst 
findest Du das Dateisystem nicht ohne weiteres.

Wenn Du ohne oder mit eigenem Dateisystem arbeitest, kann st Du 
prinzipiell reine LBA-Festlegunden treffen und nur mit diesen arbeiten. 
Wenn Du was in LBA-Sektor 345678 schreibst wirst Du es auch da wieder 
lesen können.
Wenn Du auf CHS 5-12-512 schreibst wirst Du auch das von dieser HD 
wieder genau dort lesen können.

Gruß aus Berlin
Michael

von Bernhard S. (bernhard)


Angehängte Dateien:

Lesenswert?

Hallo Michael

> Wenn Du nicht uralte IDE-HS aus den ersten Generatinen hast,
> könne die alle LBA.
> Deine 80MB usw. können es bestimmt.

Ich enttäusche Dich ja nur sehr ungern,
aber diese HDD kann z.B. nur CHS ^^

Ziel ist es u.a.:

- bei allen HDD ein LOW-Level-Format durchführen zu können,
diverse SATA / IDE Adaper erkennen teilweise nostalgische
HDD nicht mehr :-(

- AVR / µC formatiert auf FAT16, ev. mit Betriebssystem DOS 6.0

- AVR read write Dateien mit FAT16

: Bearbeitet durch User
von Michael U. (amiga)


Lesenswert?

Hallo,

Bernhard S. schrieb:
> Ich enttäusche Dich ja nur sehr ungern,
> aber diese HDD kann z.B. nur CHS ^^
Naja, die sollte ja in alten Rechnern zurechtkommen...
http://computermuseum.informatik.uni-stuttgart.de/pcdisk/h/1000/520.htm
Sie macht intern einen Auto-Translate auf ihre physische Zuordnung.
Es hindert Dich niemand, CHS zu nutzen, bei allen Platten...
>
> Ziel ist es u.a.:
>
> - bei allen HDD ein LOW-Level-Format durchführen zu können,
> diverse SATA / IDE Adaper erkennen teilweise nostalgische
> HDD nicht mehr :-(
Das alte LOW-Level-Format ignorieren diese HDs ohnehin. Wenn sie nett 
sind beschreiben sie alle Sektoren mit 0x00, meist aber machen sie 
garnichts...

> - AVR / µC formatiert auf FAT16, ev. mit Betriebssystem DOS 6.0
>
> - AVR read write Dateien mit FAT16

Ich frage jetzt wirklich nicht, wozu das alles gut sein soll...
Ich bastle ja auch etlichens scheinbar nutzloses Zeug zusammen, aber 
hier passe ich definitv. Ich finden nichtmal ansatzweise eine Anwendung 
dafür.

Gruß aus Berlin
Michael

: Bearbeitet durch User
von S. R. (svenska)


Lesenswert?

Hallo,

Bernhard S. schrieb:
> Wozu wird das SEEK Comand benötigt ?

Damit wird der Schreib-/Lesekopf schonmal auf die richtige Spur 
gefahren. Wenn du eine gesamte Spur auf einmal lesen oder schreiben 
möchtest, brauchst du ihn dann nicht mehr bewegen.

Bernhard S. schrieb:
> Wie könnte man zuverlässsig herausfinden, ob die HDD nur im
> 3-dimensionaler Form (CHS) angesproche werde kann?

Falls die Platte kein LBA-Flag gesetzt hat oder kleiner als 500 MB ist, 
dann nimm CHS. Sonst nimm LBA (evtl. mit Blacklist).

Bernhard S. schrieb:
> Forschläge:

Schreibt man mit V. :-)

Bernhard S. schrieb:
> Wie könnte man prinzipiell LBA nach CHS umrechen?

Nutze ganzzahlige Divisionen (d.h. abschneiden / abrunden).

C = LBA / (Köpfe x Sektoren/Spur)
  R1 = LBA - C x Köpfe x Sektoren/Spur

H = R1 / Sektoren/Spur
  R2 = R1 - H x Sektoren/Spur

S = R2 + 1

Michael U. schrieb:
> ich glaube, Du baust an der falschen Baustelle. Wenn Du nicht uralte
> IDE-HS aus den ersten Generatinen hast, könne die alle LBA.
> Deine 80MB usw. können es bestimmt.

Wie ich bereits schrieb, Festplatten unter 500 MB können es so gut wie 
nie (mangels Bedarf), bei Festplatten im niedrigen einstelligen 
GB-Bereich kann es fehlerhaft sein.

> Die erste Grenze der CHS-Adressierung waren 512MB, 16 Köpfe, 64 Sektoren
> und 124 Zylinder bei Sektorgröße 512Byte.

504 MB: 1024 Zylinder, 16 Köpfe, 63 Sektoren.
Die 512 MB sind falsch.

Bernhard S. schrieb:
> - bei allen HDD ein LOW-Level-Format durchführen zu können,
> diverse SATA / IDE Adaper erkennen teilweise nostalgische
> HDD nicht mehr :-(

Ein Low-Level-Format kannst du auf IDE-Festplatten prinzipiell nicht 
durchführen. Ein High-Level-Format ist auch bekannt als "Dateisystem 
anlegen", also QuickFormat. Das, was DOS mit "FORMAT" gemacht hat, ist 
"alle Sektoren lesen", gefolgt von QuickFormat.

Ein AVR ist als universelles Lesegerät für IDE-Festplatten ungeeignet, 
da zu langsam. Außerdem werden die Randbedingungen ungemütlich. Besorge 
dir für Retro-Spiele lieber einen Rechner mit IDE-Schnittstelle und 
nutze den.

> - AVR / µC formatiert auf FAT16, ev. mit Betriebssystem DOS 6.0

Das wird sehr viel mehr Arbeit, als du glaubst. DOS adressiert die 
Festplatte nämlich nicht konsistent: Manchmal baut es sich eine 
Geometrie (teilweise) aus der Partitionstabelle und der FAT zusammen und 
verwendet die...

Außerdem gibt es mehrere Translationsebenen, d.h. die aufgedruckten 
CHS-Daten wurden bei Festplatten >500 MB nie benutzt. Du zerstörst dann 
deine Daten, wenn du nicht aufpasst.

Willst du eine Festplatte unter DOS nutzen, dann formatiere sie IM 
ZIELSYSTEM auch unter DOS. Alles andere riskiert vollständigen 
Datenverlust.

> - AVR read write Dateien mit FAT16

Das ist dagegen sinnvoll, würde ich aber höchstens zum "Image ziehen" 
nutzen, wenn es mir um Retro-Technik geht. Für moderne Dinge würde ich 
keine alten Festplatten benutzen, sondern auf CF-Karten setzen - und die 
können immer LBA.

: Bearbeitet durch User
von Michael U. (amiga)


Lesenswert?

Hallo,

S. R. schrieb:
>> Die erste Grenze der CHS-Adressierung waren 512MB, 16 Köpfe, 64 Sektoren
>> und 124 Zylinder bei Sektorgröße 512Byte.
>
> 504 MB: 1024 Zylinder, 16 Köpfe, 63 Sektoren.
> Die 512 MB sind falsch.

danke fürs korrigieren, ist eben lange her...

Gruß aus Berlin
Michael

von Bernhard S. (bernhard)


Angehängte Dateien:

Lesenswert?

@alle

Danke für die zahlreichen Beiträge und Anregungen :-)

Frage:

Eine Seagate Festplatte mit dem Aufdruck "16 Heads" verwundert mich 
etwas,

denn ich zähle nur 4 Heads an 4 Armen.

Was mache ich falsch?

von Michael U. (amiga)


Lesenswert?

Hallo,

Bernhard S. schrieb:
> Eine Seagate Festplatte mit dem Aufdruck "16 Heads" verwundert mich
> etwas,
>
> denn ich zähle nur 4 Heads an 4 Armen.
>
> Was mache ich falsch?

Du glaubst nicht, daß es ab irgendwann keinen Zusammenhang zwischen den 
logischen Angaben und dem physikalischen Aufbau mehr gab.
Es wurde u.a. Zone Bit Recording genutzt, also außen mehr Sektoren als 
innen auf die Spuren geschrieben.

Auch Deine oben erwähnte Conner hat intern weniger Köpfe und rechnet 
alleine um.

Gruß aus Berlin
Michael

von Bernhard S. (bernhard)


Lesenswert?

S. R. schrieb:
> Ein Low-Level-Format kannst du auf IDE-Festplatten prinzipiell nicht
> durchführen.

Ich dachte bis jetzt, wenn jeder Sektor mit 0x00 beschrieben wird, dann 
wäre das "Low Level" ?



> Ein AVR ist als universelles Lesegerät für IDE-Festplatten ungeeignet,
> da zu langsam.

Momentan erziehle ich bei 22MHz µC Takt und Assembler:

20.000 Sektoren x 512 Byte= 10.240.000 = 10,24 MB

write:8,3s = 1,2 MB/s
read: 11.8 = 0,8 MB/s

Die meiste Zeit wartet der µC bis die HDD Bushy zurückgesetzt.

von c-hater (Gast)


Lesenswert?

Bernhard S. schrieb:

> S. R. schrieb:
>> Ein Low-Level-Format kannst du auf IDE-Festplatten prinzipiell nicht
>> durchführen.
>
> Ich dachte bis jetzt, wenn jeder Sektor mit 0x00 beschrieben wird, dann
> wäre das "Low Level" ?

Nein, ist es nicht.

Aber S.R. hat trotzdem nicht vollkommen Recht, denn in einer 
Übergangszeit bei Einführung der IDE-Platten war es tatächlich noch 
möglich, IDE-Platten zu LL-Formatieren. Es hat nämlich rein garnix mit 
der Schnittstelle zu tun, ob das geht, sondern nur mit der Art, wie die 
Spurführung der Köpfe realisiert ist. Wenn diese mechanisch absolut 
positioniert werden können, kann die Platte LL-Formatiert werden, ist 
sie aber auf eine vorhandene Servospur angewiesen, geht das nicht mehr.

Mehr oder weniger zufällig fiel die Einführung der servogeführten 
Kopfsteuerung zeitlich in etwa mit der Einführung der IDE-Schnittstelle 
zusammen, weswegen dieser Unsinn "IDE->nicht LL-formatierbar" in den 
Köpfen so vieler Leute gelandet ist, dass man das kaum noch korrigieren 
kann.

Ich würde, grob über den Daumen mal so sagen: Alles mit 40MB oder mehr 
ist ganz sicher nicht mehr LL-formatierbar. Im Bereich zwischen 5MB 
(kleinste mir bekannte IDE-Platte) und 40MB kommt's halt drauf an. Eine 
recht häufige Größe der damaligen Zeit, 30MB, gab es jedenfalls sowohl 
in Inkarnationen mit absoluter Kopfpositionierung als auch in 
servogeführten.

von Michael U. (amiga)


Lesenswert?

Hallo,

c-hater schrieb:
> Eine
> recht häufige Größe der damaligen Zeit, 30MB, gab es jedenfalls sowohl
> in Inkarnationen mit absoluter Kopfpositionierung als auch in
> servogeführten.

In dieser Zeit hatten alte BIOS-versionen auch noch die Funktion 
LL-Format eingebaut. Das war eigentlich für MFM/RLL-Platten gedacht. 
Wenn man das auf IDE-Platten loslies gab es 3 Varianten:
- die HD ignorierte die Kommandos und meldete nur Ready zurück
- die HD führte es ordnungsgemäß aus, allerdings meldete sie (zumindest 
bei mir) nie fehlerhafte Sektoren, vermutlich wurden also da schon 
Reservesektoren gemappt
- die HD führte es aus, meldete sich nie wieder zurück und war ein Fall 
für den Rundordner

Das war auch einer der Gründe für "IDE-HDs nie LL-formatieren", es war 
nirgends erkennbar was passieren würde...

Gruß aus Berlin
Michael

von Bernhard S. (bernhard)


Angehängte Dateien:

Lesenswert?

S. R. schrieb:
> C = LBA / (Köpfe x Sektoren/Spur)
>   R1 = LBA - C x Köpfe x Sektoren/Spur
>
> H = R1 / Sektoren/Spur
>   R2 = R1 - H x Sektoren/Spur
>
> S = R2 + 1

Danke für den Tipp, so könnte eine Assembler-Lösung im CHS und LBA-Modus 
ausschauen.

von S. R. (svenska)


Lesenswert?

Bernhard S. schrieb:
> Ich dachte bis jetzt, wenn jeder Sektor mit 0x00 beschrieben wird, dann
> wäre das "Low Level" ?

Nein, ein Low-Level-Format beschreibt das physische Anlegen von Spuren 
und Sektoren, wie es auf Disketten (und MFM/RLL-Platten) praktiziert 
wird. Schau dir mal die Schnittstelle zwischen Diskettenlaufwerk und 
-controller an.

von Horst S. (Gast)


Angehängte Dateien:

Lesenswert?

Da hier über alte Interfacetopologien von Festplatten geschrieben wurde, 
dachte ich, das passt hier gut hin.
Wenn also damals eine neue Festplatte ins Haus stand, das BIOS aber 
deren Geometrie nicht unterstützte/kannte, gab es seinerzeit Hilfe von 
der c't.
Ein kleines übersetztes Assemblerprogramm hat dem Rechner nach dem 
Booten dem BIOS die korrekten Parameter zur Verfügung gestellt.

von c-hater (Gast)


Lesenswert?

Michael U. schrieb:

> - die HD führte es ordnungsgemäß aus, allerdings meldete sie (zumindest
> bei mir) nie fehlerhafte Sektoren, vermutlich wurden also da schon
> Reservesektoren gemappt

Oder es ist einfach genau das passiert, wogegen ein LL-Format helfen 
sollte: Nur scheinbar fehlerhafte Sektoren zu reparieren. Nämlich 
solche, die allein durch eine Abschaltung des Schreibstroms im falschen 
Moment oder durch eine beschleunigungsinduzierte tangentiale Ablenkung 
des Kopfes (also kein Headcrash, sondern nur Verlassen der Spur) 
entstanden sind...

Tipp: Sektor-Remapping hab es damals noch nicht, das wäre mit der 
damaligen Technik viel zu teuer gewesen.

von Michael U. (amiga)


Lesenswert?

Hallo,

c-hater schrieb:
> Tipp: Sektor-Remapping hab es damals noch nicht, das wäre mit der
> damaligen Technik viel zu teuer gewesen.

Da bin ich nicht ganz überzeugt von. SCSI-HDs konnten es und der 
Unterschied im Aufwand auf den Leiterplatten zwischen z.B. einer Quantum 
52MB SCSI und der AT-Version war nicht so erheblich. Die Laufwerke 
selbst waren ohnehin identisch, man konnte einfach die Leiterplatte 
rüberschrauben. Bei der 105MB ging das auch noch.

Gruß aus Berlin
Michael

von Bernhard S. (bernhard)


Angehängte Dateien:

Lesenswert?

Habe mir erlaubt den Gehäusedeckel einer Festplatte zu öffnen.

Ein kleines Assembler-Programm sorgt dafür, daß der Lesekopf
zwischen CYL NULL und MAX hin und her pendelt.... schaut lustig aus ^^

: Bearbeitet durch User
von Bernhard S. (bernhard)



Lesenswert?

Eine mögliche Schaltung

HDD SD-Card TWI/I2C RS232 LCD Tasten LED

von Bernhard S. (bernhard)


Lesenswert?

... und so könnte ein kleines Projekt ausschauen

Beitrag "HDD SD an AVR ATmega1284p Assembler Beispiele"

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.