Está en la página 1de 14

Implementación de FAT en tarjetas CompactFlash,

tarjetas SD / MMC y memorias USB

El objetivo de este artículo es llenar un vacío en la información necesaria para implementar el


firmware de un dispositivo que lee desde tarjetas CompactFlash o tarjetas SD / MMC, como
el reproductor de MP3 programable que hemos desarrollado. Es muy común poner un sistema de
archivos FAT en una tarjeta Flash, ya que hacerlo hace que la tarjeta sea inmediatamente
utilizable por Microsoft Windows y otros sistemas operativos. Esta información también se aplica
al sistema de archivos FAT en una memoria flash USB, pero solo parcialmente.

Escribimos este documento después de luchar con FAT16 en una tarjeta CompactFlash en
el reproductor de MP3 programablebasado en un decodificador de MP3 de la Solución VLSI y un
controlador PIC de Microchip. Tuvimos dos implementaciones de referencia publicadas de cómo
acceder a la tarjeta CompactFlash y cómo encontrar el inicio de FAT y el directorio raíz. Sin
embargo, estos documentos fueron muy escuetos sobre el significado de las "constantes mágicas"
que se usaron en las compensaciones de datos en la tarjeta. Además, aunque el código fuente de
ejemplo funcionó nueve de diez veces, ocasionalmente "simplemente fallaba". La investigación
adicional, por nosotros, nos dio la razón de la falla ocasional y aclaró el asunto.

Estructura del documento


La primera parte del artículo es una (muy) breve descripción de FAT. La FAT está ampliamente
documentada en muchos libros y artículos, y las especificaciones detalladas están disponibles en
Microsoft. La segunda parte es una descripción igualmente breve de la estructura de la tabla de
particiones. Luego, hay una breve sección sobre cómo esto se aplica a los dispositivos integrados
que no tienen un BIOS compatible con PC (o incluso un procesador compatible con Intel
80x86). Este documento, en su segunda revisión, se enfoca en FAT16 y FAT32, pero también
proporciona cierta información sobre FAT12.

Más información específica sobre el diseño de los pines y la tarjeta CompactFlash registra (en
modo IDE verdadero) y sobre el diseño de los pines y los protocolos de las tarjetas SD / MMC
aparecen al final de este documento.

Este artículo es, con mucho, insuficientemente detallado para diseñar y desarrollar una interfaz
de lectura / escritura CompactFlash totalmente funcional, que utiliza FAT. Su propósito es unir
las diversas especificaciones para un solo propósito específico. Este artículo puede interpretarse
como una "guía de las especificaciones", mejorado con notas de nuestra propia experiencia.

FAT y el sector de arranque


Para Microsoft Windows y la mayoría de los demás sistemas operativos, una tarjeta Flash (en un
lector de tarjetas) y una memoria USB se comportan como discos extraíbles. Se pueden formatear,
como un disquete, y tienen un sistema de archivos. Para estos dispositivos, el sistema de archivos
suele ser FAT16 o FAT32; la capacidad de los discos virtuales suele ser demasiado grande para
FAT12 (aunque las tarjetas SD de 64 MiB con FAT12 se han visto en la naturaleza).

En una partición FAT en un disco duro y en un disquete, hay, en este orden:

Disquetes de regiones
un sector de arranque
opcionalmente sectores más reservados
FAT # 1 (Tabla de asignación de archivos)
FAT # 2 (un duplicado de FAT # 1)
el directorio raíz (no utilizado en FAT32)
el "área de datos" con todos los archivos y subdirectorios
Todos los datos (archivos y subdirectorios) siguen detrás del directorio raíz. Los tamaños de las
partes anteriores del sistema de archivos FAT se corrigen cuando se formatea el disco. El sector
de arranque es el primer sector en una serie de sectores reservados. El tamaño de un sector (en
bytes) se registra en el sector de arranque; normalmente es de 512 bytes para discos duros. La
especificación CompactFlash estandariza un sector a 512 bytes.

Históricamente, hay dos FAT, donde la primera FAT es la FAT líder y la segunda es una copia de
seguridad en caso de que se dañe la primera FAT. Algunos medios de almacenamiento pueden
tener solo una FAT (tener más de dos FAT está permitido, pero nunca hemos visto ese medio). En
el sistema FAT32, la segunda FAT puede ser líder y la primera la copia. El tamaño de las (dos)
FAT depende del tamaño total del disco y del tipo de FAT (FAT12, FAT16 o FAT32). El directorio
raíz tiene un tamaño fijo y generalmente puede contener hasta 512 entradas (los subdirectorios
pueden crecer y contraerse según sea necesario, pero el directorio raíz tiene un tamaño
fijo). FAT32 almacena su directorio "raíz" en el área de datos como un directorio estándar.

Un disco duro tiene particiones y la distribución anterior está presente al inicio de cada partición
(FAT). De hecho, cada partición contiene su propio sector de arranque, aunque puede tener un
formato y estructura diferente para cada sistema de archivos. Los detalles de la tabla de
particiones y el "registro de inicio maestro" se detallan a continuación en una sección separada.

Para evitar que el sistema operativo tenga que volver a calcular esto cada vez, la configuración
del disco se almacena al inicio del sector de arranque. Comenzando desde el desplazamiento 0x0B
(11 decimales) en el sector de arranque, hay una estructura de 51 bytes que se denomina "Bloque
de parámetros de disco" (DPB). Este bloque le dice el tamaño de un sector, el número de sectores
reservados, el número de FAT (para un sistema operativo FAT) y el tamaño del directorio raíz.

Los primeros 3 bytes en el sector de arranque son una "instrucción de salto" en el código de
máquina Intel 80x86 alrededor del bloque de parámetros de disco. Es probable que su
microprocesador o microcontrolador sea incompatible con el conjunto de instrucciones 80x86,
pero puede seguir utilizando la instrucción de salto como una especie de firma (tenga en cuenta
que las especificaciones de FAT permiten dos instrucciones de salto diferentes). Esta es una
instrucción de salto, ya que el BIOS en una PC (equipado con un procesador compatible con 80x86,
como un Intel Pentium), interpreta el sector de arranque como un programa que cargará y
ejecutará. Los 8 bytes que siguen a la instrucción de salto son un nombre de proveedor para el
disco; esto no está relacionado con el "nombre del volumen" o etiqueta del disco.

El diseño del sector de arranque (con el Bloque de parámetros de disco que comienza en 0ffset
0x0B) está debajo. La tabla muestra los campos para la estructura FAT32; las estructuras FAT12
/ FAT16 difieren de FAT32 a partir del desplazamiento 0x24. Sin embargo, los campos en
desplazamientos superiores a 0x24 para FAT12 y FAT16 no son esenciales: contienen el número
de serie y la etiqueta de volumen, además de valores para el uso de DOS y la interfaz "INT 13" del
BIOS, que probablemente no tenga en un dispositivo integrado sistema).

Compensar Descripción tamañ


0x000 Instrucción de salto Intel 80x86 3
0x003 Nombre OEM (no el nombre del volumen, vea el offset 0x02B) 8
0x00B Tamaño del sector en bytes 2
0x00D Cantidad de sectores por cluster 1
0x00E Sectores reservados (incluido el sector de arranque) 2
0x010 Número de FAT 1
0x011 Número de entradas de directorio en el directorio raíz (NA para FAT32) 2
0x013 Número total de sectores en el disco / partición, o cero para discos / 2
particiones mayores a 32 MiB (el campo en el offset 0x020 debe ser
utilizado)
0x015 Descriptor de medios (bit # 2 contiene si el disco es extraíble) 1
0x016 Número de sectores utilizados para una tabla FAT (NA para FAT32) 2
0x018 Número de sectores por pista (cilindro), direccionamiento CHS 2
0x01a Número de cabezales, direccionamiento CHS 2
0x01c Número de sectores ocultos, que es el número de sectores antes del 4
sector de arranque (aunque este campo puede establecerse en cero)
0x020 Número total de sectores en el disco / partición, si es superior a 32 MiB 4
(solo válido si el campo en el desplazamiento 0x013 es cero)
0x024 Sólo FAT32: sectores de número en la FAT, reemplaza el campo en la 4
compensación 0x016
0x028 Solo FAT32: Indicadores para la duplicación de FAT y FAT activo 2
0x02a FAT32 solamente: número de versión del sistema de archivos 2
0x02c Solo FAT32: Número de clúster para el directorio raíz, generalmente 2 4
0x030 Solo FAT32: Número de sector para la estructura FSInfo, generalmente 2
1
0x032 Sólo FAT32: Número de sector para una copia de seguridad del sector 2
de arranque, típicamente 6
0x034 FAT32 solamente: reservado para futuras expansiones 12
0x040 Número de unidad (este campo está en offset 0x024 en FAT12 / FAT16) 1
0x041 Cabezal actual (interno a DOS; este campo está en offset 0x025 en 1
FAT12 / FAT16)
0x042 Firma de inicio, el valor 0x29 indica que los siguientes campos son 1
válidos (este campo está en el desplazamiento 0x026 en FAT12 /
FAT16)
0x043 ID de volumen (número de serie; este campo está en el desplazamiento 4
0x027 en FAT12 / FAT16)
0x047 Etiqueta de volumen (este campo está en el offset 0x02b en FAT12 / 11
FAT16)
0x052 Tipo de sistema de archivos (este campo está en el desplazamiento 8
0x036 en FAT12 / FAT16)
0x08a Código de arranque (comienza en el offset 0x03e en FAT12 / FAT16, y 372
es 448 bytes)
0x1fe La firma del sector de inicio debe ser 0x55AA 2
En realidad, es incorrecto decir que un sector tiene 512 bytes y que el sector de arranque es el
único sector reservado . El tamaño del sector y la cantidad de sectores reservados se deben
buscar desde el Bloque de parámetros del disco. En la práctica, todos parecen usar sectores de
512 bytes, sin embargo. En cualquier caso, el sector de arranque debe contener una firma con el
valor 0x55aa en el desplazamiento 510 (comenzando desde cero).

Cuando se trabaja con la estructura de datos FAT, una confusión para evitar es la que existe
entre los sectores lógico y físico . El documento FAT se refiere a un número de
sector lógico basado en cero, de incremento lineal . En la geometría de un disco (ette),
un sector físico es un segmento similar a un pastel; cuando usa el direccionamiento CHS (Cilindro
/ Cabezal / Sector), tendrá que convertir números del sector lógico a números del sector
físico. Con las tarjetas CompactFlash, las tarjetas SD / MMC y los dispositivos USB, normalmente
usará el direccionamiento LBA y solo necesitará agregar un desplazamiento al área de datos para
el sector lógico.

El registro maestro de arranque y la tabla de particiones


Muchas memorias USB simulan un "gran disquete", así que con las especificaciones FAT y el diseño
del sector de arranque en la mano, tenemos toda la información que necesitamos. Por otro lado,
las tarjetas CompactFlash, la mayoría de las tarjetas SD / MMC y algunas memorias USB imitan a
un disco duro (o "disco fijo" si está acostumbrado a la terminología de IBM), con un Registro
maestro de arranque y una tabla de particiones.

Para un disco duro (y en una tarjeta CompactFlash o SD / MMC), cada partición es como un
disquete grande. Una partición FAT tiene un sector de arranque, que contiene un Bloque de
parámetros de disco; tiene uno o más sectores reservados, dos FAT y un directorio raíz. La
información sobre las particiones en sí mismas, sin embargo, está en otra tabla, dentro de otro
registro de inicio: el Master Boot Record (MBR). El Master Boot Record es también un sector de
512 bytes. Este sector contiene una tabla de particiones con cuatro entradas que comienzan en
el desplazamiento 446 (hex 0x1BE). Cada entrada de la tabla de particiones tiene una longitud de
16 bytes. Los primeros 446 bytes suelen contener un programa de arranque que el BIOS utiliza,
bueno, inicia la máquina; los dos últimos bytes son una firma y deben contener 0x55aa (la misma
firma que para un sector de arranque estándar).

Inicialmente, los discos se abordaron con valores para el cilindro, la cabeza (plato) y el
sector; esto se llama direccionamiento CHS (CHS significa Cilindro / Cabeza / Sector). Con un solo
byte para cada uno de los cilindros, el número de cabezales y el número de sectores por cilindro,
el tamaño máximo direccionable para un disco es 2 24, o 16777216 sectores. Con un tamaño de
sector de 512 bytes, el tamaño máximo del disco nunca podría exceder 8 GiB (si busca referencias
en el direccionamiento CHS, encontrará que los valores del sector y del cilindro están
empaquetados en una sola palabra de 16 bits, pero para el cálculo de la parte posterior del sobre
viene con el mismo resultado). Para acomodar discos grandes, se desarrolló un esquema de
direccionamiento alternativo: LBA (Address Logic Block). Esto es esencialmente un número de
sector lineal. Afortunadamente, la tabla de particiones contiene el inicio de la partición y su
tamaño tanto en CHS como en valores de LBA.

En una tarjeta CompactFlash o SD / MMC, primero debe navegar por la tabla de particiones (que
comienza en el desplazamiento absoluto 0x1BE, desde el inicio del disco) y encontrar el inicio de
la partición. Al saltar a la partición, tropezará con un registro de inicio que contiene un Bloque
de parámetros de disco. Luego puede proceder a localizar y decodificar la FAT y el directorio raíz,
teniendo en cuenta que todas las compensaciones en este Bloque de parámetros de disco son
relativas al inicio de la partición.

La siguiente tabla muestra el diseño de un solo registro en la tabla de particiones. Cada uno de
esos registros tiene 16 bytes de tamaño y la tabla de particiones contiene 4 registros. Es decir, la
segunda entrada en la tabla de partición comienza en el offset 0x1CE, el tercero en 0x1DE y el
cuarto en 0x1EE.
Compensar Descripción tamaño
0x00 0x80 si está activo (arrancable), 0 de lo contrario 1
0x01 inicio de la partición en el direccionamiento CHS 3
0x04 tipo de partición, ver a continuación 1
0x05 final de la partición en el direccionamiento CHS 3
0x08 desplazamiento relativo a la partición en sectores (LBA) 4
0x0C tamaño de la partición en sectores 4
Como muestra la tabla anterior, la tabla de particiones también contiene un valor que indica el
tipo de sistema de archivos, más un indicador que indica si la partición está activa. Una PC solo
arrancará desde la partición activa. Un registro de partición que está "vacío" o inválido
normalmente tiene todos los campos configurados en cero; al menos el campo "tipo" de la
partición (desplazamiento 0x04) debe ser cero.

Un subconjunto de valores de tipo de partición, relacionados con FAT, está a continuación:


Tipo de
partición Descripción
0 vacío / sin usar
1 FAT12
4 FAT16 para particiones <= 32 MiB
5 partición extendida
6 FAT16 para particiones> 32 MiB
11 FAT32 para particiones <= 2 GiB
12 Igual que el tipo 11 (FAT32), pero usando el direccionamiento LBA, que elimina
las restricciones de tamaño
14 Igual que el tipo 6 (FAT16), pero usando el direccionamiento LBA
15 Igual que el tipo 5, pero usando el direccionamiento LBA
El registro de partición siempre debe mantener el desplazamiento lineal relativo al inicio de la
partición. Para uso en dispositivos integrados, los tipos 4, 6 y 14 pueden verse como equivalentes.

Para los "discos" que están en una tarjeta de memoria Flash, Microsoft Windows es muy indulgente
con el valor del tipo de partición. Microsoft Windows parece mirar el bloque de parámetros de
disco de la partición para determinar si puede soportar la tarjeta. Dado que las tarjetas
CompactFlash y las tarjetas SD / MMC suelen estar fácilmente particionadas y formateadas (con
una única partición para toda la tarjeta), esto tiene sentido. Tanto las especificaciones SD como
las especificaciones MMC establecen que el sistema de archivos es una variedad de FAT (FAT12 /
16 o FAT32, dependiendo de la capacidad de la tarjeta).

Un registro de partición también puede apuntar a una tabla de particiones extendida (tipos 5 o
15). Una partición extendida es una partición separada que contiene una especie de "sector de
arranque" que contiene una tabla de particiones con cuatro registros más. Las particiones
extendidas están más allá del alcance de este documento. Las particiones extendidas casi nunca
aparecen en las tarjetas de memoria Flash, como se suele decir, las tarjetas solo contienen una
única partición (primaria) para toda la tarjeta.

Tarjetas de memoria FAT y Flash para un mundo integrado


Después de este material técnico, la pregunta sigue siendo cómo se relaciona esto con los
dispositivos integrados que usan una tarjeta CompactFlash para el almacenamiento de datos. Muy
sencillo, en realidad. No hay "magia" involucrada, pero el firmware debe cumplir estrictamente
con la especificación del sistema de archivos FAT, el Bloque de Parámetros de Disco y la tabla de
particiones.

Es importante no hacer accesos directos al navegar a través de la tabla de particiones. Puede


haber hasta cuatro entradas en la tabla de particiones, pero la primera partición no se describe
necesariamente en la primera entrada de la tabla de particiones. Por lo tanto, el firmware debe
examinar la tabla de particiones y omitir las entradas no válidas.
Una tarjeta de memoria flash puede contener una pequeña partición para "uso privado" por un
aparato, que utiliza un valor no estándar para el tipo de partición. Si una tarjeta tiene múltiples
particiones, el firmware debe elegir la que tenga un tipo de partición válido (como muestra la
tabla de "tipos de particiones" mostrada anteriormente, hay tres valores de tipo de partición que
son todos FAT16; el firmware debe esperar cualquiera de estos valores) , si está diseñado para
admitir FAT16). Si solo hay una partición en la tabla (con un desplazamiento y tamaño de LBA
distinto de cero), es mejor ignorar el campo "tipo de partición" en la tabla de particiones y obtener
la información del bloque de parámetros de disco de esa única partición.

Especialmente, las tarjetas SD / MMC carecen de campos de partición (o no son válidos), ya que se
consideran redundantes: la capacidad estándar de la tarjeta SD o MMC debe usar FAT12 o FAT16 y
las tarjetas de alta capacidad deben usar FAT32. Un poco en un registro interno de las tarjetas SD
y MMC indica qué tipo de tarjeta es: estándar o de alta capacidad.

En cualquier caso, lo que no funcionará es que el firmware salte al offset de bytes absoluto 0x1C6
(offset de palabras 0xE3), lea el DWORD en esa ubicación y salte a esa dirección más 1024 para
llegar al inicio de la FAT. Tal código hace muchas suposiciones:

o asume que la tarjeta de memoria Flash contiene un Registro de inicio maestro (dicho esto, una
nueva tarjeta CompactFlash que usted compra generalmente está particionada y formateada,
lista para usar);
o asume que el primer registro de partición es válido, incluso si una tarjeta de memoria Flash tiene
una sola partición, podría ser que esta partición se describa en el segundo registro dentro del
MBR (esto lo hemos visto en la práctica);
o asume que el tipo de partición es lo que espera que sea (por ejemplo, FAT16);
o asume que solo hay un sector reservado (que es común en FAT12 y FAT16, pero poco común en
FAT32);
o y si el firmware no lee el bloque de parámetros de disco, supone mucho más ...

Cuando basa su firmware en tales suposiciones, su código volverá para perseguirlo.

Programación CompactFlash
En la mayoría de los casos, es más fácil programar CompactFlash en el modo "IDE verdadero". Este
modo simula la interfaz ATAPI-4, pero con diferentes tiempos. La interfaz IDE es una asignación
de casi 1 a 1 (un subconjunto de) el bus de expansión PC-AT de 16 bits. En la época de la PC-AT,
este diseño permitía que una unidad se conectara (casi) directamente al bus. Por razones de
compatibilidad con interfaces de disco duro más antiguas (es decir, el controlador Western Digital
WD1010), la decodificación de direcciones en IDE es un poco extraña.

La mayor desventaja del modo IDE verdadero es que la "inserción en caliente" de la tarjeta
CompactFlash puede no ser compatible. La tarjeta CompactFlash cambia al modo IDE cuando
la OE/ ATASELlínea se baja al encender. Varias tarjetas CompactFlash que probamos revisaron
el OEpin después de un reinicio y se cambiaron al modo IDE verdadero cuando
el OErestablecimiento es bajo. La inserción en caliente funcionó, por lo tanto, con estas tarjetas
CompactFlash (al pulsar la RESETlínea en la inicialización de la unidad), pero no se garantiza que
funcione con todas las tarjetas CompactFlash.

Probamos tarjetas CompactFlash de SanDisk, Dane-Elec, Integral, Epson y Transcend. Las tarjetas
de SanDisk, Epson e Integral admitían la inserción en caliente después de un restablecimiento (y
cambiaban al modo IDE verdadero después de detectar la OE/ ATASEL línea). Las tarjetas de Dane-
Elec y Transcend no admitían la inserción en caliente con un reinicio, pero requerían un ciclo de
encendido para cambiar al modo IDE verdadero.
Anteriormente informamos que Dane-Elec admitía la inserción en caliente con el modo IDE
verdadero, pero una prueba reciente falló. Hemos tenido informes de que el fabricante había
cambiado a un "controlador de memoria" diferente.

Una manera simple de hacer que la inserción en caliente funcione con el modo IDE verdadero es
agregar un MOSFET en la línea de alimentación de la tarjeta CompactFlash y agregar firmware
que detecta si se insertó una tarjeta CompactFlash. Si detecta este evento, se puede alimentar
el ciclo de la tarjeta CompactFlash. Lo que solemos hacer en nuestros dispositivos es apagar la
tarjeta CompactFlash cuando detectamos que se elimina y encenderla después de detectar que
se ha insertado.

Algunas de las señales en modo IDE están activas bajas . En la descripción de la señal, esto se
indica con una barra delante del nombre; por ejemplo, /RESETes la señal de reinicio y, por lo
tanto, para reiniciar el disco, este pasador debe ser tirado a tierra. En nuestra descripción de las
señales, cuando se hace referencia a una señal activa , la presencia del prefijo de barra indica si
el pin respectivo es bajo o alto.

El bus IDE es de 16 bits. Sin embargo, los registros internos son de 8 bits (para compatibilidad con
versiones anteriores), y el estado de lectura o la información de error devuelve solo 8 bits a la
vez. Las líneas de bus de datos son tri-estatal si ambos /CS0y /CS1están inactivos, lo que le
permite utilizar la interfaz IDE en un autobús que también impulsa otros periféricos.

Hay líneas en el bus IDE que no necesitamos en un sistema integrado, pero que eran necesarias
para el bus PC-AT. Por ejemplo, la /IOCS16señal indica si la salida está en las 16 líneas de datos
o solo en las primeras 8, pero ya sabemos que las transferencias de datos son de 16 bits
y las transferencias de control (registros) son de 8 bits. En un diseño incrustado, podemos dejar
la /IOCS16línea desconectada. Como un aparte, puede cambiar la tarjeta CompactFlash para
usar solo transferencias de 8 bits, en caso de que necesite conectar la tarjeta CompactFlash a un
bus de 8 bits.

Acceder a una unidad toma los siguientes pasos:

1. La dirección se afirma en líneas A0- A2y /CS0+ /CS1. En el modo IDE verdadero, solo se utilizan
tres de las líneas de direcciones de la tarjeta CompactFlash, en combinación con
las líneas /CS0y /CS1que seleccionan el "conjunto de registros". Solo cualquiera de
las líneas /CS0 y /CS1está activa (no ambas al mismo tiempo).
2. Después de un retraso de 70 ns (o más), o bien la /IORDo /IOWRse activa, dependiendo de si
desea iniciar una instrucción de lectura o escritura. El /IORDo /IOWRson los estroboscopios.
3. Se necesita otro retraso, de 165 ns, antes de desactivar las líneas /IORD o /IOWR. Al mismo
tiempo, la inactivación de la luz estroboscópica, o inmediatamente antes o después de la
inactivación de la luz estroboscópica, se puede leer o escribir los datos en los D0- D15líneas.
4. Aunque esto es opcional, se recomienda que tanto /CS0y /CS1se inactivan al final del ciclo de
lectura o escritura. Es posible que necesite otra demora aquí, porque un ciclo completo también
tiene una duración mínima. En lugar de un simple bucle inactivo, puede optar por realizar otras
operaciones en ese momento, como interpretar los datos después de una operación de lectura o
buscar nuevos datos después de una operación de escritura.

Lo anterior es un ciclo para obtener o establecer un registro en la interfaz IDE. Para acceder a los
datos reales en una tarjeta CompactFlash, debe realizar varios de dichos ciclos en varios
registros. La unidad de transferencia siempre es un sector (y un sector tiene 512 bytes), pero
puede leer o escribir múltiples sectores en un solo comando. Para obtener un sector de datos,
escriba un comando de "sector de lectura" (valor 0x20) en el registro de Comando después de
haber inicializado los cuatro registros de Dirección de LBA y los registros de Cuenta de Sector. Una
vez que se envía el comando, tendrá que esperar hasta que aparezca el bit DREQ (Solicitud de
datos) en el registro de Estado. Luego, 256 ciclos de lectura en el registro de datos darán un
sector de datos.
/ CS1 / CS0 A2 A1 A0 Descripción
1 0 0 0 0 Datos
1 0 0 0 1 Error (leer) / Características (escribir)
1 0 0 1 0 Cuenta de sector
1 0 0 1 1 LBA 0-7
1 0 1 0 0 LBA 8-15
1 0 1 0 1 LBA 16-23
1 0 1 1 0 LBA 24-27 + banderas
1 0 1 1 1 Estado (leer) / Comando (escribir)
0 1 1 1 0 Estado alternativo (lectura) / control del dispositivo
0 1 1 1 1 No usado
La interfaz IDE define 10 registros, pero la interfaz CompactFlash no usa el último. La
especificación de CompactFlash proporciona detalles sobre los registros (consulte la lista de
recursos al final de este documento). Tenga en cuenta que cuando el registro de recuento de
sectores es cero, está emitiendo una solicitud para leer o escribir 256 sectores. El registro "LBA
24-27 + flags" contiene el número de unidad en el bit 4, el bit 6 debe configurarse (es decir,
distinto de cero) para seleccionar el direccionamiento LBA en lugar de CHS, y los bits 7 y 5
generalmente están configurados (por razones de compatibilidad) .

Leer un sector es una operación rápida, independientemente de si lee sectores secuenciales o lee
sectores desde posiciones aleatorias. Cuando se escribe un sector, la operación puede ser casi
igual de rápida o puede llevar hasta 22 ms. Cuando escribe sectores secuenciales, el rendimiento
amortizado es el que se documenta en la hoja de datos. Para escrituras aleatorias, el rendimiento
puede ser mucho menor. La razón del bajo rendimiento en las escrituras de acceso aleatorio es
que una operación de escritura en la memoria Flash solo puede escribir 0 bits. Para escribir un bit
1, la memoria Flash debe ser "borrada". Una operación de borrado establece todos los bits a 1 en
un "sector Flash", y un sector Flash es típicamente mucho más grande que los 512 bytes de un
sector FAT (disculpe la confusión, pero sucede que ambas cantidades se llaman "sectores") .

Supongamos que escribe un sector FAT en una ubicación aleatoria. Ese sector primero debe
borrarse (para todos los 1), porque la memoria flash solo puede programar 0. Pero borrar el sector
de Flash también borra todos los demás sectores de FAT. Es posible que no se pierdan y, por lo
tanto, deben copiarse en un área reutilizable antes del borrado y deben copiarse nuevamente
después del borrado. El procedimiento real es un poco más inteligente que esto (utilizando
estrategias de reasignación), pero el punto es que una sola operación de escritura puede causar
una cadena de eventos que, en conjunto, causan una gran degradación del rendimiento. Para más
detalles, puede consultar el Informe técnico de Microsoft " Diseño para discos flash de alto
rendimiento ", consulte la sección Referencias y el final de este documento.

La siguiente tabla contiene el cableado de CompactFlash a una interfaz IDE. Tenga en cuenta que
describimos solo las señales que se necesitan para la tarjeta CompactFlash: si desea construir un
adaptador para CompactFlash que se enchufa en un conector IDE de su PC, conecte las patillas 2,
19, 22, 24, 26, 30 y 40 a la tierra, conecte el pin 28 a Vcc a través de una resistencia de 10k y
deje los pines 20, 21, 29 y 32 desconectados.

Pin CF PIN IDE Usted. Descripción


1 GND - suelo
2 11 I/O D3
3 9 I/O D4
4 7 I/O D5
5 5 I/O D6
6 3 I/O D7
7 37 yo / CS0
8 GND yo A10
9 GND yo / OE (/ ATASEL), baja para True IDE
10 GND yo A9
11 GND yo A8
12 GND yo A7
13 Vcc - Vcc (3.3 V o 5 V)
14 GND yo A6
15 GND yo A5
16 GND yo A4
17 GND yo A3
18 36 yo A2
19 33 yo A1
20 35 yo A0
21 17 I/O D0
22 15 I/O D1
23 13 I/O D2
24 CAROLINA DEL NORTE O / IOCS16
25 - yo / CD2 (Card Detect; sin IDE equivalente)
26 - yo / CD1 (Card Detect; sin IDE equivalente)
27 10 I/O D11
28 12 I/O D12
29 14 I/O D13
30 16 I/O D14
31 18 I/O D15
32 38 yo / CS1
33 CAROLINA DEL NORTE O / VS1
34 25 yo / iorda
35 23 yo / IOWR
36 Vcc yo /NOSOTROS
37 31 O INTRQ
38 Vcc - Vcc (3.3 V o 5 V)
39 GND yo / ACT
40 CAROLINA DEL NORTE O / VS2
41 1 yo /REINICIAR
42 27 O IORDY
43 CAROLINA DEL NORTE O reservado
44 Vcc yo reservado, tirar alto para verdadero IDE
45 39 I/O / DASP
46 34 I/O / PDIAG
47 4 I/O D8
48 6 I/O D9
49 8 I/O D10
50 GND - suelo
Cuando la tarjeta CompactFlash está en un modo diferente al IDE verdadero, los nombres de los
pines (y sus funciones) son diferentes de las descripciones en la tabla anterior.

La tabla de arriba asume un conector IDE de 40 pines. La siguiente tabla muestra el significado
de los pines 41 a 44 para un conector de 44 pines (que se encuentra comúnmente en computadoras
portátiles). Un conector IDE de 44 pines incluye líneas eléctricas (+ 5V). Una tarjeta CompactFlash
está diseñada para funcionar con dos voltajes: 3.3 V (± 5%) o 5 V (± 10%), pero no ambos a la
vez. Ver la especificación para más detalles.

PIN IDE Usted. Descripción


41 - + 5V para la lógica
42 - + 5V para el motor de accionamiento
43 - GND
44 yo Tipo de controlador, 0 = ATA (dejar desconectado)
En su diseño, puede optar por omitir algunas líneas. Por ejemplo, el soporte para la IORDYseñal
es opcional en la especificación de CompactFlash y usted puede optar por no usar la señal en
absoluto (en lugar de tratar de detectar si es compatible). La /IOCS16señal no transmite ninguna
información que usted no sepa, por lo que ese pin también puede estar desconectado. Usted
puede tomar tal decisión para los pasadores /PDIAGy /DASP, y tal vez
por /CD1, /CD2, INTRQy /RESET así.

Como siempre, existen dificultades para manejar tarjetas CompactFlash que no siguen
estrictamente el estándar. Hemos encontrado tarjetas CompactFlash que se identifican a sí
mismas como discos duros, en lugar de devolver la firma especificada por el documento
CompactFlash. Además, a veces no se cumplen los diagramas de tiempo y secuencia para varias
señales de estado. Desafortunadamente, no hay otra opción que probar con tantas tarjetas
CompactFlash como sea posible.

Programación de tarjeta SD / MMC


Las especificaciones para tarjetas SD y MMC tienen un precio, mientras que son gratis para tarjetas
CompactFlash. Además, las especificaciones para tarjetas SD y tarjetas MMC están controladas
por dos organizaciones diferentes: la SD Card Association y la MultiMediaCard Association . Éstos
miran el trabajo de los demás, con el objetivo de permanecer compatibles si es posible, pero
existen incompatibilidades.

Para MMC, hay dos interfaces en serie diferentes para hablar con la tarjeta: la interfaz estándar
SPI y una interfaz personalizada (que permitiría varias tarjetas en un bus de interfaz en serie). La
tarjeta SD agrega un tercer protocolo donde se transfieren cuatro bits en paralelo. La mayoría
del código de "código abierto" para interconectar tarjetas SD / MMC usa el modo
SPI. (Las tarjetas móviles MMC plus y MMC más nuevas también permiten transferencias paralelas
de 4 bits e incluso de 8 bits).

Independientemente de la interfaz, el protocolo utilizado para SD y MMC se basa en transacciones


en las que el host inicia una transferencia mediante el envío de un comando y la tarjeta responde
con información de estado, los datos reales y un CRC. La tarjeta debe
permanecer seleccionada (la señal de "selección de chip" debe permanecer activada ) para toda
la transacción y el host debe poder procesar la respuesta dentro de los tiempos ordenados por la
interfaz en serie.

La mayor parte de los comandos se conocen debido a las hojas de datos detalladas y disponibles
públicamente de Samsung (un fabricante de tarjetas MMC). Los comandos son conocidos por el
número de índice y por el nombre nmemonic. Por ejemplo, el comando para seleccionar la tarjeta
para una operación posterior de datos de lectura o datos de escritura se conoce
simultáneamente SELECT CARDcomo CMD7.

Para leer un sector FAT particular, primero se debe establecer la dirección de inicio para leer (el
número de bytes también se debe establecer la lectura, para un sector FAT esto siempre es de
512 bytes). Aquí hay un truco: en las tarjetas estándar SD y MMC, la dirección está en bytes, por
lo que si transfiere un número de sector (físico), debe multiplicar el número de sector por 512
para obtener la dirección. Con las tarjetas más nuevas de "alta capacidad", la dirección está en
múltiplos de 512 bytes, la dirección es la misma que el número del sector. Esto significa que el
host debe detectar si la tarjeta es de alta capacidad o estándar. Este es también un área donde
las especificaciones SD y MMC son incompatibles, lo que significa que primero debe detectar si
una tarjeta es una tarjeta SD o una tarjeta MMC.

La prueba de SD en comparación con MMC normalmente se realiza enviando un comando a la


tarjeta que existe en la especificación SD y no está presente en las tarjetas MMC. El comando a
usar para esto es APP OPERATING CONDITIONo CMD41. Una tarjeta MMC limitará el tiempo de
espera en este comando (y no responderá). Este comando también devuelve el "Registro de
configuración operativa" (OCR), que contiene el bit de "alta capacidad". Este bit solo es válido si
solicitó que se establezca en CMD41. Sin embargo, antes de poder solicitar este bit, primero debe
haber enviado el comando SEND INTERFACE CONDa la tarjeta (CMD8); de lo contrario, una
tarjeta SD anterior (con capacidad estándar) volverá "ocupada" en la CMD41 subsiguiente con la
solicitud del "bit de alta capacidad". El bit de alta capacidad es el bit 30 en el OCR. Incluso con
esta precaución (estableciendo el "bit de alta capacidad" SEND INTERFACE CONDAPP
OPERATING CONDITIONpuede regresar con el estado de que la tarjeta no está lista. El comando
debería ser repetido. Para algunas tarjetas, puede tomar un tiempo para alcanzar el estado
"listo"; Aconsejamos seguir repitiendo el comando durante al menos 0,2 segundos antes de darse
por vencido.

Entonces el procedimiento es: verifique si la tarjeta SD admite la versión 2 de la especificación


SD (que es la primera en definir el bit de alta capacidad) con CMD8, luego pruebe el bit con
CMD41. Si la tarjeta no admite la versión 2 de la especificación SD, aún emite CMD41, pero sin
solicitar el bit de alta capacidad, para diferenciar entre una tarjeta SD de capacidad estándar y
una tarjeta MMC.

Cuando se confirma que la tarjeta es una tarjeta MMC, con el procedimiento anterior, puede
emitir SEND OPERATING CONDITION(CMD1), que es el equivalente de MMC de CMD41. Este
comando también devuelve el OCR, y al igual que CMD41, también devuelve el bit de "alta
densidad" si se solicitó. De hecho, la especificación MMC (versión 4.2) define dos bits en el OCR
para el modo de acceso, los bits 29 y 30, donde SD solo tiene un bit único. Para tarjetas de
capacidad estándar, ambos bits son 0; para tarjetas de alta capacidad, el bit 29 es cero y el bit
30 es 1. Las tarjetas MMC anteriores (que no admiten la solicitud para el modo de acceso) pueden
devolver 0: 0 o 1: 1 en bits 30:29, que se interpretan ambos como "capacidad estándar", o pueden
agotar el tiempo de espera en el comando, en cuyo caso el host reenvía CMD1 sin la solicitud del
modo de acceso.
El diagrama de flujo ilustra el procedimiento. En el código del programa, puede eliminar alguna
redundancia en el diagrama de flujo. Por ejemplo, después de CMD8, el siguiente comando
siempre es CMD41; solo el argumento para el comando es diferente. De forma similar, la llamada
repetida a CMD1 podría implementarse como un bucle, con la solicitud de "modo acceso" borrada
del argumento en la segunda iteración.

Las tarjetas de capacidad estándar generalmente usan FAT12 o FAT16, porque las especificaciones
SD y MMC las exigen. Microsoft desaconseja FAT12 para discos con capacidades superiores a 4 MiB
y declara el límite superior de la capacidad del disco FAT12 en 32 MiB. Sin embargo, existen
tarjetas SD / MMC con capacidades de 64 MB o más que usan FAT12 y no son tan raras como se
podría suponer. Esto se debe a que las especificaciones SD y MMC utilizan una modificación menor
de la antigua especificación FAT12: almacena el "número total de sectores en la partición" como
un campo de 32 bits en el desplazamiento 0x020 en el bloque de parámetros de disco, en lugar
del 16- campo de bit en el desplazamiento 0x013. El campo de 32 bits en el desplazamiento 0x020
no existía en la especificación original de FAT12. Con este truco, el tamaño máximo de una
partición FAT12 aumenta de 32 MiB a aproximadamente 256 MiB (tamaño de clúster máximo de
64 KiB multiplicado por 4085, que es la cantidad máxima de clusters que FAT12 puede
admitir). Para admitir mejor a FAT12, la SD Card Association incluso proporciona su propia utilidad
de formateo, presumiblemente porque la utilidad de formato estándar de los sistemas operativos
actuales se negará a formatear tarjetas de más de 32 MB con FAT12.

El "Manual de instrucciones del software de formateo de la tarjeta de memoria SD" hace la siguiente
afirmación:
"Generalmente, los sistemas de archivos de la tarjeta de memoria SD / SDHC formateados con el
software de formateo del sistema operativo genérico no cumplen con la especificación de la tarjeta
de memoria SD."
Consulte la sección de referencias (a continuación) para obtener un enlace a la utilidad de formato
de la tarjeta de memoria SD.

Referencias
Asociación CompactFlash; La especificación CF + y CompactFlash, Revisión
2.0 ; 2003.
La especificación completa: interfaz eléctrica, física y de software. Especialmente las
secciones sobre el tiempo y las descripciones del registro son relevantes en relación con
este artículo. Descargar la última especificación requiere un registro gratuito.

LakeView Research; La página de almacenamiento masivo .


Una lista de artículos y recursos en / para dispositivos de almacenamiento masivo que se
conectan en el puerto USB, como tarjetas de memoria y lectores / escritores de tarjetas
(CompactFlash).
Birrell, A., M. Isard, C. Thacker, T. Wobber; Un diseño para discos
Flash de alto rendimiento ; Informe técnico de Microsoft
Research MSR-TR-2005-176; Diciembre de 2005.
Las primeras 3 páginas de este informe técnico presentan medidas y un análisis de
escrituras aleatorias en una tarjeta CompactFlash.
SD Card Association; Especificaciones SD simplificadas - Parte
1, Capa física, Versión 2.00 ; Septiembre de 2006.
Las especificaciones simplificadas para las tarjetas SD se pueden obtener a través de este
enlace (después de aceptar un acuerdo de licencia) sin costo. Las especificaciones
simplificadas cubren tarjetas SD estándar y tarjetas SD de alta capacidad.

Matsushita Electric Industrial Co., Ltd.


(Panasonic); Software de formateo de la tarjeta de
memoria SD versión 2.0 ; Septiembre de 2006.
La utilidad "SDFormatter", su manual y las preguntas frecuentes se pueden descargar
desde esta página.
Samsung Electronics (Equipo de ingeniería de
aplicaciones y planificación de productos); Nota de
aplicación MMC de alta densidad ; Mayo de 2006.
Folletos de presentación sobre la versión 4.2 de las especificaciones de MMC. Esta revisión
de la especificación introduce tarjetas de "alta densidad", que pueden superar los 4 GB. El
documento compara tarjetas MMC de alta densidad con tarjetas SD de alta capacidad.
Documento técnico de hardware de Microsoft; FAT:
descripción general del formato en
disco ; Corporación Microsoft.
Información técnica sobre FAT (FAT12, FAT16 y FAT32). No me gusta el estilo de escritura
y hay algunos errores tipográficos, pero la información técnica es precisa y bastante
completa. Este es un enlace a un archivo PDF.
Comité Técnico T13; Tecnología de la
información - Adjunto TA con extensión de
interfaz de paquete (ATA / ATAPI-
4) ; Agosto de 1998.
El enlace es un borrador de trabajo de la especificación de la interfaz ATA-IDE, en formato
PDF. (La cabina de documentos finales impresos debe solicitarse a ANSI).
Villani, P .; "El Kernel de FreeDOS"; Libros
de I + D; 1996; ISBN 0-87930-436-7.
Una buena introducción a FAT12 y FAT16, pero el criterio para elegir entre FAT12 o FAT16
parece sospechoso. La descripción de FAT32 es deficiente.
metro Nombres de archivos largos
VFAT .
Un breve documento técnico sobre cuánto tiempo se implementan los nombres de archivo
en los sistemas de archivos FAT.

También podría gustarte