【技术】灵动MM32F0163D7P系列MCU的USB接口如何移植和新增设备?
本文基于灵动微电子MCU MM32F0163D7P,介绍USB接口如何移植和新增设备应用指南。
1、新增一个class里面没有参考示例的设备
如果用户想增加一个device设备但是在TinyUSB class里面又没有参考示例,本次我们一起来移植一个CDC+printer复合设备。操作步骤还是和上篇一样,先将TinyUSB从GitHub上克隆下来,将src整个文件夹copy替换到例程components目录下的src。
图1.TinyUSB源码
将tinyusb目录下example下的对应文件,将tinyusb\examples\device\cdc_dual_ports\src三个文件copy到例程user文件夹里面,其他增加时钟配置函数和添加tud_dcd_port.c接口函数文件和上一篇一致(tud_dcd_port.c文件可以参考现有例程或者联系灵动技术支持)。
图2.工程的USER文件
在tinyusb\src\class里面新增一个printer文件夹,可以参考其他设备比如从hid里面copy两个hid_device.c和hid_device.h文件做为模板,将文件名修改成printer_device.c和printer_device.h,在这个文件里面修改对应的函数接口。
图3.新增printer文件
工程文件树如下:
1. TinyUSB_CDC_Printer
2. │
3. ├─USER
4. │ main.c
5. │ usb_descriptors.c
6. │ usb_dcd_port.c
7. │
8. └─TinyUSB
9.
10. tusb.c
11. cdc_device.c
12. tud_fifo.c
13. usbd.c
14. usb_control.c
15. printer_device.c
2、修改printer接口函数
1、在printer接口文件里面需要修改实现以下几个函数:
printer_init, //接口变量初始化
printer_reset, //接口变量重置
printer_open,
printer_control_xfer_cb, //控制接口回调
printer_xfer_cb //数据接口回调
tud_printer_task //while(1)循环打印机数据处理
图4 需要实现的接口函数
2、在tusb_config.h 文件里面增加宏定义#define CFG_TUD_PRINTER 1 ,同时将对应的设备define改成2 ( #define CFG_TUD_CDC 2 ) ,使能两个CDC设备。
//------------- CLASS -------------//
#define CFG_TUD_CDC 2
#define CFG_TUD_MSC 0
#define CFG_TUD_PRINTER 1
#define CFG_TUD_HID 0
#define CFG_TUD_MIDI 0
#define CFG_TUD_VENDOR 0
3、在usbd.c 里面增加printer回调函数接口处理。
#if CFG_TUD_PRINTER
{
DRIVER_NAME("PRINTER")
.init = printer_init,
.reset = printer_reset,
.open = printer_open,
.control_xfer_cb = printer_control_xfer_cb,
.xfer_cb = printer_xfer_cb,
.sof = NULL
},
#endif
4、在tusb.h增加printer对应的头文件。
#if CFG_TUD_PRINTER
#include "class/printer/printer_device.h"
#endif
5、在tusb.h增加printer描述符。
//--------------------------------------------------------------------+
// PRINTER Descriptor Templates
//--------------------------------------------------------------------+
// Length of template descriptor: 23 bytes
#define TUD_PRINTER_DESC_LEN (9 + 7 + 7)
// Interface number, string index, EP Out & EP In address, EP size
#define TUD_PRINTER_DESCRIPTOR(_itfnum, _stridx, _epout, _epin, _epsize) \
/* Interface */\
9, TUSB_DESC_INTERFACE, _itfnum, 0, 2, TUSB_CLASS_PRINTER, 0x01, 0x02, 0,\
/* Endpoint Out */\
7, TUSB_DESC_ENDPOINT, _epout, TUSB_XFER_BULK, U16_TO_U8S_LE(_epsize), 0x00,\
/* Endpoint In */\
7, TUSB_DESC_ENDPOINT, _epin, TUSB_XFER_BULK, U16_TO_U8S_LE(_epsize), 0x00
6、修改usb_descriptors.c 的描述符,增加一个printer的描述符和对应的端点。
//--------------------------------------------------------------------+
// Configuration Descriptor
//--------------------------------------------------------------------+
enum
{
ITF_NUM_PRINTER= 0,
ITF_NUM_CDC_0,
ITF_NUM_CDC_0_DATA,
ITF_NUM_CDC_1,
ITF_NUM_CDC_1_DATA,
ITF_NUM_TOTAL
};
#define EPNUM_CDC_0_NOTIF 0x81
#define EPNUM_CDC_0_OUT 0x02
#define EPNUM_CDC_0_IN 0x82
#define EPNUM_CDC_1_NOTIF 0x83
#define EPNUM_CDC_1_OUT 0x04
#define EPNUM_CDC_1_IN 0x84
#define EPNUM_PRINTER_OUT 0x05
#define EPNUM_PRINTER_IN 0x86
uint8_t const desc_fs_configuration[] =
{
// Config number, interface count, string index, total length, attribute, power in mA
TUD_CONFIG_DESCRIPTOR(1, ITF_NUM_TOTAL, 0, CONFIG_TOTAL_LEN, 0x00, 100),
TUD_PRINTER_DESCRIPTOR(ITF_NUM_PRINTER, 5, EPNUM_PRINTER_OUT, EPNUM_PRINTER_IN, 64),
// 1st CDC: Interface number, string index, EP notification address and size, EP data address (out, in) and size.
TUD_CDC_DESCRIPTOR(ITF_NUM_CDC_0, 4, EPNUM_CDC_0_NOTIF, 8, EPNUM_CDC_0_OUT, EPNUM_CDC_0_IN, 64),
// 2nd CDC: Interface number, string index, EP notification address and size, EP data address (out, in) and size.
TUD_CDC_DESCRIPTOR(ITF_NUM_CDC_1, 4, EPNUM_CDC_1_NOTIF, 8, EPNUM_CDC_1_OUT, EPNUM_CDC_1_IN, 64),
};
7、增加device id描述符和string字符串。
//--------------------------------------------------------------------+
// String Descriptors
//--------------------------------------------------------------------+
// array of pointer to string descriptors
char const* string_desc_arr [] =
{
(const char[]) { 0x09, 0x04 }, // 0: is supported language is English (0x0409)
"TinyUSB", // 1: Manufacturer
"TinyUSB Device", // 2: Product
"123456", // 3: Serials, should use chip ID
"TinyUSB CDC", // 4: CDC Interface
"MM32 Printer", // 5: printer Interface
};
uint8_t const desc_printer_device_id[] = {
0x00,0x08, 'p', 'r', 'i', 'n', 't', '0', '0', '0',
};
uint8_t * tud_printer_device_id_cb(void)
{
//(void) itf;
return desc_printer_device_id;
}
8、对应的需要在printer_device.c的printer_control_xfer_cb实现 device id的数据回复。
bool printer_control_xfer_cb(uint8_t rhport, uint8_t stage, tusb_control_request_t const* p_request)
{
uint8_t * devicedesc;
// nothing to do with DATA & ACK stage
if (stage != CONTROL_STAGE_SETUP) return true;
// Handle class request only
TU_VERIFY(p_request->bmRequestType_bit.type == TUSB_REQ_TYPE_CLASS);
switch ( p_request->bRequest ) {
case 0x00:
devicedesc = tud_printer_device_id_cb();
tud_control_xfer(rhport, p_request, (void*) devicedesc, 10);
break;
case 0x01:
devicedesc = tud_printer_device_id_cb();
tud_control_xfer(rhport, p_request, (void*) devicedesc, 10);
break;
default:
return false; // stall unsupported request
}
return true;
}
9、在tusb_config.h文件里面添加#define CFG_TUSB_MCU OPT_MCU_MM32F016X
Tusb_option.h 文件里面增加:
#define OPT_MCU_MM32F016X 1501 ///< MindMotion MM32F0160
否则TUP_DCD_ENDPOINT_MAX 没有定义。
图5.增加MM32F0160宏定义
10、在main.c里面主循环增加三个处理函数:
tud_task();
cdc_task();
tud_printer_task();
main函数:
/*------------- MAIN -------------*/
int main(void)
{
USB_DeviceClockInit(); // board_init();
CONSOLE_Init(460800); //Config uart2
// init device stack on configured roothub port
tud_init(BOARD_TUD_RHPORT);
TU_LOG1("TinyUSB Printer & CDC\r\n");
while (1)
{
tud_task(); // tinyusb device task
cdc_task();
tud_printer_task(); //user printer task
}
}
3、功能验证测试
完成上述移植修改解决基本的编译问题后烧录测试能枚举打印机和CDC两个设备。
图6 枚举过程
图7 枚举成功
选择打印机设备,直接打印word的内容,能抓到通过枚举的打印机28号设备端点4下发的数据。
图8 枚举成功
图9 printer EP4 OUT包数据
- |
- +1 赞 0
- 收藏
- 评论 0
本文由ll转载自灵动MM32MCU公众号,原文标题为:灵动微课堂 (第264讲)|基于MM32F0163D7P的USB接口TinyUSB应用:移植和新增设备(二),本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。
相关研发服务和供应服务
相关推荐
基于MCU MM32G5330的FlexCAN实现CANopenNode协议栈移植
在现代工业自动化和汽车电子领域,CAN总线以其高可靠性和实时性成为通信的主流选择。而CANopen协议,作为CAN总线上的一种上层通信协议,广泛应用于各种设备间的通信。本文将介绍如何基于灵动MM32G5330的FlexCAN实现CANopenNode协议栈的移植,并使用灵动官方提供的开发板Mini-G5333进行验证。
技术探讨 发布时间 : 2024-04-18
解析CLASS B内部时钟检测在MM32SPIN0280上的实现
很多应用场合需要检测系统时钟是否在正常范围内,以保证MCU能正常工作。本文将为您解析CLASS B内部时钟检测在MM32SPIN0280上的实现。
技术探讨 发布时间 : 2023-10-13
Keil分散加载文件浅析
分散加载文件(scatter file)是一个文本文件,用于描述 ARM 链接器生成映像文件所需要的信息,在一些应用场景中嵌入式系统可能会使用分散加载。本章节简要介绍了分散加载文件的基本概念和语法,旨在对分散加载文件有初步认识。
设计经验 发布时间 : 2023-12-28
灵动微电子MM32F0160系列MCU FlexCAN-FD通信应用指南
MM32F0160系列MCU具有一个 FlexCAN 模块,该模块遵循 ISO 11898-1 标准、 CAN FD 和 CAN 2.0B 协议规范,不仅兼容传统CAN,还支持CAN FD模式。本章节初步学习使用MM32F0160 FlexCAN-FD接口实现CAN FD通信,相关例程参考灵动官网的LibSamples或在此基础上修改。
设计经验 发布时间 : 2024-01-07
“MindMotion·Star“ Series: Major Member MM32F5260 Officially in Mass Production
At the Shenzhen Elexcon 2024 in late August, MindMotion Microelectronics officially unveiled the “MindMotion·Star” series of high-performance MM32 MCU products, featuring four sub-series: MM32F3, MindMotion Dubhe MM32F5, MindMotion Alioth MM32G5, and MindMotion Phecda MM32H5. MindMotion is excited to announce the formal launch of a key member of the MindMotion Dubhe sub-series: the MM32F5260.
产品 发布时间 : 2024-10-25
HVAC FLAP以MM32SPIN023C为主控设计提供All in one方案
暖通空调 (HVAC) 系统旨在调节、加热、冷却、通风、清洁或除湿车厢内的空气质量 (IAQ)。暖通空调系统由前端的传感器和机械/电子开关、鼓风机电机、执行器(用于新鲜空气循环控制、气流控制和温度控制)以及制冷装置组成,这些装置将空气输送到后端的座舱,以确保驾驶员和乘客的热舒适性。HVAC FLAP以 MM32SPIN023C 为主控。
应用方案 发布时间 : 2024-03-25
使用灵动MM32F5270 MCU UART配置实现LIN通信
本文主要简述MM32F5270 UART是如何实现LIN通信的。从LIN驱动程序、 主机程序、从机程序和验证等方面来讲代码实现。
设计经验 发布时间 : 2024-02-23
MindMotion MM32H5480 Triumphs with “2024 Hardcore MCU Chip Award“
MindMotion Microelectronics, as a frontrunner in the domestic market for general-purpose 32-bit MCU products and solutions, proudly secured the “2024 Hardcore MCU Chip Award“ for its high-performance product, the MM32H5480.
产品 发布时间 : 2024-10-23
MindMotion(灵动微) MCU选型表
32位高性能,高性价比MCU,Core核心有M0、M0+、2XM0、M3、STAR-MC1,Flash存储容量范围 16KB~2048KB,RAM存储容量范围 2KB~128KB,工作电压:1.8~48V,CPU频率(MHz):48~180MHz,GPIO 端口数(个):6~86,LQFP/TSSOP/QFN等多种封装形式。
产品型号
|
品类
|
内核
|
管脚数(个)
|
工作温度(℃)
|
CPU频率(MHz)
|
工作电压(V)
|
GPIO 端口数(个)
|
Flash(KB)
|
SRAM (KB)
|
封装/外壳/尺寸
|
MM32F0163D7PV
|
32位MCU
|
M0
|
64
|
-40℃~105℃
|
96MHz
|
2.0~5.5V
|
57
|
128KB
|
16KB
|
LQFP64
|
选型表 - MindMotion 立即选型
【IC】“灵动·星”系列MM32高性能MCU产品搭载Star-MC1提供强劲内核动力,性能提升20%
“灵动·星”系列 MM32 高性能 MCU 产品,搭载安谋科技(Arm China)Star-MC1 内核性能,其1.5 DMIPS / MHz,提升 20% ,4.02 CoreMark / MHz,提升20% 。目前包含 4 个子系列: MM32F3,灵动·天枢 MM32F5,灵动·玉衡 MM32G5,灵动·天玑 MM32H5,为用户提供灵活、丰富的选择。
产品 发布时间 : 2024-10-23
MindMotion(灵动微)MM32系列32位MCU选型指南
描述- 灵动微电子成立于2011年,是中国本土领先的通用32位MCU产品及解决方案供应商。灵动微电子的 MCU 产品以 MM32 为标识,基于 Arm Cortex-M 系列内核,自主研发软硬件和生态系统。
型号- MM32G0163D4PV,MM32L0XX,MM32F0144C6PM,MM32F5230,MM32SPIN580C,MM32G0020,MM32G0140,MM32L073PF,MM32F0133C4Q,MM32SPIN080GN,MM32SPIN560CM,MM32SPIN023C,MM32F0133C4P,MM32F5287L8PV,MM32SPIN533AM,MM32F0162D7P,MM32F0121C6P,MM32F0163D4Q,MM32SPIN0230,MM32SPIN080C,MM32F0141C1T,MM32L062NT,MM32F0020B1N,MM32F0144C1TV,MM32F5330,MM32G0001,MM32G0120,MM32F0144C1TM,MM32F0163D7P,MM32SPIN030CN,MM32G0121C1TV,MM32F0010A1TV,MM32SPIN07PF,MM32SPIN05PFOP,MM32SPIN0230B1TV,MM32SPIN37PSD,MM32G0001A6T,MM32F3270,MM32F0121C4P,MM32F0121C4Q,MM32F5277E9PV,MM32F5287L9PV,MM32F0163D6P,MM32F5333D6PV,MM32SPIN0280DAPV,MM32F0121C4N,MM32SPIN080G,MM32SPIN560,MM32F0144C4PM,MM32F0144C4PV,MM32F5280,MM32SPIN06NT,MM32F0140,MM32SPIN560C,MM32F0020,MM32G5333D6QV,MM32F0162D4Q,MM32F0050C1TV,MM32F0273D6P,MM32SPIN0230B3NV,MM32SPIN06PF,MM32G0144C4QV,MM32SPIN0280,MM32L052NT,MM32F5270,MM32F0144C4P,MM32F5277E8PV,MM32F031C6T6,MM32F0130,MM32F0010,MM32F0020B1TV,MM32F5333D7PV,MM32G0144C4PV,MM32SPIN080CN,MM32F0144C4Q,MM32SPIN060G,MM32L0136C7P,MM32F0133C7P,MM32SPIN05NW,MM32F5331D3NV,MM32F0040B1T,MM32SPIN05NT,MM32G0001A6T1V,MM32SPIN06PT,MM32F0120,MM32F0162D6P,MM32F5331D3NM,MM32F003NW,MM32G0160,MM32SPIN27NF,MM32F0163D4QM,MM32SPIN05PF,MM32F031,MM32F3273G6P,MM32F0163D4QV,MM32L0136B6P,MM32G0001A1TV,MM32F0133C6P,MM32SPIN0280D7PV,MM32F5277E7PV,MM32F0144C6P,MM32SPIN222C,MM32F0144C6PV,MM32F0010A6T,MM32G0001A1T,MM32F3273G7P,MM32L0130,MM32G0001A1N,MM32SPIN05PT,MM32G0121C4PV,MM32F0010A1T,MM32F5233D7PV,MM32SPIN27PF,MM32F0010A1N,MM32G5330,MM32SPINEBK,MM32SPIN07,MM32F3273G8P,MM32SPIN160C,MM32SPIN06,MM32F0040B1N,MM32SPIN0230B1NV,MM32L0136C6P,MM32SPIN05,MM32L0020,MM32F0050,MM32SPIN0280D6PV,MM32SPIN533,MM32F031K6U6,MM32F3273G9P,MM32F0163D6PM,MM32SPIN040C,MM32G0020B1T,MM32F0163D6PV,MM32F003,MM32SPIN37,MM32G0020B1N,MM32F0273D8P,MM32F0160,MM32L0136C3T,MM32F0040,MM32G0001A1NV,MM32SPIN0280D6QV,MM32F0144C1T,MM32F103CBT6,MM32F5233D6PV,MM32F0144C4QM,MM32F3273E6P,MM32SPIN27PQ,MM32SPIN27PS,MM32SPIN27PT,MM32L0136C4N,MM32SPIN27,MM32F0020B1NV,MM32F0270,MM32G0121C4QV,MM32F031F6U6,MM32F0273D7P,MM32F003TW,MM32G0144C1TV,MM32F3273E7P,MM32F0141B1T,MM32G0163D6PV,MM32F0163D7PM,MM32SPIN030C,MM32F0163D7PV,MM32F0131C7P,MM32F103,MM32SPIN05TW,MM32F031Y6Y6,MM32F0141C4P,MM32F0141C4Q,MM32F0141C4N,MM32F031K6T6,MM32F0010A1NV,MM32F0131C6P,MM32SPIN422C,MM32F0020B1T,MM32SPIN0280D4PV,MM32L0020B1T,MM32F103RBT6,MM32L0020B1N,MM32F031F6P6,MM32F0121C1N,MM32F0050C1NV,MM32F5333D4QM,MM32G0001A6TV,MM32SPIN360C,MM32,MM32F5333D4QV,MM32F0141C6P,MM32F0141B4P,MM32F0131C4P,MM32F0131C4Q,MM32SPIN0230B3TV,MM32SPIN533A,MM32SPIN033A,MM32F5287L7PV,MM32F5233D4QV
【IC】灵动发布全新入门级32位MCU MM32G0001系列,内置时钟全温度范围内偏差不超过±2%
灵动股份推出全新超值型MM32G0001系列MCU。2023年初,灵动首次发布了其主打高性价比的MM32G系列,目前已陆续推出了G0140,G0160和G5330系列产品。为进一步丰富MM32G系列产品组合,灵动和上下游合作伙伴通力合作,打造出全新入门级超值型MM32G0001系列MCU。
新产品 发布时间 : 2023-07-01
【IC】灵动微电子高性能通用32位MCU产品MM32H5480荣获“2024年度硬核MCU芯片奖”
近日,第六届硬核芯生态大会在深圳举办,同期2024年度硬核中国芯获奖榜单正式发布。作为国内领先的本土通用32位MCU产品及解决方案供应商,MindMotion灵动微电子凭借高性能产品MM32H5480斩获“2024年度硬核MCU芯片奖”。
原厂动态 发布时间 : 2024-10-18
【经验】基于MM32F0163D7P的USB Audio Class(UAC)音频设备移植教程
在上一节我们在MM32F0163D7P 平台上成功的移植了TinyUSB,基于这个平台,今天我们来实现一个 uac2_headset 音频设备,这个设备支持基础的录音和放音功能,如果要支持音量调节/静音功能,还需要再添加一个 HID 变成复合设备。
设计经验 发布时间 : 2023-08-05
电子商城
现货市场
服务
可定制显示屏的尺寸0.96”~15.6”,分辨率80*160~3840*2160,TN/IPS视角,支持RGB、MCU、SPI、MIPI、LVDS、HDMI接口,配套定制玻璃、背光、FPCA/PCBA。
最小起订量: 1000 提交需求>
可烧录IC封装SOP/MSOP/SSOP/TSOP/TSSOP/PLCC/QFP/QFN/MLP/MLF/BGA/CSP/SOT/DFN;IC包装Tray/Tube/Tape;IC厂商不限,交期1-3天。支持IC测试(FT/SLT),管装、托盘装、卷带装包装转换,IC打印标记加工。
最小起订量: 1pcs 提交需求>
登录 | 立即注册
提交评论