91在线观看视频-91在线观看视频-91在线观看免费视频-91在线观看免费-欧美第二页-欧美第1页

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

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

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

TinyUSB基本介紹和移植例程

靈動(dòng)MM32MCU ? 來源:靈動(dòng)MM32MCU ? 2023-07-14 09:38 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

1TinyUSB基本介紹

TinyUSB是一個(gè)用于嵌入式系統(tǒng)的開源的跨平臺(tái)USB協(xié)議棧,協(xié)議棧中包含了主機(jī)端及設(shè)備端的協(xié)議棧,由于不使用動(dòng)態(tài)內(nèi)存分配以及采用阻塞所有中斷事件,在非ISR任務(wù)功能中處理中斷事件的設(shè)計(jì)方式,所以此協(xié)議棧的內(nèi)存安全性及線程安全性極高。

源碼是托管在GitHub上面,地址是:https://github.com/hathach/tinyusb。

fc2182cc-2163-11ee-962d-dac502259ad0.png

2TinyUSB基本移植介紹

MM32已基于TinyUSB開發(fā)完成相應(yīng)的參考例程,并可以給客戶提供參考,本次我們介紹的移植將基于此基礎(chǔ)上進(jìn)行。將TinyUSB從GitHub上克隆到本地,可以得到如下內(nèi)容:

fc4f427a-2163-11ee-962d-dac502259ad0.png

圖1 TinyUSB源碼

移植TinyUSB到MM32F0160需要添加如下文件:

屬于工程專用文件:

usb_descriptors.c

usb_dcd_port.c

tusb_config.h

usb_descriptors.h

屬于庫內(nèi)文件:

tusb.c

usbd.c

usbd_control.c

*_device.c

tusb_fifo.c

將src 整個(gè)文件夾copy替換到例程components目錄下的src。

將tinyusb 目錄下example下的對(duì)應(yīng)文件,以device uac2_headset為例,將tinyusbexamplesdeviceuac2_headsetsrc 四個(gè)文件copy到例程user文件夾里面。

fc723208-2163-11ee-962d-dac502259ad0.png

圖2 源碼的device文件

fc926ea6-2163-11ee-962d-dac502259ad0.png

圖3 用戶工程文件

USB時(shí)鐘頻率是48MHz,HSE可以經(jīng)過PLL倍頻到48MHz或96MHz,然后經(jīng)過分頻到48MHz,注意需要使用外部晶振,如果使用內(nèi)部時(shí)鐘HSI,需要使能時(shí)鐘回饋系統(tǒng)CRS功能。

在main.c 增加USB時(shí)鐘配置函數(shù)void USB_DeviceClockInit(void),同時(shí)將board_init();替換成usb時(shí)鐘初始化函數(shù),主頻配置96MHz,USB選擇PLL1輸入二分頻到USB。

有使用TU_LOG做串口輸出,可以使能CFG_TUSB_DEBUG為需要的輸出等級(jí),同時(shí)將

#define tu_printf printf

改到串口輸出,Keil Options->Target 勾選Use MicroLIB,并實(shí)現(xiàn)重定向函數(shù)。

//-------------clockinitial-------------//
voidUSB_DeviceClockInit(void)//HSE96M
{
/*SelectUSBCLKsource*/
RCC->CFGR&=~(1<CFGR&=~(0x03<CFGR|=0x01<

添加tud_dcd_port.c 接口函數(shù)文件,Keil下Options C/C++勾選C99和GNU externsions(tud_dcd_port.c 文件可以參考現(xiàn)有例程或者聯(lián)系靈動(dòng)技術(shù)支持)。

fcb29438-2163-11ee-962d-dac502259ad0.png

圖4 工程設(shè)置

移植修改其他設(shè)備基本流程和上述一致,將tinyusb 目錄exampledevice 里面將想要修改的設(shè)備src文件夾里面四個(gè)文件copy到例程user文件夾里面替換。

3修改一個(gè)uac2_headset Device設(shè)備

在克隆下來的的文件夾examplesdevice里面找到需要修改的device設(shè)備,本次修改uac2_headset。將里面的文件都copy到工程USER目錄里面,然后Keil工程按如下文件樹添加對(duì)應(yīng)文件。

fcce3a76-2163-11ee-962d-dac502259ad0.png

圖5 uac2_headset設(shè)備描述符文件

文件樹:

1.TinyUSB_UAC

2. │

3. ├─USER

4. │ main.c

5. │ usb_descriptors.c

6. │ usb_dcd_port.c

7. │

8. └─TinyUSB

9. tusb.c

10. audio_device.c

11. tud_fifo.c

12. usbd.c

13. usb_control.c

在tusb_config.h文件里面CLASS將對(duì)應(yīng)的設(shè)備define改成1 ( #define CFG_TUD_AUDIO 1 ) ,使能AUDIO設(shè)備。

//-------------CLASS-------------//
#defineCFG_TUD_CDC0
#defineCFG_TUD_MSC0
#defineCFG_TUD_HID0
#defineCFG_TUD_MIDI0
#defineCFG_TUD_AUDIO1
#defineCFG_TUD_VENDOR0

按照前面的移植步驟,只需要修改main.c 里面的時(shí)鐘初始化部分即可,其他的device設(shè)備修改流程一致。

4新增一個(gè)設(shè)備變成復(fù)合設(shè)備

USB設(shè)備主要四個(gè)描述符,分別是設(shè)備描述符(Device Descriptors),配置描述符(Configuration Descriptor),報(bào)告描述符(Configuration Descriptor)和字符描述符(String Descriptors)。

添加復(fù)合設(shè)備device文件,本例程在上述3(修改一個(gè)uac2_headset Device設(shè)備)例程的基礎(chǔ)上增加一個(gè)HID設(shè)備變成復(fù)合設(shè)備,首先將工程目錄下的components inyusbsrcclasshidhid_device.c文件添加到工程。

fcfce4ac-2163-11ee-962d-dac502259ad0.png

圖6 源碼HID設(shè)備參考文件

fd266732-2163-11ee-962d-dac502259ad0.png

圖7 添加device文件

在tusb_config.h 文件里面 CLASS 使能HID宏,本例程是復(fù)合設(shè)備(Audio+HID)所以兩個(gè)宏都為1。

//-------------CLASS-------------//
#defineCFG_TUD_CDC0
#defineCFG_TUD_MSC0
#defineCFG_TUD_HID1
#defineCFG_TUD_MIDI0
#defineCFG_TUD_AUDIO1
#defineCFG_TUD_VENDOR0

在usb_descriptors.c 文件里面添加HID的描述符,增加HID Report Descriptor相關(guān)函數(shù)。

//--------------------------------------------------------------------+
//HIDReportDescriptor
//--------------------------------------------------------------------+
uint8_tconstdesc_hid_report[]=
{
TUD_HID_REPORT_DESC_GENERIC_INOUT(CFG_TUD_HID_EP_BUFSIZE)
};

//InvokedwhenreceivedGETHIDREPORTDESCRIPTOR
//Applicationreturnpointertodescriptor
//Descriptorcontentsmustexistlongenoughfortransfertocomplete
uint8_tconst*tud_hid_descriptor_report_cb(uint8_titf)
{
(void)itf;
return(desc_hid_report);
}

在usb_descriptors.c 文件里面添加HID Descriptor length(注意:長度一定要和下面DESCRIPTOR對(duì)應(yīng),否則枚舉會(huì)失敗)。

#defineCONFIG_TOTAL_LEN(TUD_CONFIG_DESC_LEN+CFG_TUD_AUDIO*TUD_AUDIO_HEADSET_STEREO_DESC_LEN+TUD_HID_INOUT_DESC_LEN)

在usb_descriptors.c 文件里面添加HID描述符文件,例程使用的是TUD_HID_INOUT_DESCRIPTOR,和上述CONFIG_TOTAL_LEN里面的TUD_HID_INOUT_DESC_LEN對(duì)應(yīng),然后配置HID IN OUT通訊選擇哪個(gè)端點(diǎn)。

#defineEPNUM_HID0x03

uint8_tconstdesc_configuration[]=
{
//Interfacecount,stringindex,totallength,attribute,powerinmA
TUD_CONFIG_DESCRIPTOR(1,ITF_NUM_TOTAL,0,CONFIG_TOTAL_LEN,TUSB_DESC_CONFIG_ATT_REMOTE_WAKEUP,100),

//Interfacenumber,stringindex,EPOut&EPInaddress,EPsize
TUD_AUDIO_HEADSET_STEREO_DESCRIPTOR(2,EPNUM_AUDIO_OUT,EPNUM_AUDIO_IN|0x80),

//Interfacenumber,stringindex,protocol,reportdescriptorlen,EPOut&Inaddress,size&pollinginterval
TUD_HID_INOUT_DESCRIPTOR(ITF_NUM_HID,6,HID_ITF_PROTOCOL_NONE,sizeof(desc_hid_report),EPNUM_HID,0x80|EPNUM_HID,CFG_TUD_HID_EP_BUFSIZE,10),
};

在usb_descriptors.c 文件里面添加 HID string字符串。

//arrayofpointertostringdescriptors
charconst*string_desc_arr[]=
{
(constchar[]){0x09,0x04},//0:issupportedlanguageisEnglish(0x0409)
"TinyUSB",//1:Manufacturer
"TinyUSBheadset",//2:Product
"000001",//3:Serials,shouldusechipID
"TinyUSBSpeakers",//4:AudioInterface
"TinyUSBMicrophone",//5:AudioInterface
"TinyUSBHID",//6:HIDInterface
};

在usb_descriptors.h 文件里面ITF_NUM_TOTAL 增加一個(gè) ITF_NUM_HID。

enum
{
ITF_NUM_AUDIO_CONTROL=0,
ITF_NUM_AUDIO_STREAMING_SPK,
ITF_NUM_AUDIO_STREAMING_MIC,
ITF_NUM_HID,
ITF_NUM_TOTAL
};

在main.c 里面增加hid_task(); 然后將HID的其他處理函數(shù)添加到main.c。

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

CONSOLE_Init(460800);//enableprintfdebug

//initdevicestackonconfiguredroothubport
tud_init(BOARD_TUD_RHPORT);

TU_LOG1("UAC2Headset&HIDrunning
");///CFG_TUSB_DEBUGfordebugging#ifCFG_TUSB_DEBUG
  //0:nodebug
  //1:printerror
  //2:printwarning
  //3:printinfo

while(1)
{
tud_task();//TinyUSBdevicetask
audio_task();
hid_task();
}

return0;
}

在hid_task()函數(shù)中添加需要處理的用戶程序。

//--------------------------------------------------------------------+
//USBHID
//--------------------------------------------------------------------+
uint8_thid_report_data[64];

staticvoidsend_hid_report(uint8_treport_id,uint32_tbtn)
{
//skipifhidisnotreadyyet
if(!tud_hid_ready())return;

switch(report_id)
{
caseREPORT_ID_MOUSE:
{
int8_tconstdelta=5;

//nobutton,right+down,noscroll,nopan
if(btn)
{
tud_hid_mouse_report(REPORT_ID_MOUSE,0x00,delta,delta,0,0);
}
}
break;

default:break;
}

}

//Every10ms,wewillsent1reportforeachHIDprofile(keyboard,mouseetc..)
//tud_hid_report_complete_cb()isusedtosendthenextreportafterpreviousoneiscomplete
voidhid_task(void)
{
uint32_tconstbtn=1u;

//Remotewakeup
if(tud_suspended()&&btn)
{
//Wakeuphostifweareinsuspendmode
//andREMOTE_WAKEUPfeatureisenabledbyhost
tud_remote_wakeup();
}else
{
//Sendthe1stofreportchain,therestwillbesentbytud_hid_report_complete_cb()
send_hid_report(REPORT_ID_MOUSE,btn);
}
}

5功能驗(yàn)證測試

完成上述移植,解決基本的編譯問題后燒錄測試能枚舉正常。

fd580436-2163-11ee-962d-dac502259ad0.png

圖8 枚舉過程

fd93728c-2163-11ee-962d-dac502259ad0.png

圖9 枚舉成功

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

    關(guān)注

    41

    文章

    3683

    瀏覽量

    131433
  • 接口
    +關(guān)注

    關(guān)注

    33

    文章

    9005

    瀏覽量

    153782
  • usb
    usb
    +關(guān)注

    關(guān)注

    60

    文章

    8191

    瀏覽量

    273138
  • 串口
    +關(guān)注

    關(guān)注

    15

    文章

    1588

    瀏覽量

    79978
  • GitHub
    +關(guān)注

    關(guān)注

    3

    文章

    483

    瀏覽量

    17701

原文標(biāo)題:靈動(dòng)微課堂 (第263講)|基于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)推薦
    熱點(diǎn)推薦

    NXP i.MX RT1060移植TinyUSB:快速擴(kuò)展大量USB Class示例

    前言 ? 為啥是TinyUSB?給強(qiáng)大的RT配個(gè)輕巧的USB棧! USB這個(gè)讓我們方便快捷的接口,幾乎無處不在。在嵌入式世界里,尤其是用上了像NXP i.MX RT這樣性能強(qiáng)勁的跨界MCU,我們自然
    的頭像 發(fā)表于 05-15 09:25 ?1199次閱讀
    NXP i.MX RT1060<b class='flag-5'>移植</b><b class='flag-5'>TinyUSB</b>:快速擴(kuò)展大量USB Class示例

    如何在ESP32S3上使用TinyUSB,配置為Vendor Class設(shè)備?

    您好,請(qǐng)問如何再ESP32S3上使用TinyUSB,配置為Vendor Class設(shè)備,沒找到參考例程
    發(fā)表于 06-17 06:43

    使用ESP32S3和TinyUSB如何配置為Vendor Class設(shè)備?

    您好,請(qǐng)問如何再ESP32S3上使用TinyUSB,配置為Vendor Class設(shè)備,沒找到參考例程
    發(fā)表于 02-14 08:43

    UCOS擴(kuò)展例程-UCOSII移植

    UCOS擴(kuò)展例程-UCOSII移植
    發(fā)表于 12-14 17:24 ?30次下載

    UCOS擴(kuò)展例程-UCOSIII移植

    UCOS擴(kuò)展例程 - UCOSIII移植
    發(fā)表于 12-14 17:24 ?23次下載

    USB_DFU_IAP例程移植

    不同型號(hào)STM32的USB燒錄程序移植介紹。通過USB對(duì)芯片下載程序的bootloader介紹
    發(fā)表于 04-21 11:00 ?17次下載

    基于STM32 HID例程生成不小于64字節(jié)傳輸?shù)?b class='flag-5'>移植過程

    前言 本文簡單介紹如何應(yīng)用ST USB HID(MOUSE)例程生成一個(gè)可以輸入和輸出任何長度小于等于64字節(jié)的移植過程。 問題描述: HID的在USB的運(yùn)用中是非常廣泛的,但是很多應(yīng)用并不是簡單
    發(fā)表于 11-29 15:52 ?1035次閱讀
     基于STM32 HID<b class='flag-5'>例程</b>生成不小于64字節(jié)傳輸?shù)?b class='flag-5'>移植</b>過程

    介紹攝像頭采集顯示的例程

    這一部分歸納了目前移植好的攝像頭開發(fā)例程(后續(xù)也許還會(huì)再增加),包括OV7725/MT9V034/MT9M001/AR0144等Sensor,但不同的Sensor的例程規(guī)劃都基本一致,因此以O(shè)V7725為例,來
    的頭像 發(fā)表于 10-01 17:17 ?3136次閱讀
    <b class='flag-5'>介紹</b>攝像頭采集顯示的<b class='flag-5'>例程</b>

    基于CubeMX-STM32F302_uCOSII例程移植

    基于CubeMX--STM32F302_uCOSII例程移植1、說明STM32F302的內(nèi)核為Cortex-M4的,所以我們以官方的F4例程為基礎(chǔ)移植。2、準(zhǔn)備2.1、軟件1、官方
    發(fā)表于 12-04 14:36 ?29次下載
    基于CubeMX-STM32F302_uCOSII<b class='flag-5'>例程</b><b class='flag-5'>移植</b>

    TinyUSB針對(duì)嵌入式系統(tǒng)的開源USB堆棧

    tinyusb.zip
    發(fā)表于 04-15 10:33 ?3次下載
    <b class='flag-5'>TinyUSB</b>針對(duì)嵌入式系統(tǒng)的開源USB堆棧

    W806單片機(jī)文件系統(tǒng)移植例程

    W806單片機(jī),文件系統(tǒng)移植例程說明。
    發(fā)表于 05-05 14:57 ?8次下載

    如何對(duì)TinyUSB上游倉庫進(jìn)行移植

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

    W806單片機(jī)移植LVGL庫例程源碼下載

    W806單片機(jī)移植LVGL庫例程源碼下載。
    發(fā)表于 05-11 15:11 ?15次下載

    如何移植FPGA的例程

    在完成EDA作業(yè)后,抽空分享一下如何移植FPGA的例程。我EDA作業(yè)用的板子型號(hào)是Zybo-Z7,然后移植的是原子哥的HDMI實(shí)現(xiàn)方塊移動(dòng)例程
    的頭像 發(fā)表于 09-05 15:12 ?2264次閱讀

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

    如果用戶想增加一個(gè)device設(shè)備但是在TinyUSB class里面又沒有參考示例,本次我們一起來移植一個(gè)CDC+printer復(fù)合設(shè)備。操作步驟還是和上篇一樣,先將TinyUSB 從GitHub上克隆下來,將src 整個(gè)文件
    的頭像 發(fā)表于 07-20 17:05 ?1786次閱讀
    基于MM32F0163D7P的USB接口<b class='flag-5'>TinyUSB</b>應(yīng)用:<b class='flag-5'>移植</b>和新增設(shè)備(二)
    主站蜘蛛池模板: 欧美激情第一欧美在线 | 亚洲一区二区黄色 | 久久久久久国产精品免费免费 | 欧美天天在线 | 欧美伦理一区 | 久久精品国产福利国产琪琪 | 日韩在线视频一区二区三区 | 高颜值大长腿美女啪啪 | 男女爱爱是免费看 | 丁香花在线视频观看免费 | 久草干| 中国人69xxx大全 | 日本不卡免费高清视频 | 黄色 在线 | a男人的天堂久久a毛片 | 手机福利在线 | 91日本视频 | 99久久精品免费精品国产 | 精品视频一区在线观看 | 国产三级在线观看播放 | 日本黄色录像视频 | 亚洲日本一区二区三区在线不卡 | 在线观看午夜 | 亚洲成a人片77777kkk | 久久草精品 | 午夜国产片 | 国产一级αv片免费观看 | 亚洲香蕉久久一区二区三区四区 | 中文天堂最新版资源新版天堂资源 | 色婷婷色丁香 | 黄a免费| 四虎国产精品免费视 | 高清在线观看视频 | 亚洲精品成人久久久影院 | 欧美黄色录像视频 | 亚色中文 | 日本在线一本 | 色天使色护士 在线视频观看 | 欧美高清老少配性啪啪 | 五月婷婷 六月丁香 | 国产在线黄 |