sexta-feira, 23 de março de 2007

Cálculos para a rotina de teste de escrita

Achei a conta que tenho que fazer. Eu preciso calcular o endereço da metade do cartão. Eu já sei calcular o tamanho em blocos de 512bytes.

Apesar das operações de transferência com o cartão serem sempre em blocos, o padrão de endereçamento de dados é byte a byte, usando 32 bits A3-A2-A1-A0, onde A[3..0] têm 8 bits cada um. Apesar disso, todas as operações de leitura e escrita têm que utilizar alinhamento de bloco, ou seja, têm que ser múltiplos de 512bits, senão o cartão reporta um erro de endereçamento ilegal.

Para realizar o teste de escrita, eu escolhi escrever em uma sequência de blocos que fica na metade do tamanho máximo do cartão, pois aí certamente será uma área de dados, e já estará depois da FAT.

Como eu utilizo um programa Basic que faz interface com um programa em Assembler, eu preciso converter o tamanho em blocos num número que corresponda ao endereço da metade do cartão,

Então faço o seguinte:

T_Blocos=Tamannho em blocos de 512 bytes
TBH= int(T_blocos/65536)
TBL= T_blocos-TBH*65536

B4=int(TBH/256)
B3=TBH-B4*256
B2= int(TBL/256)
B1= TBL-B2*256

Com este cálculo eu transformo o valor T_blocos em 4 bytes, B4,B3,B2,B1. O cálculo de B4 é mais para a conta ficar genérica, pois dado que o cartão SD/MMC utilizam 32 bits para endereçar, ou seja, suporta apenas 4GB. O valor de A4 vai ser sempre 0.

Dado que cada bloco tem 512 bytes, para obter a posição do último byte do cartão, eu tenho que multiplicar o tamanho em blocos por 512. Assim para para obter a posição do byte que fica na metade do cartão, eu tenho que multiplicar o tamanho em blocos por 256, ou seja, deslocar 8 bits para a esquerda.

Isso é feito utilizando-se como endereço:

A0=0
A1=B1
A2=B2
A3=B3

Vou implementer estas rotinas no programa Basic e continuar o trabalho.

Nenhum comentário: