0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于MM32F0163D7P的USB接口TinyUSB应用:移植和新增设备(二)

灵动MM32MCU 来源:灵动MM32MCU 2023-07-20 17:05 次阅读

1

新增一个class里面没有参考示例的设备

如果用户想增加一个device设备但是在TinyUSB class里面又没有参考示例,本次我们一起来移植一个CDC+printer复合设备。操作步骤还是和上篇一样,先将TinyUSB 从GitHub上克隆下来,将src 整个文件夹copy替换到例程components目录下的src。

c4d4ea84-26db-11ee-962d-dac502259ad0.png

图1 TinyUSB源码

将tinyusb 目录下example下的对应文件,将tinyusbexamplesdevicecdc_dual_portssrc 三个文件copy到例程user文件夹里面,其他增加时钟配置函数和添加tud_dcd_port.c 接口函数文件和上一篇一致(tud_dcd_port.c 文件可以参考现有例程或者联系灵动技术支持)。

c5082f7a-26db-11ee-962d-dac502259ad0.png

图2 工程的USER文件

在tinyusbsrcclass里面新增一个printer文件夹,可以参考其他设备比如从hid里面copy两个hid_device.c和hid_device.h 文件做为模板,将文件名修改成printer_device.c和printer_device.h,在这个文件里面修改对应的函数接口。

c531392e-26db-11ee-962d-dac502259ad0.png

图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)循环打印机数据处理

c55a7ece-26db-11ee-962d-dac502259ad0.png

图4 需要实现的接口函数

2、在tusb_config.h 文件里面增加宏定义#define CFG_TUD_PRINTER 1 ,同时将对应的设备define改成2 ( #define CFG_TUD_CDC 2 ) ,使能两个CDC设备。

//-------------CLASS-------------//
#defineCFG_TUD_CDC2
#defineCFG_TUD_MSC0
#defineCFG_TUD_PRINTER1
#defineCFG_TUD_HID0
#defineCFG_TUD_MIDI0
#defineCFG_TUD_VENDOR0

3、在usbd.c 里面增加printer回调函数接口处理。

#ifCFG_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对应的头文件。

#ifCFG_TUD_PRINTER
#include"class/printer/printer_device.h"
#endif

5、在tusb.h增加printer描述符。

//--------------------------------------------------------------------+
//PRINTERDescriptorTemplates
//--------------------------------------------------------------------+

//Lengthoftemplatedescriptor:23bytes
#defineTUD_PRINTER_DESC_LEN(9+7+7)

//Interfacenumber,stringindex,EPOut&EPInaddress,EPsize
#defineTUD_PRINTER_DESCRIPTOR(_itfnum,_stridx,_epout,_epin,_epsize)
/*Interface*/
9,TUSB_DESC_INTERFACE,_itfnum,0,2,TUSB_CLASS_PRINTER,0x01,0x02,0,
/*EndpointOut*/
7,TUSB_DESC_ENDPOINT,_epout,TUSB_XFER_BULK,U16_TO_U8S_LE(_epsize),0x00,
/*EndpointIn*/
7,TUSB_DESC_ENDPOINT,_epin,TUSB_XFER_BULK,U16_TO_U8S_LE(_epsize),0x00

6、修改usb_descriptors.c 的描述符,增加一个printer的描述符和对应的端点。

//--------------------------------------------------------------------+
//ConfigurationDescriptor
//--------------------------------------------------------------------+
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
};

  #defineEPNUM_CDC_0_NOTIF0x81
#defineEPNUM_CDC_0_OUT0x02
#defineEPNUM_CDC_0_IN0x82

#defineEPNUM_CDC_1_NOTIF0x83
#defineEPNUM_CDC_1_OUT0x04
#defineEPNUM_CDC_1_IN0x84

  #defineEPNUM_PRINTER_OUT0x05
  #defineEPNUM_PRINTER_IN0x86

uint8_tconstdesc_fs_configuration[]=
{
//Confignumber,interfacecount,stringindex,totallength,attribute,powerinmA
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),

//1stCDC:Interfacenumber,stringindex,EPnotificationaddressandsize,EPdataaddress(out,in)andsize.
TUD_CDC_DESCRIPTOR(ITF_NUM_CDC_0,4,EPNUM_CDC_0_NOTIF,8,EPNUM_CDC_0_OUT,EPNUM_CDC_0_IN,64),

//2ndCDC:Interfacenumber,stringindex,EPnotificationaddressandsize,EPdataaddress(out,in)andsize.
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字符串。

//--------------------------------------------------------------------+
//StringDescriptors
//--------------------------------------------------------------------+

//arrayofpointertostringdescriptors
charconst*string_desc_arr[]=
{
(constchar[]){0x09,0x04},//0:issupportedlanguageisEnglish(0x0409)
"TinyUSB",//1:Manufacturer
"TinyUSBDevice",//2:Product
"123456",//3:Serials,shouldusechipID
"TinyUSBCDC",//4:CDCInterface
"MM32Printer",//5:printerInterface
};

uint8_tconstdesc_printer_device_id[]={
0x00,0x08,'p','r','i','n','t','0','0','0',
};

uint8_t*tud_printer_device_id_cb(void)
{
//(void)itf;
returndesc_printer_device_id;
}

8、对应的需要在printer_device.c的printer_control_xfer_cb实现 device id的数据回复。

boolprinter_control_xfer_cb(uint8_trhport,uint8_tstage,tusb_control_request_tconst*p_request)
{
uint8_t*devicedesc;
//nothingtodowithDATA&ACKstage
if(stage!=CONTROL_STAGE_SETUP)returntrue;
//Handleclassrequestonly
TU_VERIFY(p_request->bmRequestType_bit.type==TUSB_REQ_TYPE_CLASS);

switch(p_request->bRequest){
case0x00:
devicedesc=tud_printer_device_id_cb();
tud_control_xfer(rhport,p_request,(void*)devicedesc,10);

break;
case0x01:
devicedesc=tud_printer_device_id_cb();
tud_control_xfer(rhport,p_request,(void*)devicedesc,10);
break;
default:
returnfalse;//stallunsupportedrequest
}

returntrue;
}

9、在tusb_config.h文件里面添加#define CFG_TUSB_MCU OPT_MCU_MM32F016X

Tusb_option.h 文件里面增加:

#defineOPT_MCU_MM32F016X1501///< MindMotion MM32F0160

否则TUP_DCD_ENDPOINT_MAX 没有定义。

c57c15ca-26db-11ee-962d-dac502259ad0.pngc5b0f574-26db-11ee-962d-dac502259ad0.png

图5 增加MM32F0160 宏定义

10、在main.c 里面主循环增加三个处理函数:

tud_task();
cdc_task();
tud_printer_task();

main函数:

/*-------------MAIN-------------*/
intmain(void)
{
USB_DeviceClockInit();//board_init();

CONSOLE_Init(460800);//Configuart2

//initdevicestackonconfiguredroothubport
tud_init(BOARD_TUD_RHPORT);

TU_LOG1("TinyUSBPrinter&CDC
");

while(1)
{
tud_task();//tinyusbdevicetask
cdc_task();
tud_printer_task();//userprintertask
}
}

3

功能验证测试

完成上述移植修改解决基本的编译问题后烧录测试能枚举打印机和CDC两个设备。

c5c75d82-26db-11ee-962d-dac502259ad0.png

图6 枚举过程

c6022a52-26db-11ee-962d-dac502259ad0.png

图7 枚举成功

选择打印机设备,直接打印word的内容,能抓到通过枚举的打印机28号设备端点4下发的数据。

c61f01ea-26db-11ee-962d-dac502259ad0.png

图8 枚举成功

c6402a0a-26db-11ee-962d-dac502259ad0.png

图9 printer EP4 OUT包数据






审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 处理器
    +关注

    关注

    68

    文章

    18293

    浏览量

    222203
  • USB接口
    +关注

    关注

    9

    文章

    672

    浏览量

    54992
  • CDC技术
    +关注

    关注

    0

    文章

    9

    浏览量

    6817
  • MCU芯片
    +关注

    关注

    3

    文章

    221

    浏览量

    11147

原文标题:灵动微课堂 (第264讲)|基于MM32F0163D7P的USB接口TinyUSB应用:移植和新增设备(二)

文章出处:【微信号:MindMotion-MMCU,微信公众号:灵动MM32MCU】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    【NUCLEO-F412ZG申请】FreeRTOS移植USB接口实验

    申请理由:项目描述:1.进行FreeRTOS系统的初步移植实验,并提供源代码与移植经验。2.进行USB HID设备的实验,并写出实验报告。3.本人从事C51,STM8S,STM32
    发表于 11-07 16:33

    基于STM32F070F6P6的USB温湿度计

    , C7LC-0805_C2C17981N4007W通用极管D1LC-SOD-123F1C64898LED0LED灯LD1LC-0805_LED_S11C84256Mini USBMini USBP1Mini_
    发表于 07-01 11:02

    采用USB接口芯片CH372实现人机接口设备设计

    请求,从而可以实现符合各种USB 类规范的设备。  2.2 通信原理图1 通信原理框图  图1 为CH372 通信原理框图,D7~D0 为8 位双向数据总线、RD#为读选通输入引脚、
    发表于 06-05 05:00

    USB接口驱动的移植介绍

    一、介绍目前5G网络比较火,这里介绍一款5g模组的驱动的移植,实现5G上网,目前有很多5G模组,比如移远、simcom、华为等等接口类型有u***和PCIE,这里先介绍USB接口的,P
    发表于 12-20 07:32

    国产灵动微MM32F3277G7P兼容STM32F103RCT6

    兼容MM32F3270G7P的CPU采用120MHz,能够提供更好的性能。其目标应用为指纹识别、消防监控、LED面板控制、GPS跟踪器、3D打印控制、家电控制、网口转换模块等。产品供货情况和支持
    发表于 02-26 13:55

    在STM32F103VB上使用tinyusb完成配置之后没有反应是怎么回事

    尝试STM32F103VB上使用tinyusb,完成配置之后开始没有反应。调试后发现这个上拉电阻的实现需要手动实现控制:dcd_disconnectdcd_connect之后调试发现设备还是无法识别
    发表于 04-15 16:50

    stm32103VB tinyusb使用异常,无法识别描述符是为什么?

    尝试STM32F103VB上使用tinyusb,完成配置之后开始没有反应。调试后发现这个上拉电阻的实现需要手动实现控制:dcd_disconnectdcd_connect之后调试发现设备还是无法识别
    发表于 05-30 11:08

    ESP32S3 USB CDC设备通信缓冲区问题如何处理?

    这个回调函数每次读取到的数据最大也就是64字节。修改了很多地方对这个值都没有影像。数据无论发送多快都是每次只接收到64字节。并且在一次回调中多次调用tinyusb_cdcacm_read接口,但是从
    发表于 02-13 08:44

    ESP32S3 USB CDC设备通信缓冲区问题如何解决?

    这个回调函数每次读取到的数据最大也就是64字节。修改了很多地方对这个值都没有影像。数据无论发送多快都是每次只接收到64字节。并且在一次回调中多次调用tinyusb_cdcacm_read接口,但是从
    发表于 03-07 06:24

    USB设备接口IP核的设计

    USB设备接口IP核的设计:讨论了用Verilog硬件描述语言来实现USB设备接口IP核的方法,
    发表于 01-08 18:15 22次下载

    如何对TinyUSB上游仓库进行移植

    TinyUSB 是一个用于嵌入式系统的开源跨平台 USB Host/Device 协议栈,其为了内存安全而设计,没有动态分配,同时也是线程安全的,所有中断事件都会被推迟,然后在非 ISR 任务函数中处理,支持多种 MCU。目前 Tiny
    的头像 发表于 05-06 11:26 2966次阅读
    如何对<b class='flag-5'>TinyUSB</b>上游仓库进行<b class='flag-5'>移植</b>

    TinyUSB基本介绍和移植例程

    TinyUSB是一个用于嵌入式系统的开源的跨平台USB协议栈,协议栈中包含了主机端及设备端的协议栈,由于不使用动态内存分配以及采用阻塞所有中断事件,在非ISR任务功能中处理中断事件的设计方式,所以此协议栈的内存安全性及线程安全性
    的头像 发表于 07-14 09:38 5100次阅读
    <b class='flag-5'>TinyUSB</b>基本介绍和<b class='flag-5'>移植</b>例程

    基于MM32F0163D7PUSB Audio Class(UAC)音频设备

    UAC是USB Audio Class的缩写,USB音频类,一个像USB这样的通用数据接口,可以有很多种实现数字音频数据传输的方式。不同的开发者可以根据自己的喜好和需求,定义任意的控制
    的头像 发表于 07-27 16:34 674次阅读
    基于<b class='flag-5'>MM32F0163D7P</b>的<b class='flag-5'>USB</b> Audio Class(UAC)音频<b class='flag-5'>设备</b>

    基于MM32F0163D7PUSB Audio Class(UAC)音频设备

    UAC是USB Audio Class的缩写,USB音频类,一个像USB这样的通用数据接口,可以有很多种实现数字音频数据传输的方式。
    的头像 发表于 09-01 16:40 736次阅读
    基于<b class='flag-5'>MM32F0163D7P</b>的<b class='flag-5'>USB</b> Audio Class(UAC)音频<b class='flag-5'>设备</b>

    3.5mm耳机接口usb接口的区别

    3.5mm耳机接口USB接口是两种常见的音频和感知设备的连接方式。虽然它们都用于连接设备以实现
    的头像 发表于 01-11 10:34 3270次阅读