SD card am Paralellport, MS-DOS

  • Hi PeterSieg,
    ich versuch grad den OpenWatcom zu laden. Mal schaun ob der taugt.
    Aber für das SD-Treiber Projekt dürfte wohl der Borland_C mit Turbo_ASM das einzig passende sein.
    Vor allem weil der Sourcecode ja ein ASM Modul und mehrere C-Module enthält und ein "passendes" MakeFile für o.g. Tools.

    Programmiert hab ich heute noch nichts, hatte noch keine Lust.
    Aber nun hab ich einen zweiten Adapter für SD-Card mit Levelshifter mal zusammen gefummelt. Beide Teile China Ware. Es wird sicherlich keine Platine geben, so wie sich 1ST1 das wünscht. Das ist mir viel zu kompliziert.

    Der Treiber ist zwar noch immer eine Baustelle, aber ich konnte jetzt auf zwei Computern ein file schreiben und auch Lesen. Und vor allem mein Notebook PCD-4ND, das mit dem defekten Diskdrive, hat nun einen alternativ Zugang zur "Datenwelt". Den provisorischen Treiber musste ich nocht mit Interlink rüber tun, Jetzt kann ich "updates" über SD-Card drauf spielen :)


    Hier mein aktueller Testaufbau am PCD-4ND


    mfG. Klaus Loy

  • Kann denn der BCC 32bit Integer?

    ShiftLeft entspricht doch einer Multiplikation mit einer Zweierpotenz. Ist vielleicht ein wenig langsamer, aber wenn’s dafür geht...

    Das Genie beherrscht das Chaos

  • Der Borland BCC kennt unsigned long, was in diesem Fall 32 Bit ist, wohl gemerkt Compilierung für 8086 Prozessor.
    Aber er kennt scheinbar kein ShiftLeft mit 32Bit, zumindest nicht mit dieser Linker Einstellung wie sie im Make File vorgegeben ist. Und die Konstruktion des ShiftLeft des Original Treibers, Version V11 scheint nicht zu funktionieren. Evtl hängt das vom KartenTyp ab, ob die ShiftFunktion überhaupt benötigt wird, denn der Treiber hat ja vermutlich beim Entwickler schon mal funktioniert.


    Hier die Compiler und Assembler Optionen aus dem MakeFile:
    CC=bcc -c -ms -Z -O -Ol -Oe
    ASM=tasm -mx

    Und so wird gelinkt:
    tlink -t -m -s -n


    mfG. Klaus Loy

  • @Toshi, das weiß ich nicht.
    Ich möchte den Code des original Treibers mal mit dem Disassembler ansehen, um es zu verstehen.
    Außerdem vermute ich das sehr viel "reine" MS/DOS Software für den 8086 übersetzt ist, ASM, C, PAS, ...

    Auch der von mir modifizierte Treiber ist ja für 8086 compiliert, nur das meine 32Bit Shift Funktion noch nicht allgemein funktioniert. Ich kann nur maximal um 8 Stellen schieben, dummerweise werden 9 Stellen und n Stellen benötigt. Die 9 bekommt ich hin wenn ich um 5 und dann um 4 Schiebe. Für n hab ich grad noch keine Lösung.


    Meine aktuellen Ziel Rechner sind:

    Thosiba T5200 (486er) und der Siemens PCD-4ND


    Der SD-Adapter mach bereits jetzt Spaß, denn heute hab ich auf beide o.g. Rechner damit ein kleine Tool drauf kopiert :)


    mfG. Klaus Loy

  • Hier kommt das Schaltbild zu meinem aktuellen Aufbau.



    Mein modifizierter experimenteller Treiber folgt in kürze.


    mfG. Klaus Loy

  • Aber nochmal zu deinem LShift:

    Hast du schon mal probiert, das durch eine Multiplikation zu ersetzen?

    Also aus x<<9 oder leftshift(x,9) oder wie auch immer ein x*pow(2,9) zu machen.

    Ich würde aber einfach mal in einem kleinen Testprogramm versuchen, was bei den einzelnen Varianten so raus kommt.

    Das ist einfacher, als in einem kompletten Code zu debuggen.

    Das Genie beherrscht das Chaos

  • OK, hier nun erstmal ein Link zu meinem experimentellem Treiber:

    SD_Treiber_V12_alpha 
    Mist, in der DropBox hätte eigentlich ein zip-File landen sollen, jetzt sind es halt einzelne Files.


    Ich habe diese Version absichtlich auf DropBox gelegt, damit ich sie wieder aus dem Verkehr ziehen kann.

    Ihr könnt gerne damit experimentieren.


    @Toast_r,
    ich ich weiß nicht zu was diese Schaltung kompatibel wäre.
    Der level Shifter ist ganz einfach, eine Schaltung mit FETs.

    Beide Teile von ebay, China Ware.

    In einem Forum wurde von "LevelShift" mit Widerständen abgeraten.
    Wie meine Signale aussehen müsste ich mal mit dem Oszi messen.


    @ChaosRom,

    ne, hab ich nicht probiert, ich denke wenn Shift 32 nicht geht dann geht Mul auch nicht.
    Ich werd da wohl noch eine saubere Lösung finden.
    Kannst ja den Code ansehen, der liegt mit auf dem DropBox link.


    mfG. Klaus Loy

  • Also liebe Leute,

    jetzt konnte ich den Treiber Code soweit lauffähig machen und etwas aufräumen.
    Auch die 32 Bit Shift Funktionen konnte ich sauber zum Laufen kriegen.


    Hier die aktuelle Version: SDPP12.zip

    Das Anschlussbild liegt bei #73


    mfG. Klaus Loy

  • Kannst du konkret einen SD-Kartenleser und Levelshifter empfehlen, Bucht-Link? Sammelbestellung?


    Weitere Fragen:


    Wie sieht es eigentlich mit der Stromversorgung aus, wieviel A braucht die Choose?


    Könnte man die Stromversorgung evtl über den Parallelport machen, mehrere für die SD-Karte unbenutzte Signale auf High und mit GE-Dioden (0,3V Durchflussspannung) zusammenführen? Würde das gehen? Würde Netzteil einsparen...


    Unterstützt der Treiber einen Diskchange, also kann man die SD-Karte im laufenden Betrueb wechseln?


    Partitionsgröße je nach DOS-Version?


    Maximale Größe der SD-Karte?

    1ST1

  • Das Interface über den Parallelport über Dioden zu versorgen hat damals schon Nilquader probiert, hat leider nicht funktioniert.

  • Sind .sys-Dateien identisch wie .com, lediglich mit Basisadresse 0 statt 100?

    Kann man mit BCC nach Assembler compilieren und dann den Output mit nem Assembler übersetzen, nachdem man ihn passend modifiziert hat?

    Mit MSC geht das, und der << Operator funktioniert da auch datentypgemäss (unsigned long [32], short [16] und char [8bit]).

  • @1ST1,
    1.
    konkret möchte ich aktuell keine Kaufempfehlung geben, weil zuvor müsste ich mal die Signale des Levelshifters messtechnisch beurteilen. Es funktioniert bei mir aber ich weiß nicht wie gut. Das von mir verwendete Material ist recht gut auf meinem "Schalt Bild" zu erkennen. Einfach bei ebay SD-Adapter oder eben Level Shifter eingeben und dann evtl. möglichst die gleichen Platinen nehmen. Der Levelshifter beruht auf dem Prinzip wie z.B. hier beschrieben:
    Bi-Directional MOSFET Voltage Level Converter 3.3V to 5V
    Ein Nachteil dürfte sein, dass der SD-Card Ausgangstreiber der die MISO Leitung treibt, auch direkt den Eingang der LPT-Schnittstelle treiben muss. D.h. im Kurzschlussfall könnte die SD-Card sterben. Aber vermutlich sind sie robust.


    2.
    Stromversorgung, keine Ahnung ich hab es nicht gemessen.

    3.
    Stromversorgung direkt vom LPT oder evtl. COM-Port. Ich hab mich nicht getraut. Weil es sollte ja universell sein und wenn sich jemand seinen LPT Port kaputt schießt ist das auch nicht wirklich schön. Mag sein dass die Sache mit den restlichen Datenleitungen und Dioden funktionieren könnte. Man müsste dann den treiber anpassen, der müsste die Datenbits 3...7 immer !!! auf High setzen, was sicherlich ginge. Oder eben vom COM Port die Spannung holen und "aufbereiten". Bei mir hole ich sie aus einem PS/2 Anschluss, bzw. an meine Toshiba T6200 hab ich hinten einen Floppy Stecker mit 12V und 5V heraus gelegt. Was ich gestern sah, wenn die 5V nicht anliegt, dann hat an meinem Levelshifter die Power LED leicht geleuchtet, d.h. es hat sich eine undefinierbare Spannung über die Datenleitungen D0..D2 aufgebaut. Das ist natürlich auch nicht wirklich gut. Evt. sollte man da sogar noch Begrenzungswiderstände vorsehen.


    4.
    Disk Change, Nein, wenn du die Karte raus nimmst und wieder einlegst, oder eine andere nimmst, dann geht nichts mehr. Im Projekt gibt es eine Card detect Leitung, welche ich aber in meiner Hardware nicht habe. Evtl. würde das damit gehen. Aber ich hab mir diesen "Mechanismus" noch nicht angesehen. Man könnte sich vermutlich ein kleines Programmchen SDRESET.EXE machen, welches dem Treiber ein Reset schickt. Damit könnte das dann manuell behoben werden.


    5.
    Keine Ahnung, ich glaube meine Karte hat 512MB, da dauert der DIR Befehl einige Sekunden. Da kommt erst der Direktory Inhalt und dann dauert es noch einige Sekunden bis die Kartengröße angezeigt wird. Keine Ahnung was da ab geht. Ich denke es wäre besser wenn man die Karten "verkleinern" würde, d.h. Partition mit z.B. höchsten 100MB oder anlegen. Auch wie schnell und wie zuverlässig größere Dateien kopiert werden können hab ich noch nicht getestet.


    6.
    Maximal Größe, weiß ich auch nicht. Aber es muss wohl FAT16 sein und da gibt es wohl eine maximale Größe.
    Ansonsten wird vermutlich nicht jede Karte gehen. Im Treiber ist verschiedenes vorgesehen um mit verschiedenen Karten umgehen zu können. Aber ob das funktioniert und, ist mir unklar. Bei mir ging es ja wohl gerade wegen so einer Modus Umschaltung nicht. Bei einem bestimten Kartentyp, vermutlich bei "modernen" Karten wird ein Modus gefahren wo die Adressierung über Byte Adressen geht, d.h. Sektor 1 adressiert Byte 512 und schon sind wir bei der 32Bit Links Schiebe Funktion die im Original Treiber V10 und V11 nicht funktionierte. Bei dem von mir modifizieten Treiber hab ich eigentlich nur diese Funktionen in Ordnung gebracht und dann ging es.


    Wenn jemand Zeit und Lust hat, probiert es einfach aus und gebt Rückmeldung.


    Weitere Fragen werde ich in bälde beantworten.


    mfG. Klaus Loy

  • 5.
    Keine Ahnung, ich glaube meine Karte hat 512MB, da dauert der DIR Befehl einige Sekunden. Da kommt erst der Direktory Inhalt und dann dauert es noch einige Sekunden bis die Kartengröße angezeigt wird. Keine Ahnung was da ab geht. Ich denke es wäre besser wenn man die Karten "verkleinern" würde, d.h. Partition mit z.B. höchsten 100MB oder anlegen. Auch wie schnell und wie zuverlässig größere Dateien kopiert werden können hab ich noch nicht getestet.

    Das mit der langen Pause zwischen Diretory anzeigen und Kartengröße/freier Speicher ist auch bei ZIP-Disketten und bei USB-Treibern für MS-DOS so. Ist also kein Alleinstellungsmerkmal von deinem Treiber.

    1ST1

  • @6502,

    Sind .sys-Dateien identisch wie .com, lediglich mit Basisadresse 0 statt 100?

    Ich glaube ja.
    Laut Compiler Schalter (frag nicht welcher, ich weiß es grad nicht) wird eine COM Datei gebaut, aber die Zieldatei heißt halt statt SD.COM einfach SD.SYS

    Wie das es genau ist weiß ich nicht. Ich hab für das Linken immer make sd.sys eingegeben und dann hat wohl der Linker die Module in der Reihenfolge zusammen gebaut wie es in der Make Datei stand. Die Reihenfolge ist vermutlich absolut wichtig und ich meine das Erste Modul ist das Header.ASM bzw. HEADER.OBJ, welches ja in assembler geschrieben ist.

    Kann man mit BCC nach Assembler compilieren und dann den Output mit nem Assembler übersetzen, nachdem man ihn passend modifiziert hat?

    Nein das wird so wahrscheinlich nicht gehen.
    Du kannst aber beim compilieren der einzelnen OBJ Dateien, den Compilerschalter -S oben im MakeFile mit angeben.
    Dann wird ein Assembler Listing <MODUL>.ASM erzeugt, in dem die C-Zeilen an passenden Stellen als Kommentat mit im Listing enthalten sind.
    Daraus könntest du manuell dann ein Übersetzbares Assembler File bauen. Ich glaube nicht dass es ohne Änderung mit TASM übersetzbar wäre.


    Mit MSC geht das, und der << Operator funktioniert da auch datentypgemäss (unsigned long [32], short [16] und char [8bit]).

    OK, wenn es mit MSC geht, vieleicht ginge es dann auch mit BORLAND_C bzw. TASM, ich hab es nicht probiert.


    Aber ich hab die Module mit ASM Output erzeugt um einiges besser verstehen zu können. Speziell diese verdammten Makros, bzw. Defines, da wusste ich nicht wie der Code funktioniert, z.B. die SPI Bit Sequenzen erzeugen. Nachdem ich es in ASM gesehen hatte war es mir etwas klarer.

    Die Sache mit dem << Operator, wenn man ein define umgeschaltet hat, dann wurde der wohl auch übersetzt, aber dann hat der Linker gemeckert, also erstmal auch keine Lösung.


    Gesetern hat mir dann der MSC (Visual Studio 2008) geholfen den original ShiftLeft Code des Treiber zu verstehen, bzw. zu debuggen. Die parameterübergabe DINT --> 2x WORD hab ich nach wie vor nicht verstanden, der Compiler auch nicht. Dann hab ich das etwas umgebaut (Pointer ...) und nun konnte ich den Shifter debugen. Da war ein Fehler in der Logik. Diesen konnte ich korrigieren und nun gehts. Ursprünglich kam als Ergebnis immer 0x00000055 heraus was natürlich Quatsch ist.


    mfG. klaus Loy

  • Kannst du konkret einen SD-Kartenleser und Levelshifter empfehlen, Bucht-Link?

    Der Level-Shifter muss nicht bi-direktional sein. Uni-direktional reicht. Die Fließrichtung ist bei SPI ja festgelegt.


    Es gibt auch SD-Kartenmodule, die bereits mit Levelshifter daherkommen, das spart ein weiteres Modul mit Kabelgedöns ein: https://www.ebay.de/itm/Micro-…-fur-Arduino/172004847913

  • @for(;;)

    ja gibt es auch, ich hatte halt den mit FETs da liegen, er wird ja auch nur unidirektional betrieben. Drei Leitungen zur SD-Card hin und eine Leitung von der SD-Card zum PC zurück. Es funktioniert. Aber wie gut die Signale aussehen hab ich nach wie vor noch nicht gemessen.


    mfG. Klaus Loy

  • ... und ich hab auch eine MicroSD mit 512MB über einen Adapter (SD-Card mit Micro Slot) im "großen" Adapter betrieben. Gestern Abend hatte ich mal "produktiv" 3 MByte über den SD-LPT Adapter auf mein altes Notebook übertragen. Es ging, aber es geht halt gemächlich.


    Und ebay hab ich mir mal zwei Micro-SD Adapter mit Levelshifter bestellt. Mal schaun.


    mfG. Klaus Loy

  • @Toshi,
    da müsste ich mal mit der Stopuhr dran gehen. Es fühlte sich an, als ob es langsamer als mit Diskette wäre. Aber gleichzeitig hast halt den Vorteil der "großen" Kapazität.

    @All, (die sich für DOS Device Driver interessieren)

    ich habe da etwas interesantes gefunden:


    IBM Disk Operating System Version 4.00 Technical Reference

    "Chapter 11. Writing an Installable Device Driver"

    http://bitsavers.trailing-edge.com/pdf/ibm/pc/dos/15F0256_DOS_4.0_Technical_Reference_Jul88.pdf


    mfG. Klaus Loy

  • ... dann hab ich mal den Datendurchsatz gemessen, er ist gar nicht mal so schlecht:
    1 MByte copy D: (SD-Card) nach C: 37 Sekunden

    1 MByte copy C: nach D: (SD-CARD) 27 Sekunden


    Copy über Diskette ist vermutlich auch nicht schneller.


    mfG. Klaus Loy

  • Jetzt hab ich mal mit dem OSZI an meinem SD-2-Lpt Adapter gemessen.
    Hier die Schaltung "passiv Level Shifter mit FET", Schaltung von https://de.wikipedia.org/wiki/Pegelumsetzer

    Die Schaltung funktioniert, aber die Impulse sind im oberen Bereich etwas verschliffen, siehe Oszi Bild im Anhang. Dargestellt im Oszilogramm SCK gemessen auf der 3,3V Seite und MISO gemessen auf der 5V Seite. Die Treiberleistung für MISO muss halt die SD-Karte aufbringen was eigentlich nicht so eine gute Idee ist. Bitte um Meinung dazu.


    Mittlerweile habe ich nun auch einen MicroSD-Adapter mit einem aktiven IC (74LVC125A) da liegen, hab aber noch nichts damit aufgebaut.

    pasted-from-clipboard.png

    Nachteil bei diesem Adapter, der 74LVC125A wird nur mit 3,3V betrieben, so dass die MISO Leitung auf der "5V-Seite" dann halt auch nur einen Pegel von 3,3V hätte, was mir ebenfalls ungünstig vorkommt. Bitte auch Meinung dazu.

    Ansonsten ist "mein" Adapter ein recht angenehmes Tool, um halt eben mal Files auf einen Notebook mit defektem Diskettenlaufwerk zu bekommen. Das Henne Ei Problem ausgenommen, erstmal muss halt der Treiber drauf sein dann ist alles gut. Mittlerweile hab ich auch den 3Com 3C589D PCMCIA Network adapter am Laufen, dass ist dann natürlich Luxus zum Filetransfer.



    mfG. Klaus Loy