关于cherryusb的in/out完成条件
1. in完成条件:长度相等,或者接收到的是短包。具体分情况:
1)对于接收,长度一定要设置为mps整数倍,不能设置为比如193这种。
2)因为windows和linux主机,bulk模式默认不发送zlp。因此,如果设置接收长度=256,但主机cdc只发送了64或128,那么将会死等,不能结束。因此,对于主机发送不定长度的情况,建议设置device的接收长度为mps,确保要么长度相等结束(拆分为一个一个mps,最后一个包是mps),要么是短包结束。
3)对于协商好了长度的情况下,接收长度可以是1024或2048这种。比如msc。
4)对于cdc,接收也可以设置的长度非常大,比如32768,因为这样硬件自动分包效率高。这种要承担一定的概率,就是主机发送的刚好是mps倍数导致不能结束的情况。对于自己玩玩,是无所谓的。
2. out完成条件:长度相等
1)对于发送,要简单一些。长度相等,就能确保out发送完成,并触发回调函数。out的长度可以灵活设置,比如14 bytes或500 bytes都行。
2)但是需要注意,如果长度是mps倍数(长度=mps也算),需要在回调函数中额外发送zlp。目前cherryusb就是这样处理的。这是主机的要求,否则主机一直死等,不能结束传输。
3. 举2个例子说明,这是实际trace到的代码执行流
使用的开发板是stm32h750-artpi,usb为dwc2 ip,配置为非DMA模式
开发环境rt-thread
使用cherryusb,使用cdc_acm_template.c例子
3.1 cdc_acm_data_send_with_dtr_test发送256 bytes,串口助手接收的执行过程
/*数据发送的传输模式(一共3个中断):
cdc_acm_data_send_with_dtr_test–>usbd_ep_start_write–>
IEPINT(TXFE)–>dwc2_tx_fifo_empty_procecss–> dwc2_ep_write(64 bytes)–> dwc2_ep_write(64 bytes)–> dwc2_ep_write(64 bytes)–> dwc2_ep_write(64 bytes)
IEPINT(XFRC)–>usbd_event_ep_in_complete_handler–> usbd_cdc_acm_bulk_in–> usbd_ep_start_write(zlp, 0 bytes)
IEPINT(XFRC)–>usbd_event_ep_in_complete_handler–> usbd_cdc_acm_bulk_in
*/
usb_dc_dwc2.c :508 | dwc2_get_outep_intstatus
usb_dc_dwc2.c :515 | dwc2_get_outep_intstatus 1(0x00000001) <= dwc2_get_outep_intstatus
usb_dc_dwc2.c :1195| USBD_IRQHandler epint: USB_OTG_DOEPINT_XFRC
usb_dc_dwc2.c :1199| USBD_IRQHandler ep_idx=0 && xfer_len=0 => out status finished
usb_dc_dwc2.c :1200| USBD_IRQHandler go=>
usb_dc_dwc2.c :363 | dwc2_ep0_start_read_setup
usb_dc_dwc2.c :375 | dwc2_ep0_start_read_setup 1611137048(0x60080018) <= USB_OTG_OUTEP(0U)->DOEPTSIZ
usb_dc_dwc2.c :376 | dwc2_ep0_start_read_setup 163840(0x00028000) <= USB_OTG_OUTEP(0U)->DOEPCTL/*数据发送的传输模式(一共3个中断):
cdc_acm_data_send_with_dtr_test-->usbd_ep_start_write-->
IEPINT(TXFE)-->dwc2_tx_fifo_empty_procecss--> dwc2_ep_write(64 bytes)--> dwc2_ep_write(64 bytes)--> dwc2_ep_write(64 bytes)--> dwc2_ep_write(64 bytes)
IEPINT(XFRC)-->usbd_event_ep_in_complete_handler--> usbd_cdc_acm_bulk_in--> usbd_ep_start_write(zlp, 0 bytes)
IEPINT(XFRC)-->usbd_event_ep_in_complete_handler--> usbd_cdc_acm_bulk_in
*/
/*test线程运行到了cdc_acm_data_send_with_dtr_test的执行*/
cdc_acm_template.c:292 | cdc_acm_data_send_with_dtr_test
cdc_acm_template.c:295 | cdc_acm_data_send_with_dtr_test go=>
/*通过usbd_ep_start_write配置寄存器, 开启txfifo中断*/
usb_dc_dwc2.c :984 | usbd_ep_start_write
usb_dc_dwc2.c :985 | usbd_ep_start_write 256(0x00000100) <= data_len
/*stage1: 立即发生txfifo为空中断(此时usbd_ep_start_write还没有执行完), 用dwc2_ep_write写fifo正式发送, 直到发完*/
usb_dc_dwc2.c :1136| *****************************
usb_dc_dwc2.c :1137| USBD_IRQHandler
usb_dc_dwc2.c :1138| USBD_IRQHandler 262144(0x00040000) <= GINTSTS & GINTMSK
usb_dc_dwc2.c :1139| USBD_IRQHandler 2(0x00000002) <= DAINT & DAINTMSK
usb_dc_dwc2.c :1140| USBD_IRQHandler 0(0x00000000) <= DOEPMSK & DOEPINT0
usb_dc_dwc2.c :1141| USBD_IRQHandler 0(0x00000000) <= DIEPMSK & DIEPINT0
usb_dc_dwc2.c :1142| USBD_IRQHandler -------------
usb_dc_dwc2.c :458 | dwc2_get_glb_intstatus
usb_dc_dwc2.c :464 | dwc2_get_glb_intstatus 262144(0x00040000) <= dwc2_get_glb_intstatus
usb_dc_dwc2.c :1229| USBD_IRQHandler gint_status: USB_OTG_GINTSTS_IEPINT
usb_dc_dwc2.c :490 | dwc2_get_ineps_intstatus
usb_dc_dwc2.c :496 | dwc2_get_ineps_intstatus 2(0x00000002) <= dwc2_get_ineps_intstatus
usb_dc_dwc2.c :527 | dwc2_get_inep_intstatus
usb_dc_dwc2.c :538 | dwc2_get_inep_intstatus 128(0x00000080) <= dwc2_get_inep_intstatus
usb_dc_dwc2.c :1265| USBD_IRQHandler epint: USB_OTG_DIEPINT_TXFE
usb_dc_dwc2.c :1266| USBD_IRQHandler go=>
usb_dc_dwc2.c :409 | dwc2_tx_fifo_empty_procecss
usb_dc_dwc2.c :418 | dwc2_tx_fifo_empty_procecss 64(0x00000040) <= len
/*一次最大只能发mps=64 bytes*/
usb_dc_dwc2.c :381 | dwc2_ep_write
usb_dc_dwc2.c :382 | dwc2_ep_write 64(0x00000040) <= len
/*while循环第2遍, 再发mps=64 bytes*/
usb_dc_dwc2.c :381 | dwc2_ep_write
usb_dc_dwc2.c :382 | dwc2_ep_write 64(0x00000040) <= len
/*while循环第3遍, 再发mps=64 bytes*/
usb_dc_dwc2.c :381 | dwc2_ep_write
usb_dc_dwc2.c :382 | dwc2_ep_write 64(0x00000040) <= len
/*while循环第4遍, 再发mps=64 bytes*/
usb_dc_dwc2.c :381 | dwc2_ep_write
usb_dc_dwc2.c :382 | dwc2_ep_write 64(0x00000040) <= len
/*继续执行usbd_ep_start_write, 最后的2个trace语句. 可见这2个trace语句添加的地方不合适, 应该提前到开启中断之前*/
usb_dc_dwc2.c :1056| usbd_ep_start_write 2097408(0x00200100) <= USB_OTG_INEP(ep_idx)->DIEPTSIZ
usb_dc_dwc2.c :1057| usbd_ep_start_write -2142732224(0x80488040) <= USB_OTG_INEP(ep_idx)->DIEPCTL/*stage2: tx发送完成(IEPINT+XFRC), 执行usbd_event_ep_in_complete_handler, 也就是用户回调函数usbd_cdc_acm_bulk_in*/
usb_dc_dwc2.c :1136| *****************************
usb_dc_dwc2.c :1137| USBD_IRQHandler
usb_dc_dwc2.c :1138| USBD_IRQHandler 262144(0x00040000) <= GINTSTS & GINTMSK
usb_dc_dwc2.c :1139| USBD_IRQHandler 2(0x00000002) <= DAINT & DAINTMSK
usb_dc_dwc2.c :1140| USBD_IRQHandler 0(0x00000000) <= DOEPMSK & DOEPINT0
usb_dc_dwc2.c :1141| USBD_IRQHandler 0(0x00000000) <= DIEPMSK & DIEPINT0
usb_dc_dwc2.c :1142| USBD_IRQHandler -------------
usb_dc_dwc2.c :458 | dwc2_get_glb_intstatus
usb_dc_dwc2.c :464 | dwc2_get_glb_intstatus 262144(0x00040000) <= dwc2_get_glb_intstatus
usb_dc_dwc2.c :1229| USBD_IRQHandler gint_status: USB_OTG_GINTSTS_IEPINT
usb_dc_dwc2.c :490 | dwc2_get_ineps_intstatus
usb_dc_dwc2.c :496 | dwc2_get_ineps_intstatus 2(0x00000002) <= dwc2_get_ineps_intstatus
usb_dc_dwc2.c :527 | dwc2_get_inep_intstatus
usb_dc_dwc2.c :538 | dwc2_get_inep_intstatus 1(0x00000001) <= dwc2_get_inep_intstatus
usb_dc_dwc2.c :1237| USBD_IRQHandler epint: USB_OTG_DIEPINT_XFRC
usb_dc_dwc2.c :1259| USBD_IRQHandler 1(0x00000001) <= ep_idx
usb_dc_dwc2.c :1260| USBD_IRQHandler go=>
usbd_core.c :1442| usbd_event_ep_in_complete_handler
cdc_acm_template.c:229 | usbd_cdc_acm_bulk_in
/*一共发送了256 bytes*/
cdc_acm_template.c:230 | usbd_cdc_acm_bulk_in 256(0x00000100) <= nbytes
usbd_core.c :1534| usbd_get_ep_mps
/*因为发送长度是256 bytes, 刚好是mps整数倍, 因此需要发送zlp*/
/*发送zlp因为不携带数据, 因此只需要usbd_ep_start_write就可以发出去, 不需要用dwc2_ep_write*/
cdc_acm_template.c:235 | usbd_cdc_acm_bulk_in go=>
usb_dc_dwc2.c :984 | usbd_ep_start_write
usb_dc_dwc2.c :985 | usbd_ep_start_write 0(0x00000000) <= data_len
usb_dc_dwc2.c :1014| usbd_ep_start_write 524288(0x00080000) <= USB_OTG_INEP(ep_idx)->DIEPTSIZ
usb_dc_dwc2.c :1015| usbd_ep_start_write -2142732224(0x80488040) <= USB_OTG_INEP(ep_idx)->DIEPCTL/*stage3: tx(zlp)发送完成(IEPINT+XFRC), 执行usbd_event_ep_in_complete_handler, 也就是用户回调函数usbd_cdc_acm_bulk_in*/
usb_dc_dwc2.c :1136| *****************************
usb_dc_dwc2.c :1137| USBD_IRQHandler
usb_dc_dwc2.c :1138| USBD_IRQHandler 262144(0x00040000) <= GINTSTS & GINTMSK
usb_dc_dwc2.c :1139| USBD_IRQHandler 2(0x00000002) <= DAINT & DAINTMSK
usb_dc_dwc2.c :1140| USBD_IRQHandler 0(0x00000000) <= DOEPMSK & DOEPINT0
usb_dc_dwc2.c :1141| USBD_IRQHandler 0(0x00000000) <= DIEPMSK & DIEPINT0
usb_dc_dwc2.c :1142| USBD_IRQHandler -------------
usb_dc_dwc2.c :458 | dwc2_get_glb_intstatus
usb_dc_dwc2.c :464 | dwc2_get_glb_intstatus 262144(0x00040000) <= dwc2_get_glb_intstatus
usb_dc_dwc2.c :1229| USBD_IRQHandler gint_status: USB_OTG_GINTSTS_IEPINT
usb_dc_dwc2.c :490 | dwc2_get_ineps_intstatus
usb_dc_dwc2.c :496 | dwc2_get_ineps_intstatus 2(0x00000002) <= dwc2_get_ineps_intstatus
usb_dc_dwc2.c :527 | dwc2_get_inep_intstatus
usb_dc_dwc2.c :538 | dwc2_get_inep_intstatus 1(0x00000001) <= dwc2_get_inep_intstatus
usb_dc_dwc2.c :1237| USBD_IRQHandler epint: USB_OTG_DIEPINT_XFRC
usb_dc_dwc2.c :1259| USBD_IRQHandler 1(0x00000001) <= ep_idx
usb_dc_dwc2.c :1260| USBD_IRQHandler go=>
usbd_core.c :1442| usbd_event_ep_in_complete_handler
cdc_acm_template.c:229 | usbd_cdc_acm_bulk_in
/*因为发送的是zlp, nbytes=0. 传输结束*/
cdc_acm_template.c:230 | usbd_cdc_acm_bulk_in 0(0x00000000) <= nbytes
usbd_core.c :1534| usbd_get_ep_mps /*test线程再次运行到了cdc_acm_data_send_with_dtr_test的执行, 过程完全重复*/
cdc_acm_template.c:292 | cdc_acm_data_send_with_dtr_test
cdc_acm_template.c:295 | cdc_acm_data_send_with_dtr_test go=>
usb_dc_dwc2.c :984 | usbd_ep_start_write
usb_dc_dwc2.c :985 | usbd_ep_start_write 256(0x00000100) <= data_len
usb_dc_dwc2.c :1136| *****************************
usb_dc_dwc2.c :1137| USBD_IRQHandler
usb_dc_dwc2.c :1138| USBD_IRQHandler 262144(0x00040000) <= GINTSTS & GINTMSK
usb_dc_dwc2.c :1139| USBD_IRQHandler 2(0x00000002) <= DAINT & DAINTMSK
usb_dc_dwc2.c :1140| USBD_IRQHandler 0(0x00000000) <= DOEPMSK & DOEPINT0
usb_dc_dwc2.c :1141| USBD_IRQHandler 0(0x00000000) <= DIEPMSK & DIEPINT0
3.2 上位机串口助手发送数据193 bytes,device接收数据的执行过程
/*数据接收的传输模式(一共6个中断):
RXFLVL(PKTSTS=2, OUT data packet received)–>dwc2_ep_read(64 bytes)
RXFLVL(PKTSTS=2, OUT data packet received)–>dwc2_ep_read(64 bytes)
RXFLVL(PKTSTS=2, OUT data packet received)–>dwc2_ep_read(64 bytes)
RXFLVL(PKTSTS=2, OUT data packet received)–>dwc2_ep_read(1 bytes)
RXFLVL(PKTSTS=3, OUT transaction completed)–>do_nothing
OEPINT(XFRC)–>usbd_cdc_acm_bulk_out–>
*/
/*数据接收的传输模式(一共6个中断):
RXFLVL(PKTSTS=2, OUT data packet received)-->dwc2_ep_read(64 bytes)
RXFLVL(PKTSTS=2, OUT data packet received)-->dwc2_ep_read(64 bytes)
RXFLVL(PKTSTS=2, OUT data packet received)-->dwc2_ep_read(64 bytes)
RXFLVL(PKTSTS=2, OUT data packet received)-->dwc2_ep_read(1 bytes)
RXFLVL(PKTSTS=3, OUT transaction completed)-->do_nothing
OEPINT(XFRC)-->usbd_cdc_acm_bulk_out-->
*/
/*stage1: 突然来了rxfifo不为空中断, fifo收到数据, 用dwc2_ep_read从fifo读取数据*/
usb_dc_dwc2.c :1136| *****************************
usb_dc_dwc2.c :1137| USBD_IRQHandler
usb_dc_dwc2.c :1138| USBD_IRQHandler 16(0x00000010) <= GINTSTS & GINTMSK
usb_dc_dwc2.c :1139| USBD_IRQHandler 0(0x00000000) <= DAINT & DAINTMSK
usb_dc_dwc2.c :1140| USBD_IRQHandler 0(0x00000000) <= DOEPMSK & DOEPINT0
usb_dc_dwc2.c :1141| USBD_IRQHandler 0(0x00000000) <= DIEPMSK & DIEPINT0
usb_dc_dwc2.c :1142| USBD_IRQHandler -------------
usb_dc_dwc2.c :458 | dwc2_get_glb_intstatus
usb_dc_dwc2.c :464 | dwc2_get_glb_intstatus 16(0x00000010) <= dwc2_get_glb_intstatus
/*rxfifo中收到数据, 产生中断. 进一步检查发现是端点2, 是out data中断, 数据量为64*/
usb_dc_dwc2.c :1156| USBD_IRQHandler gint_status: USB_OTG_GINTSTS_RXFLVL
usb_dc_dwc2.c :1161| USBD_IRQHandler 2(0x00000002) <= ep_idx
usb_dc_dwc2.c :1162| USBD_IRQHandler 12846082(0x00c40402) <= USB_OTG_GLB->GRXSTSP
/*(PktSts=4'b0010 => OUT data packet received*/
usb_dc_dwc2.c :1163| USBD_IRQHandler 2(0x00000002) <= GRXSTSP_PKTSTS
usb_dc_dwc2.c :1166| USBD_IRQHandler USB_OTG_GLB->GRXSTSP: STS_DATA_UPDT
usb_dc_dwc2.c :1168| USBD_IRQHandler 64(0x00000040) <= read_count
usb_dc_dwc2.c :1170| USBD_IRQHandler go=>
/*需要主动去从fifo中读数据*/
/*dwc2_ep_read/write函数只用于fifo模式, 负责实际的数据读取/写入FIFO*/
usb_dc_dwc2.c :395 | dwc2_ep_read
usb_dc_dwc2.c :396 | dwc2_ep_read 64(0x00000040) <= len/*stage1.1: 继续发生rxfifo不为空中断, fifo收到数据, 用dwc2_ep_read从fifo读取数据*/
usb_dc_dwc2.c :1136| *****************************
usb_dc_dwc2.c :1137| USBD_IRQHandler
usb_dc_dwc2.c :1138| USBD_IRQHandler 16(0x00000010) <= GINTSTS & GINTMSK
usb_dc_dwc2.c :1139| USBD_IRQHandler 0(0x00000000) <= DAINT & DAINTMSK
usb_dc_dwc2.c :1140| USBD_IRQHandler 0(0x00000000) <= DOEPMSK & DOEPINT0
usb_dc_dwc2.c :1141| USBD_IRQHandler 0(0x00000000) <= DIEPMSK & DIEPINT0
usb_dc_dwc2.c :1142| USBD_IRQHandler -------------
usb_dc_dwc2.c :458 | dwc2_get_glb_intstatus
usb_dc_dwc2.c :464 | dwc2_get_glb_intstatus 16(0x00000010) <= dwc2_get_glb_intstatus
usb_dc_dwc2.c :1156| USBD_IRQHandler gint_status: USB_OTG_GINTSTS_RXFLVL
/*rxfifo中收到数据, 产生中断. 进一步检查发现是端点2, 是out data中断, 数据量为64*/
usb_dc_dwc2.c :1161| USBD_IRQHandler 2(0x00000002) <= ep_idx
usb_dc_dwc2.c :1162| USBD_IRQHandler 12911618(0x00c50402) <= USB_OTG_GLB->GRXSTSP
/*(PktSts=4'b0010 => OUT data packet received*/
usb_dc_dwc2.c :1163| USBD_IRQHandler 2(0x00000002) <= GRXSTSP_PKTSTS
usb_dc_dwc2.c :1166| USBD_IRQHandler USB_OTG_GLB->GRXSTSP: STS_DATA_UPDT
usb_dc_dwc2.c :1168| USBD_IRQHandler 64(0x00000040) <= read_count
usb_dc_dwc2.c :1170| USBD_IRQHandler go=>
usb_dc_dwc2.c :395 | dwc2_ep_read
usb_dc_dwc2.c :396 | dwc2_ep_read 64(0x00000040) <= len/*stage1.2: 继续发生rxfifo不为空中断, fifo收到数据, 用dwc2_ep_read从fifo读取数据*/
usb_dc_dwc2.c :1136| *****************************
usb_dc_dwc2.c :1137| USBD_IRQHandler
usb_dc_dwc2.c :1138| USBD_IRQHandler 16(0x00000010) <= GINTSTS & GINTMSK
usb_dc_dwc2.c :1139| USBD_IRQHandler 0(0x00000000) <= DAINT & DAINTMSK
usb_dc_dwc2.c :1140| USBD_IRQHandler 0(0x00000000) <= DOEPMSK & DOEPINT0
usb_dc_dwc2.c :1141| USBD_IRQHandler 0(0x00000000) <= DIEPMSK & DIEPINT0
usb_dc_dwc2.c :1142| USBD_IRQHandler -------------
usb_dc_dwc2.c :458 | dwc2_get_glb_intstatus
usb_dc_dwc2.c :464 | dwc2_get_glb_intstatus 16(0x00000010) <= dwc2_get_glb_intstatus
usb_dc_dwc2.c :1156| USBD_IRQHandler gint_status: USB_OTG_GINTSTS_RXFLVL
/*rxfifo中收到数据, 产生中断. 进一步检查发现是端点2, 是out data中断, 数据量为64*/
usb_dc_dwc2.c :1161| USBD_IRQHandler 2(0x00000002) <= ep_idx
usb_dc_dwc2.c :1162| USBD_IRQHandler 12846082(0x00c40402) <= USB_OTG_GLB->GRXSTSP
/*(PktSts=4'b0010 => OUT data packet received*/
usb_dc_dwc2.c :1163| USBD_IRQHandler 2(0x00000002) <= GRXSTSP_PKTSTS
usb_dc_dwc2.c :1166| USBD_IRQHandler USB_OTG_GLB->GRXSTSP: STS_DATA_UPDT
usb_dc_dwc2.c :1168| USBD_IRQHandler 64(0x00000040) <= read_count
usb_dc_dwc2.c :1170| USBD_IRQHandler go=>
usb_dc_dwc2.c :395 | dwc2_ep_read
usb_dc_dwc2.c :396 | dwc2_ep_read 64(0x00000040) <= len/*stage1.3: 继续发生rxfifo不为空中断, fifo收到数据, 用dwc2_ep_read从fifo读取数据*/
usb_dc_dwc2.c :1136| *****************************
usb_dc_dwc2.c :1137| USBD_IRQHandler
usb_dc_dwc2.c :1138| USBD_IRQHandler 16(0x00000010) <= GINTSTS & GINTMSK
usb_dc_dwc2.c :1139| USBD_IRQHandler 0(0x00000000) <= DAINT & DAINTMSK
usb_dc_dwc2.c :1140| USBD_IRQHandler 0(0x00000000) <= DOEPMSK & DOEPINT0
usb_dc_dwc2.c :1141| USBD_IRQHandler 0(0x00000000) <= DIEPMSK & DIEPINT0
usb_dc_dwc2.c :1142| USBD_IRQHandler -------------
usb_dc_dwc2.c :458 | dwc2_get_glb_intstatus
usb_dc_dwc2.c :464 | dwc2_get_glb_intstatus 16(0x00000010) <= dwc2_get_glb_intstatus
usb_dc_dwc2.c :1156| USBD_IRQHandler gint_status: USB_OTG_GINTSTS_RXFLVL
/*rxfifo中收到数据, 产生中断. 进一步检查发现是端点2, 是out data中断, 数据量为1*/
usb_dc_dwc2.c :1161| USBD_IRQHandler 2(0x00000002) <= ep_idx
usb_dc_dwc2.c :1162| USBD_IRQHandler 12910610(0x00c50012) <= USB_OTG_GLB->GRXSTSP
/*(PktSts=4'b0010 => OUT data packet received*/
usb_dc_dwc2.c :1163| USBD_IRQHandler 2(0x00000002) <= GRXSTSP_PKTSTS
usb_dc_dwc2.c :1166| USBD_IRQHandler USB_OTG_GLB->GRXSTSP: STS_DATA_UPDT
usb_dc_dwc2.c :1168| USBD_IRQHandler 1(0x00000001) <= read_count
usb_dc_dwc2.c :1170| USBD_IRQHandler go=>
usb_dc_dwc2.c :395 | dwc2_ep_read
usb_dc_dwc2.c :396 | dwc2_ep_read 1(0x00000001) <= len/*stage2: 发生rxfifo out读取完成中断, 不做任何处理*/
usb_dc_dwc2.c :1136| *****************************
usb_dc_dwc2.c :1137| USBD_IRQHandler
usb_dc_dwc2.c :1138| USBD_IRQHandler 16(0x00000010) <= GINTSTS & GINTMSK
usb_dc_dwc2.c :1139| USBD_IRQHandler 0(0x00000000) <= DAINT & DAINTMSK
usb_dc_dwc2.c :1140| USBD_IRQHandler 0(0x00000000) <= DOEPMSK & DOEPINT0
usb_dc_dwc2.c :1141| USBD_IRQHandler 0(0x00000000) <= DIEPMSK & DIEPINT0
usb_dc_dwc2.c :1142| USBD_IRQHandler -------------
usb_dc_dwc2.c :458 | dwc2_get_glb_intstatus
usb_dc_dwc2.c :464 | dwc2_get_glb_intstatus 16(0x00000010) <= dwc2_get_glb_intstatus
usb_dc_dwc2.c :1156| USBD_IRQHandler gint_status: USB_OTG_GINTSTS_RXFLVL
usb_dc_dwc2.c :1161| USBD_IRQHandler 2(0x00000002) <= ep_idx
usb_dc_dwc2.c :1162| USBD_IRQHandler 13041666(0x00c70002) <= USB_OTG_GLB->GRXSTSP
/*(PktSts=4'b0011 => OUT data transaction completed*/
/*这个USB_OTG_GLB->GRXSTSP状态没有对应的处理函数*/
usb_dc_dwc2.c :1163| USBD_IRQHandler 3(0x00000003) <= GRXSTSP_PKTSTS/*stage3: 触发OEPINT+XFRC中断, 读取193 bytes正式传输完成. 执行用户回调函数usbd_cdc_acm_bulk_out处理数据,
并开启下一次读usbd_ep_start_read(busid, CDC_OUT_EP, read_buffer, 256)*/
usb_dc_dwc2.c :1136| *****************************
usb_dc_dwc2.c :1137| USBD_IRQHandler
usb_dc_dwc2.c :1138| USBD_IRQHandler 524288(0x00080000) <= GINTSTS & GINTMSK
usb_dc_dwc2.c :1139| USBD_IRQHandler 262144(0x00040000) <= DAINT & DAINTMSK
usb_dc_dwc2.c :1140| USBD_IRQHandler 0(0x00000000) <= DOEPMSK & DOEPINT0
usb_dc_dwc2.c :1141| USBD_IRQHandler 0(0x00000000) <= DIEPMSK & DIEPINT0
usb_dc_dwc2.c :1142| USBD_IRQHandler -------------
usb_dc_dwc2.c :458 | dwc2_get_glb_intstatus
usb_dc_dwc2.c :464 | dwc2_get_glb_intstatus 524288(0x00080000) <= dwc2_get_glb_intstatus
usb_dc_dwc2.c :1187| USBD_IRQHandler gint_status: USB_OTG_GINTSTS_OEPINT
usb_dc_dwc2.c :474 | dwc2_get_outeps_intstatus
usb_dc_dwc2.c :480 | dwc2_get_outeps_intstatus 4(0x00000004) <= dwc2_get_outeps_intstatus
usb_dc_dwc2.c :508 | dwc2_get_outep_intstatus
usb_dc_dwc2.c :515 | dwc2_get_outep_intstatus 1(0x00000001) <= dwc2_get_outep_intstatus
usb_dc_dwc2.c :1195| USBD_IRQHandler epint: USB_OTG_DOEPINT_XFRC
usb_dc_dwc2.c :1212| USBD_IRQHandler 2(0x00000002) <= ep_idx
usb_dc_dwc2.c :1213| USBD_IRQHandler go=>
usbd_core.c :1450| usbd_event_ep_out_complete_handler
cdc_acm_template.c:215 | usbd_cdc_acm_bulk_out
cdc_acm_template.c:216 | usbd_cdc_acm_bulk_out 193(0x000000c1) <= nbytes
cdc_acm_template.c:223 | usbd_cdc_acm_bulk_out go=>
usb_dc_dwc2.c :1064| usbd_ep_start_read
usb_dc_dwc2.c :1065| usbd_ep_start_read 256(0x00000100) <= data_len
usb_dc_dwc2.c :1112| usbd_ep_start_read 2097408(0x00200100) <= USB_OTG_OUTEP(ep_idx)->DOEPTSIZ
usb_dc_dwc2.c :1113| usbd_ep_start_read 688192(0x000a8040) <= USB_OTG_OUTEP(ep_idx)->DOEPCTL
usb_dc_dwc2.c :1128| usbd_ep_start_read -2146926528(0x80088040) <= USB_OTG_OUTEP(ep_idx)->DOEPCTL
cdc_acm_template.c:292 | cdc_acm_data_send_with_dtr_test
cdc_acm_template.c:295 | cdc_acm_data_send_with_dtr_test go=>
usb_dc_dwc2.c :984 | usbd_ep_start_write
usb_dc_dwc2.c :985 | usbd_ep_start_write 256(0x00000100) <= data_len