📄 disk.c
字号:
********************************************************************************************************/
uint8 FsUMount(uint8 Drive)
{
if (Drive < MAX_DRIVES)
{
FreeDriveCache(Drive);
DiskInfo[Drive].Drive = UN_MOUNT_DRIVE;
return RETURN_OK;
}
else
{
return NOT_FIND_DISK;
}
}
/*********************************************************************************************************
** 函数名称: FloppyDiskInit
** 功能描述: 软盘格式硬件初始化
**
** 输 入: DiakCommand:驱动程序接口函数
** RsvdForLow:保留给底层的指针
** Buf:逻辑扇区0内容
** SecOffset:逻辑扇区偏移
** 输 出: 无
**
** 作 者: 陈明计
** 日 期: 2004年12月31日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
static void FloppyDiskInit(uint16 (* DiakCommand)(uint8 Cammand, void *Parameter),
void *RsvdForLow , uint8 *Buf, uint32 SecOffset)
{
Disk_Info *Disk;
Disk = GetEmptyDiskInfoAddr();
if (Disk == NULL)
{
return;
}
Disk->DiakCommand = DiakCommand;
Disk->SecOffset = SecOffset;
Disk->RsvdForLow = RsvdForLow;
FsMount(Disk, Buf);
}
/*********************************************************************************************************
** 函数名称: HardDiskInit
** 功能描述: 硬盘格式硬件初始化
**
** 输 入: DiakCommand:驱动程序接口函数
** RsvdForLow:保留给底层的指针
** Buf:扇区0内容
** 输 出: 无
**
** 作 者: 陈明计
** 日 期: 2004年12月31日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
static void HardDiskInit(uint16 (* DiakCommand)(uint8 Cammand, void *Parameter),
void *RsvdForLow, uint8 *Buf, uint32 SecOffset);
static void _HardDiskInit(uint16 (* DiakCommand)(uint8 Cammand, void *Parameter),
void *RsvdForLow , uint8 *Buf, uint32 SecOffset, uint16 offset)
{
uint32 temp1, temp2;
Disk_RW_Parameter Pa;
Pa.SectorIndex = SecOffset;
Pa.RsvdForLow = RsvdForLow;
Pa.Buf = Buf;
if(DiakCommand(DISK_READ_SECTOR, &Pa) != DISK_READ_OK)
{
return;
}
if (Buf[510] != 0x55 || Buf[511] != 0xaa) /* 有效标志 */
{
FloppyDiskInit(DiakCommand, RsvdForLow, Buf, SecOffset);
return;
}
if (Buf[0x1be] == 0x80 || Buf[0x1be] == 0x00) /* 第1分区表有效 */
if (Buf[0x1ce] == 0x80 || Buf[0x1ce] == 0x00) /* 第2分区表有效 */
if (Buf[0x1de] == 0x80 || Buf[0x1de] == 0x00) /* 第3分区表有效 */
if (Buf[0x1ee] == 0x80 || Buf[0x1ee] == 0x00) /* 第4分区表有效 */
{
temp1 = Buf[0x1be] + Buf[0x1ce] + Buf[0x1de] + Buf[0x1ee];
if (temp1 != 0 && temp1 != 0x80)
{
FloppyDiskInit(DiakCommand, RsvdForLow, Buf, SecOffset);
return;
}
}
switch (Buf[offset + 4]) /* 第1分区 */
{
case 0x01: /* FAT12*/
#if 0
break;
#endif
case 0x04: /* FAT16*/
#if 0
break;
#endif
case 0x06: /* FAT16*/
#if 0
break;
#endif
case 0x0b: /* FAT32*/
#if 0
break;
#endif
case 0x0c: /* FAT32*/
#if 0
break;
#endif
case 0x0e: /* FAT16*/
#if 0
break;
#endif
case 0x1b: /* FAT32*/
#if 0
break;
#endif
case 0x1c: /* FAT32*/
temp1 = Buf[offset + 8] | (Buf[offset + 9] << 8);
temp2 = ((uint32)(Buf[offset + 10] | (Buf[offset + 11] << 8))) << 16;
temp1 = temp1 | temp2;
SecOffset = temp1 + SecOffset;
Pa.SectorIndex = SecOffset;
Pa.RsvdForLow = RsvdForLow;
Pa.Buf = Buf;
if(DiakCommand(DISK_READ_SECTOR, &Pa) != DISK_READ_OK)
{
return;
}
FloppyDiskInit(DiakCommand, RsvdForLow, Buf, SecOffset);
break;
case 0x05: /* 扩展分区 */
#if 0
break;
#endif
case 0x0f: /* 扩展分区 */
temp1 = Buf[offset + 8] | (Buf[offset + 9] << 8);
temp2 = ((uint32)(Buf[offset + 10] | (Buf[offset + 11] << 8))) << 16;
temp1 = temp1 | temp2;
HardDiskInit(DiakCommand, RsvdForLow, Buf, SecOffset + temp1);
break;
default:
break;
}
}
static void HardDiskInit(uint16 (* DiakCommand)(uint8 Cammand, void *Parameter),
void *RsvdForLow, uint8 *Buf, uint32 SecOffset)
{
_HardDiskInit(DiakCommand, RsvdForLow, Buf, SecOffset, 0x1be); /* 第1个分区 */
_HardDiskInit(DiakCommand, RsvdForLow, Buf, SecOffset, 0x1ce); /* 第2个分区 */
_HardDiskInit(DiakCommand, RsvdForLow, Buf, SecOffset, 0x1de); /* 第3个分区 */
_HardDiskInit(DiakCommand, RsvdForLow, Buf, SecOffset, 0x1ee); /* 第4个分区 */
}
/*********************************************************************************************************
** 函数名称: AddFileDriver
** 功能描述: 增加一个底层驱动程序
**
** 输 入: DiakCommand:驱动程序接口函数
**
** 输 出: 无
**
** 全局变量: DiskInfo
** 调用模块: 无
**
** 作 者: 陈明计
** 日 期: 2003年9月5日
**-------------------------------------------------------------------------------------------------------
** 修改人: 陈明计
** 日 期: 2004年4月10日
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void AddFileDriver(uint16 (* DiakCommand)(uint8 Cammand, void *Parameter), void *RsvdForLow)
{
unsigned int temp;
uint8 Buf[DISK_CACHE_SIZE];
Disk_RW_Parameter Pa;
if (DiakCommand == NULL) // 参数无效退出
{
return;
}
Pa.SectorIndex = 0;
Pa.RsvdForLow = RsvdForLow;
Pa.Buf = Buf;
if (DiakCommand(DISK_INIT, &Pa) == DISK_INIT_NOT_OK) // 底层驱动初始化不成功退出
{
return;
}
Pa.SectorIndex = 0;
Pa.RsvdForLow = RsvdForLow;
Pa.Buf = Buf;
if(DiakCommand(DISK_READ_SECTOR, &Pa) != DISK_READ_OK)
{
return;
}
if (Buf[510] == 0x55 && Buf[511] == 0xaa) /* 有效标志 */
if (Buf[0x1be] == 0x80 || Buf[0x1be] == 0x00) /* 第1分区表有效 */
if (Buf[0x1ce] == 0x80 || Buf[0x1ce] == 0x00) /* 第2分区表有效 */
if (Buf[0x1de] == 0x80 || Buf[0x1de] == 0x00) /* 第3分区表有效 */
if (Buf[0x1ee] == 0x80 || Buf[0x1ee] == 0x00) /* 第4分区表有效 */
{
temp = Buf[0x1be] + Buf[0x1ce] + Buf[0x1de] + Buf[0x1ee];
if (temp == 0 || temp == 0x80)
{
HardDiskInit(DiakCommand, RsvdForLow, Buf, 0);
return;
}
}
FloppyDiskInit(DiakCommand, RsvdForLow, Buf, 0);
}
/*********************************************************************************************************
** 函数名称: RemoveFileDriver
** 功能描述: 删除一个底层驱动程序
**
** 输 入: DiakCommand:驱动程序函
**
** 输 出: 无
**
** 全局变量: DiskInfo
** 调用模块: 无
**
** 作 者: 陈明计
** 日 期: 2003年9月5日
**-------------------------------------------------------------------------------------------------------
** 修改人: 陈明计
** 日 期: 2004年4月10日
**-------------------------------------------------------------------------------------------------------
** 修改人: 陈明计
** 日 期: 2005年2月2日
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void RemoveFileDriver(uint16 (* DiakCommand)(uint8 Cammand, void *Parameter))
{
uint8 Drive;
Disk_RW_Parameter Pa;
for (Drive = 0; Drive < MAX_DRIVES; Drive++)
{
if (DiskInfo[Drive].DiakCommand != DiakCommand)
if (DiskInfo[Drive].Drive != EMPTY_DRIVE)
{
FsUMount(Drive);
Pa.RsvdForLow = DiskInfo[Drive].RsvdForLow;
DiskInfo[Drive].DiakCommand(DISK_CLOSE, &Pa);
DiskInfo[Drive].Drive = EMPTY_DRIVE; // 没有分配
DiskInfo[Drive].FATType = 0xff; // 无效的文件系统
DiskInfo[Drive].SecPerClus = 0; // 每簇扇区数
DiskInfo[Drive].NumFATs = 0; // FAT表数
DiskInfo[Drive].SecPerDisk = 0xffffffff;// 逻辑驱动器包含扇区数
DiskInfo[Drive].BytsPerSec = 0; // 每扇区字节数
DiskInfo[Drive].RootDirTable = 0; // 根目录开始扇区号(FAT32为开始簇号)
DiskInfo[Drive].RootSecCnt = 0; // 根目录占用扇区数
DiskInfo[Drive].FATStartSec = 0; // FAT表开始扇区号
DiskInfo[Drive].FATSecCnt = 0; // 每个FAT占用扇区数
DiskInfo[Drive].DataStartSec = 0; // 数据区开始扇区号
DiskInfo[Drive].PathClusIndex = 0; // 当前目录
DiskInfo[Drive].DiakCommand = NULL; // 驱动程序
}
}
}
/*********************************************************************************************************
** End Of File
********************************************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -