diff options
| author | hathach <[email protected]> | 2013-07-05 16:22:42 +0700 |
|---|---|---|
| committer | hathach <[email protected]> | 2013-07-05 16:22:42 +0700 |
| commit | 355fd7e64867093ee5974056c7735a60dd0f64e7 (patch) | |
| tree | 5928919e8df2a80437ecaa6bd6c67cffa06aafb1 /tinyusb/class/cdc_rndis_host.c | |
| parent | e4ff63c6049929d400ae326509399704f0d3c01c (diff) | |
adding subclass RNDIS-CDC driver API
- implement init
- close
- xfer_isr
- open
adding waiting for notification after send rndis_initalize_msg
Diffstat (limited to 'tinyusb/class/cdc_rndis_host.c')
| -rw-r--r-- | tinyusb/class/cdc_rndis_host.c | 40 |
1 files changed, 37 insertions, 3 deletions
diff --git a/tinyusb/class/cdc_rndis_host.c b/tinyusb/class/cdc_rndis_host.c index 585cf7d42..b01bebc7a 100644 --- a/tinyusb/class/cdc_rndis_host.c +++ b/tinyusb/class/cdc_rndis_host.c @@ -53,6 +53,7 @@ // MACRO CONSTANT TYPEDEF //--------------------------------------------------------------------+ static uint8_t msg_notification[TUSB_CFG_HOST_DEVICE_MAX][8] TUSB_CFG_ATTR_USBRAM; +STATIC_ rndish_data_t rndish_data[TUSB_CFG_HOST_DEVICE_MAX]; //--------------------------------------------------------------------+ // INTERNAL OBJECT & FUNCTION DECLARATION @@ -91,7 +92,26 @@ static tusb_error_t rndis_body_subtask(void) OSAL_SUBTASK_END } +//--------------------------------------------------------------------+ +// RNDIS-CDC Driver API +//--------------------------------------------------------------------+ +void rndish_init(void) +{ + memclr_(rndish_data, sizeof(rndish_data_t)*TUSB_CFG_HOST_DEVICE_MAX); + + //------------- Task creation -------------// + + //------------- semaphore creation for notificaiton pipe -------------// + for(uint8_t i=0; i<TUSB_CFG_HOST_DEVICE_MAX; i++) + { + rndish_data[i].sem_notification_hdl = osal_semaphore_create( OSAL_SEM_REF(rndish_data[i].semaphore_notification) ); + } +} +void rndish_close(uint8_t dev_addr) +{ + osal_semaphore_reset( rndish_data[dev_addr-1].sem_notification_hdl ); +} tusb_error_t rndish_open_subtask(uint8_t dev_addr, cdch_data_t *p_cdc) { @@ -109,6 +129,7 @@ tusb_error_t rndish_open_subtask(uint8_t dev_addr, cdch_data_t *p_cdc) OSAL_SUBTASK_BEGIN + //------------- Send & Receive Initialize -------------// OSAL_SUBTASK_INVOKED_AND_WAIT( usbh_control_xfer_subtask( dev_addr, bm_request_type(TUSB_DIR_HOST_TO_DEV, TUSB_REQUEST_TYPE_CLASS, TUSB_REQUEST_RECIPIENT_INTERFACE), SEND_ENCAPSULATED_COMMAND, 0, p_cdc->interface_number, @@ -116,10 +137,15 @@ tusb_error_t rndish_open_subtask(uint8_t dev_addr, cdch_data_t *p_cdc) error ); - if ( TUSB_ERROR_NONE != error) - { + if ( TUSB_ERROR_NONE != error ) + SUBTASK_EXIT(error); + + //------------- waiting for Response Available notification -------------// + (void) hcd_pipe_xfer(p_cdc->pipe_notification, msg_notification[dev_addr], 8, true); + osal_semaphore_wait(rndish_data[dev_addr-1].sem_notification_hdl, OSAL_TIMEOUT_NORMAL, &error); + + if ( TUSB_ERROR_NONE != error ) SUBTASK_EXIT(error); - } if ( tusbh_cdc_rndis_mounted_cb ) { @@ -129,4 +155,12 @@ tusb_error_t rndish_open_subtask(uint8_t dev_addr, cdch_data_t *p_cdc) OSAL_SUBTASK_END } +void rndish_xfer_isr(cdch_data_t *p_cdc, pipe_handle_t pipe_hdl, tusb_event_t event, uint32_t xferred_bytes) +{ + if ( pipehandle_is_equal(pipe_hdl, p_cdc->pipe_notification) ) + { + osal_semaphore_post( rndish_data[pipe_hdl.dev_addr-1].sem_notification_hdl ); + } +} + #endif |
