回答

收藏

[评测分享] 【RISC-V 先楫半导体HPM5E00 MCU开发板试用体验】4、外置SRAM模拟为U盘

#板卡评测 #板卡评测 528 人阅读 | 0 人回复 | 2025-07-09

本帖最后由 eefocus_3941691 于 2025-7-9 13:10 编辑


SDK中有PPI接口驱动外置SRAM和TinyUSB模拟2个MSC大容量设备的例子。将2者结合可以将外置SRAM(256KB容量)虚拟为U盘。
原示例位于:
sdk_env_v1.10.0\hpm_sdk\samples\tinyusb\device\msc_dual_lun

一、软件部分


1、main函数增加
  1. clock_add_to_group(clock_ppi0, 0);
  2. init_ppi_pins();
  3. init_sram_config();
  4. init_pmp_for_ppi();
  5. init_disk(0xF8000000);
复制代码
init_ppi_pins为板级函数,初始化PPI引脚以驱动外置SRAM
init_sram_config、init_pmp_for_ppi函数均可在sdk_env_v1.10.0\hpm_sdk\samples\drivers\ppi\async_sram示例中找到

init_disk为将msc_disk1指向外置SRAM区域,用来虚拟U盘空间,这个函数需要在外置SRAM就位后调用。
msc_disk1为指向数组的指针。
uint8_t (*msc_disk1)[DISK_BLOCK_SIZE];

init_disk函数,diskinfo中有3个BLOCK(512字节*3)为FAT文件结构,需要拷贝到msc_disk1中,msc_disk1的其他部分需清零
  1. void init_disk(uint32_t start) {

  2.     // Cast the start address to our disk pointer type
  3.    msc_disk1 = (uint8_t (*)[DISK_BLOCK_SIZE])start;
  4.    
  5.     // Copy the disk info to the disk memory
  6.    memcpy(msc_disk1, diskinfo, 3 * DISK_BLOCK_SIZE);
  7.    memset(msc_disk1 + 3, 0, (512 - 3) * DISK_BLOCK_SIZE);
  8. }
复制代码

2、TinyUSB模拟MSC设备部分(msc_disk_dual.c)

diskinfo为FAT文件系统定义,对原示例进行了修改。
diskinfo位于flash区域,非内存,需要在外置SRAM就位后,copy到msc_disk1中
block2、block3相同为FAT12表
  1. static const uint8_t diskinfo[4][DISK_BLOCK_SIZE] =
  2. {
  3.   {
  4.       0xEB, 0x3C, 0x90, 0x4D, 0x53, 0x44, 0x4F, 0x53, 0x35, 0x2E, 0x30, 0x00, 0x02, 0x01, 0x01, 0x00,
  5.       0x02, 0x10, 0x00, 0x00, 0x02, 0xF8, 0x02, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
  6.       0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x29, 0x78, 0x56, 0x00, 0x00, 'T' , 'i' , 'n' , 'y' , 'U' ,
  7.       'S' , 'B' , ' ' , '1' , ' ' , ' ' , 0x46, 0x41, 0x54, 0x31, 0x32, 0x20, 0x20, 0x20, 0x00, 0x00,

  8.       /* Zero up to 2 last bytes of FAT magic code */
  9.       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  10.       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  11.       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  12.       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  13.       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  14.       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  15.       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  16.       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,

  17.       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  18.       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  19.       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  20.       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  21.       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  22.       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  23.       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  24.       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,

  25.       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  26.       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  27.       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  28.       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  29.       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  30.       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  31.       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  32.       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,

  33.       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  34.       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  35.       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  36.       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0xAA
  37.   },

  38.   /*------------- Block1: FAT12 Table -------------*/
  39.   {
  40.       0xF8, 0xFF, 0xFF, 0xFF, 0x0F , 0x00,0x00 // // first 2 entries must be F8FF, third entry is cluster end of readme file
  41.   },
  42.   /*------------- Block2: FAT12 Table -------------*/
  43.   {
  44.       0xF8, 0xFF, 0xFF, 0xFF, 0x0F , 0x00,0x00 // // first 2 entries must be F8FF, third entry is cluster end of readme file
  45.   },
  46. }
复制代码
tud_msc_capacity_cb函数
主要对lun进行判断,当0时第一U盘,返回DISK_BLOCK_NUM*DISK_BLOCK_SIZE(32*512=16kb),当1时第二U盘,返回512*512=256kb
  1. void tud_msc_capacity_cb(uint8_t lun, uint32_t* block_count, uint16_t* block_size)
  2. {
  3.   (void) lun;
  4.   if(lun==0)
  5.   {
  6.   *block_count = DISK_BLOCK_NUM;
  7.   *block_size  = DISK_BLOCK_SIZE;
  8.   }else if(lun==1)
  9.   {
  10.     *block_count = 512;
  11.     *block_size  = DISK_BLOCK_SIZE;
  12.   }
  13.   printf("tud_msc_capacity_cb:%d\r\n",lun);
  14. }
复制代码
其他主要TingUSB接口函数未做修改
tud_msc_read10_cb
tud_msc_write10_cb
tud_msc_scsi_cb

二、运行效果
1、插上外置板卡
SRAM位于外置板卡上

2、断开JP6
根据SDK说明,为了使PPI工作,断开JP6

3、Type-C连接开发板J1(USB)和PC机
可以看到新识别了2个U盘,其中E盘为原示例中第一个U盘位做修改,第二U盘为外置SRAM模拟的U盘,容量大概256KB


E:的内容,F:是空的


设备管理中也可以看到这2个U盘




分享到:
回复

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

2735 积分
4 主题
+ 关注
热门推荐
关闭

站长推荐上一条 /3 下一条