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

圖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ù)支持)。

圖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ù)接口。

圖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ù)處理

圖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)有定義。
圖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è)備。
圖6 枚舉過(guò)程
圖7 枚舉成功
選擇打印機(jī)設(shè)備,直接打印word的內(nèi)容,能抓到通過(guò)枚舉的打印機(jī)28號(hào)設(shè)備端點(diǎn)4下發(fā)的數(shù)據(jù)。
圖8 枚舉成功
圖9 printer EP4 OUT包數(shù)據(jù)
審核編輯:劉清
-
處理器
+關(guān)注
關(guān)注
68文章
20144瀏覽量
246690 -
USB接口
+關(guān)注
關(guān)注
9文章
712瀏覽量
58475 -
CDC技術(shù)
+關(guān)注
關(guān)注
0文章
9瀏覽量
7042 -
MCU芯片
+關(guān)注
關(guān)注
3文章
258瀏覽量
12530
原文標(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)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
NXP i.MX RT1060移植TinyUSB:快速擴(kuò)展大量USB Class示例
MM32F0163D7P的ADC內(nèi)部1.2V參考電壓的使用
MM32F013x——Linux下搭建MM32開(kāi)發(fā)環(huán)境
如何對(duì)TinyUSB上游倉(cāng)庫(kù)進(jìn)行移植
MM32F031F6U6 新增框架第二供應(yīng)商變更通知表(中文版)
基于MM32F0163D7P的I2S接口的音樂(lè)播放器實(shí)驗(yàn)
TinyUSB基本介紹和移植例程
基于MM32F0163D7P的USB Audio Class(UAC)音頻設(shè)備

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






評(píng)論