diff --git a/tinyusb/class/cdc_host.c b/tinyusb/class/cdc_host.c index 5dd37810..49899c63 100644 --- a/tinyusb/class/cdc_host.c +++ b/tinyusb/class/cdc_host.c @@ -91,6 +91,11 @@ bool tusbh_cdc_serial_is_mounted(uint8_t dev_addr) (cdch_data[dev_addr-1].interface_protocol <= CDC_COMM_PROTOCOL_ATCOMMAND_CDMA); } +bool tusbh_cdc_rndis_is_mounted(uint8_t dev_addr) +{ + return tusbh_cdc_is_mounted(dev_addr) && cdch_data[dev_addr-1].is_rndis; +} + tusb_error_t tusbh_cdc_send(uint8_t dev_addr, void const * p_data, uint32_t length, bool is_notify) { ASSERT( tusbh_cdc_is_mounted(dev_addr), TUSB_ERROR_CDCH_DEVICE_NOT_MOUNTED); diff --git a/tinyusb/class/cdc_host.h b/tinyusb/class/cdc_host.h index d45b047a..9d6c559c 100644 --- a/tinyusb/class/cdc_host.h +++ b/tinyusb/class/cdc_host.h @@ -64,7 +64,7 @@ typedef enum { // APPLICATION PUBLIC API //--------------------------------------------------------------------+ bool tusbh_cdc_serial_is_mounted(uint8_t dev_addr) ATTR_PURE ATTR_WARN_UNUSED_RESULT; -bool tusbh_cdc_rndis_is_mounted(uint8_t dev_addr) ATTR_PURE ATTR_WARN_UNUSED_RESULT; + tusb_error_t tusbh_cdc_send(uint8_t dev_addr, void const * p_data, uint32_t length, bool is_notify); tusb_error_t tusbh_cdc_receive(uint8_t dev_addr, void * p_buffer, uint32_t length, bool is_notify); @@ -73,13 +73,21 @@ void tusbh_cdc_mounted_cb(uint8_t dev_addr) ATTR_WEAK; void tusbh_cdc_unmounted_isr(uint8_t dev_addr) ATTR_WEAK; void tusbh_cdc_xfer_isr(uint8_t dev_addr, tusb_event_t event, cdc_pipeid_t pipe_id, uint32_t xferred_bytes) ATTR_WEAK; -//------------- RNDIS Application Callback (overshadow CDC callbacks) -------------// -#if TUSB_CFG_HOST_CDC_RNDIS +#if TUSB_CFG_HOST_CDC_RNDIS +//--------------------------------------------------------------------+ +// RNDIS APPLICATION API +//--------------------------------------------------------------------+ +bool tusbh_cdc_rndis_is_mounted(uint8_t dev_addr) ATTR_PURE ATTR_WARN_UNUSED_RESULT; +tusb_error_t tusbh_cdc_rndis_get_mac_addr(uint8_t dev_addr, uint8_t mac_address[6]); + +//------------- RNDIS Application Callback (overshadow CDC callbacks) -------------// void tusbh_cdc_rndis_mounted_cb(uint8_t dev_addr) ATTR_WEAK; void tusbh_cdc_rndis_unmounted_isr(uint8_t dev_addr) ATTR_WEAK; void tusbh_cdc_rndis_xfer_isr(uint8_t dev_addr, tusb_event_t event, cdc_pipeid_t pipe_id, uint32_t xferred_bytes) ATTR_WEAK; + + #endif //--------------------------------------------------------------------+ diff --git a/tinyusb/class/cdc_rndis_host.c b/tinyusb/class/cdc_rndis_host.c index 35ee8850..1f6720ef 100644 --- a/tinyusb/class/cdc_rndis_host.c +++ b/tinyusb/class/cdc_rndis_host.c @@ -59,16 +59,29 @@ static uint8_t msg_payload[RNDIS_MSG_PAYLOAD_MAX] TUSB_CFG_ATTR_USBRAM ATTR_ALI STATIC_ rndish_data_t rndish_data[TUSB_CFG_HOST_DEVICE_MAX]; -// TODO Microsoft requires message length for any get command must be at least 0x400 bytes +// TODO Microsoft requires message length for any get command must be at least 4096 bytes //--------------------------------------------------------------------+ // INTERNAL OBJECT & FUNCTION DECLARATION //--------------------------------------------------------------------+ static tusb_error_t rndis_body_subtask(void); static tusb_error_t send_message_get_response_subtask( uint8_t dev_addr, cdch_data_t *p_cdc, - uint8_t const * p_mess, uint32_t mess_length, + uint8_t * p_mess, uint32_t mess_length, uint8_t *p_response ); +//--------------------------------------------------------------------+ +// APPLICATION API +//--------------------------------------------------------------------+ +tusb_error_t tusbh_cdc_rndis_get_mac_addr(uint8_t dev_addr, uint8_t mac_address[6]) +{ + ASSERT( tusbh_cdc_rndis_is_mounted(dev_addr), TUSB_ERROR_CDCH_DEVICE_NOT_MOUNTED); + ASSERT_PTR( mac_address, TUSB_ERROR_INVALID_PARA); + + memcpy(mac_address, rndish_data[dev_addr-1].mac_address, 6); + + return TUSB_ERROR_NONE; +} + //--------------------------------------------------------------------+ // IMPLEMENTATION //--------------------------------------------------------------------+ @@ -219,7 +232,7 @@ void rndish_xfer_isr(cdch_data_t *p_cdc, pipe_handle_t pipe_hdl, tusb_event_t ev //} static tusb_error_t send_message_get_response_subtask( uint8_t dev_addr, cdch_data_t *p_cdc, - uint8_t const * p_mess, uint32_t mess_length, + uint8_t * p_mess, uint32_t mess_length, uint8_t *p_response) { tusb_error_t error; diff --git a/tinyusb/host/usbh.h b/tinyusb/host/usbh.h index 7b4a5372..e3300ff4 100644 --- a/tinyusb/host/usbh.h +++ b/tinyusb/host/usbh.h @@ -112,7 +112,7 @@ OSAL_TASK_FUNCTION (usbh_enumeration_task) (void* p_task_para); tusb_error_t usbh_init(void); tusb_error_t usbh_control_xfer_subtask(uint8_t dev_addr, uint8_t bmRequestType, uint8_t bRequest, - uint16_t wValue, uint16_t wIndex, uint16_t wLength, uint8_t* data ); + uint16_t wValue, uint16_t wIndex, uint16_t wLength, uint8_t* data); #endif