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
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.
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.
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
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.
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
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
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.
@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).
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!
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.
IDE Programmierer schrieb: > Ja dein "wait BUSHY" ist auch sehr lustig. Ron Bushy war der Drummer von Iron Butterfly ("In-a-gadda-da-vida").
... 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
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.
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
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.
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
Bernhard S. schrieb: > ... die hoffentlich übersichtlichere HDD Festplatten IDE Beschaltung Warum ist denn IDE_A1 am µC mit A2 am Stecker verbunden?
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.
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.
> -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.
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
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/
Nik Bamert schrieb: > Ich habe mal angehaengt was ich habe Ausgereifte Sache!
1 | for (h = 0; h < 255; h++) { |
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.
Nik Bamert schrieb: > Also noch kein for(int > h=...) moeglich. H ist aber dennoch durchaus definiert. Selbst auf Hinweis siehst du nicht die "Ausgereiftheit".
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
Einfacher versteht man den "Witz", wenn man sieht, daß "h" als "uint8_t" deklariert ist.
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
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.
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
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.
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.
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
> 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.
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.
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.
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.
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
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.
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
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.
Tim S. schrieb: > [Und neue Platten mit x Terrabyte Speicher an den AVR hängen?] Terabyte, bitte. (Ist zwar groß, aber nicht planetengross).
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.
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.
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?
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
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
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
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
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
@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?
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
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.
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.
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
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.
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.
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.
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.
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
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
... 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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.