您尚未登录。

楼主 # 2024-12-08 23:21:46

Skunk
会员
注册时间: 2024-08-02
已发帖子: 4
积分: 19

RTThread Studio + F1C100s模拟优盘详细说明

这里说的模拟优盘是指把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)

离线

#1 2024-12-13 11:36:04

chenyinchang
会员
注册时间: 2024-12-03
已发帖子: 5
积分: 20

Re: RTThread Studio + F1C100s模拟优盘详细说明

想知道模拟U盘速度怎么样?能不能跑到USB2.0的标称值?

离线

#2 2024-12-18 10:16:42

rongwinzip
会员
注册时间: 2020-03-14
已发帖子: 51
积分: 4.5

Re: RTThread Studio + F1C100s模拟优盘详细说明

@Skunk
这样的话不是可以做usb高速(480MBPS)设备了

离线

页脚

工信部备案:粤ICP备20025096号 Powered by FluxBB

感谢为中文互联网持续输出优质内容的各位老铁们。 QQ: 516333132, 微信(wechat): whycan_cn (哇酷网/挖坑网/填坑网) service@whycan.cn