当前位置: 首页 > news >正文

关于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
http://www.dtcms.com/a/310006.html

相关文章:

  • WAIC现场速递:AI热浪扑面而来|小奇说
  • QD9361开发板教程:基于zynq的PS端的DDR3测试
  • Vue+Cesium 基础搭建
  • 智能体的未来:AGI路径上的关键技术突破
  • 分类预测 | Matlab实现CPO-PNN冠豪猪算法优化概率神经网络多特征分类预测
  • Win11怎样安装DirectX 9
  • 稳健标准误
  • 【苍穹外卖项目】Day05
  • draw_ctx中clip_area和buf_area的区别,为什么看起来差不多?
  • 第四篇:材质与纹理:让物体“真实“起来
  • Linux选择
  • evo_traj的参数设置及保存图片
  • van list 重复进入onload
  • c++和python联合编程示例
  • Conda install安装了一些库,如何撤销操作
  • 《n8n基础教学》第一节:如何使用编辑器UI界面
  • Day17--二叉树--654. 最大二叉树,617. 合并二叉树,700. 二叉搜索树中的搜索,98. 验证二叉搜索树
  • chroma、faiss和milvus三者之间的区别和联系
  • 数据结构——查找(一、什么是查找?)
  • 通过观看数百个外科手术视频课程来学习多模态表征|文献速递-医学影像算法文献分享
  • OpenVLA: 论文阅读 -- 开源视觉-语言-行动模型
  • 我用提示词A 对qwen3-4b大模型进行 nl2sql 任务 grpo 强化学习,评估的时候换新提示词,会影响nl2sql测评准确率吗?
  • IOMMU Client设备DMA配置过程分析(九)
  • “物联网+技校”:VR虚拟仿真实训室的发展前景
  • ALOcc: Adaptive Lifting-based 3D Semantic Occupancy and
  • Python爬虫实战:研究pycares技术构建DNS解析系统
  • Web开发-PHP应用组件框架前端模版渲染三方插件富文本编辑器CVE审计
  • 从0到1学PHP(十四):PHP 性能优化:打造高效应用
  • 基于 USBD 库 CDC Standalone 例程中的一个 Bug 解析
  • 在多租户或多服务共享 Redis 时,如何做逻辑隔离或权限控制?