Hola, debido a consultas que recibí, queria explayarme un poco más en como migrar a otra aplicación, basicamente hay gente que esta usando solamente la parte del File System, asi que en esto me voy a centrar.
La dependencia de files es la sgte:
FS-->
Card-->
MCULos módulos FS ( File System ) y Card ( Accesso a la SD/MMC ) no usan directamente ningún recurso de hardware, sino que lo hacen atravez del módulo
MCU. En el mismo deberan implementarse las sgtes funciones para obtener la mínima funcionalidad requerida.
void WatchDog_Clear( void )
{
...
}
void SetLed( tLedType LedType )
{
...
}
Estas dos funciones, una resetea el watch dog interno, y la otra por cada acceso a un sector de la tarjeta prende el led, pueden no ser usadas, en este caso deberan tener el cuerpo vacio.
Las siguientes funciones son requeridas si el acceso a la tarjeta es hecho via SPI:
void SPI_Init( tSPIClock SPIClock )
{
...
}
void SPI_ChangeClock( tSPIClock SPIClock )
{
...
}
void SPI_SendByte( byte Data )
{
...
}
byte SPI_ReceiveByte( void )
{
...
}
void SPI_CSAssert( void )
{
...
}
void SPI_CSDeassert( void )
{
...
}
Las dos primeras existen porque en el inicio es necesario comunicarse con la tarjeta a una velocidad máxima de SPI de 400 KHz, una vez finalizada la inicialización es posible aumentar la velocidad, la misma depende del tipo de tarjeta, las MMC son mas lentas que las SD y si mal no recuerdo permiten un máximo de 5Mhz de SPI.
Las funciones siguientes, Send y Receive no merecen explicación, y las dos últimas encienden/apagan la linea
-SS del SPI.
Aunque en casi todos los controloadores de SPI integrados en los micros es posible manejar en forma automatica esta señal, decidi separarla, ya que en cierta parte de inicialización es necesario transmitir una chorreada de '1' pero con esta linea en alto.
void SetTimerEvent( tTimerTime *Event, dword MiliSeconds )
{
...
}
bool TimerHasExpired( tTimerTime *Event )
{
...
}
Estas dos funciones son utilizadas para controlar las operaciones de acceso a la tarjeta y cortar por timeout en caso de que algo falle, la primera setea un "evento" con un tiempo programable y la segunda retorna verdadero si ese mismo evento expiro. Si revisan el código de estas dos funciones estan escritas en ANSI C puro, lo único es que dependen de una función interna al módulo que devuelve el valor de un contador free-running que es el encargado de contar la cantidad de ticks por segundo, en este caso es de 10 ms.
dword GetTimerTicks( void )
{
volatile dword ReadTicks;
ReadTicks = TimerTicks;
while ( ReadTicks != TimerTicks )
{
ReadTicks = TimerTicks;
}
return( ReadTicks );
}
Como la función devuelve un dword ( unsigned long o 4 bytes ) en micros cuya aquitectura no sea de 32 bits es necesario realizar la comparación dentro del while ya que la variable TimerTicks se incrementa automaticamente en el handler de un timer y esto sucede en tiempo de interrupción.
Estas son las únicas funciones que deberia implementar para mudar el file system a otra aplicación, recordar setear el endian correspondiente aocrde al micro que se este usando.
Alineación de las estructurasEl último punto importante es verificar la alineación de las estructuras. En micros de 8 bits normalmente el compilador aloca una estructura en base a la suma total de sus miembros:
typedef struct
{
byte FName[11];
byte Attr;
word Reserved0;
word CreationTime;
word CreationDate;
word LastAccessDate;
word Reserved1;
word LastWriteTime;
word LastWriteDate;
word StartCluster;
dword FileSize;
} tFileInfo;
En este caso el tamaño de la estructura es de 32 bytes ( la suma del sizeof de cada elemento ). Pero esto no siempre es asi, en algunos micros de 32 bits al micro le resulta mas optimo acceder a direcciones pares. Para estos casos el compilador puede "paddear" los miembros para que estos se aloquen siempre en direcciones pares. La estructura interna de File System trabaja con
no paddeo o lo que es lo mismo
padding = 1 , para asegurarse esto existe un pragma, casi todos los compiladores que vi lo implementan, que permite definir el tamaño del padding, quedando la definicon anterior de la sgte. manera:
#pragma pack(1)
typedef struct
{
byte FName[11];
byte Attr;
word Reserved0;
word CreationTime;
word CreationDate;
word LastAccessDate;
word Reserved1;
word LastWriteTime;
word LastWriteDate;
word StartCluster;
dword FileSize;
} tFileInfo;
Saludos !