summaryrefslogtreecommitdiff
path: root/tinyusb/class/cdc_rndis_host.c
diff options
context:
space:
mode:
authorhathach <[email protected]>2013-07-05 16:22:42 +0700
committerhathach <[email protected]>2013-07-05 16:22:42 +0700
commit355fd7e64867093ee5974056c7735a60dd0f64e7 (patch)
tree5928919e8df2a80437ecaa6bd6c67cffa06aafb1 /tinyusb/class/cdc_rndis_host.c
parente4ff63c6049929d400ae326509399704f0d3c01c (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.c40
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