⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dosformt.c

📁 truefs for vxworks, make fs on flash or rom
💻 C
字号:
/* dosformt.c - True Flash File System *//* Copyright 1984-2004 Wind River Systems, Inc. */#include "copyright_wrs.h"/* FAT-FTL Lite Software Development Kit * Copyright (C) M-Systems Ltd. 1995-1997	*//*modification history--------------------01a,29jul04,alr  modified file header, restarted history*/#include "fltl.h"#ifdef FORMAT_VOLUME#include "dosformt.h"#define FAT12bit  (LE4(bpb->totalSectorsInVolume) < 	\		   4086LU * bpb->sectorsPerCluster)int flMinClusterSize = 4;/*----------------------------------------------------------------------*//*      	      g e t D r i v e G e o m e t r y			*//*									*//* Calculates the geometry parameters for BIOS/DOS media		*//*									*//* Parameters:                                                          *//*	vol		: Pointer identifying drive			*//*                                                                      *//* Returns:                                                             *//*	bpb		: volume BIOS parameter block			*//*	cylinders	: Number of "cylinders" in volume		*//*	noOfFATs	: Number of FAT copies				*//*----------------------------------------------------------------------*/static void getDriveGeometry(TL vol,			     BPB *bpb,			     unsigned int *cylinders,			     unsigned noOfFATs){  unsigned long heads, sectors, temp;  long int sizeInSectors, noOfClusters;  int directorySectors;  SectorNo capacity = vol.sectorsInVolume(vol.rec); /* Volume size in sectors */  *cylinders = 1024;                 /* Set number of cylinders to max value */  heads = 16L;                      /* Max out number of heads */  temp = *cylinders * heads;        /* Compute divisor for heads */  sectors = capacity / temp;        /* Compute value for sectors per track */  if (capacity % temp) { 	    /* If no remainder, done! */    sectors++;                      /* Else, increment number of sectors */    temp = *cylinders * sectors;    /* Compute divisor for heads */    heads = capacity / temp;        /* Compute value for heads */    if (capacity % temp) {          /* If no remainder, done! */      heads++;                      /* Else, increment number of heads */      temp = heads * sectors;       /* Compute divisor for cylinders */      *cylinders = (unsigned) (capacity / temp);    }  }  toLE2(bpb->sectorsPerTrack,(unsigned short) sectors);  toLE2(bpb->noOfHeads,(unsigned short) heads);  toUNAL2(bpb->bytesPerSector,SECTOR_SIZE);  toLE2(bpb->reservedSectors,1);  bpb->noOfFATS = noOfFATs;  bpb->mediaDescriptor = 0xf8;	/* hard disk */  toLE4(bpb->noOfHiddenSectors,sectors);  sizeInSectors = (long) (*cylinders) * heads * sectors - sectors;  toLE4(bpb->totalSectorsInVolume,sizeInSectors);  toUNAL2(bpb->totalSectorsInVolumeDOS3,sizeInSectors > 65535l ? 0 : (unsigned short) sizeInSectors);  noOfClusters = sizeInSectors / flMinClusterSize;  for (bpb->sectorsPerCluster = flMinClusterSize;       noOfClusters > (bpb->sectorsPerCluster < 8 ? 32766l : 65534l);       bpb->sectorsPerCluster <<= 1, noOfClusters >>= 1);  if (FAT12bit)    toLE2(bpb->sectorsPerFAT,	  (unsigned short) ((((noOfClusters + 2L) * 3 + 1) / 2 - 1) / SECTOR_SIZE + 1));  else    toLE2(bpb->sectorsPerFAT,	  (unsigned short) (((noOfClusters + 2L) * 2 - 1) / SECTOR_SIZE + 1));  directorySectors = capacity / 200;  if (directorySectors < 1) directorySectors = 1;  if (directorySectors > 15) directorySectors = 15;  toUNAL2(bpb->rootDirectoryEntries,	 directorySectors * (SECTOR_SIZE / sizeof(DirectoryEntry)));}/*----------------------------------------------------------------------*//*      	 c r e a t e M a s t e r B o o t R e c o r d		*//*									*//* Creates the Master Boot Record (Sector 0)				*//*									*//* Parameters:                                                          *//*	vol		: Pointer identifying drive			*//*	bpb		: volume BIOS parameter block			*//*                                                                      *//* Returns:                                                             *//*	FLStatus	: 0 on success, failed otherwise		*//*	cylinders	: Number of "cylinders" in volume		*//*----------------------------------------------------------------------*/static FLStatus createMasterBootRecord(TL vol,				     BPB *bpb,				     unsigned cylinders){  /* create partition table */  PartitionTable partitionTable;  static unsigned char bootCode[] = {    0xFA, 0x33, 0xC0, 0x8E, 0xD0, 0xBC, 0x00, 0x7C,    0x8B, 0xF4, 0x50, 0x07, 0x50, 0x1F, 0xFB, 0xFC,    0xBF, 0x00, 0x06, 0xB9, 0x00, 0x01, 0xF2, 0xA5,    0xEA, 0x1D, 0x06, 0x00, 0x00, 0xBE, 0xBE, 0x07,    0xB3, 0x04, 0x80, 0x3C, 0x80, 0x74, 0x0E, 0x80,    0x3C, 0x00, 0x75, 0x1C, 0x83, 0xC6, 0x10, 0xFE,    0xCB, 0x75, 0xEF, 0xCD, 0x18, 0x8B, 0x14, 0x8B,    0x4C, 0x02, 0x8B, 0xEE, 0x83, 0xC6, 0x10, 0xFE,    0xCB, 0x74, 0x1A, 0x80, 0x3C, 0x00, 0x74, 0xF4,    0xBE, 0x8B, 0x06, 0xAC, 0x3C, 0x00, 0x74, 0x0B,    0x56, 0xBB, 0x07, 0x00, 0xB4, 0x0E, 0xCD, 0x10,    0x5E, 0xEB, 0xF0, 0xEB, 0xFE, 0xBF, 0x05, 0x00,    0xBB, 0x00, 0x7C, 0xB8, 0x01, 0x02, 0x57, 0xCD,    0x13, 0x5F, 0x73, 0x0C, 0x33, 0xC0, 0xCD, 0x13,    0x4F, 0x75, 0xED, 0xBE, 0xA3, 0x06, 0xEB, 0xD3,    0xBE, 0xC2, 0x06, 0xBF, 0xFE, 0x7D, 0x81, 0x3D,    0x55, 0xAA, 0x75, 0xC7, 0x8B, 0xF5, 0xEA, 0x00,    0x7C, 0x00, 0x00, 0x49, 0x6E, 0x76, 0x61, 0x6C,    0x69, 0x64, 0x20, 0x70, 0x61, 0x72, 0x74, 0x69,    0x74, 0x69, 0x6F, 0x6E, 0x20, 0x74, 0x61, 0x62,    0x6C, 0x65, 0x00, 0x45, 0x72, 0x72, 0x6F, 0x72,    0x20, 0x6C, 0x6F, 0x61, 0x64, 0x69, 0x6E, 0x67,    0x20, 0x6F, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69,    0x6E, 0x67, 0x20, 0x73, 0x79, 0x73, 0x74, 0x65,    0x6D, 0x00, 0x4D, 0x69, 0x73, 0x73, 0x69, 0x6E,    0x67, 0x20, 0x6F, 0x70, 0x65, 0x72, 0x61, 0x74,    0x69, 0x6E, 0x67, 0x20, 0x73, 0x79, 0x73, 0x74,    0x65, 0x6D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01,    0x01, 0x00, 0x06, 0x07, 0xE3, 0x66, 0x23, 0x00,    0x00, 0x00, 0x85, 0xB8, 0x03, 0x00, 0x00, 0x00,    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0xAA};  tffscpy(&partitionTable,bootCode,sizeof partitionTable);  partitionTable.activeFlag = 0x80;	/* bootable */  if (LE2(bpb->noOfHeads) > 1) {    partitionTable.startingHead = 1;    toLE2(partitionTable.startingCylinderSector,CYLINDER_SECTOR(0,1));  }  else {    partitionTable.startingHead = 0;    toLE2(partitionTable.startingCylinderSector,CYLINDER_SECTOR(1,1));  }  partitionTable.type = FAT12bit ? 1 : 4;  partitionTable.endingHead = LE2(bpb->noOfHeads) - 1;  toLE2(partitionTable.endingCylinderSector,		CYLINDER_SECTOR((cylinders - 1),LE2(bpb->sectorsPerTrack)));  toUNAL4(partitionTable.startingSectorOfPartition,LE2(bpb->sectorsPerTrack));  toUNAL4(partitionTable.sectorsInPartition,LE4(bpb->totalSectorsInVolume));  toLE2(partitionTable.signature,PARTITION_SIGNATURE);  return vol.writeSector(vol.rec,0,&partitionTable);}/*----------------------------------------------------------------------*//*      	     c r e a t e D O S B o o t S e c t o r		*//*									*//* Creates the DOS boot sector						*//*									*//* Parameters:                                                          *//*	vol		: Pointer identifying drive			*//*	bpb		: volume BIOS parameter block			*//*	volumeId	: 32-bit volume id				*//*	volumeLabel	: volume label					*//*                                                                      *//* Returns:                                                             *//*	FLStatus	: 0 on success, failed otherwise		*//*----------------------------------------------------------------------*/static FLStatus createDOSbootSector(TL vol,				  BPB *bpb,				  const char FAR1 *volumeId,				  const char FAR1 *volumeLabel){  DOSBootSector bootSector;  tffsset(&bootSector,0,sizeof bootSector);  bootSector.physicalDriveNo = 0x80;  bootSector.extendedBootSignature = 0x29;  tffscpy(bootSector.volumeId,volumeId,sizeof bootSector.volumeId);  tffsset(bootSector.volumeLabel,' ',sizeof bootSector.volumeLabel);  if (volumeLabel)    tffscpy(bootSector.volumeLabel,volumeLabel,sizeof bootSector.volumeLabel);  tffscpy(bootSector.systemId,	  FAT12bit ? "FAT12   " : "FAT16   ",	  sizeof bootSector.systemId);  bootSector.bpb = *bpb;#if	FALSE  tffscpy (&bootSector.bpb, bpb, sizeof(BPB));#endif	/* FALSE */  bootSector.bpb.jumpInstruction[0] = 0xe9;  tffscpy(bootSector.bpb.OEMname,"MSystems",sizeof bootSector.bpb.OEMname);  toLE2(bootSector.signature,PARTITION_SIGNATURE);  return vol.writeSector(vol.rec,(SectorNo) LE4(bpb->noOfHiddenSectors),&bootSector);}/*----------------------------------------------------------------------*//*      	          c r e a t e F A T s				*//*									*//* Creates the FAT's							*//*									*//* Parameters:                                                          *//*	vol		: Pointer identifying drive			*//*	bpb		: volume BIOS parameter block			*//*                                                                      *//* Returns:                                                             *//*	FLStatus	: 0 on success, failed otherwise		*//*----------------------------------------------------------------------*/static FLStatus createFATs(TL vol, BPB *bpb){  int iFAT;  SectorNo sectorNo = (SectorNo) (LE4(bpb->noOfHiddenSectors) +				  LE2(bpb->reservedSectors));  /* create the FATs */  for (iFAT = 0; iFAT < bpb->noOfFATS; iFAT++) {    int iSector;    unsigned char FATEntry[SECTOR_SIZE];    for (iSector = 0; iSector < LE2(bpb->sectorsPerFAT); iSector++) {      tffsset(FATEntry,0,SECTOR_SIZE);      if (iSector == 0) {		/* write the reserved FAT entries */	FATEntry[0] = bpb->mediaDescriptor;	FATEntry[1] = 0xff;	FATEntry[2] = 0xff;	if (!FAT12bit)	  FATEntry[3] = 0xff;      }      checkStatus(vol.writeSector(vol.rec,sectorNo++,FATEntry));    }  }  return flOK;}/*----------------------------------------------------------------------*//*      	     c r e a t e R o o t D i r e c t o r y		*//*									*//* Creates the root directory						*//*									*//* Parameters:                                                          *//*	vol		: Pointer identifying drive			*//*	bpb		: volume BIOS parameter block			*//*	volumeLabel	: volume label					*//*                                                                      *//* Returns:                                                             *//*	FLStatus	: 0 on success, failed otherwise		*//*----------------------------------------------------------------------*/static FLStatus createRootDirectory(TL vol,				  BPB *bpb,				  const char FAR1 *volumeLabel){  int iEntry;  SectorNo sectorNo = (SectorNo) (LE4(bpb->noOfHiddenSectors) +				  LE2(bpb->reservedSectors) +				  bpb->noOfFATS * LE2(bpb->sectorsPerFAT));  /* create the root directory */  for (iEntry = 0; iEntry < UNAL2(bpb->rootDirectoryEntries);       iEntry += (SECTOR_SIZE / sizeof(DirectoryEntry))) {    DirectoryEntry rootDirectorySector[SECTOR_SIZE / sizeof(DirectoryEntry)];    tffsset(rootDirectorySector,0,SECTOR_SIZE);    if (iEntry == 0 && volumeLabel) {      tffsset(rootDirectorySector[0].name,' ',sizeof rootDirectorySector[0].name);      tffscpy(rootDirectorySector[0].name,volumeLabel,sizeof rootDirectorySector[0].name);      rootDirectorySector[0].attributes = 0x28;	/* VOL + ARC */      toLE2(rootDirectorySector[0].updateTime,0);      toLE2(rootDirectorySector[0].updateDate,0x21);	/* 1/1/80 */    }    checkStatus(vol.writeSector(vol.rec,sectorNo++,rootDirectorySector));  }  return flOK;}/*----------------------------------------------------------------------*//*      	          f l D o s F o r m a t				*//*									*//* Writes a DOS-FAT file system on the Flash volume			*//*									*//* Parameters:                                                          *//*	vol		: Pointer identifying drive			*//*	formatParams	: Address of FormatParams structure to use	*//*                                                                      *//* Returns:                                                             *//*	FLStatus	: 0 on success, failed otherwise		*//*----------------------------------------------------------------------*/FLStatus flDosFormat(TL vol, FormatParams FAR1 *formatParams){  unsigned int cylinders;  BPB bpb;  getDriveGeometry(&vol,&bpb,&cylinders,formatParams->noOfFATcopies);  checkStatus(createMasterBootRecord(&vol,&bpb,cylinders));  checkStatus(createDOSbootSector(&vol,&bpb,formatParams->volumeId,formatParams->volumeLabel));  checkStatus(createFATs(&vol,&bpb));  checkStatus(createRootDirectory(&vol,&bpb,formatParams->volumeLabel));  return flOK;}#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -