int8 heads, Cylinders, Sectors;
int32 CHS_Address_start;
int32 CHS_Address_end;
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;
// Read Master Partition Table ///////////////////////////////////////////////////////////
if(recBuffer[0]=='P' AND recBuffer[1]=='\0'){
address = 0x00;
if(mmc_read_block(address, sector_size,&MMCBuffer[0])==0){
// Read and Presentation
printf("\r\n\nMMC read Master Partition Table\r\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");
// Begin CHS Partition
heads = Partition_Entry[1];
sectors = Partition_Entry[2] & 0x3f;
cylinders = ((Partition_Entry[2] & 0xc0) << 2) + Partition_Entry[3];
CHS_Address_start = (cylinders*Heads*sectors) + (heads*Sectors) + (sectors - 1);
printf("Start Partition in CHS %X/%X/%X (0x%LX)\r\n",cylinders,heads,sectors,CHS_Address_start);
// End CHS Partition
heads = Partition_Entry[5];
sectors = Partition_Entry[6] & 0x3f;
cylinders = ((Partition_Entry[6] & 0xc0) << 2) + Partition_Entry[7];
CHS_Address_end = (cylinders*Heads*sectors) + (heads*Sectors) + (sectors - 1);
printf("End Partition in CHS %X/%X/%X (0x%LX)\r\n",cylinders,heads,sectors,CHS_Address_end);
// 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("Reading MBR in address 0x%LX ...\r\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("\nMMC read BIOS Parametrer Block BPB\r\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
printf("\nMMC read BIOS Parametrer Block Extended xBPB\r\n");
printf("RAW in xBPB 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F\r\n");
printf(" ===============================================\r\n");
printf(" ");
iOffset=0x24;
for(i=0;i<26;i++){
xBPB_Entry[ i ]=MMCBuffer[iOffSet+i];
printf("%X ",xBPB_Entry[ i ]);
if(i==0x0F) printf("\r\n ");
}
printf("\r\n\n");
// disp number
printf("Drive # .............: 0x%X (%u)\r\n",xBPB_Entry[0],xBPB_Entry[0]);
// reserverd
printf("Reserved ............: 0x%X (%u)\r\n",xBPB_Entry[1],xBPB_Entry[1]);
// extended signature
printf("Extended Signature ..: 0x%X (%u)\r\n",xBPB_Entry[2],xBPB_Entry[2]);
// serial number
printf("Serial Number .......: ");
iOffset=0x03;
for(i=0;i<4;i++){
if(i!=3)
printf("%X-",xBPB_Entry[iOffSet+i]);
else
printf("%X",xBPB_Entry[iOffSet+i]);
}
printf("\r\n");
// Vol Name
printf("Vol. Name ...........: ");
iOffset=0x07;
for(i=0;i<0x0B;i++){
printf("%c",xBPB_Entry[iOffSet+i]);
}
printf("\r\n");
// Format Type
printf("Format Type .........: ");
iOffset=0x12;
for(i=0;i<0x08;i++){
printf("%c",xBPB_Entry[iOffSet+i]);
}
printf("\r\n");
// Boot record signature
printf("Boot record signature: 0x%X-0x%X\r\n",MMCBuffer[0x1FE],MMCBuffer[0x1FF]);
}else{
printf("\n\r>Read MBR page fault");
}
}else{
printf("\n\r>Read MPT page fault");
}
Cursor();
validCommand=1;
}