硬件十万个为什么

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

搜索
热搜: 活动 交友 discuz
查看: 810|回复: 0

原rtems.cn论坛rtems会员:关于RTEMS9.6版本的FAT文件系统支持...

[复制链接]

7

主题

10

帖子

48

积分

版主

Rank: 7Rank: 7Rank: 7

积分
48
发表于 2017-8-17 09:57:20 | 显示全部楼层 |阅读模式
本帖最后由 coolbacon 于 2017-8-17 09:58 编辑

在之前测试FAT32的sd卡支持时,发现原本的fat.c存在一些问题,对DBR不在扇区的SD卡无法识别,其原因在于文件DBR和MBR问题。在fat.c文件的int fat_init_volume_info(rtems_filesystem_mount_table_entry_t *mt_entry)函数中修改了程序如下
/* Read boot record */
    /* FIXME: Asserts FAT_MAX_BPB_SIZE < bdbuf block size */
    sc = rtems_bdbuf_read( vol->dev, 0, &block);
    if (sc != RTEMS_SUCCESSFUL)
    {
        rtems_disk_release(vol->dd);
        rtems_set_errno_and_return_minus_one( EIO);
    }   
    if(block->buffer[0]!=0xEB)
    {
            memcpy(&boot_entry, &block->buffer[0x1be], 16);
                        if(boot_entry.bootable==0x00)/*0x00,is not bootsable,0x80 is bootable*/
                        {
                                sc = rtems_bdbuf_read( vol->dev, boot_entry.start_sector, &block);
                    if (sc != RTEMS_SUCCESSFUL)
                    {
                        rtems_disk_release(vol->dd);
                        rtems_set_errno_and_return_minus_one( EIO);
                    }
                    vol->start_sec= boot_entry.start_sector;
                        }
                }
    memcpy( boot_rec, block->buffer, FAT_MAX_BPB_SIZE);

    sc = rtems_bdbuf_release( block);
    if (sc != RTEMS_SUCCESSFUL)
    {
        rtems_disk_release(vol->dd);
        rtems_set_errno_and_return_minus_one( EIO );
    }

    /* Evaluate boot record */
    vol->bps = FAT_GET_BR_BYTES_PER_SECTOR(boot_rec);
=====================================================================
在int fat_buf_access(fat_fs_info_t *fs_info, uint32_t   blk, int op_type, rtems_bdbuf_buffer **buf)函数里修改成如下
if (fs_info->c.state == FAT_CACHE_EMPTY)
    {
        if (op_type == FAT_OP_TYPE_READ)
        {sc = rtems_bdbuf_read(fs_info->vol.dev, fs_info->vol.start_sec+blk, &fs_info->c.buf);}
        else
        {sc = rtems_bdbuf_get(fs_info->vol.dev, fs_info->vol.start_sec+blk, &fs_info->c.buf);}

        if (sc != RTEMS_SUCCESSFUL)
        {rtems_set_errno_and_return_minus_one(EIO);}

        fs_info->c.blk_num = blk;
        fs_info->c.modified = 0;
        fs_info->c.state = FAT_CACHE_ACTUAL;
    }

=====================================================================
我在fat_vol_t结构里添加了一个成员:uint32_t           start_sec;                         /* start sector of DBR*/
另外我在fac.h文件里定义了一个结构体
typedef struct fat_lba_s
{
    uint8_t           bootable;
    uint8_t                        chs_start[3];
    uint8_t           type;
    uint8_t                        chs_end[3];
    uint32_t                 start_sector;
    uint32_t                 sector_length;
} fat_lba_t;




204613vz3ibr2oep6612er.jpg
204616err0455h4neechiw.jpg
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|硬件十万个为什么

GMT+8, 2018-11-17 12:59 , Processed in 0.033598 second(s), 27 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表