static int MS_MountDevice(int DeviceType) { kal_uint8 *sector = (kal_uint8*)MSDC_Sector; FS_MasterBootRecord *MBR; FS_BootRecord *PBR; int status; kal_bool IsMBRExist; kal_uint8 type = 0; kal_uint8 c = gMS.Capacity; // get index for MS_MBR => (type) is the index while((c >>= 1) != 2) type++; IsMBRExist = KAL_FALSE; // read MBR at sector 0 status = ReadSectors(NULL,0,1,(void*)sector); MBR = (FS_MasterBootRecord*)sector; PBR = (FS_BootRecord*)sector; if( MBR->Signature == 0xAA55 && MBR->PTable[0].BootIndicator == 0x80) { IsMBRExist = KAL_TRUE; } if(!IsMBRExist) { // create MBR kal_mem_set((void*)MBR,0,sizeof(MBR)); kal_mem_cpy((void*)&(MBR->PTable[0]),MS_MBR[type],MS_MBR_SIZE); MBR->Signature = 0xAA55; status = WriteSectors(NULL,0,1,(void*)sector); if(status < NO_ERROR) return FS_MSDC_MOUNT_ERROR; // create PBR FS_CreateBootSector((void*)sector, (FS_PartitionRecord*)MS_MBR[type], (BYTE)MSDC_MEDIA_DESCRIPTOR, (UINT)gMS.PagesPerBlk, (gMS.Capacity < 128)?FS_FMT_FAT_12:FS_FMT_FAT_16); PBR->NearJump[0] = 0xE9; PBR->NearJump[1] = 0x00; PBR->NearJump[2] = 0x00; kal_mem_set((void*)PBR->BP.OEMName,0x20,8); PBR->BP.SectorsPerCluster = gMS.PagesPerBlk; PBR->BP.DirEntries = 0x200; PBR->BP.E._16.BPB.PhysicalDiskNumber = 0; PBR->BP.E._16.BPB.CurrentHead = 0; PBR->BP.E._16.BPB.SerialNumber = 0; kal_mem_set((void*)PBR->BP.E._16.BPB.Label,0x20,11); status = WriteSectors(NULL, PBR->BP.NumberOfHiddenSectors,1,(void*)sector); if(status < NO_ERROR) return FS_MSDC_MOUNT_ERROR; } return FS_NO_ERROR; }
SD_SelfFormat() { FS_PartitionRecord Par, Par1; //static kal_uint8 p[512]; kal_mem_set((void*)&Par, 0, sizeof Par); Par.Sectors = gSD->mCSD.capacity/512; FS_CreateMasterBootRecord(MSDC_Sector, &Par); WriteSectors(gMSDC_Handle, 0, 1, MSDC_Sector); Par = ((FS_MasterBootRecord *)MSDC_Sector)->PTable[0]; FS_CreateBootSector((void*)MSDC_Sector, &Par, 0xF8, 0, FS_FMT_SINGLE_FAT ); WriteSectors(gMSDC_Handle, Par.RelativeSector, 1, MSDC_Sector); /* End of SelfFormat */ }