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

📄 disk.c

📁 arm7 zlg lpc2219 bootloader
💻 C
📖 第 1 页 / 共 2 页
字号:
********************************************************************************************************/
        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 + -