Frage: Kann man 5¼″-Laufwerke an USB anschließen? Oder gar 8″?
Es gibt folgendes, was die Eigenentwicklung nicht lohnt:
Für 5¼″ scheint es da nichts zu geben.
Einen urtümlichen Floppy-Controllerchip wie WD1772 oder U8272 zu benutzen, um die seriellen MFM-Daten zu generieren oder auszulesen erscheint unsportlich. Geht das nicht mit den heutigen Rechenleistungen von 8-Bit-Controllern mit USB auch ohne?
Hier ist MFM und der Sektoraufbau erklärt,
ich habe das mal in ein handliches CHM
gepackt.
Diskettenlaufwerke liefern und erwarten negative Impulse pro Flusswechsel. Über die Pulsbreite konnte ich keine Info finden; wahrscheinlich so dass TTL-Schaltkreise sicher ansprechen, also deutlich kürzer als 1 µs.
Und so sollte es aussehen:
| 0xA1 mit Sync | 0xA1 ohne Sync | Daten 0 | 1 | 0 | 1 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 1 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 Datenbits | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | _____ _____ * _____ _______ ___ _____ ___ / \_______/ \_______/ \___/ \_____/ \___/ \___/ \___/ Magnetfluss ___ _____ ___ _____ ___ _ _____ ___ _ _ ___ _ _ _ __ __ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \ Signal RD/WD 1½ 2 1½ 2 1½ 1 2 1½ 1 1 1½ 1 1 Zeiten 01 01 0 00 01 1 01 0 0 0 01 1 1 Generierte Bits 0 1 1 0 0 1 1 0 0 0 0 1 1 1 Merkbit T
Als erstes wurde untersucht, ob der Diskettencontroller mit seiner MFM-Schreib- und Lesefunktion überhaupt in Software realisierbar ist. Dies ist für DD und HD locker möglich, und auch ED ist realisierbar.
Immerhin passt ein typischer Diskettensektor in den RAM des ATmega32U4. Daher muss man die Daten nicht strömen lassen. Vorerst.
Andere Kodierungsformate wie GCR (Apple) lassen sich im Gegensatz zu einem Hardware-Diskettencontroller einfach per Software nachrüsten.
Um während des Sektorlesens den vorher gelesenen Sektor in 64-Byte-Stückelung zum USB zu schaffen, ist eine entsprechende Routine erforderlich, die maximal 16 Takte dauert. Da CALL und RET viel zu langsam sind, nur mit Sprüngen.
Der USB-Teil des ATmega32U4 ist sichtlich nicht AVR-typisch und die Dokumentation im Datenblatt unter aller Kanone:
INT_FLAGS = INT_FLAGS | andere_interruptbits & ~mein_interruptbit;
In diesem Forum wird heftig über dasselbe Thema diskutiert: Wie man MFM allein mit einem Mikrocontroller dekodiert.
Ein Eigenbau-Diskettenlaufwerk mit CBI-Protokoll erfordert (zumindest unter Windows 7) eine eigene .INF-Datei zur Installation und ist damit nicht gerade benutzerfreundlich. Im Falle des o.a. Funktionsmusters findet Windows die Vendor- und Product-ID (0x3EE = Mitsumi, 0x6901 = USB-Diskettenlaufwerk) in einer vorinstallierten INF-Datei und lädt usbstor.sys. Man müsste daher bei Eigenbauten jene Vendor- und Product-ID wiederverwenden, um keine INF-Datei mitliefern zu müssen. (Auf welchem Medium? Auf Diskette — das geht nicht!)
Stellt man die Firmware auf das von Microsoft empfohlene Bulk-Only-Protokoll um, lädt Windows den Treiber usbstor.sys auf generischer Basis mit Hilfe der USB-Klasse. Daher verwenden auch die im Internet herumgeisternden Kodebeispiele zum Thema Massenspeicher allesamt das Bulk-Only-Protokoll. Hier wird der SCSI-Steuerblock mit einem 15-Byte-Rahmen versehen und über den gleichen Bulk-Out-Endpoint versendet wie auch die Schreibdaten. Sowohl die Lesedaten als auch der SCSI-Status werden über den Bulk-In-Endpoint in den PC eingelesen, wobei der Status aus einem 9-Byte-Block besteht. Bei Fehlern wird der Bulk-In-Endpoint im Stall-Modus angehalten.
Die Diode am USB-Anschluss muss drauf bleiben, damit nicht das eingeschaltete Diskettenlaufwerk über dortige Pullup-Widerstände den ausgeschalteten PC versucht zu speisen. Das Laufwerk oder die Laufwerke werden selbstverständlich nicht vom USB gespeist. Hierfür ist ein eigenes Netzteil (5 V und 12 V) notwendig. Die alten Laufwerke sind viel zu stromhungrig, als dass man die Leistung einem USB-Anschluss antun sollte. Nur der Mikrocontroller wird vom PC gespeist.
Der ATmega32U4 hat eine unintuitive Portpinverteilung. Dazu kommt das Chaos, was Arduino&Co angestiftet hat. Hier noch mal nach Ports sortiert:
Port B | Port C | Port D | Port E | Port F | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Bit | A# | R. | Anschluss | Bit | A# | R. | Anschluss | Bit | A# | R. | Anschluss | Bit | A# | R. | Anschluss | Bit | A# | R. | Anschluss |
PB0 | - | A | (LED D1) | PC0 | - | PD0/OC0B | 3 | A | WD | PE0 | - | PF0 | kein Anschluss | ||||||
PB1 | 15 | A | Motor2 | PC1 | - | PD1 | 2 | A | Motor3 | PE1 | - | PF1 | kein Anschluss | ||||||
PB2 | 16 | E | TK0 | PC2 | - | PD2 | RxD | A | DS3 | PE2 | kein Anschluss | PF2 | - | ||||||
PB3 | 14 | A | STP | PC3 | - | PD3 | TxD | E | IDX | PE3 | - | PF3 | - | ||||||
PB4 | 8 | E | WP | PC4 | - | PD4/ICP1 | 4 | E | RD | PE4 | - | PF4 | A3 | A | Motor0 | ||||
PB5 | 9 | E | DC | PC5 | - | PD5 | - | A | (LED D3) | PE5 | - | PF5 | A2 | A | DS1 | ||||
PB6 | 10 | A | SS | PC6 | 5 | A | DS2 | PD6 | kein Anschluss | PE6 | 7 | A | WG | PF6 | A1 | A | DS0 | ||
PB7 | kein Anschluss | PC7 | kein Anschluss | PD7 | 6 | A | DIR | PE7 | - | PF7 | A0 | A | Motor1 |
Und so sieht in etwa ein Adapterboard aus. Links werden die Laufwerke mit DS2 und DS3 angeschlossen, rechts die mit DS0 und DS1. Jeweils mit einem „gedrehten“ Floppykabel. Das Bandlaufwerk kann irgendwo zusätzlich angeschlossen werden. Egal ob vor oder nach der Drehung.
Die Firmware könnte oder kann:
Was die Firmware nicht kann:
Oder vielleicht später doch noch?