@@ -95,6 +95,7 @@ const char* channelState(channel_state_t state)
9595 SSS ( TUSB_CS_XFER_ONGOING )
9696 SSS ( TUSB_CS_XFER_CANCEL )
9797 SSS ( TUSB_CS_UNKNOWN_ERROR )
98+ SSS ( TUSB_CS_TRANSFER_CSPLIT )
9899 }
99100 return "Unknown Channel State ";
100101#undef SSS
@@ -151,6 +152,44 @@ void tusbh_close_pipe(tusbh_device_t* dev, int pipe_num)
151152 tusb_pipe_close (& pipe );
152153}
153154
155+ #if 1
156+ static channel_state_t tusbh_pipe_xfer_and_wait (tusbh_device_t * dev , int pipe_num , uint8_t is_data , void * data , uint16_t len , uint32_t timeout )
157+ {
158+ void * bak = dev -> host -> hc [pipe_num ].user_data ;
159+ dev -> host -> hc [pipe_num ].user_data = & dev -> xfer_evt ;
160+
161+ channel_state_t r = TUSB_CS_UNKNOWN_ERROR ;
162+
163+ uint16_t remain = len ;
164+ uint8_t * p = (uint8_t * )data ;
165+ int res = 0 ;
166+
167+ dev -> host -> hc [pipe_num ].toggle_in = 1 ;
168+ channel_state_t s ;
169+
170+ do {
171+ tusb_host_xfer_data (dev -> host , pipe_num , is_data , p , remain );
172+ tusbh_evt_wait (dev -> xfer_evt .event , timeout );
173+ tusb_hc_data_t * hc = & dev -> host -> hc [pipe_num ];
174+ s = (channel_state_t )hc -> state ;
175+ if (s != TUSB_CS_TRANSFER_CSPLIT ) {
176+ if (s != TUSB_CS_TRANSFER_COMPLETE ){
177+ res = - (int )s ;
178+ goto error ;
179+ }
180+ remain -= hc -> count ;
181+ p += hc -> count ;
182+ }
183+ }while ((remain && len ) || (s == TUSB_CS_TRANSFER_CSPLIT ));
184+ res = p - ((uint8_t * )data );
185+ error :
186+ dev -> host -> hc [pipe_num ].user_data = bak ;
187+ r = (channel_state_t )dev -> host -> hc [pipe_num ].state ;
188+ return r ;
189+ }
190+
191+ #else
192+
154193static channel_state_t tusbh_pipe_xfer_and_wait (tusbh_device_t * dev , int pipe_num , uint8_t is_data , void * data , uint16_t len , uint32_t timeout )
155194{
156195 void * bak = dev -> host -> hc [pipe_num ].user_data ;
@@ -170,6 +209,7 @@ static channel_state_t tusbh_pipe_xfer_and_wait(tusbh_device_t* dev, int pipe_nu
170209
171210 return r ;
172211}
212+ #endif
173213
174214int tusbh_ep_xfer (tusbh_ep_info_t * ep , void * data , uint16_t len , uint32_t timeout )
175215{
0 commit comments