Libro Blanco de Hardware

download Libro Blanco de Hardware

of 54

Transcript of Libro Blanco de Hardware

  • 8/18/2019 Libro Blanco de Hardware

    1/54

    Libro Blanco de HardwareDiseño de Hardware para sistemas operativos Microsoft ®

    FAT: Panorama general de formato endisco

    Versión 1!"# !$ de ma%o 1&&&Microsoft 'orporation

    (l sistema de arc)ivos FAT *File Allocation Ta+le, tiene s-s or.genes en lad/cada de 1&0! % earl%1&!s % f-e el sistema de arc)ivos compati+le con elsistema operativo Microsoft ® M23D42 ® F-e 4riginalmente desarrollado

    como -n sistema simple de arc)ivos adec-ados para dis5-ete cond-ce menosde $!! 6 en tamaño 'on el tiempo se )a me7orado para soportar los mediosde com-nicación cada ve8 m9s grandes (n la act-alidad )a% tres tipos desistema de arc)ivos FAT: FAT1"# FAT1 % FAT;"

  • 8/18/2019 Libro Blanco de Hardware

    2/54

    FAT (str-ct-ra dedirectorios>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"14tras notas relativas a los directoriosFAT "

    (speciBcación>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"$

    Microsoft# M2CD42# indows % indows ET son marcas comerciales o marcascomerciales registradas de Microsoft 'orporation en los (stados nidos% G - otros pa.ses 4tros nom+res de prod-ctos % compañ.as a5-. mencionadosp-eden ser marcas comerciales de s-s respectivos propietarios 1&&& Microsoft 'orporation Todos los derec)os reservados

    RenunciaIMPORTANTE-LEA DETENIDAMENTE: (ste ac-erdo de Microsoft *IAc-erdoI, es -n legal ac-erdo entre-sted *sea persona f.sica o 7-r.dica, % Microsoft 'orporation *IMicrosoftI, para esta versión de laespeciBcación de Microsoft identiBcado anteriormente *I(speciBcacionesI,AL DESCARAR! COPIAR O "TILI#AR LAS ESPECI$ICACIONES! "STED ACEPTA LOS T%RMINOS DEESTE AC"ERDO& SI NO ESTO' DE AC"ERDO CON LOS T%RMINOS DE ESTE AC"ERDO! NODESCAR"E! COPIAR! O "TILI#AR LA ESPECI$ICACI(N&

  • 8/18/2019 Libro Blanco de Hardware

    3/54

    *', (l pacto de no demandar descrito anteriormente de+er9 estar disponi+le para -sted % se dar9 porterminado de inmediato si sted o alg-no de s-s aBliados *colectivamente IPartes covenanteeI, IiniciaI -naacción por infracción de patente contra: *L, Microsoft o c-al5-iera de s-s Bliales *colectivamente I'oncesiónPart%I,# *%, los clientes o distri+-idores de la concesión Partes# - otros destinatarios de -n pacto de nodemandar con respecto a la especiBcación de la Parte 5-e otorga *I'ovenanteesI,# o *8, los clientes odistri+-idores de 'ovenantees *todas las partes identiBcadas en *%, % *8, colectivamente denominadosI'lientesI,# 5-e la acción se +asa en -na aplicación conforme de la (speciBcaciones 'omo se -sa a5-.#

    IABliadaI signiBca c-al5-ier entidad 5-e controla# directa o indirectamente# es controlada por# oest9 +a7o el control com@n de -na Besta# % control: la energ.a# %a sea directo o indirecto# de dirigir o)acer 5-e el directo de la gestión o pol.ticas de c-al5-ier entidad %a sea a trav/s de la propiedad de losvalores de voto# por contrato o de otra manera I?niciadosI signiBca 5-e -na Parte covenantee es la primera*como las de la Parte 5-e otorga % el Partido covenantee, para presentar o instit-ir c-al5-ier reclamación oacción legal o administrativa por violación de patentes contra el Partido concesión o c-al5-iera de losclientes I?niciadosI incl-%e c-al5-ier sit-ación en la 5-e -na Parte covenantee arc)ivos o inicia -nareclamación o acción legal o administrativa por violación de patentes @nicamente como -na reconvención oe5-ivalente en resp-esta a -na Parte 5-e a-tori8a la primera presentación o instit-ir -na infracción depatente legal o administrativa reclamación contra dic)a Parte covenantee

    *D, (l pacto de no demandar descrito anteriormente no se eJtiende al -so de c-al5-ier parte de laespeciBcación para ning@n propósito 5-e no sea *a, para crear partes de -n sistema operativo *i, sólo c-andosea necesario para adaptar tales sistema operativo para 5-e p-eda interact-ar directamente con -na

    aplicación de Brmware del Brmware eJtensi+le ?niciativa (speciBcación v 1! *I(speciBcación (F?I,# *ii, sóloc-ando sea necesario para em-lar -na implementación de la (F? (speciBcación# % *+, para crear el Brmware#aplicaciones# -tilidades % G o controladores 5-e se -tili8ar9n % G o a-tori8ados para el sólo los sig-ientespropósitos:

    *i, para instalar# reparar % mantener el )ardware# Brmware % partes de f-ncionamiento2oftware del sistema 5-e se -tili8a en el proceso de arran5-e#*ii, para proporcionar a -na empresa de servicios de tiempo de e7ec-ción del sistema operativo 5-ese especiBcan en el Pliego de (F?#

      *iii, Para diagnosticar % corregir fallas en el )ardware# Brmware o de f-ncionamientosoftware del sistema *iv, para la cons-lta para la identiBcación de -n sistema inform9tico *%a seapor n@meros de serie# eti5-etas de activos# el -s-ario o de otra manera, *v, para reali8ar el inventario de -n sistema inform9tico# %*vi, para fa+ricar# instalar % conBg-rar c-al5-ier)ardware# Brmware o software del sistema operativo

    *e, Microsoft se reserva todos los dem9s derec)os 5-e p-eda tener en la memoria % la propiedad intelect-alen el mismo

  • 8/18/2019 Libro Blanco de Hardware

    4/54

    colectivamente como el Irestringido 'omponentes I, de los (stados nidos se rige por el Keglamento deAdministración de (Jportaciones *(AK# 1$ 'FK 0;! a 0, del Departamento de 'omercio de ((# la4Bcina de Administración de (Jportaciones *I=LAI, sted se compromete a c-mplir con la (AK en laeJportación o reeJportación de los 'omponentes restringidos *i, a c-al5-ier pa.s al 5-e los (( )a%aem+argado o restringido la eJportación de +ienes o servicios# 5-e incl-%en en la act-alidad# pero no sonnecesariamente limitado a '-+a# ?r9n# ?raO# "IER PROPIEDAD INTELECT"AL EN EL MISMO& EL RIESO EN C"ANTOA LA CALIDAD DE O DERI?ADOS DEL "SO O LA E@EC"CI(N DEL PLIEO DE CONDICIONES!C"AL>"IER PROPIEDAD INTELECT"AL EN EL MISMO! ' SER?ICIOS DE APO'O! EN S" CASO! 1e8ueda con u1tede1&& E+CL"SI(N DE DAOS INCIDENTALES! CONSEC"ENCIALES ' OTROS DAOS& AL MEDIDAM+IMA PERMITIDA POR LAS LE'ES APLICABLES! EN NINN CASO MICROSO$T O S"SPRO?EEDORES SERN RESPONSABLES POR NINN DAO ESPECIAL! INCIDENTAL! INDIRECTO OCONSEC"ENTE DAO 5INCL"'ENDO! PERO NO LIMITADO A! DAOS POR P%RDIDA DE BENE$ICIOSO DE IN$ORMACI(N CON$IDENCIAL O DE OTRO TIPO! INTERR"PCI(N DE LA ACTI?IDADCOMERCIAL! LESIONES PERSONALES! P%RDIDA DE PRI?ACIDAD! POR INC"MPLIMIENTO DEOBLIACIONES! 'A SEA DE B"ENA $E O C"IDADO RA#ONABLE! NELIENCIA ' POR C"AL>"IEROTRA PEC"NIARIA O DE AL"NA OTRA P%RDIDA6 DERI?ADOS O DE AL"NA MANERARELACIONADOS CON EL "SO O LA IMPOSIBILIDAD DE "SO DEL PLIEO DE CONDICIONES!C"AL>"IER PROPIEDAD INTELECT"AL ELLOS! LA PRO?ISI(N O $ALLA EN LA PRO?ISI(N DESER?ICIOS DE SOPORTE " OTRO BA@O O EN RELACI(N CON C"AL>"IER DISPOSICI(N DE ESTEAC"ERDO! A"N EN EL CASO DE $ALLA! ARA?IO 5INCL"'ENDO NELIENCIA6! RESPONSABILIDADESTRICTA! INC"MPLIMIENTO DE CONTRATO O ?IOLACI(N DE LA ARANT,A DE MICROSO$T OC"AL>"IER PRO?EEDOR INCL"SO SI MICROSO$T O C"AL>"IER PRO?EEDOR HA SIDO AD?ERTIDODE LA POSIBILIDAD DE TALES DAOS

    & LIMITACI(N DE RESPONSABILIDAD ' REC"RSOS& Sin /erFuicio de cual8uier daGo 8ue /udieraincurrir /or cual8uier *oti3o 5inclu0endo! 1in li*itacin! todo1 lo1 daGo1 *encionado1anterior*ente 0 todo1 lo1 directo1 o daGo1 4enerale16! la re1/on1abilidad total de Micro1o2t 0cual8uiera de 1u1 /ro3eedore1 baFo cual8uier di1/o1icin de e1te Acuerdo 0 el nico recur1o /aratodo lo anterior 1e li*itarn a la *a0ordel i*/orte abonado /or u1ted /ara la e1/eci=cacin oEE&""& J&KK& La1 li*itacione1 anteriore1!e.clu1ione1 0 li*itacione1 de re1/on1abilidad 1e a/licarn en la *edida *.i*a /er*itida /or lale0 a/licable! inclu1o 1icual8uier recur1o no cu*/le 1u /ro/1ito e1encial&& LE' APLICABLE& Si ;a ad8uirido e1te Plie4o en lo1 E1tado1 "nido1! e1te acuerdo 1e ri4e /or lale0e1 del E1tado de a1;in4ton& Si ;a ad8uirido e1te Plie4o en Canad! a *eno1 8uee./re1a*ente /ro;ibida /or la1 autoridade1 locale1 le0! e1te acuerdo e1t 4obernado /or la1le0e1 3i4ente1 en la Pro3incia de Ontario! Canad! 0! con re1/ecto a cual8uier contro3er1ia 8ue/ueda 1ur4ir acerca del *i1*o! 1e 1o*ete a la Furi1diccin de lo1 tribunale1 2ederale1 0

    http://www.microsoft.com/exportinghttp://www.microsoft.com/exportinghttp://www.microsoft.com/exporting

  • 8/18/2019 Libro Blanco de Hardware

    5/54

    /ro3inciale1 8ue 1e 1ientan en Toronto! Ontario& Si e1ta e1/eci=cacin 2ue ad8uirido 2uera de lo1E1tado1 "nido1! 1ern de a/licacin la1 le0e1 locale1&)K&>"ESTIONS& Si tiene al4una /re4unta relacionada con e1te Acuerdo! o 1i de1ea /oner1e encontacto Micro1o2t /or cual8uier rauel1 ET A?EC TO"Sleur1 d2aut1! et /ar le1 /re1ente1 e.cluent toute 4arantie ou condicin e./re11e ou i*/licite!l4ale ou con3entionnelle! crite ou 3erbal! 0 co*/ri1! *ai1 1an1 li*itacin! toute 51elon le ca164arantie ou ou condicione1 i*/licite l4ale de 8ualit *arc;ande! de con2or*it U un u1o/articulier! dau1encia de 3iru1! de.actitude et dint4ralit de1 r/on1e1! de r1ultat1!de12uer"ESD%CO"LANT ET DE L"TILI#ACI(N DE LA E@EC"CI(N DE LA E1/eci=cacin ET DE TO"TE Pro/iedadIntelectual DANS CELLE-CI ET ceu. D%CO"LANT DES DSER?ICIOS DE ASISTENCIA 5SIL 'A ?E#6&E+CL"SI(N DES do**a4e1 INDIRECTOS! ACCESORIOS ET A"TRES& Dan1 toute la *e1ure /er*i1e/ar la l4i1lation en 3i4ueur! Micro1o2t et 1e1 2ourni11eur1 ne 1ont en aucun ca1 Re1/on1able1 detout do**a4e e1/eciale1! indirecto1! Acce1orio! *oral ou e.e*/laire 8uel 8uil 1oit 50 co*/ri1!*ai1 1an1 li*itacin! le1 do**a4e1 entraXn1 /ar la /erte de bn=ce1 ou la /erte din2or*ationcon=dentielle ou autre! linterru/cin de1 aYaire1! le1 /reFuicio1 cor/orel1! la /erte decon=dentialit! le d2aut de re*/lir toute obli4acin 0 co*/ri1 le1 obli4acione1 de bonne 2oi etde dili4encia rai1onnable! la n4li4ence et toute autre /erte /cuniaire ou autre /erte de8uel8ue naturaleue ce 1oit6 dcoulant de! ou de toute autre *aniZre li U! lutiliue ce 1oit en ca1 de 2aute! de dlit 50 co*/ri1 la ne4li4encia6!de re1/on1abilit 1tricte! de *an8ue*ent U un contrat de *an8ue*ent ou U une arantie deMicro1o2t ou de lON" de 2ourni11eur1 1e1! et ce! *e*e SI Micro1o2t ou lun de 1e1 2ourni11eur1un t A3i1e De La /o11ibilit de tel1 do**a4e1& LIMITACI(N DE re1/on1abilit ET recour1&Mal4r tout do**a4e >ue 3ou1 /ourrie< encourir 3ierta 8uel8ue raue ce 1oit 50 co*/ri1!*ai1 1an1 li*itacin! tou1 le1 do**a4e1 *entionn1 ci-de11u1 et tou1 le1 do**a4e1 diri4e et4nrau.6! la 1eule re1/on1abilit de Micro1o2t et de 1e1 2ourni11eur1 en 3ertu de toutedi1/o1icin de cette con3encin et 3otre nica recour1 en relacin de tout ce 8ui 1ont /recedenLi*ite1 au /lu1 le3 de1 *ontant1 1ui3ant1: 1oit 5a6 le *ontant >ue 3ou1 a3e< /a0 /our lae1/eci=cacin! 1oit 5b6 1in e8ui3alant *ontant U cin8 dlare1 EE&""& 5J!KK dlare1 de lo1 EE&""&6&Le1 li*itacione1! e.clu1ione1 et renonciation1 ci-de11u1 1a//li8uent dan1 toute la *e1ure/er*i1e /ar la l4i1lation en 3i4ueur! et ce *[*e 1i leur a/licacin de un 3ertido eYet de /ri3er

    1in recour1 de 1on e1encia& Droit1 Li*ite1 D" O"?ERNEMENT A*ericain Tout Produit Lo4iciel2ourni au 4ou3erne*ent a*ricain con2or**ent U de1 de*ande1 *i1e1 le ou a/rZ1 le )erdce*bre )J e1t oYert a3ec le1 re1triccione1 et droit1 co**erciau. dcrit1 ailleur1 dan1 la/re1ente con3encin& Tout Produit Lo4iciel 2ourni au 4ou3erne*ent a*ricain con2or**ent Ude1 de*ande1 *i1e1 3an4uardia le )er dce*bre )J e1t oYert a3ec de1 droit1 Li*ite1 tel1>ue /r3u1 dan1 le $AR! \C$R J&-)\ 5Fuin )6 dan1 ou le $AR! \C$R J&-K)Q5octobre )6! 8ua//licable1 tel1&

  • 8/18/2019 Libro Blanco de Hardware

    6/54

    Con3encione1 utili

  • 8/18/2019 Libro Blanco de Hardware

    7/54

    Boot Sector 0 BPB

  • 8/18/2019 Libro Blanco de Hardware

    8/54

    Sector de arran8ue 0 e1tructura BPBNo*bre OY1e

    t5b0te

    6

    ta*aGo

    5b0te16

    De1cri/cin

    !"#$m%!oot K Q ?nstr-cciones para arrancar el código (stecampo tiene dos formas permitidas: F*/Boot ]K^ _ K.EB! F*/Boot ])^ _ K.``! F*/Boot ]^ _ K.K% F*/Boot ]K^ _ K.E! F*/Boot ])^ _ K.``! F*/Boot ]^ _ K.``K.`?ndica 5-e c-al5-ier valor de +its est9permitido en ese +%te lo 5-e esto formas es-na de tres +%tes ?ntel J salto incondicional*salto, instr-cción 5-e salta al inicio delarran5-e del sistema operativo código (stecódigo normalmente oc-pa el resto del sector! del vol-men sig-iendo el =P= %posi+lemente otros sectores '-al5-iera deestas formas es acepta+le @*/Boot ]K^ W se-tili8a con m9s frec-encia la K.EB formato

    !"#&'ame Q IM2?E1I Ha% m-c)os conceptos erróneosacerca de este campo (s sólo -na cadena denom+re

  • 8/18/2019 Libro Blanco de Hardware

    9/54

    FAT podr.an no reconocer la vol-menEormalmente esto es -na indicación de lo 5-eel formato del sistema el vol-men

    !*!#!yts*er"ec )) 'ontador de +%tes por sector (ste valorp-ede as-mir sólo los sig-ientes valores: $1"#

    1!"# "! o !& 2i se desea la m9Jimacompati+ilidad# solamente el valor $1" sede+e -tili8ar Ha% -na gran cantidad de códigoFAT en el m-ndo 5-e es# +9sicamente#Ias-midaI a $1" +%tes por sector % no semolesta en compro+ar este campo paraaseg-rarse de 5-e es $1"

  • 8/18/2019 Libro Blanco de Hardware

    10/54

    aseg-rarse de 5-e es 1 2istemas operativoMicrosoft apo%ar9n correctamente c-al5-iervalor distinto de cero en este campo

    !*!#,mFATs ) ) (l rec-ento de las estr-ct-ras de datos FAT enel vol-men (ste campo de+e siempre

    contendr9 el valor " para c-al5-ier vol-menFAT de c-al5-ier tipoA-n5-e c-al5-ier valor ma%or 5-e o ig-al a 1es perfectamente v9lido# m-c)os programasde software % arc)ivos FAT alg-nos sistemasoperativos Icontroladores del sistema p-edenno f-ncionar correctamente si el valor es algodistinto de " Todos los controladores delsistema de arc)ivos de Microsoft apo%ar9 -nvalor otro de "# pero sig-e siendo m-%recomenda+le 5-e otro valorde " -sarse en este campo

  • 8/18/2019 Libro Blanco de Hardware

    11/54

    =P=CTot2ec;" distinto de cero Paravol@menes FAT;"# este campo de+e ser !Para FAT1" % Vol@menes FAT1# este campocontiene el n@mero de sector % =P=CTot2ec;"es ! si el sector rec-ento total de Ia7-stesI *es

    menor 5-e !J1!!!!,!*!#edia ) ) !JF es el valor est9ndar para *no eJtra.+le,los medios de com-nicación IB7osI Paramedios eJtra.+les# se -tili8a con frec-encia!JF!

  • 8/18/2019 Libro Blanco de Hardware

    12/54

    5-e no particionado (Jactamente lo 5-e elvalor es apropiada est9 operando sistemaespec.Bco

    !*!#Tot"ec32 Q \ (ste campo es el n-evo rec-ento total de ;"+its de sectores en el vol-men (ste rec-ento

    incl-%e el rec-ento de todos los sectores enlas c-atro regiones del vol-men (ste campop-ede ser !# % si es !# entonces de+e )a+er=P=CTot2ec1distinto de cero Para vol@menesFAT;"# este campo de+e ser distinto de ceroPara Vol@menes FAT1"GFAT1# este campocontiene el rec-ento de sector si=P=CTot2ec1 es ! *de conta7e es ma%or 5-e oig-al a !J1!!!!,

    (n este p-nto# el sector =P= G arran5-e de FAT1" % FAT1 diBere delsector de =P= G arran5-e para FAT;"

  • 8/18/2019 Libro Blanco de Hardware

    13/54

    permiten FAT controladores del sistema dearc)ivos para detectar 5-e el discoe5-ivocado se inserta en -na -nidadeJtra.+le (ste ?D se genera por lo generalsimplemente com+inando la fec)a % la )ora

    act-ales en -n valor de ;" +its!"#ola4 \Q )) (ti5-eta de vol-men (ste campo coincide conla eti5-eta de vol-men de 11 +%tes registradaen el directorio ra.8E4TA: los controladores del sistema dearc)ivos FAT de+en aseg-rarse de 5-e seponen al d.a este campo c-ando el arc)ivo deeti5-eta de vol-men en el directorio ra.8 tienes- Eom+re cam+iado o creado

  • 8/18/2019 Libro Blanco de Hardware

    14/54

    !*!#FAT".32 Q \ (ste campo sólo est9 deBnido para los mediosde com-nicación FAT;" % no eJiste en FAT1" %FAT1 medios (ste campo es el n@mero de ;"+its de FAT;" sectores oc-pados por EA FAT=P=CFAT281 de+e ser !

    !*!#'xtFlags \K (ste campo sólo est9 deBnido para los mediosde com-nicación FAT;" % no eJiste en FAT1" %FAT1 medios=its !3; 3 n@mero de FAT activa de +ase cero2ólo es v9lido si la d-plicación se desactiva=its 3 3 Keservados=it 03! signiBca 5-e el FAT se reYe7a en tiempode e7ec-ción en todas las FATs3 1 signiBca 5-e sólo -no FAT est9 activo# es el5-e )ace referencia en los +its !3;=its 31$ 3 Keservados

    !*!#F"er  \ (ste campo sólo est9 deBnido para los mediosde com-nicación FAT;" % no eJiste en FAT1" %FAT1 medios =%te alto es ma%or el n@mero derevisión =%te +a7o es el n@mero de revisiónmenor (ste es el n@mero de versión deel vol-men FAT;" (sto apo%a la capacidad deeJtender la FAT;" tipo de papel en el f-t-ro sintener 5-e preoc-parse acerca de loscontroladores FAT;" antig-as el vol-men demonta7e (ste doc-mento deBne la versión de

    !:! 2i este campo es distinto de cero# lasversiones de niveles anteriores de indows nose montan el vol-menE4TA:

  • 8/18/2019 Libro Blanco de Hardware

    15/54

    posi+le para colocar el primer gr-po de la ra.8directorio en el primer no3cl@ster no v9lido en la-nidad *es decir# en el gr-po "# a menos 5-eest/ marcada malo, (sto se especiBca demanera 5-e los servicios de reparación de disco

    p-ede f9cilmente encontrar el directorio ra.8 sieste campo penetra accidentalmente p-esto acero

    !*!#F"n5o \ (ste campo sólo est9 deBnido para los mediosde com-nicación FAT;" % no eJiste en FAT1" %FAT1 medios E@mero de sector de laestr-ct-ra F2?EF4 en el 9rea del vol-men FAT;"reservados Por lo general# 1E4TA: Ha+r9 -na copia de la estr-ct-ra F2?EF4en =acO-p=oot# pero sólo la copia a la 5-eap-nta se mantendr9 este campo )asta la fec)a*es decir# tanto en el registro de arran5-eprincipal % de respaldo se ap-ntan a la misma2ector de F2?EF4,

    !*!#!/!oot"e

    cJK (ste campo sólo est9 deBnido para los medios

    de com-nicación FAT;" % no eJiste en FAT1" %FAT1 medios 2i no es cero# indica el n@mero desector en la 8ona reservada del vol-men de -nacopia del registro de arran5-e Por lo general Eo se recomienda el valor distinto de

    !*!#Reserved J ) (ste campo sólo est9 deBnido para los medios

    de com-nicación FAT;" % no eJiste en FAT1" %FAT1 medios Keservado para -na f-t-raeJpansión 'ódigo 5-e da formato a vol@menesFAT;" siempre de+en esta+lecer todos los +%tesde este campo a !

    !"#Drv,m \ ) (ste campo tiene la misma deBnición 5-e se)ace para FAT1" % FAT1 los medios decom-nicación

  • 8/18/2019 Libro Blanco de Hardware

    16/54

    )ace para FAT1" % FAT1 los medios decom-nicación

  • 8/18/2019 Libro Blanco de Hardware

    17/54

    alg-na manera 2in em+argo# si =P=CTot2ec1G;" es m9s grande 5-eDsO28# el vol-men es serio dañado o con formato incorrecto por5-e seeJtiende m9s all9 del eJtremo de los medios de com-nicación o datosde s-perposiciones 5-e sig-e en el disco (l tratamiento de -n vol-menen el 5-e el valor =P=CTot2ec1G;" es Idemasiado grandeI para los

    medios de com-nicación o partición como v9lido p-ede provocar lap/rdida de datos catastróBca

    ESTR"CT"RA DE LOS DATOS DEL $AT

  • 8/18/2019 Libro Blanco de Hardware

    18/54

    -nidad# %a 5-e el sector ! del vol-men no es necesariamente sector !de la -nidad de+ido a la particiónDado c-al5-ier n@mero E de datos de cl@ster v9lido# el n@mero de sectordel primer sector de ese cl@ster *de n-evo en relación con el sector ! delvol-men FAT, se calc-la de la sig-iente manera:

    *irstSectoro)!/ster = (( % 2# " BPB_SecPer!/s# $ *irstDtSector'

    E4TA: De+ido a =P=C2ecPer'l-s se limita a potencias de " *1#"###1#;",# esto signiBca 5-e la división % la m-ltiplicación por =P=C2ecPer'l-srealidad se p-eden reali8ar a trav/s de operaciones de cam+io de "scomplementan las ar5-itect-ras 5-e s-elen ser m9s r9pidas 5-e lasinstr-cciones las instr-cciones M

  • 8/18/2019 Libro Blanco de Hardware

    19/54

    A contin-ación# se determina el n@mero de sectores en la región dedatos del vol-men:)(BPB_*+,S-16 .= 0#*+,S- = BPB_*+,S-16'E/se*+,S- = BPB_*+,S-32')(BPB_,otSec16 .= 0#

    ,otSec = BPB_,otSec16'E/se,otSec = BPB_,otSec32'DtSec = ,otSec % (BPB_ResSec!t $ (BPB_*+,s " *+,S-# $ RootDirSectors#'

    A)ora determinamos el rec-ento de los cl-sters:!oto)!/sters = DtSec & BPB_SecPer!/s'

     Tenga en c-enta 5-e este c9lc-lo rondas a+a7oA)ora podemos determinar el tipo FAT Por favor, tenga cuidado, o secometa un error o-by-one!

    (n el sig-iente e7emplo# c-ando se dice [# esto no signiBca [W Tenga

    en cuenta también que las cifras son correctas.(l primer n@mero de FAT1" es !$# % el seg-ndo n@mero para FAT1 es$$"$ (stos n@meros % los 2ignos I[I no se e5-ivocan

    )(!oto)!/sters 4085# &" o/e is *+,12 "& e/se i)(!oto)!/sters 65525# &" o/e is *+,16 "& e/se &" o/e is *+,32 "&

    (sta es la manera en 5-e -no % sólo se determina 5-e tipo de FAT Eo)a% tal cosa como -n vol-men FAT1" 5-e c-enta con m9s de !gr-pos Eo )a% tal cosa como -n vol-men FAT1 5-e tiene menos de!$ agr-paciones o m9s de $$" gr-pos Eo )a% tal cosa como -nvol-men FAT;" 5-e tiene menos de $$"$ gr-pos 2i -sted trata de)acer -n vol-men FAT 5-e viole esta regla# los sistemas operativos deMicrosoft no mane7arlos correctamente por5-e van a pensar 5-e elvol-men tiene -n tipo diferente de la FAT 5-e lo 5-e -sted creeE4TA: 'omo se o+serva en n-merosas ocasiones antes# el m-ndo est9lleno de código de FAT 5-e est9 mal Ha% -na gran cantidad de código

    de tipo de FAT 5-e es apagado por 1 o " o o 1! o 1 Por esta ra8ón# serecomienda 5-e si est9 formateando -n vol-men FAT 5-e tiene lam9Jima compati+ilidad con todos los códigos eJistentes FAT# entonces-sted de+e evitar )acer vol@menes de c-al5-ier tipo 5-e tiene cerca de!$ o $$"$ gr-posMant/ngase por lo menos 1 gr-pos en cada lado le7os de estosrec-entos racimo de corte m9s

  • 8/18/2019 Libro Blanco de Hardware

    20/54

     Tenga en c-enta tam+i/n 5-e el valor 'o-ntof'l-sters es eJactamenteeso# el rec-ento de gr-pos de datos a partir de cl@ster " (l n@merom9Jimo de cl@ster v9lido para el vol-men es 'o-ntof'l-sters \ 1# % elIrec-ento de gr-pos# incl-%endo los dos gr-pos reservadas Ies'o-ntof'l-sters \ " Ha% -n c9lc-lo m9s importante relacionada con la

    FAT Dado c-al5-ier n@mero de cl@ster E v9lido# donde en el FAT *s, es laentrada para ese n@mero de cl@ster (l @nico tipo FAT para las 5-e estoes comple7o es FAT1" Para FAT1 % FAT;"# el c9lc-lo es simple:

    )(BPB_*+,S-16 .= 0#*+,S- = BPB_*+,S-16'E/se*+,S- = BPB_*+,S-32')(*+,,y:e == *+,16#*+,;))set = " 2'E/se i) (*+,,y:e == *+,32#

    *+,;))set = " 4'

    ,

  • 8/18/2019 Libro Blanco de Hardware

    21/54

     Tenga en c-enta cómo f-nciona el código FAT;" anteriormente na entrada de FATFAT;" es en realidad sólo -na entrada de "3+it (l alto +its de -na entrada FAT FAT;"son reservados

  • 8/18/2019 Libro Blanco de Hardware

    22/54

    E/se *+,12!/sEtry/ = *+,12!/sEtry/ ? 0@0***' &" !/ster ber is EE "&"((>;RD "# ?SecB))[,

  • 8/18/2019 Libro Blanco de Hardware

    23/54

    asigna+le

  • 8/18/2019 Libro Blanco de Hardware

    24/54

    de estos IeJtrasI son sectores FAT 'ódigo de formato FAT de+er.a cero el contenido deestos sectores eJtra FAT em+argo

    ?E?'?A

  • 8/18/2019 Libro Blanco de Hardware

    25/54

    " bei i))eret y reNire t

  • 8/18/2019 Libro Blanco de Hardware

    26/54

    demasiado grande# a eJpensas de perder -nos pocos sectores# el )ec)o de 5-e estec9lc-lo es sorprendentemente simple m9s de lo compensa estar f-era de forma seg-raen alg-nos casos

    FAT;" fsinfo (str-ct-ra 2ectorial % el sector de inicio de copia de seg-ridad (n -nvol-men FAT;"# la FAT p-ede ser -na gran estr-ct-ra de datos# a diferencia de en

    FAT1 donde se limita a -na m9Jimo de valor de 1"6 de sectores % FAT1" donde selimita a -n m9Jimo de valor de 6 sectores Por esta ra8ón# se )ace -na provisión paraalmacenar la I@ltima conocidaI c-enta agr-pación li+re en el FAT;" vol-men de forma5-e no tiene 5-e ser calc-lado en c-anto se )i8o -na llamada a la AP? de preg-ntarc-9nto li+re el espacio 5-e )a% en el vol-men *como en el eJtremo de -n listado dedirectorio, (l n@mero es el sector fsinfo valor en el campo =P=CF2?nfo para lossistemas operativos de Microsoft 5-e siempre se esta+lece en 1 (sta es la estr-ct-radel sector fsinfo:

    $ATQ 21in2o E1tructura Sectorial 0 el 1ector de inicio de co/ia de1e4uridad

    No*bre OY1et5b0te6

    ta*aGo5b0te16

    De1cri/cin

    F"#ead"ig K \ Valor !J11$"$" (sta Brma deplomo se -sa para validar 5-e estees de )ec)o -n sector fsinfo

    F"#Reserved1 \ \K (ste campo est9 reservadoact-almente para -na f-t-raeJpansión formato FAT;" códigosiempre de+e iniciali8ar todos los+%tes de este campo es ! =%tesAct-almente este campo de+en-nca ser -tili8ado

    F"#"tr,c"ig \\ \ Valor !J110"0" 4tra Brma 5-e esm9s locali8ada en el sector a la-+icación de los campos 5-e se-tili8an

    F"#Free#+o,nt \ \ 'ontiene el @ltimo rec-ento cl@sterli+re conocida en el vol-men 2i elvalor es !JFFFFFFFF# entonces lac-enta li+re es desconocido % de+e

    ser calc-lado '-al5-ier otro valor sep-ede -tili8ar# pero no esnecesariamente corregir De+e estarregistrado rango# al menos# paraaseg-rarse de 5-e es [W vol-mende rec-ento de cl@ster

    F"#xt#Free \ ) (sta es -na s-gerencia para elcond-ctor FAT ?ndica el n@mero de

  • 8/18/2019 Libro Blanco de Hardware

    27/54

    cl@ster en 5-e el cond-ctor de+eempe8ar a +-scar gr-pos li+resDe+ido a 5-e -n FAT;" FAT esgrande# p-ede ser +astante lento si)a% -na gran cantidad de gr-pos

    asignados al inicio de la FAT % elcond-ctor comien8a en +-sca de -ngr-po li+re a partir de las " delcl@ster Eormalmente# este valor esesta+lecido en el @ltimo n@mero decl@ster 5-e el cond-ctor asignado 2iel valor es !JFFFFFFFF# entonces no)a% ning@n indicio % el cond-ctorde+e comen8ar mirando cl@ster "'-al5-ier otro valor se p-ede-tili8ar# pero de+e ser compr-e+anantes para aseg-rarse de 5-e es -nn@mero de cl@ster v9lido para lavol-men

    F"#Trail"ig JK \ (ste campo est9 reservadoact-almente para -na f-t-raeJpansión formato FAT;"código siempre de+e iniciali8ar todoslos +%tes de este campo es ! =%tesAct-almente este campo de+en-nca ser -tili8ado

    F"#Reserved2 \ ) Valor !JAA$$!!!! (sta Brma r-tase -tili8a para validar 5-e este es de)ec)o -n sector fsinfo Tenga enc-enta 5-e las altas " +%tes de estavalor 5-e entrar en los +%tes endespla8amientos $1! % $1135-ecoincida con los +%tes de Brma-tili8ados en las mismascompensaciones en el sector !

    4tra caracter.stica de los vol@menes FAT;" 5-e no est9 presente en FAT1GFAT1" es el

    campo =P=C=O=oot2ec FAT1GFAT1" vol@menes p-eden perderse totalmente si elcontenido del sector ! del vol-men o se so+rescri+en ! sector va mal % no se p-edeleer 2e trata de -n Ip-nto @nico de falloI de FAT1 % FAT1" vol@menes (l campo=P=C=O=oot2ec red-ce la gravedad de este pro+lema para los vol@menes FAT;"#por5-e a partir de ese n@mero de sector en el vol-men33)a% -na copia de seg-ridaddel sector de arran5-e información# incl-%endo =P= del vol-men (n el caso de 5-e lainformación ! sector )a sido so+rescrito por error# toda -na -tilidad de reparación dedisco tiene 5-e )acer es resta-rar el sector de arran5-e *s, a partir de la copia de

  • 8/18/2019 Libro Blanco de Hardware

    28/54

    seg-ridad (n el caso en el sector ! se ec)a a perder# esta permite 5-e el vol-men aser montado de manera 5-e el -s-ario p-ede acceder a los datos antes de s-stit-ir eldisco (ste seg-ndo caso del sector ! va mal3es la ra8ón por la 5-e ning@n valor 5-e nosea am9s colo5-e en el campo =P=C=O=oot2ec 2i el sector ! es ilegi+le# variossistemas operativos Ica+leadosI para compro+ar si )a% sector de inicio de copia deseg-ridad *s, a partir de sector del vol-men FAT;" Tenga en c-enta 5-e a partir de la

    =P=C=O=oot2ec sector es -n sector de arran5-e completo (l Isector de arran5-eIMicrosoft FAT;" es en realidad tres sectores de $1" +%tes de longit-d (Jiste -na copiade estos tres sectores a partir de la 2ector =P=C=O=oot2ec na copia del sector fsinfotam+i/n est9 a).# a pesar de 5-e el campo =P=CF2?nfo en este sector de inicio de copiade seg-ridad se esta+lece en el mismo valor 5-e se almacena en el sector ! =P=E4TA: Todos los ; de estos sectores tienen la Brma !JAA$$ de compensaciones delsector $1! % $11# al ig-al 5-e el primera sector de arran5-e )ace *ver la disc-siónanterior al Bnal de la descripción de la estr-ct-ra =P=,

    $AT E1tructura de directorio1(sta es la eJplicación m9s simple de entradas de directorio FAT (n este doc-mento se

    ignora totalmente la

  • 8/18/2019 Libro Blanco de Hardware

    29/54

    ATTR#R'AD#&7 0x01

    ATTR#DD' 0x02

    ATTR#"7"T' 0x08

    ATTR#&9'#D 0x0:

    ATTR#DR'+T&R7 0x10

    ATTR#AR+' 0x20

    ATTR#&;#A' ATTR#R'AD#&7 |  ATTR#DD' |

      ATTR#"7"T' |

      ATTR#&9'#D

  • 8/18/2019 Libro Blanco de Hardware

    30/54

    c-enta 5-e la creación de arc)ivosse considera -na escrit-ra

    DR#

  • 8/18/2019 Libro Blanco de Hardware

    31/54

  • 8/18/2019 Libro Blanco de Hardware

    32/54

    arc)ivo largo FAT para m9s información so+re esta com+inación deatri+-tos'-ando se crea -n directorio# -n arc)ivo con el +it ATTKCD?K('T4K ens- campo D?KCAttr# 5-e esta+lece s- D?KCFile2i8e a ! D?KCFile2i8e no se-tili8a % est9 siempre ! en -n arc)ivo con el Atri+-to ATTKCD?K('T4K

    *directorios son de tamaño# simplemente sig-iendo s-s cadenas deracimo a la Marca (4', n cl@ster se asigna al directorio *a menos 5-esea el directorio ra.8 en -n FAT1GFAT1" vol-men,# % se esta+leceD?KCFst'l-s

  • 8/18/2019 Libro Blanco de Hardware

    33/54

    M-c)os sistemas de arc)ivos FAT no admiten la fec)a G )ora 5-e no seaD?KCrtTime % D?KCrtDate Para esta ra8ón# D?KC'rtTimeMil#D?KC'rtTime# D?KC'rtDate % D?KC

  • 8/18/2019 Libro Blanco de Hardware

    34/54

    Del mismo modo# -n controlador del sistema de arc)ivos FAT no de+epermitir 5-e -n directorio *-n arc)ivo 5-e es en realidad -n contenedorpara otros arc)ivos, a ser ma%or 5-e $$; X ;" *"!&01$", +%tesNOTA: (ste l.mite no se aplica al n@mero de arc)ivos en el directorio(ste l.mite es del tamaño de el propio directorio % no tiene nada 5-e ver

    con el contenido del directorio Ha% dos ra8ones para este l.mite:1 De+ido directorios FAT no se ordenan o indeJados# es -na mala ideapara crear enormes directorios de lo contrario# las operaciones como lacreación de -na n-eva entrada *5-e re5-iere 5-e cada entrada dedirectorio asignado a ser eval-ados para veriBcar 5-e el nom+re noeJiste en el directorio, se v-elven m-% lentos" Ha% m-c)os cond-ctores del sistema de arc)ivos FAT % -tilidades dedisco# incl-%endo Microsoft# de las 5-e esperan contar las entradas de-n directorio -tili8ando -na varia+le 4KD 13+it Por esta ra8ón#

    directorios no p-eden tener m9s de 13+its de valor de las entradasCon2or*e a la e1/eci=cacin(l c-mplimiento de esta especiBcación se deBne por las pr-e+as en elsistema operativo de referencia FAT *s,

  • 8/18/2019 Libro Blanco de Hardware

    35/54

    ?nfo de: )ttp:GGwwwccsinfocomGfor-mGviewtopicp)p

    tW";&&)ig)lig)tWfat;"

    4tra info AE2?' )ttp:GGelm3c)anorgGfswGZG!!indeJCe)tmlPetit fat ansic )ttp:GGelm3c)anorgGfswGZG!!indeJCp)tml

    Just removed the dust from my old FAT32 code. Maybe it will be useful for somebody... Seenotes in EX_ file.

    So the header file (MyMMCFat3.h!"

    Code:

    #define MAXFILES 2

    typedef struct _diskinforec

    {

    char hJumpCode[3];

    char OEMName[8];

    int16 hBytesPerSector;

    char bSectorsPerCluster;

    int16 Reserved1;

    char FATCopies;

    int16 hMaxRootEntries;

    int16 hSectors;

    char Descriptor;

    int16 holdSectorsPerFat;int16 hSectorsPerTrack;

    int16 hNumberofHeads;

    int32 hNumberofHidden;

    int32 hNumberofSectors;

    int32 hSectorsPerFat;

    int16 hFlags;

    int16 hFAT32Version;

    int32 hRootStartCluster;

    } diskinforec;

    http://www.ccsinfo.com/forum/viewtopic.php?t=23969&highlight=fat32http://www.ccsinfo.com/forum/viewtopic.php?t=23969&highlight=fat32http://elm-chan.org/fsw/ff/00index_e.htmlhttp://elm-chan.org/fsw/ff/00index_p.htmlhttp://www.ccsinfo.com/forum/viewtopic.php?t=23969&highlight=fat32http://www.ccsinfo.com/forum/viewtopic.php?t=23969&highlight=fat32http://elm-chan.org/fsw/ff/00index_e.htmlhttp://elm-chan.org/fsw/ff/00index_p.html

  • 8/18/2019 Libro Blanco de Hardware

    36/54

    typedef struct _direntry

    {

    char sName[8];

    char [spam][3];

    char bAttr;

    char bReserved[8];

    int16 hClusterH;int16 hTime;

    int16 hDate;

    int16 hCluster;

    int32 wSize;

    } DIR;

    typedef struct {

    char IOpuffer[512];

    DIR DirEntry;

    int32 CurrentCluster;

    int16 posinsector;

    int32 position;

    int32 dirSector;

    int16 dirIdx;

    char mode;char Free;

    } FILE;

    typedef struct {

    int32 MMCAddress;

    int32 FATstartidx;

    int32 gStartSector;

    int32 gFirstDataSector;

    int16 gDirEntryIdx;

    int32 gDirEntrySector;

    int16 gFirstEmptyDirEntry;

    int32 gFirstDirEntryCluster;

    } FAT32Vars;

    char MMCInit();void ReadSector(int32 sector, char *hova);

    void WriteSector(int32 sector, char *honnan);

    void InitFAT();

    char FindDirEntry(char *fname, char f);

    char fopen(char *fname, char mode);

    void fclose(char f);

    void fflush(char f);

    char cwd(char *fname, char f);

    void fputch(char be, char f);

    char fgetch(char *ki, char f);

    void fputstring(char *be, char f); // fputs is reserved in CCS C

    int16 fread(char *buffer, int16 leng, char f);

    void fwrite(char *buffer, int16 leng, char f);char remove(char *fname);

    char getfsize(char *fname, int32 *fsiz);

    #he im$lementation (MyMMCFat3.c!"

    Code:

    int32 FATTable[128];

  • 8/18/2019 Libro Blanco de Hardware

    37/54

    int32 gFirstEmptyCluster;

    FAT32Vars gFAT32Vars;

    diskinforec DiskInfo;

    FILE gFiles[MAXFILES];

    #byte MMCAddressL = gFAT32Vars

    #byte MMCAddressH = gFAT32Vars+1#byte MMCAddressHL = gFAT32Vars+2

    #byte MMCAddressHH = gFAT32Vars+3

    #byte gStartSectorL = gFAT32Vars+8

    #byte gStartSectorH = gFAT32Vars+9

    #byte gStartSectorHL = gFAT32Vars+10

    #locate FATTable = 0x0800

    #locate gFiles = 0x0A00

    #locate gFAT32Vars = 0x0E70

    #locate DiskInfo = 0x0E90

    #use FAST_IO(C)

    #define ChipSel pin_c2

    #define ChipClk pin_c3

    #define ChipDin pin_c5

    //#define CardInserted PIN_A4 // these pins are already defined in my main C

    file

    //#define REDLED PIN_E7

    //#define YELLOWLED PIN_E6 // remove comments or comment out lines containing

    YELLOWLED refs in this file

    //#define GREENLED PIN_E5

    char IsSelfDir(char *be)

    {

    if (be[0] == '.' && be[1] == '.') return 0xFF;

    else return 0;

    }

    void MMCOut(char indata)

    {

    char i;

    SSPBUF=indata;

    while (!BF);

    i = SSPBUF;

    }

    void MMC8Clock()

    {

    char i;

    SSPBUF=0xFF;

    while (!BF);

    i = SSPBUF;

    }

    char MMCIn()

    {

    char i;

    SSPBUF=0xFF;

    while (!BF);

    i = SSPBUF;

    return i;

    }

  • 8/18/2019 Libro Blanco de Hardware

    38/54

    char MMCInit()

    {

    char response,iii,errcnt;

    restart_wdt();

    output_high(ChipSel);

    output_high(ChipClk);

    output_high(ChipDin);bit_clear(SSPCON1,5);

    SSPCON1 = 0x30; // modify this number to change SPI clock rate

    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);

    return errcnt;

    }

    int16 GetCurrentDOSDate()

    {

    int16 retval;

    retval = myrec.tm_year - 1980;

    retval

  • 8/18/2019 Libro Blanco de Hardware

    39/54

    retval = myrec.tm_hour;

    retval

  • 8/18/2019 Libro Blanco de Hardware

    40/54

      char errs,response;

    char cnt2,cnt3;

    #byte sectorL = sector

    #byte sectorH = sector+1

    #byte sectorHL = sector+2

    if (input(CardInserted)) return;

    Disable_interrupts(GLOBAL);Restart_wdt();

    MMCAddressL = 0;

    MMCAddressH = sectorL;

    MMCAddressHL = sectorH;

    MMCAddressHH = sectorHL;

    gFAT32Vars.MMCAddress

  • 8/18/2019 Libro Blanco de Hardware

    41/54

    void InitFAT()

    {

    int32 actsector;

    char i;

    gFirstEmptyCluster = 0;

    gFAT32Vars.gStartSector = 0;ReadSector(gFAT32Vars.gStartSector,gFiles[MAXFILES-1].IOpuffer);

    if (gFiles[MAXFILES-1].IOpuffer[0] != 0xEB) {

    gStartSectorL = gFiles[MAXFILES-1].IOpuffer[0x1C6];

    gStartSectorH = gFiles[MAXFILES-1].IOpuffer[0x1C7];

    gStartSectorHL = gFiles[MAXFILES-1].IOpuffer[0x1C8];

    ReadSector(gFAT32Vars.gStartSector,gFiles[MAXFILES-1].IOpuffer);

    }

    memcpy(&DiskInfo,gFiles[MAXFILES-1].IOpuffer,sizeof(DiskInfo));

    actsector = gFAT32Vars.gStartSector+DiskInfo.Reserved1;

    ReadSector(actsector,FATTable);

    gFAT32Vars.FATstartidx = 0;

    gFAT32Vars.gFirstDataSector = gFAT32Vars.gStartSector +

    DiskInfo.FATCopies*DiskInfo.hSectorsPerFat+DiskInfo.Reserved1 - 2;

    for (i=0;i> 7;

    clpos = curcluster & 0x7F;

    if (clpage != gFAT32Vars.FATstartidx) { // read in the requested page

    actsector = gFAT32Vars.gStartSector+DiskInfo.Reserved1 + clpage;

    ReadSector(actsector,FATTable);

    gFAT32Vars.FATstartidx = clpage;

    }return (FATTable[clpos]);

    }

    void SetClusterEntry(int32 curcluster,int32 value)

    {

    int32 actsector;

    int32 clpage;

    char clpos;

    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);

    }

    void ClearClusterEntry(int32 curcluster)

    {

    int32 actsector;

  • 8/18/2019 Libro Blanco de Hardware

    42/54

      int32 clpage;

    char clpos;

    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;

    }

    int32 FindFirstFreeCluster()

    {

    int32 i,st,actsector,retval;

    char j;

    st = gFirstEmptyCluster;

    for (i=st;i

  • 8/18/2019 Libro Blanco de Hardware

    43/54

    char i,j,leng,c,toext;

    toext = FALSE;

    j = 0;

    leng = strlen(fname);

    for (i=0;isName[i] = ' ';

    for (i=0;i[spam][i] = ' ';

    for (i=0;i[spam][j++] = c;

    else pDir->sName[i] = c;

    }

    }

    void ReadRootDirectory(char fil)

    {int32 actsector;

    if (fil > (MAXFILES-1)) 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;

    }

    char FindDirEntry(char *fname,char f)

    {DIR *pDir;

    int16 i;

    char filename[16];

    int32 nextcluster,actsector;

    if (f > (MAXFILES-1)) return FALSE;

    gFAT32Vars.gFirstEmptyDirEntry = 0xFFFF;

    gFAT32Vars.gFirstDirEntryCluster = 0x0FFFFFFF;

    do {

    pDir = (DIR*)(gFiles[f].IOpuffer);

    for (i=0;isName[0] == 0xE5 || pDir->sName[0] == 0) &&

    gFAT32Vars.gFirstEmptyDirEntry == 0xFFFF) { // store first free

    gFAT32Vars.gFirstEmptyDirEntry = i;

    gFAT32Vars.gFirstDirEntryCluster = gFiles[f].CurrentCluster;}

    if (pDir->sName[0] == 0) return FALSE;

    ConvertFilename(pDir,filename);

    if (!strcmp(filename,fname)) {

    memcpy(&(gFiles[f].DirEntry),pDir,32);

    gFiles[f].dirIdx = i;

    gFAT32Vars.gDirEntryIdx = i;

    return TRUE;

    }

    pDir++;

  • 8/18/2019 Libro Blanco de Hardware

    44/54

      }

    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);

    return FALSE;

    }

    // file I/O routines

    char* TryFile(char *fname, char *f)

    {

    char i,leng;

    char *filename;

    *f = 0xFF;

    for (i=0;i

  • 8/18/2019 Libro Blanco de Hardware

    45/54

      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);

    return TRUE;

    }

    int32 ComposeCluster(char f)

    {int32 retval;

    retval = gFiles[f].DirEntry.hClusterH;

    retval

  • 8/18/2019 Libro Blanco de Hardware

    46/54

      }

    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;

    }

    }

    return f;

    }

    void fclose(char f)

    {

    output_low(YELLOWLED);

    if (f > (MAXFILES-1)) return;if ((gFiles[f].mode == 'a') || (gFiles[f].mode == 'w')) fflush(f);

    gFiles[f].Free = TRUE;

    }

    void fflush(char f)

    {

    int32 actsector;

    DIR *pDir;

    if (f > (MAXFILES-1)) 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; // if it is adirectory

    else pDir->wSize = gFiles[f].position;

    pDir->hDate = GetCurrentDOSDate();

    pDir->hTime = GetCurrentDOSTime();

    WriteSector(gFiles[f].dirSector,gFiles[f].IOpuffer);

    ReadSector(actsector,gFiles[f].IOpuffer);

    }

    char cwd(char *fname, char f)

    {

    int32 actsector;

    if (f > (MAXFILES-1)) return FALSE; // just in case of overaddressing

    if (IsSelfDir(fname)) return TRUE; // already in Root dir

    if (!FindDirEntry(fname,f)) return FALSE; // not foundactsector = ComposeCluster(f);

    actsector += gFAT32Vars.gFirstDataSector; // read current dir

    ReadSector(actsector,gFiles[f].IOpuffer);

    gFAT32Vars.gDirEntrySector = actsector;

    gFiles[f].dirSector = actsector;

    gFiles[f].CurrentCluster = ComposeCluster(f);

    return TRUE;

    }

    void fputch(char be, char f)

  • 8/18/2019 Libro Blanco de Hardware

    47/54

    {

    int32 nextcluster,actsector;

    if (f > (MAXFILES-1)) 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++;

    }

    void fputstring(char *be, char f)

    {

    int16 leng,i;

    if (f > (MAXFILES-1)) return;

    leng = strlen(be);

    for (i=0;i (MAXFILES-1)) return 0;

    retv = 0;

    for (i=0;i (MAXFILES-1)) return;

    for (i=0;i

  • 8/18/2019 Libro Blanco de Hardware

    48/54

      int32 nextcluster,actsector;

    if (f > (MAXFILES-1)) return FALSE;

    if (gFiles[f].position >= gFiles[f].DirEntry.wSize) return FALSE;

    *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;

    }

    }

    return TRUE;

    }

    char remove(char *fname)

    {

    char i,found;

    char f;DIR *pDir;

    int32 nextcluster,currentcluster;

    char *filename;

    filename = TryFile(fname,&f);

    if (filename == 0) return FALSE;

    found = FindDirEntry(filename,f);

    if (!found) {

    gFiles[f].Free = TRUE;

    return FALSE;

    }

    output_high(YELLOWLED);

    pDir = (DIR*)(&(gFiles[f].IOpuffer[32*gFAT32Vars.gDirEntryIdx]));

    pDir->sName[0] = 0xE5;

    for (i=1;isName[i] = ' ';

    for (i=0;i[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);

    return TRUE;

    }

    char getfsize(char *fname, int32 *fsiz)

    {

    char found;

  • 8/18/2019 Libro Blanco de Hardware

    49/54

      char f;

    DIR *pDir;

    char *filename;

    filename = TryFile(fname,&f);

    if (filename == 0) return FALSE;

    found = FindDirEntry(filename,f);

    if (!found) {gFiles[f].Free = TRUE;

    return FALSE;

    }

    pDir = (DIR*)(&(gFiles[f].IOpuffer[32*gFAT32Vars.gDirEntryIdx]));

    gFiles[f].Free = TRUE;

    *fsiz = pDir->wSize;

    return TRUE;

    }

    %nd a small e&am$le (EX_MyFat3.c!"

    Code:

    /* This is a small demo file for FAT32 library usage

    Written by Tamas Bodorics (Tomi)

    Some notes:

    -----------

    - I use it with a PIC18F6720 (3.5kByte RAM) HW SPI @11.0592 MHz crystal;

    tested with 64-256MB MMCs

    - The RAM area is moved to upper region by #locate directives

    - The MMC has 2 GND pins; one of them is pulled up by a resistor (10k) to

    +5V and connected to PIN_A4

    so the MMC is "hot swappable".

    - The MMC has to format FAT32, 512bytes/cluster

    - The number of opened files at a time is limited to 2 because of RAM

    limitations (some dsPICs have 8K RAM... ;-) )

    - No long names; use DOS-like 8+3 name format

    - No MKDIR and RMDIR functions (not yet...) so create the subdirs right

    after the format (and use 8+3 capital characters...)

    I use the following DOS batch in XP:

    format I: /A:512 /V:TOMI /FS:FAT32 

    mkdir I:\BERS

    mkdir I:\WINDS

    - Use '/' as directory separator, e.g. "MYDIR/ELEMENT.WND"

    "MYDIR/SUBDIR/OTHER.TXT" etc.

    - The possible modes for file open (char and NOT string as in std. C):

    'r'(read) 'w'(write; the previous content will overwritten) 'a'(append)

    - fputs is reserved keyword by CCS C so use fputstring() instead

    - In the example the EVENT.LOG file uses the Hungarian date format

    (YYYY.MM.DD. HH.mm.SS) sorry...

    - There are some functions normally not to use:

    - fflush(f) Use it only if you want to flush data into MMC while you

    keep the file opened

    - TryFile() tries to open the file incl. resolving the path

    - cwd(fname,f) is used by TryFile to resolve the path name

    - fcreate() If you open a file with 'a' or 'w' the file is

    automatically created if not exist

    */

  • 8/18/2019 Libro Blanco de Hardware

    50/54

    #include

    ..........

    #include

    typedef struct {

    unsigned long tm_year;

    char tm_mon;

    char tm_day;char tm_mday;

    char tm_hour;

    char tm_min;

    char tm_sec;

    } TimeRecord;

    ....................

    TimeRecord myrec; // this variable is updated in regular intervals in

    DoIdle()

    ....................

    ....................

    ....................

    #include "MyMMCFat32.h"

    #include "MyMMCFat32.c"

    ....................

    ....................

    void main()

    {

    char f,v,msg[64],gfilename[32];

    char gPrevCard,gActCard; // previous and actual card states (inserted,

    removed)

    .................... // other declarations

    ....................

    .................... // INIT code parts

    ....................

    InitClockInt(); // init the clock chip

    ReadClock(); // read the current time

    if (!input(CardInserted)) { // if MMC card is in place

    do {

    output_high(REDLED);

    v = MMCInit(); // init the card

    delay_ms(50);

    output_low(REDLED);

    delay_ms(50);

    } while (!v);

    output_high(YELLOWLED);InitFAT(); // init the file system

    output_low(YELLOWLED);

    output_low(REDLED);

    }

    ..................

    strcpy(gfilename,"EVENTS.LOG");

    f = fopen(gfilename,'a'); // open EVENTS.LOG for append

    if (f < MAXFILES) {

    sprintf(msg,"%04lu.%02u.%02u. %02u:%02u:%02u

  • 8/18/2019 Libro Blanco de Hardware

    51/54

    ",myrec.tm_year,myrec.tm_mon,myrec.tm_mday,myrec.tm_hour,myrec.tm_min,myrec.t

    m_sec);

    fputstring(msg,f);

    strcpy(msg,"System started\r\n");

    fputstring(msg,f);

    fclose(f);

    }

    while (1) {

    restart_wdt();

    ResetPorts();

    DoIdle(); // Idle function incl. clock update

    ....................

    ....................

    gActCard = input(CardInserted);

    if (gActCard) output_high(REDLED);

    else output_low(REDLED);

    if (gActCard == 0 && gPrevCard != 0) { // card was pulled out then

    pushed back now

    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,"Memory card replacement\r\n");

    fputstring(msg,f);

    fclose(f);

    }

    }

    gPrevCard = gActCard;

    }

    }

    /* other short examples:

    1: to send out a file content to serial line

    strcpy(gfilename,"SMSDATA.TXT");

    f = fopen(gfilename,'r');

    if (f < MAXFILES) {

    while (fgetch(&c,f)) fputc(c,HOST2);

    fclose(f);

    }

    2: to save daily measures:

    sprintf(gfilename,"BERS/%04lu%02u

    %02u.BER",myrec.tm_year,myrec.tm_mon,myrec.tm_mday); // the file name is

  • 8/18/2019 Libro Blanco de Hardware

    52/54

    YYYYMMDD.BER

    f = fopen(gfilename,'a');

    for (actidx=0;actidx

  • 8/18/2019 Libro Blanco de Hardware

    53/54

    #bit BF = SSPSTAT.0

    #hes are sim$le re1ister definitions.

    Other functions

    'osted" Mon Mar / ))* "-3 am 

    Some $eo$le have $roblems usin1 my FAT32 code es$ecially with undefined functions.2ou can find below some short e&$lanations.

    +. #he cloc0 functions. use a 4icoh cloc0 chi$ to 1et a real time cloc0 because my tar1et circuitis a data lo11er.nitCloc0nt(! funtion sets u$ the 5#_% out$ut of the chi$ as 3*/678 cloc0 out$ut so it is calledonly once in early main(! in initiali8ation section. t is then connected to the 'C9s #ME4+ in$utto 1et an interru$t in every seconds. #he lo11er has battery:bac0u$ solar $ower su$$ly so have to use Slee$(! to minimi8e the $ower consum$tion. #he tar1et board is wa0ed u$ in every seconds.

    . 4eadCloc0(! functions reads out the current date and time and stores the data in a standardstruct tm structure. #he definition"

    Code:

    typedef struct {

    unsigned long tm_year;

    char tm_mon;

    char tm_day;

    char tm_mday;

    char tm_hour;

    char tm_min;

    char tm_sec;

    } RAMRecord;

    t is im$ortant to handle the creation;modification dates in a file system if it is used for datalo11ers. f you don9t want to use correct times then sim$ly use a fi&ed date;time or you can usea software cloc0.

    3. 4eset'orts(! function is called as fre$date the cloc0 structure by callin1 4eadCloc0(!

    b; ?et the current wind s$eed and direction. Store it on MMC if necessary.c; f the old minute differs from the newly read then one minute is ela$sed@ read thetem$eratures $ressure etc. so 1et the one minute avera1es and store them in a file (MMC!.

  • 8/18/2019 Libro Blanco de Hardware

    54/54

    d; %fter these call 4estart_wdt(! and Slee$(! to enter into slee$ mode and to wait the ne&ttimer+ interru$t.