文章目录

  • 前言
  • 一、背景
  • 二、制作虚拟磁盘VHD
  • 三、生成磁盘数据
  • 四、生成.h头文件
  • 五、改造read10函数
  • 六、测试
  • 七、工具
  • 八、参考

前言

前面的文章《使用ESP32S2开发板制作U盘,支持无线访问》讲述了如何将ESP32S2开发板制作成一个U盘。本文继续延伸,讲述如何把开发板制作成一个看起来容量远远大于flash实际大小的U盘。为方便起见,就叫它“虚拟U盘”吧。
本文用到的工具,附在了第七章。


一、背景

ESP32S2开发板flash只有4M,但出于某些目的,把它插到主机(PC、Android 手机、平板、电视、车机等)上时,需要识别成一个2G的U盘(也可以是4G、8G,大小可指定),并且里面存放大于4M的文件,比如一个长4小时的MP3文件。
——这听起来很玄妙!但实现起来非常简单!

二、制作虚拟磁盘VHD

  1. PC打开“创建并格式化硬盘分区”工具(磁盘管理也可),菜单栏点击“操作”-“创建VHD”,位置自选比如放在桌面,命名为“fat32_2g.vhd”,点击“确定”。

  2. 看到创建好的磁盘,在1区域右击鼠标-“初始化磁盘”-点选“MBR”-“确定”。
  3. 在2区域右击鼠标-“新建简单卷”,继续下一步,在格式化分区时,选择“FAT32”。然后“下一步”-“完成”。

三、生成磁盘数据

  1. 使用“HxD”工具,打开前面创建的硬盘:“工具”-“读取硬盘”-“硬盘3”。

    这里可能会有疑问:逻辑硬盘中的“新加卷E”和物理硬盘中的“硬盘3”,是不是一回事。其实不是,逻辑硬盘是物理硬盘的一部分,简单说下区别:

    逻辑扇区0,对应的是DBR扇区。DBR分为两部分:DOS引导程序和BPB(BIOS参数块)。DBR的开头:EB 3C 90(FAT16),EB 58 90(FAT32)。
    物理扇区0,对应的是MBR扇区。开头为:33 C0 8E。

  2. 打开之后,点击“文件”-“另存为”,命名为“fat32_2g.data”。

四、生成.h头文件

打开工具“FileToh.exe”-“Open”,选择上一步生成的“fat32_2g.data”,等计算完成后点击“Save”,会提示“fat32_2g.h”已经生成。

五、改造read10函数

  1. 将头文件“fat32_2g.h”加入到自己的工程中;
  2. 在tusb_msc.c中,引用头文件。
  3. 改造tud_msc_read10_cb()函数.
/* file: tusb_msc.c */
#include "fat32_2g.h"#define  SKY_DISK_BLOCK_NUM  (2*1024*1024*1024/512)  // 扇区总数=2G/512
#define SKY_DISK_BLOCK_SIZE (512)                   // 一个扇区大小/* 判断扇区是不是非空扇区 */
int32_t IsInRomSector(uint32_t lba) {for (int32_t i = 0; i < sizeof(Index)/sizeof(int); i++) {if (lba == Index[i]) {return i;} }return 0xFFFFFFFF;
}
// Callback invoked when received READ10 command.
// Copy disk's data to buffer (up to bufsize) and return number of copied bytes./* 返回第lba扇区 offset处 长度为bufsize 的内容。实际上 offset 一直为0,是因为一般读都是读512B的整数倍,即一次读几个扇区bufsize是我们需要填充的 Buffer 大小,一般也是一个扇区的整数倍。
*/
int32_t tud_msc_read10_cb(uint8_t lun, uint32_t lba, uint32_t offset, void *buffer, uint32_t bufsize)
{ESP_LOGD(__func__, "lun=%d, lba=%d, offset=%d, bufsize=%d, s_disk_block_size=%d", lun, lba, offset, bufsize, s_disk_block_size);if (lun >= LOGICAL_DISK_NUM) {ESP_LOGE(__func__, "invalid lun number %u", lun);return 0;}#ifdef 0const uint32_t block_count = bufsize / s_disk_block_size;disk_read(s_pdrv, buffer, lba, block_count);return block_count * s_disk_block_size;
#else/* 扇区超出最大扇区数 */if(lba >= SKY_DISK_BLOCK_NUM){ESP_LOGE(__func__, "invalid lba number %u", lba);return 0;}/* 换算成一次读几个扇区 */const uint32_t secCnt = bufsize / SKY_DISK_BLOCK_SIZE;  int32_t secIdx;int32_t sector;static int32_t t=0;for(int32_t i= 0; i <secCnt; i++){sector = lba+i;secIdx = IsInRomSector(sector);/* 非空扇区,使用头文件中的数据填充 */if(secIdx != 0xFFFFFFFF){memcpy(buffer + (SKY_DISK_BLOCK_SIZE*i), &Sector[secIdx][0], SKY_DISK_BLOCK_SIZE);ESP_LOGI(__func__, "sector = %d hit!! secIdx = %d", sector, secIdx);}else  /* 空扇区,全部填充0 */{memset(buffer + (SKY_DISK_BLOCK_SIZE*i), 0, SKY_DISK_BLOCK_SIZE);ESP_LOGD(__func__, "sector = %d miss! reply all 0", sector);}}return bufsize;
#endif
}

六、测试

编译、烧写后,将开发板插到PC上,可以看到有一个2G大小的U盘。

在U盘中存入超长的音频文件并能播放,放在下一篇中介绍。

七、工具

FileToh
HxD

八、参考

[ESP8266/ESP32]ESP32 S2 做一个假U盘

【ESP32S2】把只有4M flash的开发板制作成一个2G的U盘(一)相关推荐

  1. 【ESP32S2】使用ESP32S2开发板制作U盘,支持无线访问

    文章目录 前言 一.开发环境 二.硬件介绍 三.下载esp-idf 四.下载esp-iot-solution 五.配置idf 1.执行下载脚本 2.设置环境变量 3.声明外部组件 六.构建例程 七.烧 ...

  2. STM32G070RBT6迷你开发板制作总结

    STM32G070RBT6迷你开发板制作总结 目录 STM32G070RBT6迷你开发板制作总结 1.组成概述 1.原理图绘制 系统组成 本系统由五部分构成:电源,晶振,复位电路.调试接口,调试芯片电 ...

  3. 硬件学习、高速dsp开发板制作、STM32学习笔记

    1.硬件工程师成长之路(1)--元件基础_[云轩]的博客-CSDN博客_硬件工程师的成长之路 总目录:https://blog.csdn.net/weixin_44407238/category_10 ...

  4. RT-ThreadBearPi 开发笔记 -- 为小熊派开发板制作 RT-Thread BSP 包

    为小熊派开发板制作 RT-Thread BSP 包 前段时间,微联智控工作室向南京厚德物联网有限公司申请了一款物联网开发平台---小熊派物联网开发套件(BearPi-IoT).关于小熊派IoT开发平台 ...

  5. Allegro PCB 开发板制作超级详细步骤

    Allegro PCB 开发板制作总结 一.        所需软件:Orcad captures CIS.allegro.DB  Doctor.pad designed.cam350.对于元器件比较 ...

  6. 基于Arduino Uno开发板制作音乐播放器

    基于Arduino Uno开发板制作音乐播放器 本文将基于Arduino开发板实现一个音乐播放器. 利用Arduino Uno读取sd卡模块中内存卡的音乐,传输信号到扬声器进行播放. 一.项目软硬件简 ...

  7. 解决X210开发板被刷成砖的问题

    解决X210开发板被刷成砖的问题 1.开发板使用:     开发板是九鼎科技的X210BV3S开发板,SoC是S5PV210,是三星的一款基于ARM Cortex-A8内核的芯片. 2.所看教学课程: ...

  8. arduino串口监视器显示nan_使用Arduino开发板制作摩尔斯电码生成器

    摩尔斯电码是一种通信系统,用于在两个不同持续时间的信号中编码任何字符,称为点和虚线.摩尔斯电码由Samuel F.B开发.并进一步用于电报传输秘密信息.它在第二次世界大战时最常用.摩尔斯电码可以通过点 ...

  9. FPGA之道(19)以FPGA为核心的开发板制作

    文章目录 前言 开发板制作 前言 学习FPGA的初期,我们习惯到网上买一款FPGA开发板,这是新手学习FPGA开发的最佳途径,负责任的开发板制作者会提供相应的教程供练习,毕竟能动手操作上板子才是真正玩 ...

最新文章

  1. 天翼云从业认证(4.6)高并发场景上云实践
  2. Android学习之图片压缩,压缩程度高且失真度小
  3. xmpp muc 群聊协议 3
  4. 二十四点游戏python_[求助]关于二十四点游戏python
  5. 联想m7400pro清零方法_联想打印机怎么清零 联想打印机清零方法【教程】
  6. linux文件删除恢复
  7. tcp与udp的socket编程,udp代码实现客户端服务端,tcp代码实现客户端服务端(单线程、多线程、多进程分别实现),三次握手
  8. 计算机基础【面试遇到】
  9. 不要让开源成为贸易战的牺牲品!
  10. TCP/IP网络编程之域名及网络地址
  11. 【大数据部落】用关联规则和聚类探索药物配伍规律
  12. Android学习JNI,使用JNI实现字符串加密
  13. 【jmeter连接数据库报错问题排查,以及建立jmeter与mysql之间的简单连接】
  14. 软考嵌入式中级经验分享+真题教材
  15. 弯管机编程软件电脑版_聚编程电脑版
  16. Hysys能量流和物质流分析
  17. 基于RFID定位技术的固定资产管理,RFID资产管理带给你无限可能--新导智能
  18. android自定义剪切板,Android10适配之剪切板
  19. adb通过局域网连接手机
  20. 电脑是linux下安装win7,Linux下安装win7

热门文章

  1. 三个简短的动画实现饿了么红包滑动效果
  2. EXCEL引用单元格的几种格式
  3. 如何将本地文件上传到腾讯云服务器(多图)
  4. HDU - 2548 两军交锋
  5. Android 旧项目打包 api-versions.xml Stream closed
  6. 【buu平台】[GXYCTF2019]BabySQli
  7. 一种简捷、可靠、廉价的贴片元件焊接方法——拉焊
  8. QQLite 插件开发 之 html解析 CsQuery(C#)
  9. DLNA数字家庭网络联盟
  10. pygame - 图片移动