@@ -51,17 +51,22 @@ typedef struct {
5151//--------------------------------------------------------------------+
5252static cdch_data_t cdch_data [CFG_TUSB_HOST_DEVICE_MAX ];
5353
54+ static inline cdch_data_t * get_itf (uint8_t dev_addr )
55+ {
56+ return & cdch_data [dev_addr - 1 ];
57+ }
58+
5459bool tuh_cdc_mounted (uint8_t dev_addr )
5560{
56- cdch_data_t * cdc = & cdch_data [ dev_addr - 1 ] ;
61+ cdch_data_t * cdc = get_itf ( dev_addr ) ;
5762 return cdc -> ep_in && cdc -> ep_out ;
5863}
5964
6065bool tuh_cdc_is_busy (uint8_t dev_addr , cdc_pipeid_t pipeid )
6166{
6267 if ( !tuh_cdc_mounted (dev_addr ) ) return false;
6368
64- cdch_data_t const * p_cdc = & cdch_data [ dev_addr - 1 ] ;
69+ cdch_data_t const * p_cdc = get_itf ( dev_addr ) ;
6570
6671 switch (pipeid )
6772 {
@@ -111,6 +116,27 @@ bool tuh_cdc_receive(uint8_t dev_addr, void * p_buffer, uint32_t length, bool is
111116 return hcd_pipe_xfer (dev_addr , ep_in , p_buffer , length , is_notify );
112117}
113118
119+ bool tuh_cdc_set_control_line_state (uint8_t dev_addr , bool dtr , bool rts , tuh_control_complete_cb_t complete_cb )
120+ {
121+ cdch_data_t const * p_cdc = get_itf (dev_addr );
122+ tusb_control_request_t const request =
123+ {
124+ .bmRequestType_bit =
125+ {
126+ .recipient = TUSB_REQ_RCPT_INTERFACE ,
127+ .type = TUSB_REQ_TYPE_CLASS ,
128+ .direction = TUSB_DIR_OUT
129+ },
130+ .bRequest = CDC_REQUEST_SET_CONTROL_LINE_STATE ,
131+ .wValue = (rts ? 2 : 0 ) | (dtr ? 1 : 0 ),
132+ .wIndex = p_cdc -> itf_num ,
133+ .wLength = 0
134+ };
135+
136+ TU_ASSERT ( tuh_control_xfer (dev_addr , & request , NULL , complete_cb ) );
137+ return true;
138+ }
139+
114140//--------------------------------------------------------------------+
115141// USBH-CLASS DRIVER API
116142//--------------------------------------------------------------------+
@@ -132,7 +158,7 @@ bool cdch_open(uint8_t rhport, uint8_t dev_addr, tusb_desc_interface_t const *it
132158 cdch_data_t * p_cdc ;
133159
134160 p_desc = tu_desc_next (itf_desc );
135- p_cdc = & cdch_data [ dev_addr - 1 ] ;
161+ p_cdc = get_itf ( dev_addr ) ;
136162
137163 p_cdc -> itf_num = itf_desc -> bInterfaceNumber ;
138164 p_cdc -> itf_protocol = itf_desc -> bInterfaceProtocol ; // TODO 0xff is consider as rndis candidate, other is virtual Com
@@ -194,30 +220,25 @@ bool cdch_open(uint8_t rhport, uint8_t dev_addr, tusb_desc_interface_t const *it
194220 }
195221 }
196222
197- // FIXME move to seperate API : connect
198- tusb_control_request_t request =
199- {
200- .bmRequestType_bit = { .recipient = TUSB_REQ_RCPT_INTERFACE , .type = TUSB_REQ_TYPE_CLASS , .direction = TUSB_DIR_OUT },
201- .bRequest = CDC_REQUEST_SET_CONTROL_LINE_STATE ,
202- .wValue = 0x03 , // dtr on, cst on
203- .wIndex = p_cdc -> itf_num ,
204- .wLength = 0
205- };
206-
207- TU_ASSERT ( usbh_control_xfer (dev_addr , & request , NULL ) );
223+ return true;
224+ }
208225
226+ bool cdch_set_config (uint8_t dev_addr , uint8_t itf_num )
227+ {
228+ (void ) dev_addr ; (void ) itf_num ;
209229 return true;
210230}
211231
212- void cdch_isr (uint8_t dev_addr , uint8_t ep_addr , xfer_result_t event , uint32_t xferred_bytes )
232+ bool cdch_xfer_cb (uint8_t dev_addr , uint8_t ep_addr , xfer_result_t event , uint32_t xferred_bytes )
213233{
214234 (void ) ep_addr ;
215235 tuh_cdc_xfer_isr ( dev_addr , event , 0 , xferred_bytes );
236+ return true;
216237}
217238
218239void cdch_close (uint8_t dev_addr )
219240{
220- cdch_data_t * p_cdc = & cdch_data [ dev_addr - 1 ] ;
241+ cdch_data_t * p_cdc = get_itf ( dev_addr ) ;
221242 tu_memclr (p_cdc , sizeof (cdch_data_t ));
222243}
223244
0 commit comments