Hallo! Ich habe eine 16MB SD-Karte von Panasonic, zumindest ist die Kapazität nach Herstellerangaben so. Durch Auslesen des CDS-Blocks und der Durchführung der nötigen Berechnungen komme ich aber auf 14909440 Bytes. Kann jemand verifizieren, dass das die richtige Anzahl an Bytes ist? Gruß, Martin
Hi, verrätst Du auch wie wir das jetzt für Dich verifizieren sollen? Gruß, Feadi
wenn du meinst daß dir ca. 1MB fehlt dann stimmt das, denn irgendwie müssen ja die 16MB verwaltet oder organsiert werden. genauso kannst du das bei festplatten beobachten.
Vielleicht jemand mit 16MB-Karte von Panasonic macht einen Test? Anderer weg wäre uns mal den CSD zu posten. Grüße, Freakazoid
> wenn du meinst daß dir ca. 1MB fehlt dann stimmt das, denn irgendwie > müssen ja die 16MB verwaltet oder organsiert werden. genauso kannst > du das bei festplatten beobachten. Kapier ich nicht. Es geht im nicht um die Netto-Datenmenge (z.B. im Explorer). Da müßte man natürlich die FAT (oder andere Dateisstemverwaltungsstrukturen) berücksichtigen. Es geht im hier wohl eher um BlockSize * 2<<x ... also die Berechnung aus der CSD-Antwort (16 Bytes).
Könnte es sich um defekte Sektoren handeln? Schliesslich müsste eine 16MB Karte schon ein bischen älter sein. Feadi
Hallo meine Panasonic SD Karte hat unter Windows 14860288 Byte das Speichersystem ist da natürlich schon weg. Wenn das Speichersystem ca 409200 Bytes hat (ungenau) müsste der Wert stimmen.
meine SD-karte hat 14.860.288 (formatiert mit Panasonic LUMIX) 14.852.096 (FAT) 14.879.744 (NTFS) FAT32 funktioniert nicht (formatierung bricht ab)
SD steht für Secure Digital, und das bedeutet das irgendwo im Speicher der Karte auch die Schlüssel für den Kryptoprozessor gespeichert werden müssen. Wenn man an die Datenblätter ran kommt sieht man wofür dieser Speicher draufgeht. Gruß Hagen
Also ich habe die SD-Karte nun über einen Kartenleser in WinHex geöffnet. Das Programm zeigt dabei allerhand Informationen über das Medium an, unter anderem auch, dass die Gesamtkapazität 14.909.440 Bytes beträgt, was meiner ursprünglichen Berechnung entspricht. Auch die Anzahl der Sektoren (29120) stimmt überein. Nun habe ich die gleiche Berechnung mal für eine 512 MB-Karte von Kingston durchgeführt. Dort errechnet die Funktion 109.576.192 Bytes und 214.016 Sektoren, was für mich nicht so viel Sinn macht. WinHex zeigt 512.229.276 Bytes an. Kann das irgendjemand erklären? Warum sollte die Berechnung für eine Karte klappen und für eine andere totalen Unsinn liefern? Den Quelltext für die Berechnungsfunktion habe ich angehängt. Gruß, Martin
Hallo,
> Den Quelltext für die Berechnungsfunktion habe ich angehängt.
Haste nicht ;-)
geht deine Funktion zufällig von 512Byte-Sektoren aus (ich meine, daß
z.B. der Code von Ulrich Radig das tut)? Hast Du überprüft, ob das
stimmt (also ob Deine Formatierung wirklich 512Byte-Sektoren hat)?
Vielleicht postest Du mal den Code und den BPM (BIOS Parameter Block).
Grüße, Freakazoid
BTW: Ich hoffe wir reden überhaupt von einer FAT-Formatierung ;-)
Hm. Sieht eigentlich gut aus. Hast Du mal überprüft, ob die CSD korrekt gelesen wurde (z.B. Dump über RS232)? Nicht, daß Du auf einem völlig wirren Datenblock zugreifst.
Das ist das CSD-Register für die 512MB-Karte von Kingston Block Binary Decimal 1. 00000000 0 2. 00101101 45 3. 00000000 0 4. 00110010 50 5. 00011011 27 6. 01011001 89 7. 10000011 131 8. 11010000 208 9. 11110110 246 10. 11011011 219 11. 01111111 127 12. 10000000 128 13. 00010110 22 14. 01000000 64 15. 00000000 0 16. 00001101 13 Daraus ergibt sich nach SD Card Product Manual, Rev. 1.9 C_SIZE 111101000011 3907 READ_BLOCK_LEN 1001 9 C_SIZE_MULT 110 6 und letztlich memory capacity = (C_SIZE + 1)* 2^(C_SIZE_MULT + 2) * 2^(READ_BL_LEN) = 3908 256 512 = 512.229.376 was dem richtigen Wert entspricht. Kann mir jemand erklären weswegen bei mir der falsche Wert ausgegeben wird. Der Aufruf der im vorherigen Posting angegeben Funktion lautet if(!SD_GetDriveSize(&sc)){ sectorCount = sc/512; file->sectorCount = sc/512; if( (sc%512) != 0){ sectorCount--; file->sectorCount--; } DBG("Drive Size is %li Bytes (%li Sectors)\n\r", sc, sectorCount); } else printf((rom char*)"Couldn't get drive size\n\r"); Danke für eure Antworten. Gruß, Martin
Ok. Ich habe den Fehler jetzt selbst gefunden. War ziemlich blöd von mir. Statt c_size = (euint32)((CSD[6] & 0x03)<<10); muss es c_size = (euint32)(CSD[6] & 0x03)<<10; heißen. Logisch, weil ja sonst beim shiften immer 0 rauskommt. CSD ist ein Array vom Typ unsigned char, die einzelnen Felder sind also nur 8 Bit breit und wenn man da zehnmal nach links shifted ist nachher nix mehr über. Also ERST nach long casten und dann shiften! Gruß, Martin
Tricky. Ich hatte zwar beim Rückwärtsrechnen c_size auch mit 0 raus (deswegen ja auch meine Frage nach dem CSD), aber den Teil mit den Klammern hätt ich nicht bemerkt. Mist. Naja, war halt wohl gestern ein wenig neben mir (am 14.10. um 08:11 Uhr das 2. mal Vater geworden) ;-) Hauptsache das Teil läuft jetzt. Grüße, Freakazoid
Glückwunsch zu der Vaterschaft! Und vielen Dank für die Mithilfe… Gruß, Martin
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.