打印
[MM32硬件]

基于TinyUSB协议栈的MSC大容量存储设备样例工程

[复制链接]
298|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
范德萨发额|  楼主 | 2024-7-29 15:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在嵌入式系统开发中,大容量存储设备(Mass Storage Class, MSC)是一个常见的需求。TinyUSB作为一个轻量级且易于使用的USB协议栈,提供了实现MSC设备的简单方法。本文将介绍如何基于TinyUSB协议栈创建一个MSC大容量存储设备的样例工程。

工程准备
1. 环境配置
首先,确保开发环境已经搭建好,包括以下内容:

编译器:ARM GCC或其他适用于目标平台的编译器。
开发板:支持USB功能的MCU开发板(如STM32、ESP32等)。
TinyUSB库:从GitHub获取最新的TinyUSB库。
2. 获取TinyUSB
从GitHub克隆TinyUSB库,并将其添加到工程中:

bash
git clone https://github.com/hathach/tinyusb.git


实现步骤
1. 工程目录结构
创建工程目录,结构如下:

css

my_msc_project/
├── src/
│   ├── main.c
│   ├── tusb_config.h
│   └── board_init.c
├── include/
│   └── board.h
├── lib/
│   └── tinyusb/ (克隆的TinyUSB库)
├── Makefile




使用特权

评论回复
沙发
范德萨发额|  楼主 | 2024-7-29 15:56 | 只看该作者
配置TinyUSB
在src/tusb_config.h中配置TinyUSB MSC选项:

c

#ifndef _TUSB_CONFIG_H_
#define _TUSB_CONFIG_H_

#define CFG_TUSB_MCU                 OPT_MCU_STM32  // 根据具体MCU修改
#define CFG_TUSB_RHPORT0_MODE        OPT_MODE_DEVICE
#define CFG_TUSB_OS                  OPT_OS_NONE
#define CFG_TUSB_MEM_SECTION
#define CFG_TUSB_MEM_ALIGN           __attribute__ ((aligned(4)))

// USB Device Configuration
#define CFG_TUD_ENDOINT0_SIZE        64

// Class Configuration
#define CFG_TUD_MSC                  1

#endif /* _TUSB_CONFIG_H_ */

使用特权

评论回复
板凳
范德萨发额|  楼主 | 2024-7-29 15:56 | 只看该作者
初始化USB和MSC
在src/main.c中,初始化USB设备和MSC功能:

c#include "bsp/board.h"
#include "tusb.h"

// MSC Storage callback API
int32_t tud_msc_read10_cb(uint8_t lun, uint32_t lba, uint32_t offset, void* buffer, uint32_t bufsize);
int32_t tud_msc_write10_cb(uint8_t lun, uint32_t lba, uint32_t offset, const void* buffer, uint32_t bufsize);
void tud_msc_inquiry_cb(uint8_t lun, uint8_t vendor_id[8], uint8_t product_id[16], uint8_t product_rev[4]);

void main(void) {
    board_init();
    tusb_init();

    while (1) {
        tud_task(); // TinyUSB device task
    }
}

// Implement MSC callback functions...

使用特权

评论回复
地板
范德萨发额|  楼主 | 2024-7-29 15:57 | 只看该作者
实现MSC回调函数
在src/main.c中实现MSC回调函数,处理读写请求:

c
#include "tusb.h"

#define DISK_BLOCK_NUM  16
#define DISK_BLOCK_SIZE 512

uint8_t msc_disk[DISK_BLOCK_NUM][DISK_BLOCK_SIZE];

int32_t tud_msc_read10_cb(uint8_t lun, uint32_t lba, uint32_t offset, void* buffer, uint32_t bufsize) {
    memcpy(buffer, msc_disk[lba] + offset, bufsize);
    return bufsize;
}

int32_t tud_msc_write10_cb(uint8_t lun, uint32_t lba, uint32_t offset, const void* buffer, uint32_t bufsize) {
    memcpy(msc_disk[lba] + offset, buffer, bufsize);
    return bufsize;
}

void tud_msc_inquiry_cb(uint8_t lun, uint8_t vendor_id[8], uint8_t product_id[16], uint8_t product_rev[4]) {
    const char vid[] = "TinyUSB";
    const char pid[] = "MSC Demo";
    const char rev[] = "1.0";
    memcpy(vendor_id, vid, 8);
    memcpy(product_id, pid, 16);
    memcpy(product_rev, rev, 4);
}


使用特权

评论回复
5
范德萨发额|  楼主 | 2024-7-29 15:57 | 只看该作者
编译和烧录
根据开发板和工具链,配置Makefile并编译工程,将生成的固件烧录到开发板上。

结论
通过以上步骤,我们成功基于TinyUSB协议栈实现了一个简单的MSC大容量存储设备。这个样例工程展示了如何配置和使用TinyUSB库,读者可以在此基础上进行扩展和定制,满足更复杂的应用需求。TinyUSB提供了灵活的接口和强大的功能,是嵌入式USB开发的理想选择。

使用特权

评论回复
6
shenxiaolin| | 2024-7-29 21:01 | 只看该作者
感谢分享

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

49

主题

875

帖子

1

粉丝