基于STM32F103的USB学习笔记37 - Mass Storage之调试

72 篇文章 39 订阅

尝试解决拷贝覆盖的问题。

1. 让根目录区可写

const uint8_t mscRootDir[ROOT_SIZE * FAT_SECTOR_SIZE]

在写里面添加写跟目录区

else if(gScsiInfo.offset >= (FAT_RESERVE_SIZE + FAT_SIZE * 2) * FAT_SECTOR_SIZE)
{//Root Area
    uint32_t i;
    offset = gScsiInfo.offset - (FAT_RESERVE_SIZE + FAT_SIZE * 2) * FAT_SECTOR_SIZE;
    for(i = 0; i < count; i++)
        mscRootDir[offset + i] = gMscBotData.dat[i];
}

无效

2. 让FAT表可写

直接拷贝无效,删掉旧文件后再拷贝是可以的。删除文件可以看到系统有写入的地址:

Write: 0x1600
Write: 0x1640
Write: 0x1680
Write: 0x16c0
Write: 0x1700
Write: 0x1740
Write: 0x1780
Write: 0x17c0
Write: 0x1200
Write: 0x1240
Write: 0x1280
Write: 0x12c0
Write: 0x1300
Write: 0x1340
Write: 0x1380
Write: 0x13c0
Write: 0x1400
Write: 0x1440
Write: 0x1480
Write: 0x14c0
Write: 0x1500
Write: 0x1540
Write: 0x1580
Write: 0x15c0

其中0x1600-0x17FF是根目录区,似乎只改了0x16A0这个地址(从0x54改为0xE5).

0x1200-0x15FF是FAT1和FAT2,将TEXT.txt的簇链去掉了。

再写入2KB的TEXT.txt文件,可以发现更新的地址范围多了0x1800-0x1FFF, 根目录区和FAT的内容如下

3. 将电脑硬盘中的文件改为1KB字节,删除U盘中的2KB文件,拷贝1KB文件进U盘,根目录和FAT内的文件长度都变为一半。

修改硬盘中文件的内容,覆盖U盘中的文件,这时是可以覆盖写入的。可以看到系统更新了一遍0x1600-0x17FF根目录区和0x1200-0x15FF FAT表区,然后又更新了一遍0x1600-0x17FF根目录区和0x1200-0x15FF FAT表区,接着再次更新了2遍0x1600-0x17FF根目录区,最后更新了0x1800-0x1BFF文件内容区。

看起来系统并不需要更多的空间覆盖,奇怪为什么U盘满的情况就不行。

3. 改为内部Flash做U盘,看系统格式化后是否可以覆盖。内部Flash的方式U盘的容量为9KB,所以需要一个9KB大小的文件。测试结果相同。Windows这个规格好奇怪,居然不让覆盖,bug?

4. 将文件大小改2倍大小试试是否可以骗过系统。

#define MSC_MEMORY_SIZE         ((FAT_RESERVE_SIZE/*DBR*/ + FAT_SIZE * 2/*FAT*/ + ROOT_SIZE/*Root*/) * FAT_SECTOR_SIZE + FILE_SIZE * 2)

写文件那里就不再对后面假的2KB空间写入

if(gScsiInfo.offset >= (FAT_RESERVE_SIZE + ROOT_SIZE + FAT_SIZE * 2) * FAT_SECTOR_SIZE)
{//RAM Area
    if(gScsiInfo.offset < (FAT_RESERVE_SIZE + ROOT_SIZE + FAT_SIZE * 2) * FAT_SECTOR_SIZE + FILE_SIZE)
    {
        uint32_t i;
        offset = gScsiInfo.offset - (FAT_RESERVE_SIZE + ROOT_SIZE + FAT_SIZE * 2) * FAT_SECTOR_SIZE;
        for(i = 0; i < count; i++)
            gUDiskRam[offset + i] = gMscBotData.dat[i];
    }
}

测试发现是可行的。

5. 试试是否可以拷贝小于2KB字节任意大小的TEXT.txt文件,也是可行的。

6. 试试拷贝4KB字节大小的文件,可以正常拷贝。

注意事项:

1. 根目录项中的8+3文件名必须采用大写的方式,否则会提示找不到文件。

 

 

 

 

 

 

 

 

 

 

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值