在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

基于MM32F0163D7P的USB接口TinyUSB應(yīng)用:移植和新增設(shè)備(二)

靈動(dòng)MM32MCU ? 來(lái)源:靈動(dòng)MM32MCU ? 2023-07-20 17:05 ? 次閱讀

1

新增一個(gè)class里面沒(méi)有參考示例的設(shè)備

如果用戶想增加一個(gè)device設(shè)備但是在TinyUSB class里面又沒(méi)有參考示例,本次我們一起來(lái)移植一個(gè)CDC+printer復(fù)合設(shè)備。操作步驟還是和上篇一樣,先將TinyUSB 從GitHub上克隆下來(lái),將src 整個(gè)文件夾copy替換到例程components目錄下的src。

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

圖1 TinyUSB源碼

將tinyusb 目錄下example下的對(duì)應(yīng)文件,將tinyusbexamplesdevicecdc_dual_portssrc 三個(gè)文件copy到例程user文件夾里面,其他增加時(shí)鐘配置函數(shù)和添加tud_dcd_port.c 接口函數(shù)文件和上一篇一致(tud_dcd_port.c 文件可以參考現(xiàn)有例程或者聯(lián)系靈動(dòng)技術(shù)支持)。

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

圖2 工程的USER文件

在tinyusbsrcclass里面新增一個(gè)printer文件夾,可以參考其他設(shè)備比如從hid里面copy兩個(gè)hid_device.c和hid_device.h 文件做為模板,將文件名修改成printer_device.c和printer_device.h,在這個(gè)文件里面修改對(duì)應(yīng)的函數(shù)接口。

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

圖3 新增printer文件

工程文件樹(shù)如下:

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接口函數(shù)

1、在printer接口文件里面需要修改實(shí)現(xiàn)以下幾個(gè)函數(shù):

printer_init,//接口變量初始化
printer_reset,//接口變量重置
printer_open,
printer_control_xfer_cb,//控制接口回調(diào)
printer_xfer_cb//數(shù)據(jù)接口回調(diào)
tud_printer_task//while(1)循環(huán)打印機(jī)數(shù)據(jù)處理

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

圖4 需要實(shí)現(xiàn)的接口函數(shù)

2、在tusb_config.h 文件里面增加宏定義#define CFG_TUD_PRINTER 1 ,同時(shí)將對(duì)應(yīng)的設(shè)備define改成2 ( #define CFG_TUD_CDC 2 ) ,使能兩個(gè)CDC設(shè)備。

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

3、在usbd.c 里面增加printer回調(diào)函數(shù)接口處理。

#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對(duì)應(yīng)的頭文件。

#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 的描述符,增加一個(gè)printer的描述符和對(duì)應(yīng)的端點(diǎn)。

//--------------------------------------------------------------------+
//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、對(duì)應(yīng)的需要在printer_device.c的printer_control_xfer_cb實(shí)現(xiàn) device id的數(shù)據(jù)回復(fù)。

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///

否則TUP_DCD_ENDPOINT_MAX 沒(méi)有定義。

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

圖5 增加MM32F0160 宏定義

10、在main.c 里面主循環(huán)增加三個(gè)處理函數(shù):

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

main函數(shù):

/*-------------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

功能驗(yàn)證測(cè)試

完成上述移植修改解決基本的編譯問(wèn)題后燒錄測(cè)試能枚舉打印機(jī)和CDC兩個(gè)設(shè)備。

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

圖6 枚舉過(guò)程

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

圖7 枚舉成功

選擇打印機(jī)設(shè)備,直接打印word的內(nèi)容,能抓到通過(guò)枚舉的打印機(jī)28號(hào)設(shè)備端點(diǎn)4下發(fā)的數(shù)據(jù)。

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

圖8 枚舉成功

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

圖9 printer EP4 OUT包數(shù)據(jù)






審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 處理器
    +關(guān)注

    關(guān)注

    68

    文章

    19384

    瀏覽量

    230494
  • USB接口
    +關(guān)注

    關(guān)注

    9

    文章

    702

    瀏覽量

    55727
  • CDC技術(shù)
    +關(guān)注

    關(guān)注

    0

    文章

    9

    瀏覽量

    6884
  • MCU芯片
    +關(guān)注

    關(guān)注

    3

    文章

    253

    瀏覽量

    11570

原文標(biāo)題:靈動(dòng)微課堂 (第264講)|基于MM32F0163D7P的USB接口TinyUSB應(yīng)用:移植和新增設(shè)備(二)

文章出處:【微信號(hào):MindMotion-MMCU,微信公眾號(hào):靈動(dòng)MM32MCU】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    MM32F0163D7P的ADC內(nèi)部1.2V參考電壓的使用

    ADC外設(shè)是12位的逐次逼近型(SAR)模擬數(shù)字轉(zhuǎn)換器,可以將模擬信號(hào)轉(zhuǎn)換成數(shù)字信號(hào)。
    發(fā)表于 08-03 17:15 ?1445次閱讀
    <b class='flag-5'>MM32F0163D7P</b>的ADC內(nèi)部1.2V參考電壓的使用

    MM32F013x——Linux下搭建MM32開(kāi)發(fā)環(huán)境

    Cortex-M0型號(hào):MM32F0133C7P下載器與調(diào)試接口MM32 DAP-Link + SWD操作系統(tǒng):Ubuntu20.0.4集成開(kāi)發(fā)環(huán)境平臺(tái):eclipse IDE for C/C++
    發(fā)表于 01-25 18:13 ?2次下載
    <b class='flag-5'>MM32F</b>013x——Linux下搭建<b class='flag-5'>MM</b>32開(kāi)發(fā)環(huán)境

    如何對(duì)TinyUSB上游倉(cāng)庫(kù)進(jìn)行移植

    TinyUSB 是一個(gè)用于嵌入式系統(tǒng)的開(kāi)源跨平臺(tái) USB Host/Device 協(xié)議棧,其為了內(nèi)存安全而設(shè)計(jì),沒(méi)有動(dòng)態(tài)分配,同時(shí)也是線程安全的,所有中斷事件都會(huì)被推遲,然后在非 ISR 任務(wù)函數(shù)中處理,支持多種 MCU。目前 Tiny
    的頭像 發(fā)表于 05-06 11:26 ?3708次閱讀
    如何對(duì)<b class='flag-5'>TinyUSB</b>上游倉(cāng)庫(kù)進(jìn)行<b class='flag-5'>移植</b>

    AN0061 從MM32F0010移植MM32F0020(中文版)

    AN0061 從MM32F0010移植MM32F0020(中文版)
    發(fā)表于 02-22 18:33 ?0次下載
    AN0061 從<b class='flag-5'>MM32F</b>0010<b class='flag-5'>移植</b>到<b class='flag-5'>MM32F</b>0020(中文版)

    AN0061 從MM32F0010移植MM32F0020(英文版)

    AN0061 從MM32F0010移植MM32F0020(英文版)
    發(fā)表于 02-22 18:34 ?0次下載
    AN0061 從<b class='flag-5'>MM32F</b>0010<b class='flag-5'>移植</b>到<b class='flag-5'>MM32F</b>0020(英文版)

    AN0052從MM32F0130移植MM32F0140(中文版)

    AN0052 從MM32F0130移植MM32F0140(中文版)
    發(fā)表于 02-22 18:42 ?0次下載
    AN0052從<b class='flag-5'>MM32F</b>0130<b class='flag-5'>移植</b>到<b class='flag-5'>MM32F</b>0140(中文版)

    AN0052從MM32F0130移植MM32F0140(英文版)

    AN0052 從MM32F0130移植MM32F0140(英文版)
    發(fā)表于 02-22 18:43 ?0次下載
    AN0052從<b class='flag-5'>MM32F</b>0130<b class='flag-5'>移植</b>到<b class='flag-5'>MM32F</b>0140(英文版)

    AN0051 從MM32F031移植MM32F0140(中文版)

    AN0051 從MM32F031移植MM32F0140(中文版)
    發(fā)表于 02-22 18:49 ?0次下載
    AN0051 從<b class='flag-5'>MM32F</b>031<b class='flag-5'>移植</b>到<b class='flag-5'>MM32F</b>0140(中文版)

    AN0051 從MM32F031移植MM32F0140(英文版)

    AN0051 從MM32F031移植MM32F0140(英文版)
    發(fā)表于 02-22 18:50 ?0次下載
    AN0051 從<b class='flag-5'>MM32F</b>031<b class='flag-5'>移植</b>到<b class='flag-5'>MM32F</b>0140(英文版)

    MM32F003NW 新增框架第供應(yīng)商變更通知表(中文版)

    MM32F003NW 新增框架第供應(yīng)商變更通知表(中文版)
    發(fā)表于 02-23 18:53 ?0次下載
    <b class='flag-5'>MM32F</b>003NW <b class='flag-5'>新增</b>框架第<b class='flag-5'>二</b>供應(yīng)商變更通知表(中文版)

    MM32F031F6U6 新增框架第供應(yīng)商變更通知表(中文版)

    MM32F031F6U6 新增框架第供應(yīng)商變更通知表(中文版)
    發(fā)表于 02-23 18:58 ?0次下載
    <b class='flag-5'>MM32F031F</b>6U6 <b class='flag-5'>新增</b>框架第<b class='flag-5'>二</b>供應(yīng)商變更通知表(中文版)

    基于MM32F0163D7P的I2S接口的音樂(lè)播放器實(shí)驗(yàn)

    I2S(Inter-IC Sound)總線,又稱集成電路內(nèi)置音頻總線,是飛利浦公司為數(shù)字音頻設(shè)備之間的音頻數(shù)據(jù)傳輸而制定的一種總線標(biāo)準(zhǔn)。
    發(fā)表于 07-12 11:42 ?1043次閱讀
    基于<b class='flag-5'>MM32F0163D7P</b>的I2S<b class='flag-5'>接口</b>的音樂(lè)播放器實(shí)驗(yàn)

    TinyUSB基本介紹和移植例程

    TinyUSB是一個(gè)用于嵌入式系統(tǒng)的開(kāi)源的跨平臺(tái)USB協(xié)議棧,協(xié)議棧中包含了主機(jī)端及設(shè)備端的協(xié)議棧,由于不使用動(dòng)態(tài)內(nèi)存分配以及采用阻塞所有中斷事件,在非ISR任務(wù)功能中處理中斷事件的設(shè)計(jì)方式,所以此協(xié)議棧的內(nèi)存安全性及線程安全性
    的頭像 發(fā)表于 07-14 09:38 ?1.1w次閱讀
    <b class='flag-5'>TinyUSB</b>基本介紹和<b class='flag-5'>移植</b>例程

    基于MM32F0163D7PUSB Audio Class(UAC)音頻設(shè)備

    UAC是USB Audio Class的縮寫(xiě),USB音頻類(lèi),一個(gè)像USB這樣的通用數(shù)據(jù)接口,可以有很多種實(shí)現(xiàn)數(shù)字音頻數(shù)據(jù)傳輸?shù)姆绞健2煌拈_(kāi)發(fā)者可以根據(jù)自己的喜好和需求,定義任意的控制
    的頭像 發(fā)表于 07-27 16:34 ?1396次閱讀
    基于<b class='flag-5'>MM32F0163D7P</b>的<b class='flag-5'>USB</b> Audio Class(UAC)音頻<b class='flag-5'>設(shè)備</b>

    基于MM32F0163D7PUSB Audio Class(UAC)音頻設(shè)備

    UAC是USB Audio Class的縮寫(xiě),USB音頻類(lèi),一個(gè)像USB這樣的通用數(shù)據(jù)接口,可以有很多種實(shí)現(xiàn)數(shù)字音頻數(shù)據(jù)傳輸?shù)姆绞健?/div>
    的頭像 發(fā)表于 09-01 16:40 ?1059次閱讀
    基于<b class='flag-5'>MM32F0163D7P</b>的<b class='flag-5'>USB</b> Audio Class(UAC)音頻<b class='flag-5'>設(shè)備</b>
    主站蜘蛛池模板: 国外免费精品视频在线观看| 五月六月婷婷| 欧美福利在线播放| 美女被免费网站91色| 久久天天躁夜夜躁狠狠躁2020| 毛片福利| 日本人的xxxxxxxxx69| 717影院理伦午夜论八戒| 男人j进入女人免费视频| 在线精品国产三级| 婷婷精品视频| 欧美一级三级在线观看| 久久男人网| 色黄污在线看黄污免费看黄污| 日日干夜夜操s8| 美女视频黄色的免费| 国产精品毛片在线大全| 新天堂网| 公妇乱淫日本免费观看| 欧美亚洲啪啪| www.一区二区| 三级网站在线| 国模吧一区二区三区精品视频| 夜夜摸夜夜操| 午夜影视在线观看| 一级黄视频| 日韩精品在线第一页| gogo亚洲肉体艺术100| 乱高h亲女| 色视频在线看| 国产精品久久精品牛牛影视| 天堂网在线新版www| 欧美极品一区| 亚洲精品卡1卡二卡3卡四卡| 日韩三级观看| 成人观看天堂在线影片| 青青青久97在线观看香蕉| 69xxxx欧美老师| 四虎影院.com| 大尺度在线播放| 狠狠的操|