Libro Blanco de Hardware
-
Upload
jhon-alexander-suescun-p -
Category
Documents
-
view
221 -
download
0
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.