hk@holger-klabunde.de
http://www.holger-klabunde.de

10.10.2006

Wie gro drfen CF/MMC/SD Karten mit meinem DOS sein ?
======================================================
MMC/SD 	maximal 4GB. Siehe Kommentare in MMC_SPI.C
SDHC    kann ich noch nicht sagen
CF	maximal 128GB. Siehe Kommentare in COMPACT.C

Wie formatiert Windows Medien ?
===============================
Gute Frage ;)

Ich stelle hier mal ein paar von meinen Erfahrungen zusammen
wie eine CF/MMC/SD formatiert sein kann. Was man tun sollte
und was besser nicht wenn man mein ATMega-DOS benutzen mchte.

Ich krze CF/MMC/SD hier mal auf CF. Alles gilt auch fr MMC/SD
und was da noch so FAT formatiert werden kann.

Vorweg: Ich habe keine Tips mit welchem Programm man CF
formatieren sollte. Nimm Windows, dein Handy, deinen PDA,
deine Digitalkamera, Linux oder sonst was.

#########################################################################
# Was ist ein FAT-Filesystem eigentlich ?
#########################################################################
FAT heisst FileAllocationTable und ist im Prinzip nichts anderes als eine
flexible Speicherverwaltung. Der Datentrger wird in Speicherblcke (Cluster)
bestimmter Gre aufgeteilt. Die Cluster bestehen aus einem oder mehreren
Sektoren des Datentrgers. Die Cluster einer Datei mssen nicht direkt
hintereinander auf dem Datentrger liegen. Sie knnen kreuz und quer auf dem
Datentrger verteilt sein. Wo diese Cluster liegen, wo der folgende Cluster
einer Datei liegt und welche Cluster frei sind wird in der FAT in Form einer
Clusterchain markiert. Eine Clusterchain (frei bersetzt Speicherblockkette)
ist nichts anderes als eine verkettete Liste von Speicherblocknummern fr
eine Datei. In der FAT werden diese Clusterchains fr jede Datei gespeichert.
Die Nummer des ersten Clusters einer Datei steht NICHT in der FAT ! Sie steht
im Verzeichniseintrag der Datei.

Maximale Dateigre
====================
Eine Datei darf bei FAT hchstens 4GB gro werden.
Mehr passt in die Dateigre mit 32Bit halt nicht rein.

NTFS kann Dateien grer 4GB anlegen.
Linux natrlich auch.

NTFS, EXT2 oder Reiserfs auf ATMega mag ich aber nicht
mehr programmieren. FAT ist schon ok fr Microcontroller ;)

Unterschiede FAT12/16/32
========================
Hauptschlich unterscheiden die drei sich durch die Anzahl der Bytes
die fr einen Clustereintrag in der FAT benutzt werden.

FAT12  12Bit 1.5 Byte verschachtelt in der FAT um Platz zu sparen ! Igitt.
                      Zwei Eintrge belegen 3 Bytes. Daher kommt es vor das
                      ein Clustereintrag auf ZWEI verschiedene Sektoren
                      verteilt ist.
FAT16  16Bit 2 Byte
FAT32  32Bit 4 Byte   Es werden aber nur 28Bit davon wirklich benutzt !
                      Msste deshalb eigentlich FAT28 heissen ;)

FAT12 und FAT16 haben ein Rootdirectory das nicht in der Clusterchain
eingetragen bzw. kein Teil der FAT ist ! Die Gre ist fest vorgegeben
und kann nicht verndert werden. Die Gre des Rootdirectory betrgt
normalerweise 32 Sektoren. Bei 32 Byte pro Dateieintrag sind max. 512
Dateien im Rootdirectory mglich !

Das Rootdirectory von FAT32 ist Bestandteil der FAT. Die Gre ist nicht
festgelegt. Durch reservieren von Clustern in der FAT kann es beliebig
vergrert werden.

Cluster und die Folgen
======================
Jede Datei belegt mindestens einen Cluster. Selbst wenn nur ein Byte
in die Datei geschrieben wird. Wenn die Datei eine Clustergre plus ein
Byte gro ist belegt sie zwei Cluster. Der Rest ist einfach Verschnitt.

Wenn man bestimmen mchte wie viel Speicher eine Datei auf dem CF WIRKLICH
belegt ist es keine gute Idee NUR den Verzeichniseintrag zu lesen. Der gibt
an wie viele Bytes die Datei gro ist. Er sagt nichts darber aus wie viele
Cluster belegt sind.

Beispiel: Die Datei ist ein Byte gro. Eine Datei belegt immer mindestens
einen Cluster. Ein Cluster besteht hier einfach mal aus 32 Sektoren.
Die Datei belegt dann real 32 Sektoren * 512 Bytes => 16 kB 

Wenn 1024 solcher Dateien in einem Verzeichnis liegen zeigt dein Dateimanager
1024 Bytes als Summe belegter Bytes an. Real sind es 16 MB !

Hunderte kleine Dateien im Temp-Verzeichnis knnen dir also auch
die Festplatte zumllen !

Sektor 0: Partitionstabelle oder Bootsektor ?
=============================================
Es gibt zwei Mglichkeiten wie Sektor 0 auf dem CF aussehen
kann. Entweder er enthlt eine Partitionstabelle wenn der CF
partitioniert ist, oder Sektor 0 enthlt bereits den Bootsektor.
Im zweiten Fall ist die Formatierung hnlich einer Floppy Disk.
Man braucht also eine Mglichkeit zu unterscheiden welcher der
beiden Flle fr den CF zutrifft. Das geht z.B. mit einer Abfrage
die MS eigentlich nicht empfiehlt. Sie ist aber sehr zuverlssig.
Siehe unten. Man nimmt erstmal an Sektor 0 enthlt einen Bootsektor.
Dann fragt man den FileSystem String ab. Dort steht FAT12, FAT16 oder
FAT32. Findet man keinen der drei Strings ist die Wahrscheinlichkeit
hoch das es sich nicht um einen Bootsektor sondern um eine
Partitionstabelle handelt. Dann muss man sich den Bootsektoroffset aus
der Partitionstabelle holen, den Bootsektor lesen und die gleiche
Abfrage auf den FAT Typ noch einmal machen.

Findet man nichts ist die CF exotisch formatiert. Oder es ist eine
Extended Partition (zweite Partitionstabelle) auf der CF. Die fragt
mein Programm nicht mehr ab. Damit kann es nichts anfangen.

Das hier ist die empfohlene Abfrage von MS um den FAT Typ zu bestimmen:

   if(CountofClusters < 4085)
    {
     FATtype=FAT12;
    }
   else
    {
     if(CountofClusters < 65525)
       {
        FATtype=FAT16;
       }
     else
       {
        FATtype=FAT32;
       }
    }

Diese Abfrage funktioniert aber nicht mehr wenn man die CF mit sehr groen
Clustern formatiert. Beispiel: 64MB CF, FAT16 und 64 Sektoren pro Cluster.
Nach der Formatierung sind ca. 2000 Cluster vorhanden. Laut der Abfrage
oben wre das FAT12, ist es aber nicht ! Win erkennt solch eine Karte aber
trotz empfohlener Abfrage als FAT16. Warum wohl ?

Wann formatiert Win mit Partitionstabelle und wann nicht ?
==========================================================
Wieder eine gute Frage ;) 

Ich habe unter XP eine 32MB MMC mit FAT (FAT16) und eine 128MB SD
mit FAT32 formatiert. Beide hatten vorher eine Partitionstabelle.
Beide hatten auch DANACH noch eine Partitionstabelle. Dann habe ich
auf beiden Karten ALLE Sektoren gelscht. Die Partitionstabelle war
damit weg. Dann wieder mit XP formatiert. In Sektor 0 stand danach KEINE
Partitionstabelle mehr. In Sektor 0 stand bei beiden Karten ein Bootsektor.

Wie Windows formatiert hngt also auch davon ab wie die Karte z.B. vom
Werk aus formatiert wurde, oder dem Handy, oder der Kamera ...

Wer eine Partitionstabelle auf dem CF braucht kann sie mit fdisk unter
W98 oder diskpart (?) unter XP anlegen. Solange der Kartenleser das
untersttzt jedenfalls. Ich habe einen mit dem man unter W98 nicht einmal
formatieren kann.

Wie gro darf ein Cluster bei FAT sein ?
========================================
Die kleinste Clustergre ist ein Sektor (512Bytes). Die grte
Clustergre ist 128 Sektoren (64kB).

Man kann einen 32MB CF auch mit FAT12 und 64kB Clustern
formatieren. Kommt darauf an welches Windows man verwendet.
XP kann einen 32MB CF mit 512 Byte bis 64 kB Clustern
formatieren.

Bleibt die Frage ob Windows das dann auch lesen kann !!??
Kann es scheinbar. Siehe "Versuche" weiter unten.

Welchen FAT-Typ soll ich benutzen ?
===================================
Bezogen auf mein ATMega-DOS solltest du FAT16 verwenden solange
die Gre des CF das zulsst.

Bei einem 128MB CF z.B. solltest du NICHT FAT32 nehmen. Warum ?
Bei FAT16 sind die Clusternummern nur 16Bit breit, bei FAT32 sind
sie 32Bit breit. Die Verarbeitung dauert bei FAT32 also auf jeden Fall
schon mal lnger und bentigt auch mehr RAM-Speicher weil alle Variablen
32Bit breit sein mssen.

FAT12 hat einen ganz entscheidenden Nachteil. Die Clusternummern sind
12Bit breit. Es kann passieren das ein Teil der Clusternummer im gerade
gelesenen FAT-Sektor liegt, und ein Teil im nchsten FAT-Sektor. Den muss
man dann auch noch lesen. Der Zugriff auf die FAT wird dadurch langsamer.
Bei FAT12 kann die komplette FAT aber wesentlich schneller nach freien
Clustern durchsucht werden weil die Anzahl der mglichen Cluster wesentlich
kleiner ist als bei FAT16 oder FAT32.

Maximale Clusteranzahl fr FAT12, FAT16, FAT32 und die Folgen
=============================================================
FAT12 4085 Cluster
FAT16 65525 Cluster
FAT32 268435445 Cluster

Anhand der maximal mglichen Anzahl Cluster kann man ausrechnen mit welcher
Clustergre eine Partition mindestens formatiert werden mu und wie gro
die Partition maximal werden darf.

Ein Cluster darf maximal 128 Sektoren gro werden. Daraus ergibt sich:

Grte theoretische Partition = Maxcluster * 512 * 128

FAT12	256MB
FAT16	4GB
FAT32	17.6TB

Bei FAT32 sollen die Cluster aber maximal 32kB gro sein.
Eine Partition kann dann maximal 8TB gro werden.

Hier kommt aber die maximale Anzahl Sektoren ins Spiel !
FAT32 benutzt 32Bit Werte fr Sektornummern. 4GB * 512 = 2TB.
Oder habe ich mich da verrechnet ?

Da ist bei FAT32 eigentlich Schlu. Wie gro eine Partition bei
FAT32 aber wirklich werden darf kann ich im Moment nicht sagen.

Beispiel: FAT16
Bei 32MB ist es gerade so mglich nur einen Sektor pro Cluster zu
benutzen. (1024 * 1024 * 32) / 512 = 65535. Bei 64MB mu ein Cluster
also mindestens zwei Sektoren gro sein, bei 128MB mindestens vier
Sektoren, usw.

Partition FAT16		Sektoren pro Cluster Minimum
   8MB			1  Sektor
  16MB			1  Sektor
  32MB			1  Sektor
  64MB			2  Sektoren 
 128MB			4  Sektoren 
 256MB			8  Sektoren 
 512MB			16  Sektoren 
   1GB			32  Sektoren 
   2GB			64  Sektoren 
   4GB			128 Sektoren 

Bei 4GB ist fr FAT16 Schlu. 8GB knnen mit FAT16 nicht formatiert werden
weil ein Cluster maximal 64kB bzw. 128 Sektoren gro werden darf.

Man knnte theoretisch z.B. eine 1.44MB Floppy mit FAT32 formatieren !
Das macht aber keiner ;) Und Win mag FAT32 Laufwerke erst ab 65527 Clustern.

Wie gro ist die FAT ?
======================
Rein theoretisch bei nur einem Sektor pro Cluster:

FAT12 4085 Cluster * 1.5Bytes = 6127.5 Bytes => max 12 Sektoren
FAT16 65525 Cluster * 2Bytes  = 131050 Bytes => max 256 Sektoren 
FAT32 268435445 Cluster * 4Bytes = 1073741780 Bytes => max 2097152 Sektoren

Das sind aber nur die Maximalwerte.

Die FAT sollte bei W98 und FAT32 nicht grer als 16MB werden habe ich bei MS mal
gelesen. Die Clustergre soll nicht grer als 32kB sein. Mal nachrechnen:

16MB / 4 Byte Eintrge * 32kB = 128 GB fr W98

Eine FAT32 Partition darf auf keinen Fall weniger als 65527 Cluster enthalten.
Wie gro muss sie dann mindestens sein fr FAT32 ?

65527 * 512 = 32.7 MB

Rechenbeispiele und die hilfreichen Ergebnisse:
===================================================

FAT12
=====
Der zu lesende/schreibende Sektor in der FAT wird so bestimmt

     fatoffset= (cluster * 3) >>1 ; //multiply by 1.5 (rounds down)

cluster * 3 kann maximal 4085 * 3 = 12255 werden. Das ist unsigned int.
12255 >> 1 wird maximal 6128 gro. Das ist unsigned int. 
Der FAT Sektor Offset ist dann fatoffset/BYTE_PER_SEC.
Maximal 6128/512 = 12. Das ist unsigned char !

To be continued ;)

FAT16
=====
Der zu lesende/schreibende Sektor in der FAT wird so bestimmt

 ReadSector(FATFirstSector + ((unsigned long)cluster * 2) / BYTE_PER_SEC, iob);

Die 2 steht fr 2 Byte Eintrge pro Cluster in der FAT.
cluster mu zu ULONG werden weil 65525 * 2 grer UINT ist.
Wenn man das umstellt kann man reduzieren

 ReadSector(FATFirstSector + ((unsigned int)cluster) / (BYTE_PER_SEC/2), iob);

BYTE_PER_SEC/2 ist 256. Statt zu teilen kann man schieben

 ReadSector(FATFirstSector + ( (unsigned int)cluster >> 8 ), iob);

cluster >> 8 ist das HIGH Byte der Clusternummer

 ReadSector(FATFirstSector + (unsigned char)( (unsigned int)cluster >> 8 ), iob);

Also kein unsigned int zu FATFirstSector addieren, sondern nur ein unsigned char.
Wenn der Compiler gut optimiert schiebt er gar nicht erst sondern addiert gleich
das HIGH Byte der Clusternummer.

FAT32
=====
Der zu lesende/schreibende Sektor in der FAT wird so bestimmt

 ReadSector(FATFirstSector + ((unsigned long)cluster * 4) / BYTE_PER_SEC, iob);

Die 4 steht fr 4 Byte Eintrge pro Cluster in der FAT.

 ReadSector(FATFirstSector + ((unsigned long)cluster) / (BYTE_PER_SEC/4), iob);

BYTE_PER_SEC/4 ist 128. Statt zu teilen kann man schieben

 ReadSector(FATFirstSector + ( (unsigned long)cluster >> 7 ), iob);

cluster >> 7 wird nicht grer als 268435445 / 128 = 2097152

Das ist immer noch unsigned long. Hier ist die Frage: Was ist schneller ?
Teilen oder schieben. Oder auch : Was braucht mehr Programmcode ? 

Welche Clustergre soll ich verwenden ?
========================================
Das kommt auf deinen Anwendungsfall an. Wenn du nur sehr wenige Dateien
auf dem CF lesen/schreiben mchtest nimm die grte Clustergre. Wenn
du viele ganz kleine Dateien lesen/schreiben mchtest nimm die kleinste
Clustergre.

Beispiel: 32MB CF
Unter XP formatiert mit FAT16 und 512 Byte Clustern max. ca. 62000 Dateien mglich.
Unter XP formatiert mit FAT16 und 4kB Clustern max. ca. 7100 Dateien mglich.

Wenn dein Programm schnell sein mu nimm die grte Clustergre. Dann
mu nicht so oft in der FAT gelesen werden. Je grer die Cluster sind
desto weniger mu die FAT beschrieben werden. Das erhht die Lebensdauer
des CF um einiges !

Je kleiner die Cluster sind desto grer wird die FAT. Es dauert lnger
die FAT nach freien Clustern zu durchsuchen. Beim schreiben mssen die
FAT Sektoren auch fter beschrieben werden. Das verringert die Lebensdauer
des CF.

Versuche und Probleme
=====================

Ich habe unter Linux eine 128MB SD mit FAT12 formatiert.
Die Cluster sind dann 32kB gro. Ungefhr 3900 Cluster bzw.
Dateien mglich. Mit dem ATMega-DOS habe ich 512kB geschrieben.
W98 hat die SD ohne Probleme gelesen ! Scandisk meckert nicht.
XP nimmt die Karte (hama 8in 1 Reader) ! Dateien werden gelesen.
Mein Sitecom Reader nimmt die Karte.

Ich habe unter Linux eine 256MB SD mit FAT12 formatiert.
Die Cluster sind dann 64kB gro. Ungefhr 3900 Cluster bzw.
Dateien mglich. Mit dem ATMega-DOS habe ich 512kB geschrieben.
W98 hat die SD ohne Probleme gelesen ! Scandisk meckert nicht.
XP mag die Karte nicht besonders ! Dateien und Verzeichnisse
werden korrekt angezeigt. Dateien lesen dauert extrem lange.
Liegt evtl. am CardReader (hama 8in1) der eigentlich immer
super funktioniert. Mein (Schei W98) Typhoon Reader liest die Karte
ohne groe Verzgerungen. Mit den XP Treibern luft der richtig
gut ! Formatiert die Karte sogar.

Abgefahrene Formate
===================
Wenn man den secPerCluster Eintrag im Bootsektor bis zum Maximum
ausreizt knnte man die maximal Gre der Partition fast verdoppeln.
MS sagt 128 ist die maximale Gre. Wenn man aber bis 255 geht knnte
ein FAT12 bis fast 512MB lesen schreiben. FAT16 bis fast 8GB.
Kann Win das dann aber noch lesen ! 

Die Gre eines physikalischen Sektors betrgt bei heutigen Laufwerken
512 Bytes. Es spricht eigentlich nichts dagegen 1024 Byte Sektoren
zu benutzen. 
