예제 #1
0
파일: ms_drv.c 프로젝트: 12019/mtktest
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;
}
예제 #2
0
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 */

}