Autor Tema: MMC Card : Hardware & Firmware  (Leído 52357 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5416
    • Picmania by Redraven
Re: MMC Card : Hardware & Firmware
« Respuesta #75 en: 01 de Febrero de 2007, 10:45:12 »
Muchas gracias, amigo PICMouse, en la parte que me toca ...   :5}
pero la verdad es que soy un exhibicionista y me gusta hacerlo todo (o casi todo público)  :D
Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado aitopes

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5102
    • uControl
Re: MMC Card : Hardware & Firmware
« Respuesta #76 en: 01 de Febrero de 2007, 11:30:34 »
Amigo PicMouse!

Citar
Aitopes, es de guerreros atender la casa, el trabajo y este foro, de la manera en que lo haces.

Si lo dices por lo del bebe, no te equivoques!  Lo atiende mi mujer, yo solo me pongo mal cuando lo veo llorar, pero la encargada de TODO lo que implica atender un retoño lo hace ella! :)
Hasta que no aparezca un buen compilador para reprogramarlo, seguira atendiendolo ella.
(No estaria mal cambiarle el firmware...se ve que vino con la hora de España, duerme de 5AM hasta el medidodia....y a la noche, se dedica a hacer fiestas, llorar, o ambas cosas..  :shock: ).
Si cualquier habilidad que aprende un niño será obsoleta antes de que la use, entonces, ¿qué es lo que tiene que aprender? La respuesta es obvia:
La única habilidad competitiva a largo plazo es la habilidad para aprender
“. Seymour Papert

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5416
    • Picmania by Redraven
Re: MMC Card : Hardware & Firmware
« Respuesta #77 en: 03 de Febrero de 2007, 10:59:58 »
Este es un pequeño paso para la humanidad pero inmenso para mí.  :D
(Dándole la vuelta a lo que Armstrong dijo en la Luna)

Visto que para alcanzar el Master Boot Sector (o sea saber en qué Address había que leer) había que interpretar primero la Master Partition Table ...  :mrgreen:

Pues yá está.



Con éste código:

               for(j=0;j<0x10;j++){  // one for byte in Partition Entry
                  f = 0x1BE+j;
                  Partition_Entry[j]=MMCBuffer[f];
               }
               // Interpretation
               printf("\r\n");
               // Type
               printf("Partition Type %u\r\n",Partition_Entry[4]);
               // start_lsec is address of the partion boot sector
               start_lsec=make32(Partition_Entry[11],Partition_Entry[10],Partition_Entry[9],Partition_Entry[8]);
               printf("Start Partition in sectors %Lu (Address of MBR 0x%LX)\r\n",start_lsec,start_lsec*(sector_size+1));
               // partition_size
               partition_size=make32(Partition_Entry[15],Partition_Entry[14],Partition_Entry[13],Partition_Entry[12]);
               printf("Partition Size in sectors %Lu (Capacity in Bytes %Lu)\r\n",partition_size,partition_size*(sector_size+1));
               // Continuing for MBR
               printf("Jumping to MBR in %LX ...\r\n\n",start_lsec*(sector_size+1));          
               address = 0x8000;
               strcpy(recBuffer,"R\0");

podemos ver ....



Ya os daré detalles en cuando tenga un hueco para documentar esto en condiciones.  :D


« Última modificación: 10 de Junio de 2013, 09:43:12 por RedPic »
Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5416
    • Picmania by Redraven
Re: MMC Card : Hardware & Firmware
« Respuesta #78 en: 03 de Febrero de 2007, 16:34:57 »
Bueno, para que este Sábado no sea improductivo del todo ...

Vamos a interpretar el MBR ... por lo menos la entrada general y el BPB  :mrgreen:

El siguiente paso va a ser interpretar el xPBP o Información Extendida del FAT16



   int32 start_lsec;
   int32 partition_size;
   int16 bytes_per_sector;
   int8  sectors_per_cluster;
   int16 sectors_reserved;
   int16 root_entries;
   int16 sectors_per_volumenL;
   int16 sectors_per_fat;
   int16 sectors_per_track;
   int16 num_heads;
   int32 sectors_invisibles;
   int32 sectors_per_volumenH;

   ...

            address = 0x00;
            if(mmc_read_block(address, sector_size,&MMCBuffer[0])==0){
               // Read and Presentation
               printf("\r\n\n>MMC read Master Partition Table\r\n\n");
               printf("RAW in MPT  00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F\r\n");
               printf("            ===============================================\r\n");
               for(i=0;i<4;i++){        // One for Partition Entry
                  f = 0x1BE + (i*0x10);
                  printf("P%u at %LX  ",i+1,f);
                  for(j=0;j<0x10;j++){  // one for byte in Partition Entry
                     f = 0x1BE + (i*0x10) +j;
                     Partition_Entry[j]=MMCBuffer[f];
                     printf("%LX ",Partition_Entry[j]);
                  }
                  if(i==0) printf("*");
                  printf("\r\n");
               }
               // Reread the first partition
               for(j=0;j<0x10;j++){  // one for byte in Partition Entry
                  f = 0x1BE+j;
                  Partition_Entry[j]=MMCBuffer[f];
               }
               // Interpretation
               printf("\r\n");
               // Type
               printf("Partition Type %u\r\n",Partition_Entry[4]);
               // start_lsec is address of the partion boot sector
               start_lsec=make32(Partition_Entry[11],Partition_Entry[10],Partition_Entry[9],Partition_Entry[8]);
               printf("Start Partition in sectors %Lu (Address of MBR 0x%LX)\r\n",start_lsec,start_lsec*(sector_size+1));
               // partition_size
               partition_size=make32(Partition_Entry[15],Partition_Entry[14],Partition_Entry[13],Partition_Entry[12]);
               printf("Partition Size in sectors %Lu (Capacity in Bytes %Lu)\r\n",partition_size,partition_size*(sector_size+1));
               // Continuing for MBR
               printf("\r\nReading MBR in address %LX ...\r\n\n",start_lsec*(sector_size+1));
               address = start_lsec*(sector_size+1);
               if(mmc_read_block(address, sector_size,&MMCBuffer[0])==0){
                  // Jumping Code
                  printf("Jump Code .: ");
                  iOffset=0x00;
                  for(i=0;i<3;i++){
                     printf("0x%X ",MMCBuffer[iOffSet+i]);
                  }
                  printf("\r\n");
                  // OEM ID
                  printf("OEM ID ....: ");
                  iOffset=0x03;
                  for(i=0;i<8;i++){
                     printf("%c",MMCBuffer[iOffSet+i]);
                  }
                  printf("\r\n");
                  // BPB_Entry
                  printf("\r\nMMC read BIOS Parametrer Block\r\n\n");
                  printf("RAW in BPB  00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F\r\n");
                  printf("            ===============================================\r\n");
                  printf("            ");
                  iOffset=0x0B;
                  for(i=0;i<25;i++){
                     BPB_Entry[ i ]=MMCBuffer[iOffSet+i];
                     printf("%X ",BPB_Entry[ i ]);
                     if(i==0x0F) printf("\r\n            ");
                  }
                  printf("\r\n\n");
                  // bytes_per_sector
                  bytes_per_sector=make16(BPB_Entry[1],BPB_Entry[0]);
                  printf("Bytes per Sector ....: 0x%LX (%Lu)\r\n",bytes_per_sector,bytes_per_sector);
                  // sectors_per_cluster
                  sectors_per_cluster=(int8) BPB_Entry[2];
                  printf("Sectors per Cluster .: 0x%X   (%u)\r\n",sectors_per_cluster,sectors_per_cluster);
                  // sectors_reserved
                  sectors_reserved=make16(BPB_Entry[4],BPB_Entry[3]);
                  printf("Sectors Reserved ....: 0x%LX (%Lu)\r\n",sectors_reserved,sectors_reserved);
                  // number copys of FAT
                  printf("Copys of FAT ........: 0x%X   (%u)\r\n",BPB_Entry[05],BPB_Entry[05]);
                  // root_entries
                  root_entries=make16(BPB_Entry[7],BPB_Entry[6]);
                  printf("Root entries ........: 0x%LX (%Lu)\r\n",root_entries,root_entries);
                  // sectors_per_volumen LOW
                  sectors_per_volumenL=make16(BPB_Entry[9],BPB_Entry[8]);
                  printf("Volumen Sectors Low .: 0x%LX (%Lu)\r\n",sectors_per_volumenL,sectors_per_volumenL);
                  // Media Descriptor Byte
                  printf("Media Descriptor Byte: 0x%X   (%u)\r\n",BPB_Entry[10],BPB_Entry[10]);
                  // sectors_per_fat
                  sectors_per_fat=make16(BPB_Entry[12],BPB_Entry[11]);
                  printf("FAT Sectors .........: 0x%LX (%Lu)\r\n",sectors_per_fat,sectors_per_fat);
                  // sectors_per_track
                  sectors_per_track=make16(BPB_Entry[14],BPB_Entry[13]);
                  printf("Track Sectors .......: 0x%LX (%Lu)\r\n",sectors_per_track,sectors_per_track);
                  // sectors_per_track
                  num_heads=make16(BPB_Entry[16],BPB_Entry[15]);
                  printf("Heads ...............: 0x%LX (%Lu)\r\n",num_heads,num_heads);
                  // sectors_invisibles
                  sectors_invisibles=make32(BPB_Entry[20],BPB_Entry[19],BPB_Entry[18],BPB_Entry[17]);
                  printf("Invisible Sectors ...: 0x%LX (%Lu)\r\n",sectors_invisibles,sectors_invisibles);
                  // sectors_per_volumen Hight
                  sectors_per_volumenH=make32(BPB_Entry[24],BPB_Entry[23],BPB_Entry[22],BPB_Entry[21]);
                  printf("Volumen Sectors Hight: 0x%LX (%Lu)\r\n",sectors_per_volumenH,sectors_per_volumenH);
                  // xBPB_Entry
                  
                  
               }else{
                  printf("\n\r>Read MBR page fault");
               }

            }else{
               printf("\n\r>Read MPT page fault");
            }
« Última modificación: 10 de Junio de 2013, 09:44:14 por RedPic »
Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado aitopes

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5102
    • uControl
Re: MMC Card : Hardware & Firmware
« Respuesta #79 en: 03 de Febrero de 2007, 17:22:54 »
Hola Diego!

Tendriamos que chekear que lo que estas leyendo sea coherente con lo que yo he posteado, no? :)

Saludos!
Si cualquier habilidad que aprende un niño será obsoleta antes de que la use, entonces, ¿qué es lo que tiene que aprender? La respuesta es obvia:
La única habilidad competitiva a largo plazo es la habilidad para aprender
“. Seymour Papert

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5416
    • Picmania by Redraven
Re: MMC Card : Hardware & Firmware
« Respuesta #80 en: 04 de Febrero de 2007, 08:42:02 »
La leyes de la Filosofia Natural, ó Filosofía de la Ciencia, me obligan a deducir siempre lo general de lo particular. Y para ello necesitamos de una casuística amplia y variada. Un solo ejemplar bajo el microscopio es insuficiente para proclamar una Ley Natural. Esto sería como construir la Entomología a partir de una única mariposa estudiada. Y no ese el caso.

Tu documento, Ariel, describe un Diskette, mi experimento involucra una MMC Card. Siendo iguales no son lo mismo. El uno no admite particiones, la otra sí al ser asimilada a un Disco Duro. Aquél tiene el MBR el el Sector 0, ésta lo tiene en el 64. Ambos MBR son similares y compatibles entre sí y con tu documento.

Pero para llegar a él hay que descifrar primero el MPT de particiones, y para ello tengo que hacer una suposición que después me confirma el MBR y es que los sectores son de 512 Bytes. Premisa a la que se ha de llegar por inspiración divina, como si fuese un Postulado de Euclídes.

Sin esta suposición no puedo inferir la dirección del MBR en la MMC Card. Y yo lo he hecho porque previamente sabía, a través de mi Firmware espía, en qué dirección estaba el MBR y al leer la MPT y decirme ésta que el comienzo físico de dicha partición estaba en el sector 64 solo tuve que multiplicar por 512 para poder cargar el MBR. Ya que efectivamente 64 * 512 = 32768 (Hex 8000) que es donde en efecto está mi MBR.

Y es entonces el MBR el que me dice que BPB_BytsPerSec es precisamente 512, que es como ser capaz de subirse al tren después de que éste haya partido de la estación.  :shock:

Pero hay mas ¿incongruencias o desconocimientos? ... la MPT tiene 4 entradas de las que una de ellas, la primera, tiene datos y las otras tres están a cero. Por ello yo esperaba que el campo Active tuviese un valor distinto de cero, pero es cero, por lo que debería suponer que esa única partición no es la activa, y sin embargo lo es, precisamente porque es la única. Por ello mi software no puede fiar de ese dato, sino que debe ver si los demás tienen o no contenido. O como es el caso, leer la primera partición tal cual está dándola por activa y saltando a leer el siguiente hito dándola por buena.  :shock:

Pero por lo demás tu documento es absolutamente exacto, cuando los offsets correspondientes se toman como relativos al inicio del MBR y no absolutos con respecto al origen.  :mrgreen:

Por ello te digo lo que te dije antes: Falta más información, y sospecho que es sobre el sistema de organizar las FAT en un Disco Duro, que puede albergar varias particiones, cada una de ellas con distintos formateos, ó MBR's distintos.  :P

Continuamos ...

P.D. ¿Son todas la MMC iguales? No lo sé, solo tengo una (como la mariposa) asi que no puedo hablar de las MMC Cards, sino de mi MMC Card.  :(

« Última modificación: 04 de Febrero de 2007, 10:46:11 por RedPic »
Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5416
    • Picmania by Redraven
Re: MMC Card : Hardware & Firmware
« Respuesta #81 en: 04 de Febrero de 2007, 10:33:18 »
Another Brick in the Wall ...

The Wall, Pink Floyd. 1979.

Buenoooo ... con esto doy por concluída la primera fase de la fase concluyente. O sease que el BPB, la MPT y la xBPB ... Ahora imagino que el siguiente frente ha de ser el del Root Directory ... supongo.  :mrgreen:

Ademas de la info publicada por Ariel/Aitopes en su Fat al desnudo he utilizado principalmente el magnífico Tutorial de Tecnología PC de A.J.Millán de Zator Systems. Sobre todo la sección Discos : Estructura Lógica en la que aparece ABSOLUTAMENTE TODO.

El asunto es que he logrado interpretar, y volcar a pantalla, con mi firmware en CCS C, toda la información relevante acerca de la organización lógica de la MMC Card. Ahora el reto está en acceder a las entradas FAT y a través de ellas localizar los ficheros para poder interactuar con ellos, leyéndolos y/o escribiéndolos.

La pantalla mostrativa de la lectura de los datos básicos de acceso es:



El código CCS C que hace esto es el siguiente:

Código: C#
  1.    int8  heads, Cylinders, Sectors;
  2.    int32 CHS_Address_start;
  3.    int32 CHS_Address_end;
  4.    int32 start_lsec;
  5.    int32 partition_size;
  6.    int16 bytes_per_sector;
  7.    int8  sectors_per_cluster;
  8.    int16 sectors_reserved;
  9.    int16 root_entries;
  10.    int16 sectors_per_volumenL;
  11.    int16 sectors_per_fat;
  12.    int16 sectors_per_track;
  13.    int16 num_heads;
  14.    int32 sectors_invisibles;
  15.    int32 sectors_per_volumenH;
  16.  
  17.          // Read Master Partition Table ///////////////////////////////////////////////////////////
  18.          if(recBuffer[0]=='P' AND recBuffer[1]=='\0'){
  19.  
  20.             address = 0x00;
  21.             if(mmc_read_block(address, sector_size,&MMCBuffer[0])==0){
  22.                // Read and Presentation
  23.                printf("\r\n\nMMC read Master Partition Table\r\n");
  24.                printf("RAW in MPT  00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F\r\n");
  25.                printf("            ===============================================\r\n");
  26.                for(i=0;i<4;i++){        // One for Partition Entry
  27.                   f = 0x1BE + (i*0x10);
  28.                   printf("P%u at %LX  ",i+1,f);
  29.                   for(j=0;j<0x10;j++){  // one for byte in Partition Entry
  30.                      f = 0x1BE + (i*0x10) +j;
  31.                      Partition_Entry[j]=MMCBuffer[f];
  32.                      printf("%LX ",Partition_Entry[j]);
  33.                   }
  34.                   if(i==0) printf("*");
  35.                   printf("\r\n");
  36.                }
  37.                // Reread the first partition
  38.                for(j=0;j<0x10;j++){  // one for byte in Partition Entry
  39.                   f = 0x1BE+j;
  40.                   Partition_Entry[j]=MMCBuffer[f];
  41.                }
  42.                // Interpretation
  43.                printf("\r\n");
  44.                // Begin CHS Partition
  45.                heads     = Partition_Entry[1];
  46.                sectors   = Partition_Entry[2] & 0x3f;
  47.                cylinders = ((Partition_Entry[2] & 0xc0) << 2) + Partition_Entry[3];              
  48.                CHS_Address_start = (cylinders*Heads*sectors) + (heads*Sectors) + (sectors - 1);
  49.                printf("Start Partition in CHS %X/%X/%X (0x%LX)\r\n",cylinders,heads,sectors,CHS_Address_start);
  50.                // End CHS Partition
  51.                heads     = Partition_Entry[5];
  52.                sectors   = Partition_Entry[6] & 0x3f;
  53.                cylinders = ((Partition_Entry[6] & 0xc0) << 2) + Partition_Entry[7];              
  54.                CHS_Address_end = (cylinders*Heads*sectors) + (heads*Sectors) + (sectors - 1);
  55.                printf("End Partition in CHS %X/%X/%X (0x%LX)\r\n",cylinders,heads,sectors,CHS_Address_end);
  56.                // Type
  57.                printf("Partition Type %u\r\n",Partition_Entry[4]);
  58.                // start_lsec is address of the partion boot sector
  59.                start_lsec=make32(Partition_Entry[11],Partition_Entry[10],Partition_Entry[9],Partition_Entry[8]);
  60.                printf("Start Partition in sectors %Lu (Address of MBR 0x%LX)\r\n",start_lsec,start_lsec*(sector_size+1));
  61.                // partition_size
  62.                partition_size=make32(Partition_Entry[15],Partition_Entry[14],Partition_Entry[13],Partition_Entry[12]);
  63.                printf("Partition Size in sectors %Lu (Capacity in Bytes %Lu)\r\n",partition_size,partition_size*(sector_size+1));
  64.                // Continuing for MBR
  65.                printf("Reading MBR in address 0x%LX ...\r\n",start_lsec*(sector_size+1));
  66.                address = start_lsec*(sector_size+1);
  67.                if(mmc_read_block(address, sector_size,&MMCBuffer[0])==0){
  68.                   // Jumping Code
  69.                   printf("Jump Code .: ");
  70.                   iOffset=0x00;
  71.                   for(i=0;i<3;i++){
  72.                      printf("0x%X ",MMCBuffer[iOffSet+i]);
  73.                   }
  74.                   printf("\r\n");
  75.                   // OEM ID
  76.                   printf("OEM ID ....: ");
  77.                   iOffset=0x03;
  78.                   for(i=0;i<8;i++){
  79.                      printf("%c",MMCBuffer[iOffSet+i]);
  80.                   }
  81.                   printf("\r\n");
  82.                   // BPB_Entry
  83.                   printf("\nMMC read BIOS Parametrer Block BPB\r\n");
  84.                   printf("RAW in BPB  00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F\r\n");
  85.                   printf("            ===============================================\r\n");
  86.                   printf("            ");
  87.                   iOffset=0x0B;
  88.                   for(i=0;i<25;i++){
  89.                      BPB_Entry[ i ]=MMCBuffer[iOffSet+i];
  90.                      printf("%X ",BPB_Entry[ i ]);
  91.                      if(i==0x0F) printf("\r\n            ");
  92.                   }
  93.                   printf("\r\n\n");
  94.                   // bytes_per_sector
  95.                   bytes_per_sector=make16(BPB_Entry[1],BPB_Entry[0]);
  96.                   printf("Bytes per Sector ....: 0x%LX (%Lu)\r\n",bytes_per_sector,bytes_per_sector);
  97.                   // sectors_per_cluster
  98.                   sectors_per_cluster=(int8) BPB_Entry[2];
  99.                   printf("Sectors per Cluster .: 0x%X   (%u)\r\n",sectors_per_cluster,sectors_per_cluster);
  100.                   // sectors_reserved
  101.                   sectors_reserved=make16(BPB_Entry[4],BPB_Entry[3]);
  102.                   printf("Sectors Reserved ....: 0x%LX (%Lu)\r\n",sectors_reserved,sectors_reserved);
  103.                   // number copys of FAT
  104.                   printf("Copys of FAT ........: 0x%X   (%u)\r\n",BPB_Entry[05],BPB_Entry[05]);
  105.                   // root_entries
  106.                   root_entries=make16(BPB_Entry[7],BPB_Entry[6]);
  107.                   printf("Root entries ........: 0x%LX (%Lu)\r\n",root_entries,root_entries);
  108.                   // sectors_per_volumen LOW
  109.                   sectors_per_volumenL=make16(BPB_Entry[9],BPB_Entry[8]);
  110.                   printf("Volumen Sectors Low .: 0x%LX (%Lu)\r\n",sectors_per_volumenL,sectors_per_volumenL);
  111.                   // Media Descriptor Byte
  112.                   printf("Media Descriptor Byte: 0x%X   (%u)\r\n",BPB_Entry[10],BPB_Entry[10]);
  113.                   // sectors_per_fat
  114.                   sectors_per_fat=make16(BPB_Entry[12],BPB_Entry[11]);
  115.                   printf("FAT Sectors .........: 0x%LX (%Lu)\r\n",sectors_per_fat,sectors_per_fat);
  116.                   // sectors_per_track
  117.                   sectors_per_track=make16(BPB_Entry[14],BPB_Entry[13]);
  118.                   printf("Track Sectors .......: 0x%LX (%Lu)\r\n",sectors_per_track,sectors_per_track);
  119.                   // sectors_per_track
  120.                   num_heads=make16(BPB_Entry[16],BPB_Entry[15]);
  121.                   printf("Heads ...............: 0x%LX (%Lu)\r\n",num_heads,num_heads);
  122.                   // sectors_invisibles
  123.                   sectors_invisibles=make32(BPB_Entry[20],BPB_Entry[19],BPB_Entry[18],BPB_Entry[17]);
  124.                   printf("Invisible Sectors ...: 0x%LX (%Lu)\r\n",sectors_invisibles,sectors_invisibles);
  125.                   // sectors_per_volumen Hight
  126.                   sectors_per_volumenH=make32(BPB_Entry[24],BPB_Entry[23],BPB_Entry[22],BPB_Entry[21]);
  127.                   printf("Volumen Sectors Hight: 0x%LX (%Lu)\r\n",sectors_per_volumenH,sectors_per_volumenH);
  128.                   // xBPB_Entry
  129.                   printf("\nMMC read BIOS Parametrer Block Extended xBPB\r\n");
  130.                   printf("RAW in xBPB 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F\r\n");
  131.                   printf("            ===============================================\r\n");
  132.                   printf("            ");
  133.                   iOffset=0x24;
  134.                   for(i=0;i<26;i++){
  135.                      xBPB_Entry[ i ]=MMCBuffer[iOffSet+i];
  136.                      printf("%X ",xBPB_Entry[ i ]);
  137.                      if(i==0x0F) printf("\r\n            ");
  138.                   }
  139.                   printf("\r\n\n");
  140.                   // disp number
  141.                   printf("Drive # .............: 0x%X   (%u)\r\n",xBPB_Entry[0],xBPB_Entry[0]);
  142.                   // reserverd
  143.                   printf("Reserved ............: 0x%X   (%u)\r\n",xBPB_Entry[1],xBPB_Entry[1]);
  144.                   // extended signature
  145.                   printf("Extended Signature ..: 0x%X   (%u)\r\n",xBPB_Entry[2],xBPB_Entry[2]);
  146.                   // serial number
  147.                   printf("Serial Number .......: ");
  148.                   iOffset=0x03;
  149.                   for(i=0;i<4;i++){
  150.                      if(i!=3)
  151.                         printf("%X-",xBPB_Entry[iOffSet+i]);
  152.                      else
  153.                         printf("%X",xBPB_Entry[iOffSet+i]);
  154.                   }
  155.                   printf("\r\n");
  156.                   // Vol Name
  157.                   printf("Vol. Name ...........: ");
  158.                   iOffset=0x07;
  159.                   for(i=0;i<0x0B;i++){
  160.                      printf("%c",xBPB_Entry[iOffSet+i]);
  161.                   }
  162.                   printf("\r\n");
  163.                   // Format Type
  164.                   printf("Format Type .........: ");
  165.                   iOffset=0x12;
  166.                   for(i=0;i<0x08;i++){
  167.                      printf("%c",xBPB_Entry[iOffSet+i]);
  168.                   }
  169.                   printf("\r\n");
  170.                   // Boot record signature
  171.                   printf("Boot record signature: 0x%X-0x%X\r\n",MMCBuffer[0x1FE],MMCBuffer[0x1FF]);
  172.                }else{
  173.                   printf("\n\r>Read MBR page fault");
  174.                }
  175.             }else{
  176.                printf("\n\r>Read MPT page fault");
  177.             }
  178.             Cursor();
  179.             validCommand=1;
  180.          }
  181.  

El 90% de la información que estamos tratando con este código es irrelevante para nuestras pretensiones de leer/escribir ficheros, y además la gran carga de programa y/o ROM se desperdicia con los printf ... Cuando pasemos a la fase siguiente imagino que con una docena de líneas tendremos resulto la carga de los datos importantes.  :mrgreen:

En fin, pero eso será otro día.
 
« Última modificación: 21 de Enero de 2010, 19:17:10 por RedPic »
Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5416
    • Picmania by Redraven
Re: MMC Card : Hardware & Firmware
« Respuesta #82 en: 04 de Febrero de 2007, 10:54:27 »
Nota muy importante:

Todos los valores numéricos utilizados por Mocosoft para en sus FAT, menos los formatos Cylinder/Head/Sector, estan expresados en little-endian format.

Esto quiere quiere decir que el primer byte en orden ascendente de dirección en el buffer es el MENOS SIGNIFICATIVO, y el último es el MAS SIGNIFICATIVO.

Por eso lo de int16 Valor = make16(buffer[1],buffer[0]);

¡Que después me decís que no explico las cosas!  :mrgreen:


Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado PalitroqueZ

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5429
    • Electrónica Didacta
Re: MMC Card : Hardware & Firmware
« Respuesta #83 en: 04 de Febrero de 2007, 11:55:57 »
es decir Red que si veo en un offset por ejemplo 3A4F el dato en realidad ¿es 4F3A?

Salu2
Pedro
La propiedad privada es la mayor garantía de libertad.
Friedrich August von Hayek

Desconectado aitopes

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5102
    • uControl
Re: MMC Card : Hardware & Firmware
« Respuesta #84 en: 04 de Febrero de 2007, 12:29:11 »
Hola Diego!

Sigues adelante a toda maquina! ;)

Por supuesto, a pesar de que el ejemplo que he tomado es un diskete, voy a ampliar a los demas medios de almacenamiento, ya que el diskete esta obsoleto. Pero me sirve como base sobre los que analizar los otros, ya que es de lejos el mas sensillo.

¿Llegaremos a concetar un disco duro a un pic?  :shock:
Si cualquier habilidad que aprende un niño será obsoleta antes de que la use, entonces, ¿qué es lo que tiene que aprender? La respuesta es obvia:
La única habilidad competitiva a largo plazo es la habilidad para aprender
“. Seymour Papert

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 17506
    • MicroPIC
Re: MMC Card : Hardware & Firmware
« Respuesta #85 en: 04 de Febrero de 2007, 12:37:34 »
¿Llegaremos a concetar un disco duro a un pic?  :shock:
Eso ya lo hizo Manex hace tiempo:
http://www.todopic.com.ar/foros/index.php?topic=2558.20
Un saludo desde Sevilla, España.
Visita MicroPIC                                                                                        ɔ!doɹɔ!ɯ ɐʇ!s!ʌ

Desconectado aitopes

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5102
    • uControl
Re: MMC Card : Hardware & Firmware
« Respuesta #86 en: 04 de Febrero de 2007, 12:39:26 »
Siempre pienso lo mismo: he llegado a este foro demasiado tarde....ja ja ja!
Voy a ver el hilo YA! :)
Si cualquier habilidad que aprende un niño será obsoleta antes de que la use, entonces, ¿qué es lo que tiene que aprender? La respuesta es obvia:
La única habilidad competitiva a largo plazo es la habilidad para aprender
“. Seymour Papert

Desconectado PalitroqueZ

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5429
    • Electrónica Didacta
Re: MMC Card : Hardware & Firmware
« Respuesta #87 en: 05 de Febrero de 2007, 11:52:51 »
¿Llegaremos a concetar un disco duro a un pic?  :shock:
Eso ya lo hizo Manex hace tiempo:
http://www.todopic.com.ar/foros/index.php?topic=2558.20

hay un código que publicó Lagger hace tiempo, está simulado OK en proteus pero solo es acceso al disco por bloques, mas no entra en la parte del FAT

Salu2
Pedro
La propiedad privada es la mayor garantía de libertad.
Friedrich August von Hayek

Desconectado Duende_Azul

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 832
Re: MMC Card : Hardware & Firmware
« Respuesta #88 en: 05 de Febrero de 2007, 17:58:02 »
Que sera de la vida de Lagger? mejor conocido como el "pana" Lagger.

Desconectado LordLafebre

  • Moderador Global
  • DsPIC30
  • *****
  • Mensajes: 3529
    • Micros & micros
Re: MMC Card : Hardware & Firmware
« Respuesta #89 en: 05 de Febrero de 2007, 18:21:50 »
Hola:

Pues que pena, pero Lager se desaparecio de la noche a la mañana, desde que nos hemos migrado a este foro, no se ha conectado nunca, es una verdadera lástima, a ver si aparece nuevamente mi maestro  :mrgreen:
« Última modificación: 05 de Febrero de 2007, 18:26:38 por LordLafebre »