Vous êtes sur la page 1sur 54

Libro Blanco de Hardware

Diseo de Hardware para sistemas operativos Microsoft

FAT: Panorama general de formato en


disco
Versin 1.02, 05 de mayo 1999
Microsoft Corporation
El sistema de archivos FAT (File Allocation Table) tiene sus orgenes en la
dcada de 1970 y early1980s y fue el sistema de archivos compatible con el
sistema operativo Microsoft MS-DOS . Fue Originalmente desarrollado
como un sistema simple de archivos adecuados para disquete conduce menos
de 500 K en tamao. Con el tiempo se ha mejorado para soportar los medios
de comunicacin cada vez ms grandes. En la actualidad hay tres tipos de
sistema de archivos FAT: FAT12, FAT16 y FAT32. La diferencia bsica entre estos
FAT sub tipos, y la razn de los nombres, es el tamao, en bits, de las entradas
de la FAT real estructura en el disco. Hay 12 bits en una entrada de FAT FAT12,
16 bits en una entrada de FAT FAT16 y 32 bits en una entrada de FAT FAT32.

Contenido
Convenciones utilizadas en este
documento................................. .................................... 6
Observaciones generales (aplicables a sistema de archivos FAT Todo
Tipo)............. ........ 6
Boot Sector y BPB

..6
Estructura de los datos del FAT .
12
FAT Tipo

.13
Inicializacin de volmenes FAT.......
.18
FAT32 fsinfo Estructura Sectorial y el sector de inicio de copia de
seguridad................. 20

FAT Estructura de
directorios
.21
Otras notas relativas a los directorios
FAT...................................................................... 24
Especificacin
..25
Microsoft, MS_DOS, Windows y Windows NT son marcas comerciales o marcas
comerciales registradas de Microsoft Corporation en los Estados Unidos
y / u otros pases. Otros nombres de productos y compaas aqu mencionados
pueden ser marcas comerciales de sus respectivos propietarios.
1999 Microsoft Corporation. Todos los derechos reservados.

Renuncia
IMPORTANTE-LEA DETENIDAMENTE: Este acuerdo de Microsoft ("Acuerdo") es un legal acuerdo entre
usted (sea persona fsica o jurdica) y Microsoft Corporation ("Microsoft") para esta versin de la
especificacin de Microsoft identificado anteriormente ("Especificaciones").
AL DESCARGAR, COPIAR O UTILIZAR LAS ESPECIFICACIONES, USTED ACEPTA LOS TRMINOS DE
ESTE ACUERDO. SI NO ESTOY DE ACUERDO CON LOS TRMINOS DE ESTE ACUERDO, NO
DESCARGUE, COPIAR, O UTILIZAR LA ESPECIFICACIN.
La especificacin es propiedad de Microsoft o sus proveedores y est protegido por leyes de propiedad
intelectual internacionales y los tratados de derechos de autor, as como otras leyes de propiedad intelectual
y los tratados.
1. PACTO LIMITED no demandar.
(A) Siempre y cuando cumpla con todos los trminos y condiciones de este Acuerdo y sujeto a las
limitaciones en Secciones 1 (b) - (e) siguiente, Microsoft le concede la siguiente licencia no exclusiva,
mundial, libre de regalas, no transferible, no sublicenciable pacto limitado, recproca no demandar:
(I) Een virtud de los derechos de autor son propiedad o licenciable por Microsoft sin el pago de
atencin a terceros no afiliados, para reproducir el Pliego nicamente con la finalidad de crear partes
de los productos que se ajusten a la especificacin en forma no modificada, y
(Ii) En el marco de sus reclamos necesarios nicamente para fabricar, hacer fabricar, usar, importar
y directa e indirectamente, ofrecer en venta, vender y distribuir de otra manera y disponer de partes
de productos que cumplan la especificacin en forma no modificada.
Para efectos de lo anterior, la especificacin es "sin modificaciones", si no hay cambios, adiciones o
extensiones de la especificacin y "Reclamaciones necesario" significa pretensiones de una solicitud de
patente o patente que son: (1) propiedad o licenseable por Microsoft sin pago de una contraprestacin a un
tercero no afiliado parte, y (2) tienen una fecha de presentacin efectiva antes del 31 de diciembre de 2010,
que debe ser infringido el fin para que una parte (s) de un producto que cumpla con la especificacin.
Reclamaciones necesarios no incluye las reclamaciones relativas a la tecnologa de fabricacin de
semiconductores o circuitos de microprocesador o no reclamaciones requiere que se infrinja en el
cumplimiento del pliego de condiciones (aunque en la misma patente como necesaria Reclamos).
(B) El pacto anterior no demandar no se extender a cualquier parte o funcin de un producto que (i) no es
obligado a cumplir con la especificacin en forma no modificada, o (ii) a la que haba una manera
comercialmente razonable alternativa a infringir una demanda necesaria.

(C) El pacto de no demandar descrito anteriormente deber estar disponible para usted y se dar por
terminado de inmediato si Usted o alguno de sus afiliados (colectivamente "Partes covenantee") "inicia" una
accin por infraccin de patente contra: (X) Microsoft o cualquiera de sus filiales (colectivamente "Concesin
Party"), (y) los clientes o distribuidores de la concesin Partes, u otros destinatarios de un pacto de no
demandar con respecto a la especificacin de la Parte que otorga ("Covenantees"), o (z) los clientes o
distribuidores de Covenantees (todas las partes identificadas en (y) y (z) colectivamente denominados
"Clientes"), que la accin se basa en una aplicacin conforme de la Especificaciones. Como se usa aqu,
"Afiliada" significa cualquier entidad que controla, directa o indirectamente, es controlada por, o
est bajo el control comn de una fiesta, y control: la energa, ya sea directo o indirecto, de dirigir o
hacer que el directo de la gestin o polticas de cualquier entidad ya sea a travs de la propiedad de los
valores de voto, por contrato o de otra manera. "Iniciados" significa que una Parte covenantee es la primera
(como las de la Parte que otorga y el Partido covenantee) para presentar o instituir cualquier reclamacin o
accin legal o administrativa por violacin de patentes contra el Partido concesin o cualquiera de los
clientes. "Iniciados" incluye cualquier situacin en la que una Parte covenantee archivos o inicia una
reclamacin o accin legal o administrativa por violacin de patentes nicamente como una reconvencin o
equivalente en respuesta a una Parte que autoriza la primera presentacin o instituir una infraccin de
patente legal o administrativa reclamacin contra dicha Parte covenantee.
(D) El pacto de no demandar descrito anteriormente no se extiende al uso de cualquier parte de la
especificacin para ningn propsito que no sea (a) para crear partes de un sistema operativo (i) slo cuando
sea necesario para adaptar tales sistema operativo para que pueda interactuar directamente con una
aplicacin de firmware del firmware extensible Iniciativa Especificacin v 1.0 ("Especificacin EFI"), (ii) slo
cuando sea necesario para emular una implementacin de la EFI Especificacin, y (b) para crear el firmware,
aplicaciones, utilidades y / o controladores que se utilizarn y / o autorizados para el slo los siguientes
propsitos:
(i) para instalar, reparar y mantener el hardware, firmware y partes de funcionamiento
Software del sistema que se utiliza en el proceso de arranque,
(ii) para proporcionar a una empresa de servicios de tiempo de ejecucin del sistema operativo que
se especifican en el Pliego de EFI,
(iii) Para diagnosticar y corregir fallas en el hardware, firmware o de funcionamiento
software del sistema; (iv) para la consulta para la identificacin de un sistema informtico (ya sea
por nmeros de serie, etiquetas de activos, el usuario o de otra manera);
(v) para realizar el inventario de un sistema informtico, y
(vi) para fabricar, instalar y configurar cualquier
hardware, firmware o software del sistema operativo.
(e) Microsoft se reserva todos los dems derechos que pueda tener en la memoria y la propiedad intelectual
en el mismo. La posesin de este documento no le otorga ninguna pacto de no demandar con respecto a
cualquier
otras patentes de Microsoft, marcas registradas, derechos de autor u otros derechos de propiedad intelectual,
o cualquier licencia con
respeto a los derechos de propiedad intelectual de Microsoft.
2. LIMITACIONES ADICIONALES Y OBLIGACIONES.
(A) El pacto anterior no demandar slo es aplicable a la versin de la especificacin de que usted es a punto
de descargar. No se aplica a las versiones adicionales de o ampliaciones de la especificacin. (B) Sin perjuicio
de cualquier otro derecho, Microsoft podr terminar el presente Acuerdo, si usted no cumple con el trminos
y condiciones de este Acuerdo. En tal caso, deber destruir todas las copias del Pliego.
3. DERECHOS DE PROPIEDAD INTELECTUAL. Todos propiedad, titularidad y derechos de propiedad
intelectual en y para la
Especificacin son propiedad de Microsoft o sus proveedores.
4.U.S. DERECHOS DEL GOBIERNO. Cualquier especificacin suministrado al Gobierno de EE.UU. en
respuesta a solicitudes
emitido el o despus del 1 de diciembre de 1995 se proporciona con los derechos comerciales y las
restricciones descritas en
en este documento. Cualquier especificacin suministrado al Gobierno de EE.UU. en respuesta a solicitudes
emitidas antes del 1 de diciembre de 1995 se proporciona con DERECHOS LIMITADOS previstos en FAR, 48
CFR 52.227-14 (junio de 1987) o DFAR,
48 CFR 252.227-7013 (OCTUBRE 1988), segn sea el caso. RESTRICCIONES
5.RESTRIXIONES DE EXPORTACION. La exportacin de la especificacin, cualquier parte del mismo, o
cualquier proceso o servicio que sea el producto directo de la Especificacin (lo anterior se hace referencia

colectivamente como el "restringido Componentes ") de los Estados Unidos se rige por el Reglamento de
Administracin de Exportaciones (EAR, 15 CFR 730 a 744) del Departamento de Comercio de EE.UU., la
Oficina de Administracin de Exportaciones ("BXA"). Usted se compromete a cumplir con la EAR en la
exportacin o reexportacin de los Componentes restringidos (i) a cualquier pas al que los EE.UU. haya
embargado o restringido la exportacin de bienes o servicios, que incluyen en la actualidad, pero no son
necesariamente limitado a Cuba, Irn, Irak, Libia, Corea del Norte, Sudn, Siria y la Repblica Federal de
Yugoslavia (Serbia incluyendo, pero no Montenegro), oa cualquier ciudadano de cualquier pas, siempre que
sea , que intente transmitir o transportar los Componentes restringidos de nuevo a ese pas, (ii) a cualquier
persona o entidad que usted sabe o tiene razones para sospechar que utilizar los Componentes restringidos
en el diseo, desarrollo o produccin de armas nucleares, qumicas o biolgicas, o (iii) a cualquier persona o
entidad que se ha prohibido participar en transacciones de exportacin de Estados Unidos por cualquier
agencia federal del Gobierno de los EE.UU.. Usted garantiza y representa que ni la BXA ni ninguna otra
agencia federal de EE.UU. tiene suspendido, revocado o denegado sus privilegios de exportacin. Para
obtener informacin adicional, consulte http://www.microsoft.com/exporting.
6. RENUNCIA DE GARANTAS. En la medida mxima permitida por la ley aplicable, Microsoft y sus
proveedores ofrecen el pliego de condiciones (y toda la propiedad intelectual en el mismo) y (en
su caso) servicios de apoyo relacionados con el pliego de condiciones ("Servicios de Asistencia")
TAL CUAL Y CON TODOS SUS DEFECTOS, y por la presente negamos cualquier garanta o
condicin, ya sea expresa, implcita o estatutaria, incluida, pero no limitado a, cualquier (si los
hay) garantas o condiciones implcitas de comerciabilidad, de aptitud para un propsito en
particular, de la ausencia de virus, de la exactitud o integridad de respuestas, resultados, y de
falta de negligencia o falta de esfuerzo razonable, todo lo que se refiere a la especificacin,
cualquier la propiedad intelectual en el mismo y la prestacin o no de proporcionar servicios de
apoyo. TAMBIN, NO EXISTE GARANTA O CONDICIN DE TTULO, DISFRUTE Y POSESIN
PACFICOS, CORRESPONDENCIA CON LA DESCRIPCIN O NO INFRACCIN, CON RESPECTO A LA
ESPECIFICACIONES Y CUALQUIER PROPIEDAD INTELECTUAL EN EL MISMO. EL RIESGO EN CUANTO
A LA CALIDAD DE O DERIVADOS DEL USO O LA EJECUCIN DEL PLIEGO DE CONDICIONES,
CUALQUIER PROPIEDAD INTELECTUAL EN EL MISMO, Y SERVICIOS DE APOYO, EN SU CASO, se
queda con ustedes.
7. EXCLUSIN DE DAOS INCIDENTALES, CONSECUENCIALES Y OTROS DAOS. AL MEDIDA
MXIMA PERMITIDA POR LAS LEYES APLICABLES, EN NINGN CASO MICROSOFT O SUS
PROVEEDORES SERN RESPONSABLES POR NINGN DAO ESPECIAL, INCIDENTAL, INDIRECTO O
CONSECUENTE DAO (INCLUYENDO, PERO NO LIMITADO A, DAOS POR PRDIDA DE BENEFICIOS
O DE INFORMACIN CONFIDENCIAL O DE OTRO TIPO, INTERRUPCIN DE LA ACTIVIDAD
COMERCIAL, LESIONES PERSONALES, PRDIDA DE PRIVACIDAD, POR INCUMPLIMIENTO DE
OBLIGACIONES, YA SEA DE BUENA FE O CUIDADO RAZONABLE, NEGLIGENCIA Y POR CUALQUIER
OTRA PECUNIARIA O DE ALGUNA OTRA PRDIDA) DERIVADOS O DE ALGUNA MANERA
RELACIONADOS CON EL USO O LA IMPOSIBILIDAD DE USO DEL PLIEGO DE CONDICIONES,
CUALQUIER PROPIEDAD INTELECTUAL ELLOS, LA PROVISIN O FALLA EN LA PROVISIN DE
SERVICIOS DE SOPORTE U OTRO BAJO O EN RELACIN CON CUALQUIER DISPOSICIN DE ESTE
ACUERDO, AUN EN EL CASO DE FALLA, AGRAVIO (INCLUYENDO NEGLIGENCIA), RESPONSABILIDAD
ESTRICTA, INCUMPLIMIENTO DE CONTRATO O VIOLACIN DE LA GARANTA DE MICROSOFT O
CUALQUIER PROVEEDOR INCLUSO SI MICROSOFT O CUALQUIER PROVEEDOR HA SIDO ADVERTIDO
DE LA POSIBILIDAD DE TALES DAOS.
8. LIMITACIN DE RESPONSABILIDAD Y RECURSOS. Sin perjuicio de cualquier dao que pudiera
incurrir por cualquier motivo (incluyendo, sin limitacin, todos los daos mencionados
anteriormente y todos los directos o daos generales), la responsabilidad total de Microsoft y
cualquiera de sus proveedores bajo cualquier disposicin de este Acuerdo y el nico recurso para
todo lo anterior se limitarn a la mayordel importe abonado por usted para la especificacin o
EE.UU. $ 5.00. Las limitaciones anteriores,
exclusiones y limitaciones de responsabilidad se aplicarn en la medida mxima permitida por la
ley aplicable, incluso si
cualquier recurso no cumple su propsito esencial.
9. LEY APLICABLE. Si ha adquirido este Pliego en los Estados Unidos, este acuerdo se rige por la
leyes del Estado de Washington. Si ha adquirido este Pliego en Canad, a menos que
expresamente prohibida por las autoridades locales ley, este acuerdo est gobernado por las
leyes vigentes en la Provincia de Ontario, Canad, y, con respecto a cualquier controversia que
pueda surgir acerca del mismo, se somete a la jurisdiccin de los tribunales federales y

provinciales que se sientan en Toronto, Ontario. Si esta especificacin fue adquirido fuera de los
Estados Unidos, sern de aplicacin las leyes locales.
10.QUESTIONS. Si tiene alguna pregunta relacionada con este Acuerdo, o si desea ponerse en
contacto Microsoft por cualquier razn, por favor pngase en contacto con la subsidiaria de
Microsoft que atiende a su pas o escriba a: Microsoft Sales Information Center / One Microsoft
Way / Redmond, WA 98052-6399.
11.ACUERDO ENTIRE. Este Acuerdo es el acuerdo completo entre usted y Microsoft en relacin
con las Especificaciones y los servicios de soporte (si existe) y se sustituyen todos los anteriores
o contemporneas orales o las comunicaciones, propuestas y representaciones con respecto a la
especificacin o cualquier otro tema cubierto por este Acuerdo. En la medida en los trminos de
las polticas de Microsoft o programas para el conflicto de Servicios de Apoyo con los trminos
de este Acuerdo, los trminos de este Acuerdo controlar. Si vous avez acervo votre produit
Microsoft au CANADA, la garantie limite suivante vous preo: Renonciation Garantas AUX. Dans
toute la mesure permise par la lgislation en vigueur, Microsoft et ses fournisseurs fournissent
la Especificacin (ET A toute Propiedad Intelectual dans celle-ci) et tous (Selon le cas) les
servicios d'asistencia lis la especificacin ("Services d'assistance") Tels Quels ET AVEC TOUS
leurs dfauts, et par les presentes excluent toute garantie ou condicin expresse ou implicite,
lgale ou conventionnelle, crite ou verbal, y compris, mais sans limitacin, toute (selon le cas)
garantie ou ou condiciones implicite lgale de qualit marchande, de conformit un uso
particulier, d'ausencia de virus, d'exactitude et d'intgralit des rponses, de rsultats,
d'esfuerzos tcnicas et professionnels et d'ausencia de negligencia, le tout relativement a la
especificacin, toute proprit dans Intelectual celle-ci et la prestation ou la no prestation
des Services d'asistencia. DE PLUS, IL
N'Y A AUCUNE GARANTIE ET CONDICIN DE TTULO, DE goce PAISIBLE, DE POSESIN PAISIBLE, DE
SIMILARIT LA DESCRIPCIN ET D'AUSENCIA DE contrefaon relativement LA Especificacin
ET A Toute Propiedad Intelectual DANS Celle-CI. VOUS SUPPORTEZ TOUS LES RISQUES
DCOULANT ET DE L'UTILIZACIN DE LA EJECUCIN DE LA Especificacin ET DE TOUTE Propiedad
Intelectual DANS CELLE-CI ET ceux DCOULANT DES D'SERVICIOS DE ASISTENCIA (S'IL YA VEZ).
EXCLUSIN DES dommages INDIRECTOS, ACCESORIOS ET AUTRES. Dans toute la mesure permise
par la lgislation en vigueur, Microsoft et ses fournisseurs ne sont en aucun cas Responsables de
tout dommage especiales, indirectos, Accesorio, moral ou exemplaire quel qu'il soit (y compris,
mais sans limitacin, les dommages entrans par la perte de bnfices ou la perte d'information
confidentielle ou autre, l'interrupcin des affaires, les prejuicios corporels, la perte de
confidentialit, le dfaut de remplir toute obligacin y compris les obligaciones de bonne foi et
de diligencia raisonnable, la ngligence et toute autre perte pcuniaire ou autre perte de
quelque naturaleza Que ce soit) dcoulant de, ou de toute autre manire li , l'utilizacin ou
l'impossibilit d'utiliser la especificacin, toute Propiedad Intelectual dans celle-ci, la prestation
ou la no prestation des Services d'ou asistencia autrement en vertu de relativement ou toute
disposicin de cette convencin, Que ce soit en cas de faute, de dlit (y compris la negligencia),
de responsabilit stricte, de manquement un contrat de manquement ou une Garantie de
Microsoft ou de l'ONU de fournisseurs ses, et ce, meme SI Microsoft ou l'un de ses fournisseurs
un t Avise De La possibilit de tels dommages. LIMITACIN DE responsabilit ET recours.
Malgr tout dommage Que vous pourriez encourir vierta quelque razn Que ce soit (y compris,
mais sans limitacin, tous les dommages mentionns ci-dessus et tous les dommages dirige et
gnraux), la seule responsabilit de Microsoft et de ses fournisseurs en vertu de toute
disposicin de cette convencin et votre nica recours en relacin de tout ce qui sont preceden
Limites au plus lev des montants suivants: soit (a) le montant Que vous avez pay pour la
especificacin, soit (b) sin equivalant montant cinq dlares EE.UU. (5,00 dlares de los EE.UU.).
Les limitaciones, exclusiones et renonciations ci-dessus s'appliquent dans toute la mesure
permise par la lgislation en vigueur, et ce mme si leur aplicacin de un vertido effet de priver
sin recours de son esencia. Droits Limites DU GOUVERNEMENT Americain Tout Produit Logiciel
fourni au gouvernement amricain conformment des demandes mises le ou aprs le 1er
dcembre 1995 est offert avec les restricciones et droits commerciaux dcrits ailleurs dans la
presente convencin. Tout Produit Logiciel fourni au gouvernement amricain conformment
des demandes mises vanguardia le 1er dcembre 1995 est offert avec des droits Limites tels
Que prvus dans le FAR, 48CFR 52.227-14 (juin 1987) dans ou le FAR, 48CFR 252.227-7013
(octobre 1988), qu'applicables tels.

Convenciones utilizadas en este documento


Los nmeros que tienen los caracteres "0x" al principio de ellos son nmeros
hexadecimales (base 16).
Cualquier nmero que no cuentan con los caracteres "0x" al principio son decimal
(base 10) nmeros.
Los fragmentos de cdigo en este documento estn escritas en el lenguaje de
programacin "C". Tipificacin estricta y sintaxis no se cumplen.
Hay varios fragmentos de cdigo en este documento que se mezclan libremente
elementos de datos de 32 bits y 16 bits. Es supone que usted es un programador que
sabe cmo escribir correctamente dichas operaciones de manera que datos no se
pierdan debido al truncamiento de valores de 32 bits a valores de 16 bits. Tambin
tome en cuenta que todos los tipos de datos son UNSIGNED. No hacer clculos FAT con
los tipos enteros con signo, porque los clculos se estar equivocado en algunos
volmenes FAT.
Observaciones generales (aplicables al sistema de archivos FAT Todos los
tipos)
Todos los sistemas de archivos FAT se desarrollaron originalmente para la arquitectura
de la mquina IBM PC. La importancia de esto es que el sistema de archivos FAT en la
estructura de datos del disco es todo "little endian." Si nos fijamos en una Entrada del
FAT de 32 bits almacenada en el disco como una serie de cuatro bytes de 8 bits, siendo
el primero byte [0] y el ltimo siendo byte [4], aqu es donde los 32 bits numerados de
00 a 31 son (00 siendo el menos significativo bit):
byte[3]

3 3 2 2 2 2 2 2
1 0 9 8 7 6 5 4

byte[2]

2 2 2 2 1 1 1 1
3 2 1 0 9 8 7 6

byte[1]

1 1 1 1 1 1 0 0
5 4 3 2 1 0 9 8

byte[0]

0 0 0 0 0 0 0 0
7 6 5 4 3 2 1 0

Esto es importante si su mquina es una mquina "big endian", ya que tendr que
traducir entre grande y pequeo endian al mover datos desde y hacia el disco.
Un volumen del sistema de archivos FAT se compone de cuatro regiones bsicas,
establecidas en la presente orden en el volumen:

0 Reserved Region
1 FAT Region
2 Root Directory Region (no existe en volmenes FAT32)
3 File and Directory Data Region (Archivo y Directorio de regin de datos)

Boot Sector y BPB


La primera estructura de datos importantes en un volumen FAT se llama el BPB (BIOS
Parameter Block), que
se encuentra en el primer sector del volumen en la regin reservada. Este sector se
denomina a veces "Sector de arranque" o el "sector reservado" o el "sector 0 ", pero el
hecho importante es simplemente que es el primer sector del volumen.
Esta es la primera cosa sobre el sistema de archivos FAT que a veces causa confusin.
En la versin de MS-DOS 1.x, no haba un BPB en el sector de arranque. En esta
primera versin del sistema de archivos FAT, haba slo dos formatos diferentes, la una
para un solo lado y el de 360K de doble cara de 5,25 pulgadas disquetes. La
determinacin de qu tipo estaba en el disco se hace buscando en el primer byte de la
FAT (los 8 bits ms bajos de FAT [0]).
Este tipo de determinacin de los medios de comunicacin fue sustituido en MS-DOS
versin 2.x poniendo un BPB en el del sector de arranque, y el viejo estilo de la
determinacin de los medios de comunicacin (hecho por mirar el primer byte de la
FAT) ya no fue apoyada. Todos los volmenes FAT deben tener un BPB en el sector de
arranque. Esto nos lleva al segundo punto de confusin en relacin con la
determinacin del volumen FAT: Qu es exactamente Cmo es un BPB tiene? El BPB
en el sector de inicio definida para MS-DOS 2.x slo permiti una FAT volumen con
estricto menos de 65.536 sectores (32 MB de palabra en sectores de 512 bytes). Esta
limitacin era debido al hecho de que el campo "total de sectores" era slo un campo
de 16 bits. Esta limitacin fue abordado por MS-DOS 3.x, donde se modific el BPB para
incluir un nuevo campo de 32 bits para el valor total de los sectores.
El siguiente cambio de BPB se produjo con el sistema operativo Microsoft Windows 95,
donde el FAT32 tipo fue introducido. FAT16 fue limitado por el tamao mximo de la FAT
y la mxima vlida tamao de clster a no ms de un volumen de 2 GB si el disco tiene
sectores de 512 bytes. FAT32 abord esta limitacin de la cantidad de espacio en disco
que un volumen FAT podra ocupar de manera que los discos de ms de 2 GB slo
tenan que tener una particin definida.
El FAT32 BPB coincide exactamente con el FAT12/FAT16 BPB hasta e incluyendo el
BPB_TotSec32 campo. Difieren de partida en el desplazamiento 36, dependiendo de si
el tipo de medio es FAT12/FAT16 o FAT32 (vase ms adelante para determinar el tipo
de FAT). El punto importante aqu es que el BPB en el sector de arranque de un
volumen FAT siempre debe ser uno que tiene todos los nuevos campos de BPB, ya sea
para la FAT12/FAT16 o FAT32 Tipo de BPB. Hacerlo de esta manera se asegura la
mxima compatibilidad del FAT volumen y se asegura de que todos los controladores
del sistema de archivos FAT puedan entender y apoyar el volumen correctamente,
porque siempre contiene todos los campos definidos en la actualidad. NOTA: En la
siguiente descripcin, todos los campos cuyos nombres comienzan con BPB_ son parte
del BPB. Todos los campos cuyos nombres comienzan con BS_ forman parte del sector
de arranque y no es realmente parte del BPB. A continuacin se muestra el inicio de
sector 0 de un volumen FAT, que contiene el BPB:

Sector de arranque y estructura BPB


Nombre
Offse tama
Descripcin
t
o
(byte (bytes
)
)
BS_jmpBoot
Instrucciones para arrancar el cdigo. Este
0
3

BS_OEMName

campo tiene dos formas permitidas:


jmpBoot [0] = 0xEB, jmpBoot [1] = 0x??,
jmpBoot [2] = 0x90
y
jmpBoot [0] = 0xE9, jmpBoot [1] = 0x??,
jmpBoot [2] = 0x??
0x?
Indica que cualquier valor de 8 bits est
permitido en ese byte. lo que esto formas es
una de tres bytes Intel x86 salto incondicional
(salto) instruccin que salta al inicio del
arranque del sistema operativo cdigo. Este
cdigo normalmente ocupa el resto del sector
0 del volumen siguiendo el BPB y
posiblemente otros sectores. Cualquiera de
estas formas es aceptable. JmpBoot [0] = se
utiliza con ms frecuencia la 0xEB formato.
"MSWIN4.1" Hay muchos conceptos errneos
acerca de este campo. Es slo una cadena de
nombre. Los sistemas operativos de Microsoft
no ponen atencin a este campo. Algunos
conductores FAT lo hacen. Esta es la razn por
la que la cadena indicada, "MSWIN4.1", es la
configuracin recomendada, porque es el
ambiente
menos
probable
que
cause
problemas de compatibilidad. Si quiere poner
algo ms aqu, esa es su opcin, pero el
resultado puede ser que algunos conductores

BPB_BytsPerSec

11

BPB_SecPerClus

13

BPB_RsvdSecCn
t

14

FAT podran no reconocer la volumen.


Normalmente esto es una indicacin de lo que
el formato del sistema el volumen.
Contador de bytes por sector. Este valor
puede asumir slo los siguientes valores: 512,
1024, 2048 o 4096. Si se desea la mxima
compatibilidad, solamente el valor 512 se
debe utilizar. Hay una gran cantidad de cdigo
FAT en el mundo que es, bsicamente,
"asumida" a 512 bytes por sector y no se
molesta en comprobar este campo para
asegurarse de que es 512. Los sistemas
operativos
de
Microsoft
apoyar
adecuadamente 1024,
2048 y 4096, pero estos valores no son
recomendables.
Nmero de sectores por unidad de asignacin.
Este valor debe ser una potencia de 2 y
mayor que 0. Los valores legales son 1, 2, 4,
8, 16, 32, 64, y 128. Tenga en cuenta sin
embargo, que un valor nunca se debe utilizar
que de lugar a un valor "bytes por cluster"
(BPB_BytsPerSec * BPB_SecPerClus) superior a
32 K (32 * 1024). Hay una idea errnea de que
los valores superiores a este estn bien.
Valores que provocar un tamao de clster
superior
a
32K
bytes
no
funcionan
correctamente, hacer no tratar de definir una.
Algunas versiones de algunos sistemas
permiten 64K bytes por valor de clster.
Muchos programas de instalacin de la
aplicacin no se funcionen correctamente en
un volumen tan FAT.
Nmero de sectores reservados en la zona
reservada del volumen comenzando en el
primer sector del volumen. Este campo no
debe ser 0. Para volmenes FAT12 y FAT16,
este valor no debe ser nunca distinta de 1.
Para volmenes FAT32, este valor es
tpicamente 32. Hay una gran cantidad de
cdigo FAT en el mundo "cableada" a 1
sector reservado para FAT12 y FAT16
volmenes y que no
se molestan en comprobar este campo para

BPB_NumFATs

16

BPB_RootEntCnt

17

BPB_TotSec16

19

asegurarse de que es 1. Sistemas operativo


Microsoft apoyarn correctamente cualquier
valor distinto de cero en este campo.
El recuento de las estructuras de datos FAT en
el volumen. Este campo debe siempre
contendr el valor 2 para cualquier volumen
FAT de cualquier tipo.
Aunque cualquier valor mayor que o igual a 1
es perfectamente vlido, muchos programas
de software y archivos FAT algunos sistemas
operativos "controladores del sistema pueden
no funcionar correctamente si el valor es algo
distinto de 2. Todos los controladores del
sistema de archivos de Microsoft apoyar un
valor otro de 2, pero sigue siendo muy
recomendable que otro valor
de 2 usarse en este campo. La razn del valor
estndar de este campo es 2 es para
proporcionar redundancia para la estructura
de datos FAT de modo que si un sector va mal
en uno de las grasas, que los datos no se
pierden, ya que se duplica en la otra FAT. En
medios no basados en disco, como las tarjetas
de memoria flash, donde tales redundancia es
una caracterstica intil, un valor de 1 puede
ser se utiliza para guardar el espacio que una
segunda copia de los usos FAT, pero algunos
controladores de sistema de archivos FAT no
reconozcan tal volumen adecuadamente.
Para volmenes FAT12 y FAT16, este campo
contiene el recuento de 32 - entradas de
directorio bytes en el directorio raz. Para
volmenes FAT32, este campo debe ser 0.
Para FAT12 y FAT16 volmenes, este valor
siempre debe especificar un nmero que
multiplicado por 32 resultados en un mltiplo
par de BPB_BytsPerSec. Para obtener el
mximo compatibilidad, volmenes FAT16
deberan utilizar el valor 512.
Este campo es el de 16 bits recuento total de
sectores en el volumen. Este recuento incluye
el recuento de todos los sectores en las cuatro
regiones del volumen. Este campo puede ser
0, y si es 0, entonces debe haber

BPB_Media

21

BPB_FATSz16

22

BPB_SecPerTrk

24

BPB_NumHeads

26

BPB_HiddSec

28

BPB_TotSec32
distinto
de
cero.
Para
volmenes FAT32, este campo debe ser 0.
Para FAT12 y Volmenes FAT16, este campo
contiene el nmero de sector y BPB_TotSec32
es 0 si el sector recuento total de "ajustes" (es
menor que 0x10000).
0xF8 es el valor estndar para (no extrable)
los medios de comunicacin "fijos". Para
medios extrables, se utiliza con frecuencia
0xF0. Los valores legales para este campo son
0xF0, 0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD,
0xFE y 0xFF. El nico otro punto importante es
que cualquier valor que se pone aqu tambin
se debe poner en el byte bajo del [0] entrada
FAT. Este se remonta a la antigua
determinacin de los medios de comunicacin
1.x de MS-DOS sealaron antes y ya no se
suele utilizar para cualquier cosa.
Este campo es el recuento de 16 bits
FAT12/FAT16 de sectores ocupados por ONE
FAT. En los volmenes FAT32 este campo debe
ser 0, y
BPB_FATSz32 contiene el recuento de tamao
de FAT.
Sectores por pista de 0x13 interrupcin. Este
campo slo es relevante para los medios de
comunicacin que tienen una geometra
(volumen se divide en pistas por mltiples
cabezas y cilindros) y son visibles en 0x13
interrupcin.
Este campo contiene los "sectores por pista"
valor geomtrico.
Nmero de cabezas de 0x13 interrupcin. Este
campo es relevante como se discuti
anteriormente para BPB_SecPerTrk. Este
campo contiene el uno base "recuento de
cabezas". Por ejemplo, en un 1,44 MB de 3,5
pulgadas conducir este valor es 2.
Cuenta de los sectores ocultos anteriores a la
particin que contiene este Volumen FAT. Este
campo es por lo general slo es relevante
para los medios de comunicacin visible en
0x13 interrupcin. Este campo debe ser
siempre cero en los medios de comunicacin

BPB_TotSec32

32

que no particionado. Exactamente lo que el


valor es apropiada est operando sistema
especfico.
Este campo es el nuevo recuento total de 32
bits de sectores en el volumen. Este recuento
incluye el recuento de todos los sectores en
las cuatro regiones del volumen. Este campo
puede ser 0, y si es 0, entonces debe haber
BPB_TotSec16distinto de cero. Para volmenes
FAT32, este campo debe ser distinto de cero.
Para Volmenes FAT12/FAT16, este campo
contiene
el
recuento
de
sector
si
BPB_TotSec16 es 0 (de contaje es mayor que o
igual a 0x10000).

En este punto, el sector BPB / arranque de FAT12 y FAT16 difiere del


sector de BPB / arranque para FAT32.
La primera tabla muestra la estructura de archivos FAT12 y FAT16
empezando en el desplazamiento 36 del sector de arranque.
FAT12 y FAT16 Estructura empezando en el desplazamiento 36
Nombre
Offse tama
Descripcin
t
o
(byte (bytes
)
)
BS_DrvNum
1
Nmero de unidad 0x13 Int (por ejemplo,
36

BS_Reserved1

37

BS_BootSig

38

BS_VolID

39

0x80). Este campo es compatible con MS-DOS


arranque y se espera que el nmero de
unidad 0x13 INT de los medios de
comunicacin (0x00 a 0x80 disquetes, los
discos duros).
NOTA: Este campo es en realidad operan
sistema especfico.
Reservado (utilizado por Windows NT). Cdigo
que da formato a los volmenes FAT siempre
debe establecer este byte a 0.
La firma de arranque Extended (0x29). Este es
un byte de firma que indica que los siguientes
tres campos en el sector de arranque son
presentados.
Nmero de serie de volumen. Este campo,
junto con BS_VolLab, apoya el seguimiento de
volumen en un medio extrable. Estos valores

BS_VolLab

43

11

BS_FilSysType

54

permiten FAT controladores del sistema de


archivos para detectar que el disco
equivocado se inserta en una unidad
extrable. Este ID se genera por lo general
simplemente combinando la fecha y la hora
actuales en un valor de 32 bits.
Etiqueta de volumen. Este campo coincide con
la etiqueta de volumen de 11 bytes registrada
en el directorio raz.
NOTA: los controladores del sistema de
archivos FAT deben asegurarse de que se
ponen al da este campo cuando el archivo de
etiqueta de volumen en el directorio raz tiene
su
Nombre
cambiado
o
creado.
La
configuracin para este campo cuando no hay
etiqueta de volumen es la cadena "NO NAME".
Una de las cadenas "FAT12", "FAT16" o "FAT".
NOTA: Muchas personas piensan que la
cadena en este campo tiene algo que ver con
la determinacin de qu tipo de FAT- FAT12,
FAT16 o FAT32, que el volumen tiene. Esto no
es cierto. Usted notar a partir de su nombre
que este campo no es en realidad parte de la
BPB. Esta cadena es informativa solamente y
no es utilizado por Microsoft controladores del
sistema de archivos para determinar tipo de
FAT, porque es frecuente que no est bien
ajustada o no est presente. Ver el tipo de
determinacin de la FAT la seccin de este
documento. Esta cadena debe establecerse
sobre la base de la Tipo FAT, sin embargo,
debido a que algunos sistemas de archivos
FAT no es de Microsoft conductores miran.

Esta es la estructura de FAT32 empezando en el desplazamiento 36 del


sector de arranque.
Estructura FAT32 empezando en el desplazamiento 36
Nombre

Offse
t
(byte
)

tama
o
(byte
s)

Descripcin

BPB_FATSz32

36

BPB_ExtFlags

40

BPB_FSVer

42

BPB_RootClus

44

Este campo slo est definido para los medios


de comunicacin FAT32 y no existe en FAT12 y
FAT16 medios. Este campo es el nmero de 32
bits de FAT32 sectores ocupados por UNA FAT.
BPB_FATSz16 debe ser 0.
Este campo slo est definido para los medios
de comunicacin FAT32 y no existe en FAT12 y
FAT16 medios.
Bits 0-3 - nmero de FAT activa de base cero.
Slo es vlido si la duplicacin se desactiva.
Bits 4-6 - Reservados.
Bit 7-0 significa que el FAT se refleja en tiempo
de ejecucin en todas las FATs.
- 1 significa que slo uno FAT est activo, es el
que hace referencia en los bits 0-3.
Bits 8-15 - Reservados.
Este campo slo est definido para los medios
de comunicacin FAT32 y no existe en FAT12 y
FAT16 medios. Byte alto es mayor el nmero de
revisin. Byte bajo es el nmero de revisin
menor. Este es el nmero de versin de
el volumen FAT32. Esto apoya la capacidad de
extender la FAT32 tipo de papel en el futuro sin
tener
que
preocuparse
acerca
de
los
controladores FAT32 antiguas el volumen de
montaje. Este documento define la versin de
0:0. Si este campo es distinto de cero, las
versiones de niveles anteriores de Windows no
se montan el volumen.
NOTA: Las utilidades de disco deben respetar
este campo y no operar volmenes con un
nmero de versin mayor o menor mayor que la
de que fueron diseados. Controladores del
sistema de archivos FAT32 deben registrarse
este campo y no se montan el volumen si no
contiene una versin nmero que se defini en
el momento que el conductor fue escrita.
Este campo slo est definido para los medios
de comunicacin FAT32 y no existe en FAT12 y
FAT16 medios. Esto se establece en el nmero
de clster de la primero clster del directorio
raz, por lo general 2, pero no requiere que sea
2. NOTA: Las utilidades de disco que cambian la
ubicacin del directorio raz debe hacer todo lo

BPB_FSInfo

48

BPB_BkBootSe
c

50

BPB_Reserved

52

12

BS_DrvNum

64

BS_Reserved1

65

BS_BootSig

66

posible para colocar el primer grupo de la raz


directorio en el primer no-clster no vlido en la
unidad (es decir, en el grupo 2, a menos que
est marcada malo). Esto se especifica de
manera que los servicios de reparacin de disco
puede fcilmente encontrar el directorio raz si
este campo penetra accidentalmente puesto a
cero.
Este campo slo est definido para los medios
de comunicacin FAT32 y no existe en FAT12 y
FAT16 medios. Nmero de sector de la
estructura FSINFO en el rea del volumen FAT32
reservados. Por lo general, 1.
NOTA: Habr una copia de la estructura FSINFO
en BackupBoot, pero slo la copia a la que
apunta se mantendr este campo hasta la fecha
(es decir, tanto en el registro de arranque
principal y de respaldo se apuntan a la misma
Sector de FSINFO).
Este campo slo est definido para los medios
de comunicacin FAT32 y no existe en FAT12 y
FAT16 medios. Si no es cero, indica el nmero de
sector en la zona reservada del volumen de una
copia del registro de arranque. Por lo general 6.
No se recomienda el valor distinto de 6.
Este campo slo est definido para los medios
de comunicacin FAT32 y no existe en FAT12 y
FAT16 medios. Reservado para una futura
expansin. Cdigo que da formato a volmenes
FAT32 siempre deben establecer todos los bytes
de este campo a 0.
Este campo tiene la misma definicin que se
hace para FAT12 y FAT16 los medios de
comunicacin. La nica diferencia para FAT32
medios de comunicacin es que el campo se
encuentra en un diferente desplazamiento en el
sector de arranque.
Este campo tiene la misma definicin que se
hace para FAT12 y FAT16 los medios de
comunicacin. La nica diferencia para FAT32
medios de comunicacin es que el campo se
encuentra en un diferente desplazamiento en el
sector de arranque.
Este campo tiene la misma definicin que se

BS_VolID

67

BS_VolLab

71

11

BS_FilSysType

82

hace para FAT12 y FAT16 los medios de


comunicacin. La nica diferencia para FAT32
medios de comunicacin es que el campo se
encuentra en un diferente desplazamiento en el
sector de arranque.
Este campo tiene la misma definicin que se
hace para FAT12 y FAT16 los medios de
comunicacin. La nica diferencia para FAT32
medios de comunicacin es que el campo se
encuentra en un diferente desplazamiento en el
sector de arranque.
Este campo tiene la misma definicin que se
hace para FAT12 y FAT16 los medios de
comunicacin. La nica diferencia para FAT32
medios de comunicacin es que el campo se
encuentra en un diferente desplazamiento en el
sector de arranque.
Ponga siempre a la cadena "FAT32". Por favor,
vea la nota de esta campo en la seccin
FAT12/FAT16 anterior. Este campo no tiene nada
que ver con la determinacin del tipo FAT.

Hay otra nota importante sobre Sector 0 de un volumen FAT. Si tenemos


en cuenta el contenido de la sector como una matriz de bytes, debe ser
cierto que el sector [510] es igual a 0x55 y sector [511] es igual 0xAA.
NOTA: Muchos documentos FAT errneamente dicen que este 0xAA55
firma ocupa los "ltimos 2 bytes del sector de arranque ". Esta
afirmacin es correcta si - y slo si - BPB_BytsPerSec es 512. Si
BPB_BytsPerSec es mayor que 512, los desplazamientos de estos bytes
de firma no cambian (aunque es perfectamente bien para los dos
ltimos bytes al final del sector de arranque que contiene tambin la
firma). Revise sus suposiciones sobre el valor en el campo
BPB_TotSec16/32. Supongamos que tenemos un disco o particin de
tamao en sectores DskSz. Si el campo TotSec BPB (ya sea
BPB_TotSec16 o BPB_TotSec32 - Lo que es distinto de cero) es menor que
o igual a DskSz, no hay nada en absoluto mal con el Volumen FAT. De
hecho, no es nada raro tener un valor BPB_TotSec16/32 que es
ligeramente ms pequeo
que DskSz. Tambin es perfectamente
aceptable para el valor BPB_TotSec16/32 ser considerablemente menor
que DskSz. Todo esto significa que se est desperdiciando espacio en
disco. Esto no significa por s mismo que el volumen FAT es daado de

alguna manera. Sin embargo, si BPB_TotSec16/32 es ms grande que


DskSz, el volumen es serio daado o con formato incorrecto porque se
extiende ms all del extremo de los medios de comunicacin o datos
de superposiciones que sigue en el disco. El tratamiento de un volumen
en el que el valor BPB_TotSec16/32 es "demasiado grande" para los
medios de comunicacin o particin como vlido puede provocar la
prdida de datos catastrfica.

ESTRUCTURA DE LOS DATOS DEL FAT


La siguiente estructura de datos que es importante es la propia FAT. Lo
que esta estructura de datos hace es definir un lista simplemente
enlazada de las "extensiones" (clusters) de un archivo. Tenga en cuenta
en este punto que un directorio o archivo FAT
contenedor no es ms que un archivo normal que tiene un atributo
especial que indica que es un directorio. El nico
Otra cosa especial acerca de un directorio es que los datos o contenidos
del "archivo" es una serie de 32 bytes = FAT entradas de directorio
(vase ms adelante). Por lo dems, un directorio es como un archivo. El
FAT mapas de la regin de datos del volumen por su nmero de clster.
El grupo primero de datos es el grupo 2.
El primer sector de clster 2 (la regin de datos del disco) se calcula
utilizando los campos para el BPBvolumen de la siguiente manera. En
primer lugar, se determina el nmero de sectores ocupados por el
directorio root:
RootDirSectors = ((BPB_RootEntCnt * 32) + (BPB_BytsPerSec 1)) / BPB_BytsPerSec;

Tenga en cuenta que en un volumen FAT32 BPB_RootEntCnt el valor es


siempre 0, por lo que en un volumen FAT32 RootDirSectors es siempre 0.
El 32 en el anterior es el tamao de una entrada de directorio FAT en
bytes. Tenga en cuenta tambin que este clculo se redondea.
El inicio de la regin de datos, el primer sector del grupo 2, se calcula
como sigue:
If(BPB_FATSz16 != 0)
FATSz = BPB_FATSz16;
Else
FATSz = BPB_FATSz32;
FirstDataSector = BPB_ResvdSecCnt + (BPB_NumFATs * FATSz) + RootDirSectors;

NOTA: Este nmero de sector es relativa al primer sector del volumen


que contiene el BPB (la sector que contiene el nmero de BPB es el
sector 0). Esto no significa necesariamente asigna directamente a la

unidad, ya que el sector 0 del volumen no es necesariamente sector 0


de la unidad debido a la particin.
Dado cualquier nmero N de datos de clster vlido, el nmero de sector
del primer sector de ese clster (de nuevo en relacin con el sector 0 del
volumen FAT) se calcula de la siguiente manera:
FirstSectorofCluster = ((N 2) * BPB_SecPerClus) + FirstDataSector;

NOTA: Debido a BPB_SecPerClus se limita a potencias de 2 (1,2,4,8,16,32


....), esto significa que la divisin y la multiplicacin por BPB_SecPerClus
realidad se pueden realizar a travs de operaciones de cambio de 2s
complementan las arquitecturas que suelen ser ms rpidas que las
instrucciones las instrucciones MULT y DIV. En actuales procesadores
X86 de Intel, esto es en gran medida irrelevante, porque aunque el MULT
y la mquina DIV
las instrucciones estn fuertemente optimizados para la multiplicacin y
divisin por potencias de 2.

FAT Tipo Determinacin


Existe una gran confusin sobre exactamente cmo funciona esto, lo
que lleva a muchos "off por 1", "fuera de 2 "," off por 10 ", y los" errores
de forma masiva fuera ". Es realmente muy simple cmo funciona esto.
El tipo FAT una de FAT12, FAT16 o FAT32, se determina por el nmero de
grupos en el volumen y nada otra cosa.
Por favor, lea todo en esta seccin cuidadosamente, todas las palabras
son importantes. Por ejemplo, tenga en cuenta que la declaracin era "la
cuenta de las agrupaciones." Esto no es lo mismo que "el nmero
mximo de clster vlida" porque el clster de datos primero es 2 y no
es 0 o 1. Para empezar, vamos a discutir exactamente cmo se
determina el "recuento de los clusters" de valor. Todo esto se hace
usando los campos de BPB para el volumen. En primer lugar, se
determina el nmero de sectores que ocupa el directorio raz como se
seal anteriormente ..
RootDirSectors = ((BPB_RootEntCnt * 32) + (BPB_BytsPerSec 1)) / BPB_BytsPerSec;

Tenga en cuenta que en un volumen FAT32, el valor BPB_RootEntCnt es


siempre 0, de modo que en un volumen FAT32, RootDirSectors es
siempre 0.

A continuacin, se determina el nmero de sectores en la regin de


datos del volumen:
If(BPB_FATSz16 != 0)
FATSz = BPB_FATSz16;
Else
FATSz = BPB_FATSz32;
If(BPB_TotSec16 != 0)
TotSec = BPB_TotSec16;
Else
TotSec = BPB_TotSec32;
DataSec = TotSec (BPB_ResvdSecCnt + (BPB_NumFATs * FATSz) + RootDirSectors);

Ahora determinamos el recuento de los clusters:


CountofClusters = DataSec / BPB_SecPerClus;

Tenga en cuenta que este clculo rondas abajo.


Ahora podemos determinar el tipo FAT. Por favor, tenga cuidado, o se
cometa un error off-by-one!
En el siguiente ejemplo, cuando se dice <, esto no significa <=. Tenga
en cuenta tambin que las cifras son correctas.
El primer nmero de FAT12 es 4085, y el segundo nmero para FAT16 es
65.525. Estos nmeros y los Signos "<" no se equivocan.
If(CountofClusters < 4085) {
/* Volume is FAT12 */
} else if(CountofClusters < 65525) {
/* Volume is FAT16 */
} else {
/* Volume is FAT32 */
}

Esta es la manera en que uno y slo se determina que tipo de FAT. No


hay tal cosa como un volumen FAT12 que cuenta con ms de 4.084
grupos. No hay tal cosa como un volumen FAT16 que tiene menos de
4.085 agrupaciones o ms de 65.524 grupos. No hay tal cosa como un
volumen FAT32 que tiene menos de 65.525 grupos. Si usted trata de
hacer un volumen FAT que viole esta regla, los sistemas operativos de
Microsoft no manejarlos correctamente porque van a pensar que el
volumen tiene un tipo diferente de la FAT que lo que usted cree.
NOTA: Como se observa en numerosas ocasiones antes, el mundo est
lleno de cdigo de FAT que est mal. Hay una gran cantidad de cdigo
de tipo de FAT que es apagado por 1 o 2 o 8 o 10 o 16. Por esta razn, se
recomienda que si est formateando un volumen FAT que tiene la
mxima compatibilidad con todos los cdigos existentes FAT, entonces
usted debe evitar hacer volmenes de cualquier tipo que tiene cerca de
4.085 o 65.525 grupos.
Mantngase por lo menos 16 grupos en cada lado lejos de estos
recuentos racimo de corte ms.

Tenga en cuenta tambin que el valor CountofClusters es exactamente


eso, el recuento de grupos de datos a partir de clster 2. El nmero
mximo de clster vlido para el volumen es CountofClusters + 1, y el
"recuento de grupos, incluyendo los dos grupos reservadas "es
CountofClusters + 2. Hay un clculo ms importante relacionada con la
FAT. Dado cualquier nmero de clster N vlido, donde en el FAT (s) es la
entrada para ese nmero de clster? El nico tipo FAT para las que esto
es complejo es FAT12. Para FAT16 y FAT32, el clculo es simple:
If(BPB_FATSz16 != 0)
FATSz = BPB_FATSz16;
Else
FATSz = BPB_FATSz32;
If(FATType == FAT16)
FATOffset = N * 2;
Else if (FATType == FAT32)
FATOffset = N * 4;
ThisFATSecNum = BPB_ResvdSecCnt + (FATOffset / BPB_BytsPerSec);
ThisFATEntOffset = REM(FATOffset / BPB_BytsPerSec);

FATOffset por
BPB_BytsPerSec. ThisFATSecNum es el nmero de sector del sector de la FAT que
contiene la entrada de
clster de N en el primero FAT. Si desea que el nmero de sector en la segunda FAT, se
agrega a FATSz
ThisFATSecNum; para la tercera FAT, aadir 2 * FATSz, y as sucesivamente.
Ahora lee el nmero del sector ThisFATSecNum (recuerda que esto es un nmero de
sector en relacin con el sector 0 del volumen FAT). Asumir esta se lee en una matriz
de bytes de 8 bits llamado SecBuff. Suponga tambin que el tipo WORD es un sin signo
de 16 bits y que el tipo DWORD es una sin signo de 32 bits.

If(FATType == FAT16)
FAT16ClusEntryVal = *((WORD *) &SecBuff[ThisFATEntOffset]);
Else
FAT32ClusEntryVal = (*((DWORD *) &SecBuff[ThisFATEntOffset])) & 0x0FFFFFFF;

Obtiene el contenido de esa agrupacin. Para definir el contenido de este mismo grupo
que haga lo siguiente:
If(FATType == FAT16)
*((WORD *) &SecBuff[ThisFATEntOffset]) = FAT16ClusEntryVal;
Else {
FAT32ClusEntryVal = FAT32ClusEntryVal & 0x0FFFFFFF;
*((DWORD *) &SecBuff[ThisFATEntOffset]) =
(*((DWORD *) &SecBuff[ThisFATEntOffset])) & 0xF0000000;
*((DWORD *) &SecBuff[ThisFATEntOffset]) =
(*((DWORD *) &SecBuff[ThisFATEntOffset])) | FAT32ClusEntryVal;

Tenga en cuenta cmo funciona el cdigo FAT32 anteriormente. Una entrada de FAT
FAT32 es en realidad slo una entrada de 28-bit. El alto 4 bits de una entrada FAT FAT32
son reservados. La nica vez que los altos 4 bits de entradas FAT FAT32 nunca se debe
cambiar es cuando se formatea el volumen, momento en el que toda la entrada FAT de
32 bits debe ser puesto a cero, incluyendo los altos 4 bits. Un poco ms de explicacin
est en orden aqu, porque este punto sobre las entradas FAT FAT32 parece causar un
gran confusin. Bsicamente entradas FAT de 32 bits no son realmente valores de 32
bits, sino que son slo de 28 bits valores. Por ejemplo, todos estos valores de 32 bits de
racimo de entrada: 0x10000000, 0xF0000000 y 0x00000000 todo indica que el grupo
es libre, porque no tiene en cuenta los altos 4 bits cuando se lee el valor de la entrada
cluster. Si el valor de agrupacin libre de 32-bit es actualmente 0x30000000 y desea
marcar este grupo tan malo almacenando el 0x0FFFFFF7 valor en l. A continuacin, la
entrada de 32 bits contendr el valor 0x3FFFFFF7 cuando haya terminado, ya que debe
mantener los altos 4 bits cuando se escribe en el 0x0FFFFFF7 marca de clster no
vlido. Tome en cuenta que debido a que el valor BPB_BytsPerSec siempre es divisible
entre 2 y 4, que nunca tenga que preocuparse por una entrada FAT16 o FAT FAT32 que
abarca ms de un lmite del sector (esto no es el caso de FAT12).
El cdigo para FAT12 es ms complicado porque hay 1,5 bytes (12 bits) por entrada
FAT.
if (FATType == FAT12)
FATOffset = N + (N / 2);
/* Multiply by 1.5 without using floating point, the divide by 2 rounds DOWN */
ThisFATSecNum = BPB_ResvdSecCnt + (FATOffset / BPB_BytsPerSec);
ThisFATEntOffset = REM(FATOffset / BPB_BytsPerSec);

Ahora tenemos que comprobar si el caso lmite del sector:


If(ThisFATEntOffset == (BPB_BytsPerSec 1)) {
/* This cluster access spans a sector boundary in the FAT */
/* There are a number of strategies to handling this. The */
/* easiest is to always load FAT sectors into memory */
/* in pairs if the volume is FAT12 (if you want to load */
/* FAT sector N, you also load FAT sector N+1 immediately */
/* following it in memory unless sector N is the last FAT */
/* sector). It is assumed that this is the strategy used here */
/* which makes this if test for a sector boundary span */
/* unnecessary. */
}

Ahora tenemos acceso a la entrada FAT como una palabra tal como lo hacemos para
FAT16, pero si el nmero de clster es INCLUSO, slo queremos los bajos de 12 bits de
los 16 bits que haremos ser recuperar, y si el nmero de clster es impar, se slo
quieren que los altos 12 bits de los 16 bits que buscarlo.
FAT12ClusEntryVal = *((WORD *) &SecBuff[ThisFATEntOffset]);
If(N & 0x0001)
FAT12ClusEntryVal = FAT12ClusEntryVal >> 4; /* Cluster number is ODD */
Else
FAT12ClusEntryVal = FAT12ClusEntryVal & 0x0FFF; /* Cluster number is EVEN */

Obtiene el contenido de esa agrupacin. Para definir el contenido de este mismo grupo
que haga lo siguiente:
If(N & 0x0001) {
FAT12ClusEntryVal = FAT12ClusEntryVal << 4; /* Cluster number is ODD */
*((WORD *) &SecBuff[ThisFATEntOffset]) =
(*((WORD *) &SecBuff[ThisFATEntOffset])) & 0x000F;

} Else {
FAT12ClusEntryVal = FAT12ClusEntryVal & 0x0FFF; /* Cluster number is EVEN */
*((WORD *) &SecBuff[ThisFATEntOffset]) =
(*((WORD *) &SecBuff[ThisFATEntOffset])) & 0xF000;
}
*((WORD *) &SecBuff[ThisFATEntOffset]) =
(*((WORD *) &SecBuff[ThisFATEntOffset])) | FAT12ClusEntryVal;

NOTA: Se supone que el operador >> desplaza un valor de bit de 0 en los 4 bits altos y
que la << operador cambia un valor de bit de 0 a los 4 bits bajos. La forma en que los
datos de un archivo se asocia con el archivo es el siguiente. En la entrada del
directorio, el grupo se registra el nmero de la primera clster del archivo. El primer
grupo (extensin) del archivo es el de datos asociados con este primer nmero de
clster, y la ubicacin de los datos en el volumen se calcula a partir el nmero de
clster como se describe anteriormente (clculo de FirstSectorofCluster). Tenga en
cuenta que un archivo de un archivo de longitud cero que no tiene datos asignados a
ella-tiene un primer nmero de clster de 0 colocado en la entrada del directorio. La
ubicacin de esta agrupacin en el FAT (ver clculo anterior de ThisFATSecNum y
ThisFATEntOffset) contiene ya sea una marca de EOC (End Of Clusterchain) o la nmero
de clster de la siguiente clster del archivo. El valor EOC depende de tipo FAT
(suponiendo FATContent es el contenido de la entrada de clster en el FAT se
comprueba para ver si se trata de un COE marca):
IsEOF = FALSE;
If(FATType == FAT12) {
If(FATContent >= 0x0FF8)
IsEOF = TRUE;
} else if(FATType == FAT16) {
If(FATContent >= 0xFFF8)
IsEOF = TRUE;
} else if (FATType == FAT32) {
If(FATContent >= 0x0FFFFFF8)
IsEOF = TRUE;
}

Tenga en cuenta que el nmero de clster cuyo cmulo de entrada en la FAT contiene
la marca de EOC se asigna al archivo y es tambin el ltimo grupo asignado al archivo.
Conductores FAT sistema operativo de Microsoft utilizan la EOC valor 0x0FFF para
FAT12, 0xFFFF para FAT16, FAT32 y 0x0FFFFFFF para cuando se pusieron en el
contenido de un clster para la marca EOC. Existen varias utilidades de disco para los
sistemas operativos de Microsoft que utilice un valor diferente, sin embargo. Tambin
hay una marca especial "de clster no vlido". Cualquier grupo que contiene el "clster
no vlido" valor en su entrada FAT es un grupo que no debe ser colocado en la lista
libre, ya que es propenso a disco errores. El valor "de clster no vlido" es 0x0FF7 para
FAT12, FAT16 para 0xFFF7 y 0x0FFFFFF7 para FAT32. La otra nota relevante es que
estos sectores defectuosos tambin se pierden grupos-grupos que parecen ser
asignado ya que contienen un valor no-cero, pero que no son parte de los archivos
cadena de asignacin. Utilidades de reparacin de disco deben reconocer clsteres
perdidos que contienen este valor especial es tan malo clusters y no cambia el
contenido de la entrada de clster. NOTA: No es posible que la marca de clster no
vlido para ser un nmero de clster asignable en FAT12 y Volmenes FAT16, pero es
factible para 0x0FFFFFF7 ser un nmero de clster asignable en FAT32 volmenes. Para
evitar posibles confusiones por utilidades de disco, sin volumen FAT32 debe
configurarse cada vez de tal manera que 0x0FFFFFF7 es un nmero de clster

asignable. La lista de grupos libres en la FAT no es ms que la lista de todos los grupos
que contienen el valor 0 en su entrada de clster FAT. Tenga en cuenta que este valor
debe ser recuperado como se ha descrito anteriormente como para cualquier otro
Entrada FAT que no es libre. Esta lista de grupos libres no se almacena en ninguna
parte en el volumen, sino que debe ser calculado cuando el volumen est montado
mediante el escaneo de la FAT para las entradas que contienen el valor 0. En
Volmenes FAT32, el sector BPB_FSInfo pueden contener un recuento vlido de
clsteres libres en el volumen. Ver la documentacin del sector fsinfo FAT32. Cules
son los dos grupos reservadas al comienzo de la FAT para? El primer grupo reservado,
FAT [0], contiene el valor del byte BPB_Media en sus 8 bits ms bajos, y todos los
dems bits se ponen a 1. Por ejemplo, si el BPB_Media valor es 0xF8, para FAT12 FAT
[0] = 0x0FF8, para FAT16 FAT [0] = 0xFFF8, y para FAT32 FAT [0] = 0x0FFFFFF8. El
segundo grupo reservado, FAT [1], se establece segn el formato de la EOC marcar. En
FAT12 volmenes, que no se utiliza y est simplemente siempre contiene una marca de
EOC. Para FAT16 y FAT32, el controlador de sistema de archivos puede utilizar las dos
grandes partes de la FAT [1] la entrada de las banderas de volumen sucios (todo otras
partes, siempre se dejan establece en 1). Tenga en cuenta que la ubicacin es algo
diferente para FAT16 y FAT32, porque son los altos 2 bits de la entrada.

For FAT16:
ClnShutBitMask = 0x8000;
HrdErrBitMask = 0x4000;

For FAT32:
ClnShutBitMask = 0x08000000;
HrdErrBitMask = 0x04000000;

ClnShutBitMask Bit - Si el bit es 1, el volumen es "limpio". Si el bit es 0, el volumen es


"sucio". Esto indica que el controlador de sistema de archivos no hizo Desmontar el
volumen correctamente la ltima vez que haba subido el volumen. Lo sera una buena
idea para ejecutar una utilidad de reparacin de disco Chkdsk / Scandisk en l, ya que
podra daarse. HrdErrBitMask Bit - Si este bit es 1, no de lectura / escritura se
encuentran errores. Si este bit es 0, el controlador de sistema de archivos encontr un
error de disco I / O en la Volumen de la ltima vez que se monta, que es un indicador
de que algunos sectores que pudo haber salido mal en el volumen. Sera una buena
idea para ejecutar una Utilidad de reparacin de disco Chkdsk / Scandisk que hace
anlisis de superficie en que se vea para los nuevos sectores defectuosos.
Aqu hay dos notas ms importantes de la regin FAT de un volumen FAT:
1. El ltimo sector de la FAT no es necesariamente parte de la FAT. Las paradas de FAT a
la agrupacin nmero en el ltimo sector FAT que corresponde a la entrada de nmero
de clster CountofClusters + 1 (vase el clculo CountofClusters antes), y esta entrada
no es necesariamente al final del ltimo sector de la FAT. Cdigo FAT no debe hacer
ninguna suposicin acerca de lo que el contenido del ltimo sector FAT son despus de
las CountofClusters + 1 entrada. FAT cdigo de formato debera cero los bytes despus
de esta entrada embargo.
2. El (BPB_FATSz32 de volmenes FAT32) Valor BPB_FATSz16 puede ser ms grande de
lo necesario ser. En otras palabras, puede haber sectores FAT totalmente no utilizados
al final de cada FAT en el Zona FAT del volumen. Por esta razn, el ltimo sector de la
FAT se calcula siempre utilizando los CountofClusters + 1 valores, nunca del valor
BPB_FATSz16/32. cdigo FAT no deben hacer suposiciones acerca de lo que el contenido

de estos "extras" son sectores FAT. Cdigo de formato FAT debera cero el contenido de
estos sectores extra FAT embargo.

INICIALIZACIN DE VOLMENES FAT


En este punto, el lector atento debe tener una pregunta muy interesante. Teniendo en
cuenta que el tipo de FAT (FAT12, FAT16 o FAT32) depende del nmero de grupos-y que
los sectores disponible en el rea de datos de un volumen FAT es dependiente del
tamao de la FAT-cuando entregado un sin formato volumen que an no cuenta con un
BPB, cmo se determina esto y calcular los valores propios puesto en BPB_SecPerClus
y, o bien BPB_FATSz16 o BPB_FATSz32? La forma en que Microsoft operativo sistemas
de hacer esto es con un valor fijo, varias mesas y una ingeniosa pieza de la aritmtica.
Los sistemas operativos de Microsoft slo los archivos FAT12 en discos flexibles. Debido
a que hay un nmero limitado de formatos de disquetes que todos tienen un tamao
fijo, esto se hace con una simple tabla:
"Si se trata de un disco de este tipo, entonces el BPB se parece a esto."
No hay clculo dinmico para FAT12. Para los formatos FAT12, todo el clculo para
BPB_SecPerClus y BPB_FATSz16 se elaboran a mano en una hoja de papel y se registran
en el mesa (teniendo cuidado, por supuesto, que el recuento de clster resultante fue
siempre inferior a 4085). Si los medios de comunicacin
mide ms de 4 MB, no se moleste con FAT12. Utilice valores BPB_SecPerClus pequeas
para que el volumen ser FAT16. El resto de esta seccin es totalmente especfica a las
unidades que tienen 512 bytes por sector. Usted no puede utilizar estos tablas o la
aritmtica inteligente, con unidades que tienen un tamao de sector diferente. El
"valor fijo" es simplemente un tamao de volumen que es el "valor de FAT16 a FAT32
corte y cambio". Cualquier tamao de volumen ms pequeo que este es FAT16 y
cualquier volumen de este tamao o ms grande es FAT32. En Windows, este valor es
de 512 MB. Cualquier Volumen FAT menor que 512 MB es FAT16, y cualquier volumen
FAT de 512 MB o ms es FAT32. Por favor, no dibujar una conclusin incorrecta aqu.
Hay muchos volmenes FAT16 por ah que son mayores de 512 MB. Hay varias
maneras a forzar el formato sea FAT16 en lugar de la predeterminada de FAT32, y hay
una gran cantidad de cdigo que implementa diferentes lmites. Todo lo que estamos
hablando aqu es el valor de corte y cambio predeterminado para MS-DOS y Windows
en los volmenes que todava no hayan sido formateadas. Hay dos tablas, una es para
FAT16 y el otro es para FAT32. Una entrada en estas tablas se selecciona en funcin del
tamao del volumen en 512 sectores bytes (el valor que ir en BPB_TotSec16 o
BPB_TotSec32), y el valor que esta tabla series es el valor BPB_SecPerClus.
struct DSKSZTOSECPERCLUS {
DWORD DiskSize;
BYTE SecPerClusVal;
};
/*
*This is the table for FAT16 drives. NOTE that this table includes
* entries for disk sizes larger than 512 MB even though typically
* only the entries for disks < 512 MB in size are used.
* The way this table is accessed is to look for the first entry
* in the table for which the disk size is less than or equal
* to the DiskSize field in that table entry. For this table to
* work properly BPB_RsvdSecCnt must be 1, BPB_NumFATs
* must be 2, and BPB_RootEntCnt must be 512. Any of these values

* being different may require the first table entries DiskSize value
* to be changed otherwise the cluster count may be to low for FAT16.
*/
DSKSZTOSECPERCLUS DskTableFAT16 [] = {
{ 8400, 0}, /* disks up to 4.1 MB, the 0 value for SecPerClusVal trips an error */
{ 32680, 2}, /* disks up to 16 MB, 1k cluster */
{ 262144, 4}, /* disks up to 128 MB, 2k cluster */
{ 524288, 8}, /* disks up to 256 MB, 4k cluster */
{ 1048576, 16}, /* disks up to 512 MB, 8k cluster */
/* The entries after this point are not used unless FAT16 is forced */
{ 2097152, 32}, /* disks up to 1 GB, 16k cluster */
{ 4194304, 64}, /* disks up to 2 GB, 32k cluster */
{ 0xFFFFFFFF, 0} /* any disk greater than 2GB, 0 value for SecPerClusVal trips an error */
};
/*
* This is the table for FAT32 drives. NOTE that this table includes
* entries for disk sizes smaller than 512 MB even though typically
* only the entries for disks >= 512 MB in size are used.
* The way this table is accessed is to look for the first entry
* in the table for which the disk size is less than or equal
* to the DiskSize field in that table entry. For this table to
* work properly BPB_RsvdSecCnt must be 32, and BPB_NumFATs
* must be 2. Any of these values being different may require the first
* table entries DiskSize value to be changed otherwise the cluster count
* may be to low for FAT32.
*/
DSKSZTOSECPERCLUS DskTableFAT32 [] = {
{ 66600, 0}, /* disks up to 32.5 MB, the 0 value for SecPerClusVal trips an error */
{ 532480, 1}, /* disks up to 260 MB, .5k cluster */
{ 16777216, 8}, /* disks up to 8 GB, 4k cluster */
{ 33554432, 16}, /* disks up to 16 GB, 8k cluster */
{ 67108864, 32}, /* disks up to 32 GB, 16k cluster */
{ 0xFFFFFFFF, 64}/* disks greater than 32GB, 32k cluster */
};

As que le da un tamao de disco y un tipo de FAT FAT16 o FAT32, ahora tenemos un


valor BPB_SecPerClus. La Lo nico que nos queda es hacer es calcular el nmero de
sectores de la FAT ocupa de manera que podemos establecer BPB_FATSz16 o
BPB_FATSz32. Tenga en cuenta que en este punto se asume que BPB_RootEntCnt,
BPB_RsvdSecCnt y BPB_NumFATs se ajustan adecuadamente. Tambin suponemos que
DskSize es el tamao del volumen que estamos bien vamos a poner en BPB_TotSec32 o
BPB_TotSec16.
RootDirSectors = ((BPB_RootEntCnt * 32) + (BPB_BytsPerSec 1)) / BPB_BytsPerSec;
TmpVal1 = DskSize (BPB_ResvdSecCnt + RootDirSectors);
TmpVal2 = (256 * BPB_SecPerClus) + BPB_NumFATs;
If(FATType == FAT32)
TmpVal2 = TmpVal2 / 2;
FATSz = (TMPVal1 + (TmpVal2 1)) / TmpVal2;
If(FATType == FAT32) {
BPB_FATSz16 = 0;
BPB_FATSz32 = FATSz;
} else {
BPB_FATSz16 = LOWORD(FATSz);
/* there is no BPB_FATSz32 in a FAT16 BPB */
}

No gaste demasiado tiempo tratando de averiguar por qu funciona esta matemtica.


La base para el clculo es complicado, lo importante es que se trata de cmo los
sistemas operativos de Microsoft hacen, y funciona. Tenga en cuenta, sin embargo, que
esta matemtica no funciona perfectamente. Se ocasionalmente establecer un FATSz
que es hasta 2 sectores demasiado grandes para FAT16, y en ocasiones hasta 8
sectores demasiado grandes para FAT32. Nunca se calcular un valor FATSz que es
demasiado pequea, sin embargo. Debido a que est bien tener un FATSz que es

demasiado grande, a expensas de perder unos pocos sectores, el hecho de que este
clculo es sorprendentemente simple ms de lo compensa estar fuera de forma segura
en algunos casos.
FAT32 fsinfo Estructura Sectorial y el sector de inicio de copia de seguridad En un
volumen FAT32, la FAT puede ser una gran estructura de datos, a diferencia de en
FAT16 donde se limita a una mximo de valor de 128K de sectores y FAT12 donde se
limita a un mximo de valor de 6K sectores. Por esta razn, se hace una provisin para
almacenar la "ltima conocida" cuenta agrupacin libre en el FAT32 volumen de forma
que no tiene que ser calculado en cuanto se hizo una llamada a la API de preguntar
cunto libre el espacio que hay en el volumen (como en el extremo de un listado de
directorio). El nmero es el sector fsinfo valor en el campo BPB_FSInfo; para los
sistemas operativos de Microsoft que siempre se establece en 1. Esta es la estructura
del sector fsinfo:

FAT32 fsinfo Estructura Sectorial y el sector de inicio de copia de


seguridad

Nombre

Offset
(byte)
0

tamao
(bytes)
4

480

FSI_StrucSig

484

FSI_Free_Count

488

FSI_Nxt_Free

492

12

FSI_LeadSig

FSI_Reserved1

Descripcin
Valor 0x41615252. Esta firma de
plomo se usa para validar que este
es de hecho un sector fsinfo.
Este
campo
est
reservado
actualmente
para
una
futura
expansin. formato FAT32 cdigo
siempre debe inicializar todos los
bytes de este campo es 0. Bytes
Actualmente este campo debe
nunca ser utilizado.
Valor 0x61417272. Otra firma que es
ms localizada en el sector a la
ubicacin de los campos que se
utilizan.
Contiene el ltimo recuento clster
libre conocida en el volumen. Si el
valor es 0xFFFFFFFF, entonces la
cuenta libre es desconocido y debe
ser calculado. Cualquier otro valor se
puede
utilizar,
pero
no
es
necesariamente corregir. Debe estar
registrado rango, al menos, para
asegurarse de que es <= volumen
de recuento de clster.
Esta es una sugerencia para el
conductor FAT. Indica el nmero de

FSI_TrailSig

508

FSI_Reserved2

496

12

clster en que el conductor debe


empezar a buscar grupos libres.
Debido a que un FAT32 FAT es
grande, puede ser bastante lento si
hay una gran cantidad de grupos
asignados al inicio de la FAT y el
conductor comienza en busca de un
grupo libre a partir de las 2 del
clster. Normalmente, este valor es
establecido en el ltimo nmero de
clster que el conductor asignado. Si
el valor es 0xFFFFFFFF, entonces no
hay ningn indicio y el conductor
debe comenzar mirando clster 2.
Cualquier otro valor se puede
utilizar, pero debe ser comprueban
antes para asegurarse de que es un
nmero de clster vlido para la
volumen.
Este
campo
est
reservado
actualmente
para
una
futura
expansin. formato FAT32
cdigo siempre debe inicializar todos
los bytes de este campo es 0. Bytes
Actualmente este campo debe
nunca ser utilizado.
Valor 0xAA550000. Esta firma ruta
se utiliza para validar que este es de
hecho un sector fsinfo. Tenga en
cuenta que las altas 2 bytes de esta
valor que entrar en los bytes en
desplazamientos 510 y 511-que
coincida con los bytes de firma
utilizados
en
las
mismas
compensaciones en el sector 0.

Otra caracterstica de los volmenes FAT32 que no est presente en FAT16/FAT12 es el


campo BPB_BkBootSec. FAT16/FAT12 volmenes pueden perderse totalmente si el
contenido del sector 0 del volumen o se sobrescriben 0 sector va mal y no se puede
leer. Se trata de un "punto nico de fallo" de FAT16 y FAT12 volmenes. El campo
BPB_BkBootSec reduce la gravedad de este problema para los volmenes FAT32,
porque a partir de ese nmero de sector en el volumen-6-hay una copia de seguridad
del sector de arranque informacin, incluyendo BPB del volumen. En el caso de que la
informacin 0 sector ha sido sobrescrito por error, toda una utilidad de reparacin de
disco tiene que hacer es restaurar el sector de arranque (s) a partir de la copia de

seguridad. En el caso en el sector 0 se echa a perder, esta permite que el volumen a


ser montado de manera que el usuario puede acceder a los datos antes de sustituir el
disco. Este segundo caso del sector 0 va mal-es la razn por la que ningn valor que no
sea 6 Jams coloque en el campo BPB_BkBootSec. Si el sector 0 es ilegible, varios
sistemas operativos "cableados" para comprobar si hay sector de inicio de copia de
seguridad (s) a partir de sector 6 del volumen FAT32. Tenga en cuenta que a partir de la
BPB_BkBootSec sector es un sector de arranque completo. El "sector de arranque"
Microsoft FAT32 es en realidad tres sectores de 512 bytes de longitud. Existe una copia
de estos tres sectores a partir de la Sector BPB_BkBootSec. Una copia del sector fsinfo
tambin est ah, a pesar de que el campo BPB_FSInfo en este sector de inicio de copia
de seguridad se establece en el mismo valor que se almacena en el sector 0 BPB.
NOTA: Todos los 3 de estos sectores tienen la firma 0xAA55 de compensaciones del
sector 510 y 511, al igual que el primera sector de arranque hace (ver la discusin
anterior al final de la descripcin de la estructura BPB).

FAT Estructura de directorios


Esta es la explicacin ms simple de entradas de directorio FAT. En este documento se
ignora totalmente la Larga Arquitectura Nombre de archivo y slo habla de las entradas
de directorio cortos. Para una descripcin ms completa de los Estructura de
directorios FAT, consulte el documento "FAT: Long Name On-Media Format
Specification". Un directorio de FAT no es ms que un "archivo", compuesto de una lista
lineal de estructuras de 32 bytes. El nico directorio especial, que debe estar siempre
presente, es el directorio raz. Para FAT12 y FAT16 medios de comunicacin, el
directorio raz se encuentra en una ubicacin fija en el disco inmediatamente despus
de la ltima FAT y es de un tamao fijo en sectores computado a partir del valor
BPB_RootEntCnt (ver clculos para RootDirSectors anteriormente en este documento).
Para FAT12 y FAT16 medios de comunicacin, el primer sector de la raz directorio es el
nmero de sector en relacin con el primer sector del volumen FAT:
FirstRootDirSecNum = BPB_ResvdSecCnt + (BPB_NumFATs * BPB_FATSz16);

Para FAT32, el directorio raz puede ser de tamao variable y es una cadena de
clsteres, como cualquier otro directorio es. El primer grupo del directorio raz de un
volumen FAT32 se almacena en BPB_RootClus. A diferencia de otros directorios, el
directorio raz misma de cualquier tipo FAT no tiene fecha y hora sellos, no tiene un
nombre de archivo (que no sea el nombre del archivo implcito "\"), y no contiene "."
y .. "Archivos como las dos primeras entradas de directorio en el directorio. El nico
otro aspecto especial de la raz directorio es que es el nico directorio en el volumen
FAT para las que es vlido tener un archivo que tiene
slo el bit de atributo ATTR_VOLUME_ID (vase ms adelante).

FAT Directorio 32 Byte Estructura de Entrada


Nombre
Offset
tamao
Descripcin
(byte)
(bytes)
DIR_Name
Nombre corto
0
11
DIR_Attr
Atributos de archivo:
11
1

ATTR_READ_ONLY
ATTR_HIDDEN
ATTR_SYSTEM
ATTR_VOLUME_ID
ATTR_DIRECTORY
ATTR_ARCHIVE
ATTR_LONG_NAME

DIR_NTRes

12

DIR_CrtTimeTenth

13

DIR_CrtTime
DIR_LstAccDate

14
16
18

2
2
2

DIR_FstClusHI

20

DIR_WrtTime

22

DIR_CrtDate

0x01
0x02
0x04
0x08
0x10
0x20
ATTR_READ_ONLY |
ATTR_HIDDEN |
ATTR_SYSTEM |
ATTR_VOLUME_ID

Los dos bits superiores del byte de


atributo estn reservados y deben
siempre se pone a 0 cuando se crea
un archivo y nunca modificado o
mirado despus de eso.
Reservado para uso con Windows
NT. Establecer el valor de 0 cuando
un archivo es
creado y nunca modificar o verlo
despus.
Millisecond sello en el momento de
creacin del archivo. Este campo
realidad Contiene un recuento de
dcimas
de
segundo.
La
granularidad de la segundo parte de
DIR_CrtTime es de 2 segundos por lo
que este campo es un conde de
dcimas de segundo, y su rango de
valores vlidos es de 0 a 199
Incluido.
Tiempo en que fue creado el archivo
La fecha de creacin
Fecha de ltima entrada. Tenga en
cuenta que no hay una hora del
ltimo acceso, slo una fecha. Esta
es la fecha de la ltima lectura o
escritura. En el caso de una
operacin de escritura, esto se debe
establecer en la misma fecha que
DIR_WrtDate
Palabra superior de la primera serie
de clster de esta entrada (siempre
0 para un
FAT12 o un volumen FAT16).
Hora de ltima escritura. Tenga en

DIR_WrtDate

24

DIR_FstClusLO

26

DIR_FileSize

28

cuenta que la creacin de archivos


se considera una escritura.
Fecha de la ltima escritura. Tenga
en cuenta que la creacin de
archivos se considera una escritura.
Palabra Baja de primer nmero de
clster de esta entrada.
DWORD de 32 bits que sostiene el
tamao de este archivo en bytes.

Dir_name [0]
Notas especiales sobre el primer byte (dir_name [0]) de una entrada de
directorio FAT:
Si dir_name [0] == 0xE5, entonces la entrada de directorio es gratuito
(no hay ningn nombre de archivo o directorio en este
entrada).
Si dir_name [0] == 0x00, entonces la entrada de directorio es gratuita
(igual que para 0xE5), y no hay asignado las entradas de directorio
despus de sta (todo el dir_name [0] bytes en todas las entradas
despus de ste tambin se establecen en 0).
El valor especial 0, en lugar del valor 0xE5, indica el cdigo del
controlador de sistema de archivos FAT que el resto de las entradas de
este directorio no necesita ser examinada porque son todos libres.
Si dir_name [0] == 0x05, entonces el carcter de nombre de archivo
real para este byte es 0xE5. 0xE5 es en realidad un valor de byte inicial
KANJI vlida para el conjunto de caracteres utilizado en Japn. El valor
0x05 especial se utiliza para que este caso nombre de archivo especial
para Japn puede ser manejado correctamente y no causa de archivos
FAT cdigo del sistema para pensar que la entrada es libre.
El campo dir_name es en realidad dividida en dos partes: la parte
principal + 8 caracteres del nombre, y el Extensin de 3 caracteres.
Estas dos partes son "el espacio en acolchada" con bytes de 0x20.
Dir_name [0] puede no ser igual a 0x20. Hay una implcita '.' Carcter
entre la parte principal de la nombre y la parte de extensin del nombre
que no est presente en dir_name. Caracteres en minsculas son no se
permite en dir_name (lo que estos personajes son es especfico del pas).

Los siguientes caracteres no son legales en los bytes de dir_name:


Los valores de menos de 0x20 a excepcin del caso especial de 0x05
en dir_name [0] se describe anteriormente.
0x22, 0x2A, 0x2B, 0x2C, 0x2E, 0x2F, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E,
0x3F, 0x5B, 0x5C, 0x5D,
y 0x7C.
Estos son algunos ejemplos de cmo un introducidos por el usuario en
nombre de mapas dir_name:
foo.bar -> FOO BAR
FOO.BAR -> FOO BAR
Foo.Bar -> FOO BAR
foo -> FOO
foo. -> FOO
PICKLE.A -> PICKLE A
prettybg.big -> PRETTYBGBIG
.big -> illegal, DIR_Name[0] cannot be 0x20

En los directorios FAT todos los nombres son nicos. Mira las primeras
tres ejemplos anteriores. Los diferentes todos los nombres se refieren al
mismo fichero, y slo puede haber un archivo con dir_name set de "FOO
BAR" en cualquier directorio.
DIR_Attr especifica los atributos del archivo:
ATTR_READ_ONLY Indica que se escribe en el archivo debe fallar.
ATTR_HIDDEN Indica que los listados de directorios normales no
deberan mostrar este archivo.
ATTR_SYSTEM Indica que este es un archivo del sistema operativo.
ATTR_VOLUME_ID Slo debe haber un "archivo" en el volumen que tiene
este atributo establecido, y que el archivo debe estar en el directorio
raz. El nombre de este archivo es en realidad la etiqueta para el
volumen. DIR_FstClusHI y DIR_FstClusLO siempre debe ser 0 para la
etiqueta de volumen (no hay datos grupos se asignan al archivo de
etiqueta de volumen). ATTR_DIRECTORY Indica que este archivo es en
realidad un contenedor para otros archivos. ATTR_ARCHIVE Este atributo
admite utilidades de copia de seguridad. Este bit es activado por el
archivo FAT controlador del sistema cuando se crea un archivo, cambiar
de nombre o escrita. Copia de seguridad servicios pblicos podrn
utilizar este atributo para indicar qu archivos del volumen se han
modificado desde la ltima vez que se realiz una copia de seguridad.
Tenga en cuenta que la combinacin de bits ATTR_LONG_NAME atributo
indica que el "archivo" es en realidad parte de la entrada de nombre
largo para algn otro archivo. Consulte la especificacin de nombre de

archivo largo FAT para ms informacin sobre esta combinacin de


atributos.
Cuando se crea un directorio, un archivo con el bit ATTR_DIRECTORY en
su campo DIR_Attr, que establece su DIR_FileSize a 0. DIR_FileSize no se
utiliza y est siempre 0 en un archivo con el Atributo ATTR_DIRECTORY
(directorios son de tamao, simplemente siguiendo sus cadenas de
racimo a la Marca EOC). Un clster se asigna al directorio (a menos que
sea el directorio raz en un FAT16/FAT12 volumen), y se establece
DIR_FstClusLO y DIR_FstClusHI a ese nmero de clster y ponga una EOC
marcar en esa entrada racimos en la FAT. A continuacin, se inicializa
todos los bytes de ese grupo a 0. Si el directorio es el directorio raz, que
se llevan a cabo (no hay punto o punto-punto entradas en el directorio
raz). Si el directorio no es el directorio raz, es necesario crear dos
entradas especiales en los dos primeros 32 bytes entradas de directorio
del directorio (las primeras dos entradas de 32 bytes en la regin de
datos de la agrupacin que acaba de asignado).
La primera entrada de directorio tiene dir_name establece en:
". "
El segundo tiene dir_name conjunto de:
".. "
stos se llaman el punto y punto punto entradas. El campo DIR_FileSize
en ambas entradas se establece en 0, y todos de los campos de fecha y
hora en ambas entradas se establecen en los mismos valores que
estaban en el entrada de directorio para el directorio que acaba de crear.
Ahora configura DIR_FstClusLO y DIR_FstClusHI para la entrada de punto
(la primera entrada) con los mismos valores que pones en los campos de
la directorios de entrada de directorio (el nmero de clster del clster
que contiene el punto y entradas de punto punto). Por ltimo, se
establece DIR_FstClusLO y DIR_FstClusHI para la entrada punto punto (la
segunda entrada) a la primer nmero de clster del directorio en el que
acaba de crear el directorio (el valor es 0 si este directorio es el
directorio raz incluso para volmenes FAT32). Este es el resumen para el
punto y entradas de punto punto: El punto de entrada es un directorio
que apunta a s mismo.
Los puntos de entrada a la agrupacin punto punto de partida de los
padres de este directorio (que es 0 si directorios padre es el directorio
raz).
Formatos de fecha y hora

Muchos sistemas de archivos FAT no admiten la fecha / hora que no sea


DIR_WrtTime y DIR_WrtDate. Para esta razn, DIR_CrtTimeMil,
DIR_CrtTime, DIR_CrtDate y DIR_LstAccDate son en realidad campos
opcionales. DIR_WrtTime y DIR_WrtDate deben ser apoyadas, sin
embargo. Si la fecha y la otra campos de hora no se admiten, se debe
establecer en 0 en el archivo crear e ignorado en otro archivo
operaciones.
Formato de fecha. Un directorio de entrada de fecha sello FAT es un
campo de 16 bits que es bsicamente una fecha relativa a la MS-DOS
poca de 01/01/1980. Aqu es el formato (bit 0 es el LSB de la palabra de
16 bits, el bit 15 es el MSB de la palabra de 16 bits):
Bits 04: Day of month, valid value range 1-31 inclusive.
Bits 58: Month of year, 1 = January, valid value range 112 inclusive.
Bits 915: Count of years from 1980, valid value range 0127 inclusive (19802107).

Formato de hora. Una entrada de directorio sello de tiempo FAT es un


campo de 16 bits que tiene una granularidad de 2 segundos.
Aqu es el formato (bit 0 es el LSB de la palabra de 16 bits, el bit 15 es el
MSB de la palabra de 16 bits).
Bits 0-4: 2-segundo cargo, rango de valores vlidos 0-29 incluido (0 - 58
segundos).
Bits 5-10: Minutos, Rango de valores vlidos 0-59 inclusive.
Bits 11 a 15: horas, rango de valores vlidos 0-23 inclusive.
El rango de tiempo vlido es de Midnight 00:00:00 a 23:59:58.

Otras notas relativas a los directorios FAT


Entradas de directorio del nombre de archivos largos son idnticos en
todos los tipos de FAT . Consulte la FAT nombre largo del archivo
Especificaciones para los detalles.
DIR_FileSize es un campo de 32 bits. Para volmenes FAT32, el
controlador de sistema de archivos FAT no debe permitir que una cadena
de clsteres que se cree que es ms largo que 0x100000000 bytes, y el
ltimo byte de la ltima clster en una cadena larga que no se puede
asignar al archivo. Esto debe hacerse de manera que no tiene un archivo
El tamao del archivo> 0xFFFFFFFF bytes. Este es un lmite fundamental
de todos los sistemas de archivos FAT. El mximo tamao de archivo
permitido en un volumen FAT es 0xFFFFFFFF (4294967295) bytes.

Del mismo modo, un controlador del sistema de archivos FAT no debe


permitir que un directorio (un archivo que es en realidad un contenedor
para otros archivos) a ser mayor que 65.536 * 32 (2097152) bytes.
NOTA: Este lmite no se aplica al nmero de archivos en el directorio.
Este lmite es del tamao de el propio directorio y no tiene nada que ver
con el contenido del directorio. Hay dos razones para este lmite:
1. Debido directorios FAT no se ordenan o indexados, es una mala idea
para crear enormes directorios; de lo contrario, las operaciones como la
creacin de una nueva entrada (que requiere que cada entrada de
directorio asignado a ser evaluados para verificar que el nombre no
existe en el directorio) se vuelven muy lentos.
2. Hay muchos conductores del sistema de archivos FAT y utilidades de
disco, incluyendo Microsoft, de las que esperan contar las entradas de
un directorio utilizando una variable WORD 16-bit. Por esta razn,
directorios no pueden tener ms de 16-bits de valor de las entradas.
Conforme a la especificacin
El cumplimiento de esta especificacin se define por las pruebas en el
sistema operativo de referencia FAT (s).
Los sistemas operativos de referencia para FAT son Microsoft Windows
98 y Microsoft Windows 2000 (Basado en la tecnologa NT).
Su volumen FAT est en conformidad con esta especificacin si y slo si
ambos de la referencia
sistemas operativos montar el volumen, compruebe si hay errores con el
sistema operativo de disco suministrado
herramientas (Chkdsk.exe para Windows 2000 y Scandisk.exe para
Windows 98) y no aparezca ningn error.
El procedimiento bsico consiste en fabricar un volumen FAT utilizando
el sistema y las herramientas y mueva el disco o disco de medios para
una unidad extrable, a un equipo que ejecuta el sistema operativo de
referencia y probarlo.

Info

de:

http://www.ccsinfo.com/forum/viewtopic.php?

t=23969&highlight=fat32

Otra info ANSIC http://elm-chan.org/fsw/ff/00index_e.html


Petit fat ansic http://elm-chan.org/fsw/ff/00index_p.html

Just removed the dust from my old FAT32 code. Maybe it will be useful for somebody... See
notes in EX_ file.
So the header file (MyMMCFat32.h):
Code:
#defineMAXFILES2
typedefstruct_diskinforec
{
charhJumpCode[3];
charOEMName[8];
int16hBytesPerSector;
charbSectorsPerCluster;
int16Reserved1;
charFATCopies;
int16hMaxRootEntries;
int16hSectors;
charDescriptor;
int16holdSectorsPerFat;
int16hSectorsPerTrack;
int16hNumberofHeads;
int32hNumberofHidden;
int32hNumberofSectors;
int32hSectorsPerFat;
int16hFlags;
int16hFAT32Version;
int32hRootStartCluster;
}diskinforec;

typedefstruct_direntry
{
charsName[8];
char[spam][3];
charbAttr;
charbReserved[8];
int16hClusterH;
int16hTime;
int16hDate;
int16hCluster;
int32wSize;
}DIR;
typedefstruct{
charIOpuffer[512];
DIRDirEntry;
int32CurrentCluster;
int16posinsector;
int32position;
int32dirSector;
int16dirIdx;
charmode;
charFree;
}FILE;
typedefstruct{
int32MMCAddress;
int32FATstartidx;
int32gStartSector;
int32gFirstDataSector;
int16gDirEntryIdx;
int32gDirEntrySector;
int16gFirstEmptyDirEntry;
int32gFirstDirEntryCluster;
}FAT32Vars;
charMMCInit();
voidReadSector(int32sector,char*hova);
voidWriteSector(int32sector,char*honnan);
voidInitFAT();
charFindDirEntry(char*fname,charf);
charfopen(char*fname,charmode);
voidfclose(charf);
voidfflush(charf);
charcwd(char*fname,charf);
voidfputch(charbe,charf);
charfgetch(char*ki,charf);
voidfputstring(char*be,charf);//fputsisreservedinCCSC
int16fread(char*buffer,int16leng,charf);
voidfwrite(char*buffer,int16leng,charf);
charremove(char*fname);
chargetfsize(char*fname,int32*fsiz);

The implementation (MyMMCFat32.c):


Code:
int32FATTable[128];

int32gFirstEmptyCluster;
FAT32VarsgFAT32Vars;
diskinforecDiskInfo;
FILEgFiles[MAXFILES];
#byteMMCAddressL=gFAT32Vars
#byteMMCAddressH=gFAT32Vars+1
#byteMMCAddressHL=gFAT32Vars+2
#byteMMCAddressHH=gFAT32Vars+3
#bytegStartSectorL=gFAT32Vars+8
#bytegStartSectorH=gFAT32Vars+9
#bytegStartSectorHL=gFAT32Vars+10
#locateFATTable=0x0800
#locategFiles=0x0A00
#locategFAT32Vars=0x0E70
#locateDiskInfo=0x0E90
#useFAST_IO(C)
#defineChipSelpin_c2
#defineChipClkpin_c3
#defineChipDinpin_c5
//#defineCardInsertedPIN_A4//thesepinsarealreadydefinedinmymainC
file
//#defineREDLEDPIN_E7
//#defineYELLOWLEDPIN_E6//removecommentsorcommentoutlinescontaining
YELLOWLEDrefsinthisfile
//#defineGREENLEDPIN_E5

charIsSelfDir(char*be)
{
if(be[0]=='.'&&be[1]=='.')return0xFF;
elsereturn0;
}
voidMMCOut(charindata)
{
chari;
SSPBUF=indata;
while(!BF);
i=SSPBUF;
}
voidMMC8Clock()
{
chari;
SSPBUF=0xFF;
while(!BF);
i=SSPBUF;
}
charMMCIn()
{
chari;
SSPBUF=0xFF;
while(!BF);
i=SSPBUF;
returni;
}

charMMCInit()
{
charresponse,iii,errcnt;
restart_wdt();
output_high(ChipSel);
output_high(ChipClk);
output_high(ChipDin);
bit_clear(SSPCON1,5);
SSPCON1=0x30;//modifythisnumbertochangeSPIclockrate
SSPSTAT=0;
iii=10;
errcnt=100;
do{
MMCOut(0xFF);
}while(iii);
delay_us(1000);
output_low(ChipClk);
output_low(ChipSel);
MMCOut(0x40);
MMCOut(0x00);
MMCOut(0x00);
MMCOut(0x00);
MMCOut(0x00);
MMCOut(0x95);
MMC8Clock();
response=MMCIn();
output_high(ChipSel);
output_high(ChipClk);
do{
delay_us(1000);
output_low(ChipClk);
output_low(ChipSel);
MMCOut(0x41);
MMCOut(0x00);
MMCOut(0x00);
MMCOut(0x00);
MMCOut(0x00);
MMCOut(0x01);
MMC8Clock();
response=MMCIn();
output_high(ChipSel);
output_high(ChipClk);
MMC8Clock();
errcnt;
}while(response&&errcnt);
returnerrcnt;
}
int16GetCurrentDOSDate()
{
int16retval;
retval=myrec.tm_year1980;
retval<<=9;
retval|=((int16)myrec.tm_mon<<5);
retval|=(int16)myrec.tm_mday;
returnretval;
}
int16GetCurrentDOSTime()
{
int16retval;

retval=myrec.tm_hour;
retval<<=11;
retval|=((int16)myrec.tm_min<<5);
retval|=(int16)myrec.tm_sec>>1;
returnretval;
}
voidReadSector(int32sector,char*hova)
{
charerrs,response;
charcnt2,cnt3;
#bytesectorL=sector
#bytesectorH=sector+1
#bytesectorHL=sector+2
if(input(CardInserted))return;
Disable_interrupts(GLOBAL);
Restart_wdt();
MMCAddressL=0;
MMCAddressH=sectorL;
MMCAddressHL=sectorH;
MMCAddressHH=sectorHL;
gFAT32Vars.MMCAddress<<=1;
output_low(ChipClk);
output_low(ChipSel);
MMCOut(0x51);
MMCOut(MMCAddressHH);
MMCOut(MMCAddressHL);
MMCOut(MMCAddressH&0xFE);
MMCOut(0);
MMCOut(0x01);
errs=8;
do{
response=MMCIn();
}while(errs&&response==0xFF);
errs=50;
do{
response=MMCIn();
if(response==0xFE)break;
delay_ms(1);
}while(errs);
*0xFE9=(int16)hova;
cnt3=2;
cnt2=0;
do{
do{
SSPBUF=0xFF;
while(!BF);
*0xFEE=SSPBUF;
}while(cnt2);
}while(cnt3);
response=MMCIn();
response=MMCIn();
output_high(ChipSel);
output_high(ChipClk);
Enable_interrupts(GLOBAL);
}
voidWriteSector(int32sector,char*honnan)
{

charerrs,response;
charcnt2,cnt3;
#bytesectorL=sector
#bytesectorH=sector+1
#bytesectorHL=sector+2
if(input(CardInserted))return;
Disable_interrupts(GLOBAL);
Restart_wdt();
MMCAddressL=0;
MMCAddressH=sectorL;
MMCAddressHL=sectorH;
MMCAddressHH=sectorHL;
gFAT32Vars.MMCAddress<<=1;
response=0;
output_low(ChipClk);
output_low(ChipSel);
MMCOut(0x58);
MMCOut(MMCAddressHH);
MMCOut(MMCAddressHL);
MMCOut(MMCAddressH&0xFE);
MMCOut(0);
MMCOut(0x01);
MMC8Clock();
errs=8;
do{
response=MMCIn();
}while(errs&&response==0xFF);
if(response){
output_high(ChipSel);
output_high(ChipClk);
MMC8Clock();
Enable_interrupts(GLOBAL);
return;
}
MMC8Clock();
MMCOut(0xFE);
*0xFE9=(int16)honnan;
cnt3=2;
cnt2=0;
do{
do{
SSPBUF=*0xFEE;
while(!BF);
}while(cnt2);
}while(cnt3);
MMCOut(0x00);
MMCOut(0x01);
response=MMCIn();
response^=0xE5;
if(response){
gotoendwr3;
}
do{
response=MMCIn();
}while(response==0);
response=0;
endwr3:
output_high(ChipSel);
output_high(ChipClk);
MMC8Clock();
Enable_interrupts(GLOBAL);
}

voidInitFAT()
{
int32actsector;
chari;
gFirstEmptyCluster=0;
gFAT32Vars.gStartSector=0;
ReadSector(gFAT32Vars.gStartSector,gFiles[MAXFILES1].IOpuffer);
if(gFiles[MAXFILES1].IOpuffer[0]!=0xEB){
gStartSectorL=gFiles[MAXFILES1].IOpuffer[0x1C6];
gStartSectorH=gFiles[MAXFILES1].IOpuffer[0x1C7];
gStartSectorHL=gFiles[MAXFILES1].IOpuffer[0x1C8];
ReadSector(gFAT32Vars.gStartSector,gFiles[MAXFILES1].IOpuffer);
}
memcpy(&DiskInfo,gFiles[MAXFILES1].IOpuffer,sizeof(DiskInfo));
actsector=gFAT32Vars.gStartSector+DiskInfo.Reserved1;
ReadSector(actsector,FATTable);
gFAT32Vars.FATstartidx=0;
gFAT32Vars.gFirstDataSector=gFAT32Vars.gStartSector+
DiskInfo.FATCopies*DiskInfo.hSectorsPerFat+DiskInfo.Reserved12;
for(i=0;i<MAXFILES;i++)
gFiles[i].Free=TRUE;
}
int32GetNextCluster(int32curcluster)
{
int32actsector;
int32clpage;
charclpos;
clpage=curcluster>>7;
clpos=curcluster&0x7F;
if(clpage!=gFAT32Vars.FATstartidx){//readintherequestedpage
actsector=gFAT32Vars.gStartSector+DiskInfo.Reserved1+clpage;
ReadSector(actsector,FATTable);
gFAT32Vars.FATstartidx=clpage;
}
return(FATTable[clpos]);
}
voidSetClusterEntry(int32curcluster,int32value)
{
int32actsector;
int32clpage;
charclpos;
clpage=curcluster>>7;
clpos=curcluster&0x7F;
actsector=gFAT32Vars.gStartSector+DiskInfo.Reserved1+clpage;
if(clpage!=gFAT32Vars.FATstartidx){
ReadSector(actsector,FATTable);
gFAT32Vars.FATstartidx=clpage;
}
FATTable[clpos]=value;
WriteSector(actsector,FATTable);
actsector+=DiskInfo.hSectorsPerFat;
WriteSector(actsector,FATTable);
}
voidClearClusterEntry(int32curcluster)
{
int32actsector;

int32clpage;
charclpos;
clpage=curcluster>>7;
clpos=curcluster&0x7F;
if(clpage!=gFAT32Vars.FATstartidx){
actsector=gFAT32Vars.gStartSector+DiskInfo.Reserved1+
gFAT32Vars.FATstartidx;
WriteSector(actsector,FATTable);
actsector+=DiskInfo.hSectorsPerFat;
WriteSector(actsector,FATTable);
actsector=gFAT32Vars.gStartSector+DiskInfo.Reserved1+clpage;
ReadSector(actsector,FATTable);
gFAT32Vars.FATstartidx=clpage;
}
FATTable[clpos]=0;
}
int32FindFirstFreeCluster()
{
int32i,st,actsector,retval;
charj;
st=gFirstEmptyCluster;
for(i=st;i<DiskInfo.hSectorsPerFat;i++){
if(i!=gFAT32Vars.FATstartidx){
actsector=gFAT32Vars.gStartSector+DiskInfo.Reserved1+i;
ReadSector(actsector,FATTable);
gFAT32Vars.FATstartidx=gFirstEmptyCluster=i;
}
for(j=0;j<128;j++)
if(FATTable[j]==0){
retval=i;
retval<<=7;
retval|=j;
returnretval;
}
}
return0x0FFFFFFF;
}
voidConvertFilename(DIR*beDir,char*name)
{
chari,j,c;
j=0;
name[0]=0;
for(i=0;i<8;i++){
c=beDir>sName[i];
if(c=='')break;
name[j++]=c;
}
for(i=0;i<3;i++){
c=beDir>[spam][i];
if(c==''||c==0)break;
if(!i)name[j++]='.';
name[j++]=c;
}
name[j++]=0;
}
voidGetDOSName(DIR*pDir,char*fname)
{

chari,j,leng,c,toext;
toext=FALSE;
j=0;
leng=strlen(fname);
for(i=0;i<8;i++)
pDir>sName[i]='';
for(i=0;i<3;i++)
pDir>[spam][i]='';
for(i=0;i<leng;i++){
c=fname[i];
c=toupper(c);
if(c=='.'){
toext=TRUE;
continue;
}
if(toext)pDir>[spam][j++]=c;
elsepDir>sName[i]=c;
}
}
voidReadRootDirectory(charfil)
{
int32actsector;
if(fil>(MAXFILES1))return;
actsector=gFAT32Vars.gStartSector+
DiskInfo.FATCopies*DiskInfo.hSectorsPerFat+DiskInfo.Reserved1;
ReadSector(actsector,gFiles[fil].IOpuffer);
gFAT32Vars.gDirEntrySector=actsector;
gFiles[fil].dirSector=actsector;
gFiles[fil].dirIdx=0;
memcpy(&(gFiles[fil].DirEntry),gFiles[fil].IOpuffer,32);
gFiles[fil].CurrentCluster=DiskInfo.hRootStartCluster;
}
charFindDirEntry(char*fname,charf)
{
DIR*pDir;
int16i;
charfilename[16];
int32nextcluster,actsector;
if(f>(MAXFILES1))returnFALSE;
gFAT32Vars.gFirstEmptyDirEntry=0xFFFF;
gFAT32Vars.gFirstDirEntryCluster=0x0FFFFFFF;
do{
pDir=(DIR*)(gFiles[f].IOpuffer);
for(i=0;i<16;i++){
if((pDir>sName[0]==0xE5||pDir>sName[0]==0)&&
gFAT32Vars.gFirstEmptyDirEntry==0xFFFF){//storefirstfree
gFAT32Vars.gFirstEmptyDirEntry=i;
gFAT32Vars.gFirstDirEntryCluster=gFiles[f].CurrentCluster;
}
if(pDir>sName[0]==0)returnFALSE;
ConvertFilename(pDir,filename);
if(!strcmp(filename,fname)){
memcpy(&(gFiles[f].DirEntry),pDir,32);
gFiles[f].dirIdx=i;
gFAT32Vars.gDirEntryIdx=i;
returnTRUE;
}
pDir++;

}
nextcluster=GetNextCluster(gFiles[f].CurrentCluster);
if(nextcluster!=0x0FFFFFFF&&nextcluster!=0){
actsector=nextcluster+gFAT32Vars.gFirstDataSector;
ReadSector(actsector,gFiles[f].IOpuffer);
gFAT32Vars.gDirEntrySector=actsector;
gFiles[f].dirSector=actsector;
gFiles[f].CurrentCluster=nextcluster;
}
}while(nextcluster!=0x0FFFFFFF&&nextcluster!=0);
returnFALSE;
}
//fileI/Oroutines
char*TryFile(char*fname,char*f)
{
chari,leng;
char*filename;
*f=0xFF;
for(i=0;i<MAXFILES;i++){
if(gFiles[i].Free){
*f=i;
break;
}
}
if(*f==0xFF)return0;
ReadRootDirectory(*f);
filename=fname;
leng=strlen(fname);
for(i=0;i<leng;i++){
if(fname[i]=='/'){
fname[i]=0;
if(!cwd(filename,*f)){
gFiles[*f].Free=TRUE;
return0;
}
filename=fname+i+1;
}
}
returnfilename;
}
charfcreate(charf,char*fname)
{
DIR*pDir;
int32actsector,actcl;
int16i;
if(f>(MAXFILES1))returnFALSE;
if(gFAT32Vars.gFirstDirEntryCluster==0x0FFFFFFF){
//extendthedirectoryfile!!!
gFAT32Vars.gFirstDirEntryCluster=FindFirstFreeCluster();
gFAT32Vars.gFirstEmptyDirEntry=0;

SetClusterEntry(gFiles[f].CurrentCluster,gFAT32Vars.gFirstDirEntryCluster);
SetClusterEntry(gFAT32Vars.gFirstDirEntryCluster,0x0FFFFFFF);
actsector=gFAT32Vars.gFirstDirEntryCluster+
gFAT32Vars.gFirstDataSector;
for(i=0;i<512;i++)
gFiles[f].IOpuffer[i]=0;
WriteSector(actsector,gFiles[f].IOpuffer);
}

actsector=gFAT32Vars.gFirstDirEntryCluster+
gFAT32Vars.gFirstDataSector;
ReadSector(actsector,gFiles[f].IOpuffer);
pDir=(DIR*)(&(gFiles[f].IOpuffer[32*gFAT32Vars.gFirstEmptyDirEntry]));
gFiles[f].dirSector=actsector;
gFiles[f].dirIdx=gFAT32Vars.gFirstEmptyDirEntry;
GetDOSName(pDir,fname);
pDir>bAttr=0;
actcl=FindFirstFreeCluster();
pDir>hCluster=actcl&0xFFFF;
pDir>hClusterH=actcl>>16;
SetClusterEntry(actcl,0x0FFFFFFF);
pDir>wSize=0;
gFiles[f].position=0;
pDir>hDate=GetCurrentDOSDate();
pDir>hTime=GetCurrentDOSTime();
WriteSector(actsector,gFiles[f].IOpuffer);
memcpy(&(gFiles[f].DirEntry),pDir,32);
returnTRUE;
}
int32ComposeCluster(charf)
{
int32retval;
retval=gFiles[f].DirEntry.hClusterH;
retval<<=16;
retval|=gFiles[f].DirEntry.hCluster;
returnretval;
}
charfopen(char*fname,charmode)
{
charfound;
charf;
int32actsector,actcluster,nextcluster;
char*filename;
if(input(CardInserted))return0xFF;
output_high(YELLOWLED);
filename=TryFile(fname,&f);
if(filename==0)return0xFF;
found=FALSE;
found=FindDirEntry(filename,f);
if(!found){
if(mode=='r'){
gFiles[f].Free=TRUE;
return0xFF;
}else{
if(!fcreate(f,filename))return0xFF;
found=TRUE;
}
}
if(found){
gFiles[f].Free=FALSE;
gFiles[f].mode=mode;
if(mode=='a'){
gFiles[f].position=gFiles[f].DirEntry.wSize;
actcluster=ComposeCluster(f);
while(actcluster!=0x0FFFFFFF&&nextcluster!=0){
nextcluster=GetNextCluster(actcluster);
if(nextcluster==0x0FFFFFFF||nextcluster==0)break;
actcluster=nextcluster;

}
actsector=actcluster+gFAT32Vars.gFirstDataSector;
ReadSector(actsector,gFiles[f].IOpuffer);
gFiles[f].CurrentCluster=actcluster;
gFiles[f].posinsector=gFiles[f].position&0x01FF;
if(gFiles[f].posinsector==0&&gFiles[f].position!=0)
gFiles[f].posinsector=512;
}else{
gFiles[f].position=0;
actsector=ComposeCluster(f);
actsector+=gFAT32Vars.gFirstDataSector;
ReadSector(actsector,gFiles[f].IOpuffer);
gFiles[f].CurrentCluster=ComposeCluster(f);
gFiles[f].posinsector=0;
}
}
returnf;
}
voidfclose(charf)
{
output_low(YELLOWLED);
if(f>(MAXFILES1))return;
if((gFiles[f].mode=='a')||(gFiles[f].mode=='w'))fflush(f);
gFiles[f].Free=TRUE;
}
voidfflush(charf)
{
int32actsector;
DIR*pDir;
if(f>(MAXFILES1))return;
actsector=gFiles[f].CurrentCluster+gFAT32Vars.gFirstDataSector;
WriteSector(actsector,gFiles[f].IOpuffer);
ReadSector(gFiles[f].dirSector,gFiles[f].IOpuffer);
pDir=(DIR*)(&(gFiles[f].IOpuffer[32*gFiles[f].dirIdx]));
if(gFiles[f].DirEntry.bAttr&0x10)pDir>wSize=0;//ifitisa
directory
elsepDir>wSize=gFiles[f].position;
pDir>hDate=GetCurrentDOSDate();
pDir>hTime=GetCurrentDOSTime();
WriteSector(gFiles[f].dirSector,gFiles[f].IOpuffer);
ReadSector(actsector,gFiles[f].IOpuffer);
}
charcwd(char*fname,charf)
{
int32actsector;
if(f>(MAXFILES1))returnFALSE;//justincaseofoveraddressing
if(IsSelfDir(fname))returnTRUE;//alreadyinRootdir
if(!FindDirEntry(fname,f))returnFALSE;//notfound
actsector=ComposeCluster(f);
actsector+=gFAT32Vars.gFirstDataSector;//readcurrentdir
ReadSector(actsector,gFiles[f].IOpuffer);
gFAT32Vars.gDirEntrySector=actsector;
gFiles[f].dirSector=actsector;
gFiles[f].CurrentCluster=ComposeCluster(f);
returnTRUE;
}
voidfputch(charbe,charf)

{
int32nextcluster,actsector;
if(f>(MAXFILES1))return;
if(gFiles[f].posinsector==512){
actsector=gFiles[f].CurrentCluster+gFAT32Vars.gFirstDataSector;
WriteSector(actsector,gFiles[f].IOpuffer);
nextcluster=FindFirstFreeCluster();
if(nextcluster!=0x0FFFFFFF&&nextcluster!=0){
SetClusterEntry(gFiles[f].CurrentCluster,nextcluster);
SetClusterEntry(nextcluster,0x0FFFFFFF);
actsector=nextcluster+gFAT32Vars.gFirstDataSector;
ReadSector(actsector,gFiles[f].IOpuffer);
gFiles[f].CurrentCluster=nextcluster;
gFiles[f].posinsector=0;
}
}
gFiles[f].IOpuffer[gFiles[f].posinsector]=be;
gFiles[f].posinsector++;
gFiles[f].position++;
}
voidfputstring(char*be,charf)
{
int16leng,i;
if(f>(MAXFILES1))return;
leng=strlen(be);
for(i=0;i<leng;i++)
fputch(be[i],f);
}
int16fread(char*buffer,int16leng,charf)
{
int16i,retv;
charc,v;
if(f>(MAXFILES1))return0;
retv=0;
for(i=0;i<leng;i++){
v=fgetch(&c,f);
if(v){
buffer[i]=c;
retv++;
}
elsebreak;
}
returnretv;
}
voidfwrite(char*buffer,int16leng,charf)
{
int16i;
if(f>(MAXFILES1))return;
for(i=0;i<leng;i++)
fputch(buffer[i],f);
}
charfgetch(char*ki,charf)
{

int32nextcluster,actsector;
if(f>(MAXFILES1))returnFALSE;
if(gFiles[f].position>=gFiles[f].DirEntry.wSize)returnFALSE;
*ki=gFiles[f].IOpuffer[gFiles[f].posinsector];
gFiles[f].posinsector++;
gFiles[f].position++;
if(gFiles[f].posinsector==512){
nextcluster=GetNextCluster(gFiles[f].CurrentCluster);
if(nextcluster!=0x0FFFFFFF&&nextcluster!=0){
actsector=nextcluster+gFAT32Vars.gFirstDataSector;
ReadSector(actsector,gFiles[f].IOpuffer);
gFiles[f].CurrentCluster=nextcluster;
gFiles[f].posinsector=0;
}
}
returnTRUE;
}
charremove(char*fname)
{
chari,found;
charf;
DIR*pDir;
int32nextcluster,currentcluster;
char*filename;
filename=TryFile(fname,&f);
if(filename==0)returnFALSE;
found=FindDirEntry(filename,f);
if(!found){
gFiles[f].Free=TRUE;
returnFALSE;
}
output_high(YELLOWLED);
pDir=(DIR*)(&(gFiles[f].IOpuffer[32*gFAT32Vars.gDirEntryIdx]));
pDir>sName[0]=0xE5;
for(i=1;i<8;i++)
pDir>sName[i]='';
for(i=0;i<3;i++)
pDir>[spam][i]='';
WriteSector(gFAT32Vars.gDirEntrySector,gFiles[f].IOpuffer);
currentcluster=ComposeCluster(f);
while(currentcluster!=0x0FFFFFFF&&nextcluster!=0){
nextcluster=GetNextCluster(currentcluster);
ClearClusterEntry(currentcluster);
currentcluster=nextcluster;
}
ClearClusterEntry(currentcluster);
SetClusterEntry(currentcluster,0);
currentcluster=gFAT32Vars.gStartSector+DiskInfo.Reserved1+
gFAT32Vars.FATstartidx;
WriteSector(currentcluster,FATTable);
currentcluster+=DiskInfo.hSectorsPerFat;
WriteSector(currentcluster,FATTable);
gFiles[f].Free=TRUE;
output_low(YELLOWLED);
returnTRUE;
}
chargetfsize(char*fname,int32*fsiz)
{
charfound;

charf;
DIR*pDir;
char*filename;
filename=TryFile(fname,&f);
if(filename==0)returnFALSE;
found=FindDirEntry(filename,f);
if(!found){
gFiles[f].Free=TRUE;
returnFALSE;
}
pDir=(DIR*)(&(gFiles[f].IOpuffer[32*gFAT32Vars.gDirEntryIdx]));
gFiles[f].Free=TRUE;
*fsiz=pDir>wSize;
returnTRUE;
}

And a small example (EX_MyFat32.c):


Code:
/*ThisisasmalldemofileforFAT32libraryusage
WrittenbyTamasBodorics(Tomi)
Somenotes:

IuseitwithaPIC18F6720(3.5kByteRAM)HWSPI@11.0592MHzcrystal;
testedwith64256MBMMCs
TheRAMareaismovedtoupperregionby#locatedirectives
TheMMChas2GNDpins;oneofthemispulledupbyaresistor(10k)to
+5VandconnectedtoPIN_A4
sotheMMCis"hotswappable".
TheMMChastoformatFAT32,512bytes/cluster
Thenumberofopenedfilesatatimeislimitedto2becauseofRAM
limitations(somedsPICshave8KRAM...;))
Nolongnames;useDOSlike8+3nameformat
NoMKDIRandRMDIRfunctions(notyet...)socreatethesubdirsright
aftertheformat(anduse8+3capitalcharacters...)
IusethefollowingDOSbatchinXP:
formatI:/A:512/V:TOMI/FS:FAT32
mkdirI:\BERS
mkdirI:\WINDS
Use'/'asdirectoryseparator,e.g."MYDIR/ELEMENT.WND"
"MYDIR/SUBDIR/OTHER.TXT"etc.
Thepossiblemodesforfileopen(charandNOTstringasinstd.C):
'r'(read)'w'(write;thepreviouscontentwilloverwritten)'a'(append)
fputsisreservedkeywordbyCCSCsousefputstring()instead
IntheexampletheEVENT.LOGfileusestheHungariandateformat
(YYYY.MM.DD.HH.mm.SS)sorry...
Therearesomefunctionsnormallynottouse:
fflush(f)UseitonlyifyouwanttoflushdataintoMMCwhileyou
keepthefileopened
TryFile()triestoopenthefileincl.resolvingthepath
cwd(fname,f)isusedbyTryFiletoresolvethepathname
fcreate()Ifyouopenafilewith'a'or'w'thefileis
automaticallycreatedifnotexist
*/

#include<18F6720.h>
..........
#include<string.h>
typedefstruct{
unsignedlongtm_year;
chartm_mon;
chartm_day;
chartm_mday;
chartm_hour;
chartm_min;
chartm_sec;
}TimeRecord;
....................
TimeRecordmyrec;//thisvariableisupdatedinregularintervalsin
DoIdle()
....................
....................
....................
#include"MyMMCFat32.h"
#include"MyMMCFat32.c"
....................
....................
voidmain()
{
charf,v,msg[64],gfilename[32];
chargPrevCard,gActCard;//previousandactualcardstates(inserted,
removed)
....................//otherdeclarations
....................
....................//INITcodeparts
....................
InitClockInt();//inittheclockchip
ReadClock();//readthecurrenttime
if(!input(CardInserted)){//ifMMCcardisinplace
do{
output_high(REDLED);
v=MMCInit();//initthecard
delay_ms(50);
output_low(REDLED);
delay_ms(50);
}while(!v);
output_high(YELLOWLED);
InitFAT();//initthefilesystem
output_low(YELLOWLED);
output_low(REDLED);
}
..................
strcpy(gfilename,"EVENTS.LOG");
f=fopen(gfilename,'a');//openEVENTS.LOGforappend
if(f<MAXFILES){
sprintf(msg,"%04lu.%02u.%02u.%02u:%02u:%02u

",myrec.tm_year,myrec.tm_mon,myrec.tm_mday,myrec.tm_hour,myrec.tm_min,myrec.t
m_sec);
fputstring(msg,f);
strcpy(msg,"Systemstarted\r\n");
fputstring(msg,f);
fclose(f);
}
while(1){
restart_wdt();
ResetPorts();
DoIdle();//Idlefunctionincl.clockupdate
....................
....................
gActCard=input(CardInserted);
if(gActCard)output_high(REDLED);
elseoutput_low(REDLED);
if(gActCard==0&&gPrevCard!=0){//cardwaspulledoutthen
pushedbacknow
delay_ms(50);
do{
output_high(REDLED);
v=MMCInit();
delay_ms(50);
output_low(REDLED);
delay_ms(50);
}while(!v);
output_high(YELLOWLED);
InitFAT();
output_low(YELLOWLED);
output_low(REDLED);
delay_ms(50);
strcpy(gfilename,"EVENTS.LOG");
f=fopen(gfilename,'a');
if(f<MAXFILES){
sprintf(msg,"%04lu.%02u.%02u.%02u:%02u:%02u
",myrec.tm_year,myrec.tm_mon,myrec.tm_mday,myrec.tm_hour,myrec.tm_min,myrec.t
m_sec);
fputstring(msg,f);
strcpy(msg,"Memorycardreplacement\r\n");
fputstring(msg,f);
fclose(f);
}
}
gPrevCard=gActCard;
}
}
/*othershortexamples:
1:tosendoutafilecontenttoserialline
strcpy(gfilename,"SMSDATA.TXT");
f=fopen(gfilename,'r');
if(f<MAXFILES){
while(fgetch(&c,f))fputc(c,HOST2);
fclose(f);
}
2:tosavedailymeasures:
sprintf(gfilename,"BERS/%04lu%02u
%02u.BER",myrec.tm_year,myrec.tm_mon,myrec.tm_mday);//thefilenameis

YYYYMMDD.BER
f=fopen(gfilename,'a');
for(actidx=0;actidx<22;actidx++){//tosavethelast22updated
measures
if(!bit_test(saveflags,actidx))continue;//skipifthisrecordis
notupdated
gBER=gLastBERs[actidx];
if(f<MAXFILES)fwrite(&gBER,sizeof(gBER),f);
}
fclose(f);
*/

Sorry about definitions


Posted: Thu Mar 22, 2007 10:54 am

Sorry for that, always include "my6720.h" what looks like this:
Code:
#byteSTATUS=0xFD8
#bitbCARRY=STATUS.0
#byteport_A=0xF80
#byteport_B=0xF81
#byteport_C=0xF82
#byteport_D=0xF83
#byteport_E=0xF84
#byteport_F=0xF85
#byteport_G=0xF86
#bytetris_A=0xF92
#bytetris_B=0xF93
#bytetris_C=0xF94
#bytetris_D=0xF95
#bytetris_E=0xF96
#bytetris_F=0xF97
#bytetris_G=0xF98
#bytePCON=0xFD0
#bytebRCSTA=0xFAB
#definebCREN4
#definebOERR2
#byteSSPADD=0xFC8
#byteSSPCON1=0xFC6
#byteSSPCON2=0xFC5
#byteSSPBUF=0xFC9
#byteSSPSTAT=0xFC7
#bytePIR1=0xF9E
#bytePIE1=0xF9D
#bytePIR2=0xFA1
#bitSSPOV=SSPCON1.6
#bitSEN=SSPCON2.0
#bitRSEN=SSPCON2.1
#bitPEN=SSPCON2.2
#bitRCEN=SSPCON2.3
#bitACKEN=SSPCON2.4
#bitACKDT=SSPCON2.5
#bitACKSTAT=SSPCON2.6
#bitSSPIF=PIR1.3
#bitBCLIF=PIR2.3

#bitBF=SSPSTAT.0

Thes are simple register definitions.

Other functions
Posted: Mon Mar 26, 2007 2:43 am

Some people have problems using my FAT32 code especially with undefined functions.
You can find below some short explanations.
1. The clock functions. I use a Ricoh clock chip to get a real time clock because my target circuit
is a data logger.
InitClockInt() funtion sets up the INT_A output of the chip as 32768Hz clock output so it is called
only once in early main() in initialization section. It is then connected to the PIC's TIMER1 input
to get an interrupt in every 2 seconds. The logger has battery-backup solar power supply so I
have to use Sleep() to minimize the power consumption. The target board is waked up in every
2 seconds.
2. ReadClock() functions reads out the current date and time and stores the data in a standard
"struct tm" structure. The definition:
Code:
typedefstruct{
unsignedlongtm_year;
chartm_mon;
chartm_day;
chartm_mday;
chartm_hour;
chartm_min;
chartm_sec;
}RAMRecord;

It is important to handle the creation/modification dates in a file system if it is used for data
loggers. If you don't want to use correct times then simply use a fixed date/time or you can use
a software clock.
3. ResetPorts() function is called as frequently as possible to set up the port TRIS registers,
timer settings, etc. It is an old Microchip suggession to make a stable card in a noisy
environment (the TRIS registers could be corrupted by high level noises). If you have a stable
power supply and could keep external noises in an affordable low level then simply use an empty
function:
Code:
voidResetPorts()
{
}

4. DoIdle() function is called when a TIMER1 interrupt occurs. So normally it is called in every 2
seconds. It is the main data logger function. A small example what it has to do:
a/ Update the clock structure by calling ReadClock()
b/ Get the current wind speed and direction. Store it on MMC if necessary.
c/ If the old minute differs from the newly read then one minute is elapsed; read the
temperatures, pressure, etc. so get the "one minute averages" and store them in a file (MMC).

d/ After these, call Restart_wdt() and Sleep() to enter into sleep mode and to wait the next
timer1 interrupt.

Vous aimerez peut-être aussi