4.1.2 Driver Device Mode Client Functions
The DRV_USB_DEVICE_INTERFACE structure contains pointers to the USB Driver’s Device mode Client Functions. These functions are only applicable when the USB module is operating as a USB Device. A USB Driver must implement these functions and ensure that the Device Stack can access these functions through the driver’s DRV_USB_DEVICE_INTERFACE structure. Descriptions of the Driver Device Mode Client functions in the DRV_USB_DEVICE_INTERFACE structure include:
- Driver Device Address Set Function
- Driver Device Current Speed Get Function
- Driver Device SOF Number Get Function
- Driver Device Attach Function
- Driver Device Detach Function
- Driver Device Endpoint Enable Function
- Driver Device Endpoint Disable Function
- Driver Device Endpoint Stall Function
- Driver Device Endpoint Stall Clear Function
- Driver Device Endpoint Enable Status Function
- Driver Device Endpoint Stall Status Function
- Driver Device IRP Submit Function
- Driver Device IRP Cancel All Function
- Driver Device IRP Cancel Function
- Driver Device Remote Wakeup Start Function
- Driver Device Remote Wakeup Stop Function
- Driver Device Test Mode Enter Function
The PIC32MZ and the PIC32MX USB peripheral drivers implement the Device mode functions and export these functions to the Device Stack though their respective DRV_USB_DEVICE_INTERFACE structure.
Driver Device Address Set Function
The deviceAddressSet
member of the DRV_USB_DEVICE_INTERFACE
structure should point to the USB Driver Device Address Set function. The signature
of this function is as follows:
void (*deviceAddressSet)(DRV_HANDLE handle, uint8_t address);
The USB Driver Device Address Set Function should match this signature. The USB
Device Stack will call this function to set the Device USB Address. The function
will be called in an interrupt context and hence the function implementation must be
interrupt-safe. The handle
parameter is the driver handle obtained
from calling the driver Open function. The address
parameter is the
address provided by the USB Host through the Set Device Address Standard
request.
Driver Device Current Speed Get Function
The deviceCurrentSpeedGet
member of the DRV_USB_DEVICE_INTERFACE
structure should point to the USB Driver Current Speed Get function. The signature
of this function is as follows:
USB_SPEED (*deviceCurrentSpeedGet)(DRV_HANDLE handle);
The USB Driver Device Current Speed Get function should match this signature. The USB
Device Stack will call this function to obtain the speed at which the device has
connected to the USB. It will call this function after reset signaling has
completed. The handle
parameter is driver handle obtained from
calling the driver Open function. This function is called in an interrupt context
and should be interrupt-safe.
Driver Device SOF Number Get Function
The deviceSOFNumberGet
member of the DRV_USB_DEVICE_INTERFACE
structure should point to the USB Driver Start-Of-Frame Number Get function. The
signature of this function is as follows:
uint16_t (*deviceSOFNumberGet)(DRV_HANDLE handle);
The USB Driver SOF Number Get function should match this signature. The USB Device
Stack will call this function to obtain the current SOF number. The USB peripheral
uses a 16 bit counter to count the number of SOFs that have occurred since USB
reset. This value is returned along with the Device Stack Start of Frame event. This
function is called from an interrupt context and should be interrupt-safe. The
handle
parameter is the driver handle obtained from calling the
driver Open function.
Driver Device Attach Function
The deviceAttach
member of the DRV_USB_DEVICE_INTERFACE structure
should point to the USB Driver Attach function. The signature of this function is as
follows:
uint16_t(*deviceAttach)(DRV_HANDLE handle);
The USB Driver Attach function should match this signature. The USB Device Stack will
call this function when the Device application calls the USB Device Stack Device
Attach function. The USB Driver will enable the required signaling resistors for
indicate attach to the Host. The application could call this function in response to
a VBUS power available event. This function must be interrupt-safe. The
handle
parameter is the driver handle obtained from calling the
driver Open function.
Driver Device Detach Function
The deviceDetach member of the DRV_USB_DEVICE_INTERFACE structure should point to the USB Driver Detach function. The signature of this function is as follows:
uint16_t(*deviceDetach)(DRV_HANDLE handle);
The USB Driver Detach function should match this signature. The USB Device Stack will
call this function when the Device application calls the USB Device Stack Device
Detach function. The USB Driver will disable the required signaling resistors to
indicate detach to the Host. The application could call this function in response to
a VBUS power not available event. This function should be interrupt-safe. The
handle
parameter is driver handle obtained from calling the
driver Open function.
Driver Device Endpoint Enable Function
The deviceEndpointEnable
member of the DRV_USB_DEVICE_INTERFACE
structure should point to the USB Driver Endpoint Enable function. The signature of
this function is as follows:
USB_ERROR (*deviceEndpointEnable)(DRV_HANDLE handle, USB_ENDPOINT endpoint, USB_TRANSFER_TYPE transferType, uint16_t endpointSize);
The USB Driver Endpoint Enable function should match this signature. The USB Device Stack Function Driver will call this function when it is initialized by the USB Device Layer. The Device Layer, on receiving the Set Configuration request from the Host, identifies the function drivers that are required by the configuration and initializes them. The function drivers will call the endpoint enable function to enable the endpoints required for their operation. Enabling the endpoint will cause it reply to transaction requests from the Host and accept transfer requests from the device application.
The handle
parameter is the driver handle obtained from calling the
driver Open function. The endpoint
parameter is the USB endpoint
(which indicates the direction along with endpoint number) that should be enabled.
The transferType is the type of the USB transfer that this endpoint will handle. The
endpointSize is the size of the maximum transaction that the endpoint will handle.
This should match the endpoint size communicated to the Host via the device endpoint
descriptors.
The function will return USB_ERRROR_NONE if the endpoint was configured successfully. The function will return USB_ERROR_DEVICE_ENDPOINT_INVALID if the specified endpoint is not provisioned in the system configuration. It will return USB_ERROR_PARAMETER_INVALID if the driver handle is not valid.
The endpoint enable function will be called in an interrupt context and should be interrupt-safe. It is not expected to be thread safe. For standard function drivers, the endpoint enable function will be called in the context of the USB Device Layer Client. For vendor USB devices, the vendor application must call the endpoint enable function in response to and within the context of the device configured event. Again this event itself will execute in the context of the Device Layer.
Driver Device Endpoint Disable Function
The deviceEndpointDisable
member of the DRV_USB_DEVICE_INTERFACE
structure should point to the USB Driver Endpoint Disable function. The signature of
this function is as follows:
USB_ERROR (*deviceEndpointDisable)(DRV_HANDLE handle, USB_ENDPOINT endpoint);
The USB Driver Endpoint Disable function should match this signature. The USB Device Stack Function Driver will call this function when it is deinitialized by the USB Device Layer. The Device Layer will deinitialize function drivers when it receives a USB reset event from the driver or on receiving the Set Configuration request from the Host with configuration parameter 0. Disabling the endpoint will cause it NAK transaction request from the Host and not accept transfer requests from the device application.
The handle
parameter is the driver handle obtained from calling the
driver Open function. The endpoint
parameter is the USB endpoint
(which indicates the direction along with endpoint number) that should be disabled.
The function will return USB_ERRROR_NONE if the function executed successfully. The function will return USB_ERROR_DEVICE_ENDPOINT_INVALID if the specified endpoint is not provisioned in the system configuration. It will return USB_ERROR_PARAMETER_INVALID if the driver handle is not valid.
The endpoint disable function will be called in an interrupt context and should be interrupt-safe. It is not expected to be thread safe. For standard function drivers, the endpoint disable function will be called in the context of the USB Device Layer Client. For vendor USB devices, the vendor application must call the endpoint enable function in response to and within the context of the device reset event. Again this event itself will execute in the context of the Device Layer. Disabling the endpoint will not cancel any transfers that have been queued against the endpoint. The function drivers will call the IRP Cancel All function to cancel any pending transfers.
Driver Device Endpoint Stall Function
The deviceEndpointStall
member of the DRV_USB_DEVICE_INTERFACE
structure should point to the USB Driver Endpoint Stall function. The signature of
this function is as follows:
USB_ERROR (*deviceEndpointStall)(DRV_HANDLE handle, USB_ENDPOINT endpoint);
The USB Driver Endpoint Stall function should match this signature. The USB Device Stack Function Driver will call this function to stall an endpoint. The Device Layer itself will stall endpoint 0 for several reasons including non-support of the Host request or failure while executing the request. A function driver will also stall an endpoint for protocol specific reasons. The driver will stall both, receive and transmit directions when stalling Endpoint 0. The driver will stall the specified direction while stalling a non-zero endpoint.
This function must be thread safe and interrupt safe. Stalling the endpoint will
abort all the transfers queued on the endpoint with the completion status set to
USB_DEVICE_IRP_STATUS_ABORTED_ENDPOINT_HALT. The handle
parameter
is the driver handle obtained from calling the driver Open function. The
endpoint
parameter is the USB endpoint (which indicates the
direction along with endpoint number) that should be stalled. The function will
return USB_ERRROR_NONE if the function executed successfully. The function will
return USB_ERROR_DEVICE_ENDPOINT_INVALID if the specified endpoint is not
provisioned in the system configuration. It will return USB_ERROR_PARAMETER_INVALID
if the driver handle is not valid.
Driver Device Endpoint Stall Clear Function
The deviceEndpointStallClear
member of the DRV_USB_DEVICE_INTERFACE
structure should point to the USB Driver Endpoint Stall Clear function. The
signature of this function is as follows:
USB_ERROR (*deviceEndpointStallClear)(DRV_HANDLE handle, USB_ENDPOINT endpoint);
The USB Driver Endpoint Stall Clear function should match this signature. The USB Device Stack Function Driver will call this function to clear the stall on a non-zero endpoint. The Device Layer will call this function to clear the stall condition on Endpoint 0. Clearing the stall on a non-zero endpoint will clear all transfers scheduled on the endpoint and transfer completion status will be set to USB_DEVICE_IRP_STATUS_TERMINATED_BY_HOST. When the stall is cleared, the data toggle for non-zero endpoint will be set to DATA0. The data toggle on Endpoint 0 OUT endpoint will be set to DATA1. The USB Driver will clear the Stall condition on an endpoint even if it was not stalled.
This function must be thread safe and interrupt safe. Stalling the endpoint will
flush all the transfers queued on the endpoint. The handle
parameter is the driver handle obtained from calling the driver Open function. The
endpoint
parameter is the USB endpoint (which indicates the
direction along with endpoint number) whose stall condition must be cleared. The
function will return USB_ERRROR_NONE if the function executed successfully. The
function will return USB_ERROR_DEVICE_ENDPOINT_INVALID if the specified endpoint is
not provisioned in the system configuration. It will return
USB_ERROR_PARAMETER_INVALID if the driver handle is not valid.
Driver Device Endpoint Enable Status Function
The deviceEndpointIsEnabled
member of the DRV_USB_DEVICE_INTERFACE
structure should point to the USB Driver Endpoint Enable Status function. The
signature of this function is as follows:
bool (*deviceEndpointIsEnabled)(DRV_HANDLE handle, USB_ENDPOINT endpoint);
The USB Driver Endpoint Enable Status function should match this signature. The USB
Device Stack function will call this function to check if an endpoint has been
enabled. The function returns true if the endpoint is enabled. The endpoint is
enabled through the USB Driver Endpoint Enable function. The handle
parameter is the driver handle obtained from calling the driver Open function. The
endpoint
parameter is the USB endpoint (which indicates the
direction along with endpoint number) whose enable status needs to be queried.
Driver Device Endpoint Stall Status Function
The deviceEndpointIsStalled
member of the DRV_USB_DEVICE_INTERFACE
structure should point to the USB Driver Endpoint Stall Status function. The
signature of this function is as follows:
bool (*deviceEndpointIsStalled)(DRV_HANDLE handle, USB_ENDPOINT endpoint);
The USB Driver Endpoint Stall Status function should match this signature. The USB
Device Stack function will call this function to check if an endpoint has been
stalled. The function returns true if the endpoint is stalled. The endpoint is
stalled through the USB Driver Endpoint Stall function. The handle
parameter is the driver handle obtained from calling the driver Open function. The
endpoint
parameter is the USB endpoint (which indicates the
direction along with endpoint number) whose stall status needs to be queried.
Driver Device IRP Submit Function
The deviceIRPSubmit member of the DRV_USB_DEVICE_INTERFACE structure should point to the USB Driver Device IRP Submit function. The signature of the IRP submit function is as follows:
USB_ERROR (*deviceIRPSubmit)(DRV_HANDLE handle, USB_ENDPOINT endpoint, USB_DEVICE_IRP * irp);
The USB Driver Device IRP Submit function must match this signature. The Device Stack
(USB Device calls this function to submit an IRP to the USB Driver. The USB Driver
provides this mechanism to transfer data between the device and the Host. The
handle
parameter is the driver handle obtained from calling the
driver Open function. The endpoint
parameter should set to endpoint
through which transfer must be processed. The irp
parameter should
point to the Device IRP data structure. The IRP data structure will transport an
entire transfer over the endpoint. The USB Driver will split up the transfer into
transactions based on the endpoint size specified at the time of enabling the
endpoint. This process does not require Device Stack intervention.
The function will return USB_ERRROR_NONE if the function executed successfully. The function will return USB_ERROR_DEVICE_ENDPOINT_INVALID if the specified endpoint is not provisioned in the system configuration. It will return USB_ERROR_PARAMETER_INVALID if the driver handle is not valid. It will return USB_ERROR_DEVICE_IRP_IN_USE if an in progress IRP is resubmitted. It will return USB_ERROR_ENDPOINT_NOT_CONFIGURED if the IRP is submitted to an endpoint that is not enabled.
The USB Driver will queue the IRP if there is already an IRP being processed on the endpoint. The completion of the IRP processing is indicated by the USB Driver calling the IRP callback function specified within the IRP. The Device IRP Submit function must be thread safe and IRP callback safe. The Device Stack may resubmit the IRP within the IRP callback function. The IRP callback function itself executes within an interrupt context. The completion status of the IRP will be available in the status member of the IRP when the IRP callback function is invoked.
Driver Device IRP Cancel All Function
The deviceIRPCancelAll
member of the DRV_USB_DEVICE_INTERFACE
structure should point to the USB Driver Device IRP Cancel All function. The
signature of this is as follows:
USB_ERROR (*deviceIRPCancelAll)(DRV_HANDLE handle, USB_ENDPOINT endpoint);
The USB Driver Device IRP Cancel All function must match this signature. The USB
Device Stack will call this function before disabling the endpoint. Calling this
function will call all IRPs that are queued on the endpoint to be canceled. The
callback of each IRP will be invoked and the IRP completion status will be set to
USB_DEVICE_IRP_STATUS_ABORTED. If an IRP is in progress, an ongoing transaction will
be allowed to complete and pending transactions will be canceled. The
handle
parameter is the driver handle obtained from calling the
driver Open function. The endpoint
parameter is the USB endpoint
(which indicates the direction along with endpoint number) whose queued IRPs must be
canceled.
The function is thread safe and interrupt safe and will return USB_ERRROR_NONE if it executed successfully. The function will return USB_ERROR_DEVICE_ENDPOINT_INVALID if the specified endpoint is not provisioned in the system configuration. It will return USB_ERROR_PARAMETER_INVALID if the driver handle is not valid.
Driver Device IRP Cancel Function
The deviceIRPCancel
member of the DRV_USB_DEVICE_INTERFACE structure
should point to the USB Driver Device IRP Cancel function. The signature of this is
as follows:
USB_ERROR (*deviceIRPCancel)(DRV_HANDLE handle, USB_DEVICE_IRP * IRP);
The USB Driver Device IRP Cancel function must match this signature. This function is
called by the USB Device Stack function driver to cancel a scheduled IRP. If the IRP
is in the queue but it’s processing has not started, the IRP will removed from the
queue and the IRP callback function will be called from within the cancel function.
The callback will be invoked with the IRP completion status set to
USB_DEVICE_IRP_STATUS_ABORTED. If an IRP is in progress, an ongoing transaction will
be allowed to complete and pending transactions will be canceled. The
handle
parameter is the driver handle obtained from calling the
driver Open function. The irp
parameter is the IRP to be canceled.
The function is thread safe and will return USB_ERRROR_NONE if it executed successfully. It will return USB_ERROR_PARAMETER_INVALID if the driver handle is not valid or if the IRP has status indicates that this IRP is not queued or not in progress. The application should not release the data memory associated with IRP unless the callback has been received.
Driver Device Remote Wakeup Start Function
The deviceRemoteWakeupStart
member of the DRV_USB_DEVICE_INTERFACE
structure should point to the USB Driver Device Remote Wakeup Start function. The
signature of this function is as follows:
void (*deviceRemoteWakeupStart)(DRV_HANDLE handle);
The USB Driver Device Remote Wakeup Start function must match this signature. The USB
Device Stack will call the function when the device application wants to start
remote wakeup signaling. This would happen if the device supports remote wake-up
capability and this has been enabled by the Host. The handle
parameter is the driver handle obtained from calling the driver Open function.
Driver Device Remote Wakeup Stop Function
The deviceRemoteWakeupStop
member of the DRV_USB_DEVICE_INTERFACE
structure should point to the USB Driver Device Remote Wakeup Stop function. The
signature of this function is as follows:
void (*deviceRemoteWakeupStop)(DRV_HANDLE handle);
The USB Driver Device Remote Wakeup Stop function must match this signature. The USB
Device Stack will call the function when the device application wants to stop remote
wakeup signaling. The application would call after calling the remote wakeup start
function. The handle
parameter is the driver handle obtained from
calling the driver Open function.
Driver Device Test Mode Enter Function
The deviceTestModeEnter
parameter of the DRV_USB_DEVICE_INTERFACE
structure should point to the USB Driver Device Test Mode Enter function. The
signature of this function is as follows:
USB_ERROR (*deviceTestModeEnter)(DRV_HANDLE handle, USB_TEST_MODE_SELECTORS testMode);
The USB Driver Device Test Mode Enter function should match this signature. The USB
Device Stack calls this driver function to place the driver into test mode. This is
required when the USB Host (operating at Hi-Speed) send the Set Feature request with
the feature selector test set to test mode. This request also specifies which of the
test mode signals, the driver should enable. The handle
parameter
is the driver handle obtained from calling the driver Open function. The
testMode
parameter should be set to one of the test modes as
defined in table 9-7 of the USB 2.0 specification.
The test mode enter function is only supported by the PIC32MZ USB Driver as the USB peripheral on this controller supports Hi-Speed operation. The function will return USB_ERRROR_NONE if it executed successfully. It will return USB_ERROR_PARAMETER_INVALID if the driver handle is not valid.
This concludes the discussion on the DRV_USB_DEVICE_INTERFACE structure. The following sections describe using the USB Common Driver.