这里说的模拟优盘是指把F1C100S当成一个读卡器来通过电脑读写SD卡,论坛里很多人都说过可以用CherryUSB来实现,但都语焉不详,实在是累人。花了两天折腾好后,在这儿记录一下,给后来人提供方便。
一、用RT-Thread Studio创建一个工程。需要根据自己使用的bootloader修改为可以下载到SPI flash运行,这儿就不多讲。
二、安装软件包
RT-Thread Setting中,切换到详细,直接搜索CherryUSB。选中后,再打开"Enable usb device mode"。对如下几个选项做修改:
Select usb device speed -> HS
Select usb device ip ...... -> musb_sunxi
Enable usb msc device 选中
Select usb device template msc
保存让工程更新
三. 修改代码
将packages/CherryUSB/cherryusb_config_template.h拷贝到applications下,并更名为usb_config.h。在其中加入如下定义:
#define CONFIG_USB_MUSB_SUNXI
#define CONFIG_USBDEV_EP_NUM 4
#define CONFIG_USBHOST_PIPE_NUM 4
修改宏#define CONFIG_USB_PRINTF rt_kprintf !!!非常重要!!!否则在中断中报告log时会导致程序崩溃。可能要加入#include <rtthread.h>才能编译通过
修改CONFIG_USBDEV_MSC_MAX_BUFSIZE 为32768,再大没有意义。!!!非常重要!!!会影响速度
打开选项 CONFIG_USBDEV_MSC_THREAD !!!非常重要!!!否则程序无法运行
此时代码能编译通过,但并没有什么用。
在main.c中加入一个自定义命令用于启动U盘测试:
#include <stddef.h>
rt_device_t sd_device;
struct rt_device_blk_geometry geo; //SD卡信息
void udsk(int argc, char *argv[] )
{
sd_device = rt_device_find("sd0");
if (sd_device == NULL)
{
}
else
{
memset(&geo, 0, sizeof(geo));
rt_kprintf("SD卡信息:\n");
rt_device_control(sd_device, RT_DEVICE_CTRL_BLK_GETGEOME, &geo);
rt_kprintf("扇区大小 : %d byte\n", geo.bytes_per_sector);
rt_kprintf("扇区总数: %d \n", geo.sector_count);
rt_kprintf("擦除块大小: %d byte\n", geo.block_size);
msc_storage_init(0, 0x01c13000);
}
}
MSH_CMD_EXPORT(udsk, Make SD card as a USB disk);
此时一般会报msc_storage_init找不到。先把ram disk排除构建——资源管理器中package/CheryUSB/demo/msc_ram_template.c上点右键,"资源配置"-"排除构建"。然后把磁盘的demo加进来。工程属性->C/C++常规->路径和符号,切换到"源位置"tab,点击"编辑过滤器",找到//packages/CherryUSB-v1.4.0/demo/msc_storage_template.c,点移除。这儿有个奇怪的包含问题,需要在msc_storage_template.c开始添加#include <rtthread.h>。然后在msc_storage_template.c中定义extern struct rt_device_blk_geometry geo;然后把BLOCK_COUNT替换为geo.sector_count, BLOCK_SIZE替换为geo.bytes_per_sector。
这样修改后,工程就能编译通过了。但依然没有什么用。
四. 加入cherryUSB官方提供的F1C100S驱动。
https://github.com/CherryUSB/cherryusb_rtt_f1c100s,不需要克隆到本地,只需要把f1c100s/drivers下的drv_usb.c, usb_phy.h, usb_phy.c下载下来,放到工程的drivers目录下即可。编译会报NULL没定义,加上#include <stddef.h>即可。
编译通过后,下载到目标板,等SD卡加载成功后,运行udsk,就会显示优盘。
注意: 因为是启用的USB2.0,如果线不太好的话,可能会一直报错且电脑没有反应。如果不能确认问题的话,在第二步中 Select usb device speed 改为 FS再试。更新工程后,构建排除要再来一次。
最近编辑记录 Skunk (2024-12-08 23:27:43)
离线
想知道模拟U盘速度怎么样?能不能跑到USB2.0的标称值?
离线
@Skunk
这样的话不是可以做usb高速(480MBPS)设备了
离线