dxd - dynax driver framework 2.1.0d48
cross platform open source driver development framework
Loading...
Searching...
No Matches
dxd::usb_stream_device Class Reference

generic USB device More...

#include <dxd_usb_stream.h>

+ Inheritance diagram for dxd::usb_stream_device:
+ Collaboration diagram for dxd::usb_stream_device:

Classes

class  clock
 
class  stream
 USB stream. More...
 

Public Types

enum  speed {
  low =::kUSBHostConnectionSpeedLow , full =::kUSBHostConnectionSpeedFull , high =::kUSBHostConnectionSpeedHigh , usb1 =full ,
  usb2 =high , low =::kUSBHostConnectionSpeedLow , full =::kUSBHostConnectionSpeedFull , high =::kUSBHostConnectionSpeedHigh ,
  usb1 =full , usb2 =high
}
 
enum  speed {
  low =::kUSBHostConnectionSpeedLow , full =::kUSBHostConnectionSpeedFull , high =::kUSBHostConnectionSpeedHigh , usb1 =full ,
  usb2 =high , low =::kUSBHostConnectionSpeedLow , full =::kUSBHostConnectionSpeedFull , high =::kUSBHostConnectionSpeedHigh ,
  usb1 =full , usb2 =high
}
 

Public Member Functions

os_result clear ()
 
unsigned char configuration () const
 
unsigned char configuration () const
 return available USB configurations
 
os_result configuration (unsigned char configuration)
 
os_result configuration (unsigned char configuration)
 choose USB configuration
 
unsigned char configurations () const
 
unsigned char configurations () const
 return current USB configuration
 
decltype(dx::usb::descriptor::device) descriptor () const
 IOKit: request the USB device descriptor.
 
template<class client_t = ::IOService, typename return_t = os_result, typename exec_arg_t , typename exec_t >
return_t each_child (exec_arg_t exec_arg, exec_t exec)
 apply executor functor for each child
 
template<class client_t = ::IOUserClient, typename return_t = os_result, typename exec_arg_t , typename exec_t >
return_t each_client (exec_arg_t exec_arg, exec_t exec)
 apply executor functor for each user client
 
uint64_t frame () const
 
uint64_t frame () const
 
::IOUSBHostInterface * interface (unsigned char index, unsigned char setting=0)
 IOKit: USB interface.
 
const ::USBD_INTERFACE_INFORMATION * interface (unsigned char index, unsigned char setting=0)
 
template<typename tx_t , typename rx_t >
os_result ioctl (unsigned int ioctl, const tx_t &tx, rx_t &rx)
 convenience ioctl accessor for direct inter-kext IOCTL
 
os_result notify_clients ()
 
 operator const::IOLock * () const
 
 operator::DEVICE_OBJECT * () const
 
 operator::IOLock * ()
 
 operator::IOUSBHostDevice * () const
 IOKit: IOUSBDevice* implicit cast.
 
template<typename type_t >
os_result property (const char *key, type_t &value) const
 provider property request
 
template<typename type_t >
os_result query (const char *key, type_t &value)
 device property request
 
template<>
os_result query (const char *key, unsigned int &value)
 (defined(doxygen)||defined(DXD_EXTERN))
 
template<typename data_t >
os_result request (const dx::usb::control &control, data_t &data)
 IOKit: synchronously sends an USB request.
 
template<typename data_t >
os_result request (const dx::usb::control &control, data_t &data)
 
os_result request (const dx::usb::control &control, void *data, size_t &size)
 
os_result request (const dx::usb::control &control, void *data, size_t &size)
 
os_result set (const char *key, unsigned int value)
 
speed speed () const
 
speed speed () const
 
os_result state () const
 
os_result string (unsigned char idx, char *string, unsigned char &chars)
 
os_result string (unsigned char idx, char *string, unsigned char &chars, dx::usb::language language=dx::usb::language::standard)
 IOKit: request the USB string descriptor for the index.
 
template<typename string_t >
os_result string (unsigned char idx, string_t &string)
 
template<typename string_t >
os_result string (unsigned char idx, string_t &string)
 

Public Attributes

dxd::usb_stream_device::clock clock
 
os_result status =not_initialized
 
scoped< streamstreams [0x20] {}
 

Protected Member Functions

void close_interfaces ()
 
void conclude () override
 IOKit: USB conclude.
 
void conclude () override
 WDK: USB device de-initialization callback.
 
os_result ioctl (unsigned int ioctl, const void *in, size_t size_in, void *out, size_t size_out, size_t &size) override
 usb IOCTL handler
 
os_result launch () override
 IOKit: USB launch.
 
os_result launch () override
 WDK: USB device initialization callback.
 
os_result open (const dx::stream::open< dx::usb::endpoint > &open, dxd::stream::opened< dx::circular > *opened, size_t &size)
 
os_result open_interfaces ()
 
os_result sleep () override
 device PNP sleep virtual method
 
bool start (::IOService *provider) override
 IOKit: USB start.
 
os_result wake () override
 device PNP wake virtual method
 

Detailed Description

generic USB device

Member Enumeration Documentation

◆ speed [1/2]

enum dxd::usb_device::speed
inherited
Todo
enum class
Enumerator
low 
full 
high 
usb1 
usb2 
low 
full 
high 
usb1 
usb2 

◆ speed [2/2]

enum dxd::usb_device::speed
inherited
Enumerator
low 
full 
high 
usb1 
usb2 
low 
full 
high 
usb1 
usb2 

Member Function Documentation

◆ clear()

os_result dxd::usb_device::clear ( )
inlineinherited
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ close_interfaces()

void dxd::usb_device::close_interfaces ( )
inlineprotectedinherited
+ Here is the caller graph for this function:

◆ conclude() [1/2]

void dxd::usb_device::conclude ( )
inlineoverrideprotectedvirtualinherited

IOKit: USB conclude.

This method:

  • iterates over and closes all USB interfaces
  • deselects USB configuration
  • closes the USB device from exclusive access
  • De-selects previosly selected USB configuration,
Todo
investigate if reset() is still needed here
  • closes the USB device, so another driver has the chance to match against (important: this driver will not unload otherwise)

Reimplemented from dxd::device.

+ Here is the call graph for this function:

◆ conclude() [2/2]

void dxd::usb_device::conclude ( )
inlineoverrideprotectedvirtualinherited

WDK: USB device de-initialization callback.

Reimplemented from dxd::device.

+ Here is the call graph for this function:

◆ configuration() [1/4]

unsigned char dxd::usb_device::configuration ( ) const
inlineinherited
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ configuration() [2/4]

unsigned char dxd::usb_device::configuration ( ) const
inlineinherited

return available USB configurations

◆ configuration() [3/4]

os_result dxd::usb_device::configuration ( unsigned char configuration)
inlineinherited
+ Here is the call graph for this function:

◆ configuration() [4/4]

os_result dxd::usb_device::configuration ( unsigned char configuration)
inlineinherited

choose USB configuration

removes interface cache

deselects current configuration on request #0

obtains the configuration descriptor,

obtains all descriptors,

enumerates interfaces in the configuration,

allocates and builds an URB for the select-configuration request,

creates interface cache

enumerates the pipes in the interface information array, which is now filled with pipe information.

+ Here is the call graph for this function:

◆ configurations() [1/2]

unsigned char dxd::usb_device::configurations ( ) const
inlineinherited
+ Here is the call graph for this function:

◆ configurations() [2/2]

unsigned char dxd::usb_device::configurations ( ) const
inlineinherited

return current USB configuration

◆ descriptor()

decltype(dx::usb::descriptor::device) dxd::usb_device::descriptor ( ) const
inlineinherited

IOKit: request the USB device descriptor.

Deprecated
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ each_child()

template<class client_t = ::IOService, typename return_t = os_result, typename exec_arg_t , typename exec_t >
return_t dxd::device::each_child ( exec_arg_t exec_arg,
exec_t exec )
inlineinherited

apply executor functor for each child

◆ each_client()

template<class client_t = ::IOUserClient, typename return_t = os_result, typename exec_arg_t , typename exec_t >
return_t dxd::device::each_client ( exec_arg_t exec_arg,
exec_t exec )
inlineinherited

apply executor functor for each user client

◆ frame() [1/2]

uint64_t dxd::usb_device::frame ( ) const
inlineinherited
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ frame() [2/2]

uint64_t dxd::usb_device::frame ( ) const
inlineinherited
+ Here is the call graph for this function:

◆ interface() [1/2]

::IOUSBHostInterface * dxd::usb_device::interface ( unsigned char index,
unsigned char setting = 0 )
inlineinherited

IOKit: USB interface.

Selects the USB interface

checks interface, if it fails: was it configured?

and selects the (alternate) setting

Parameters
indexindex of the USB interface in the USB configuration
settingsetting # of the USB interface

◆ interface() [2/2]

const ::USBD_INTERFACE_INFORMATION * dxd::usb_device::interface ( unsigned char index,
unsigned char setting = 0 )
inlineinherited

requests settings change,

disposes and creates new interface cache on size change,

and fills interface cache,

◆ ioctl() [1/2]

template<typename tx_t , typename rx_t >
os_result dxd::device::ioctl ( unsigned int ioctl,
const tx_t & tx,
rx_t & rx )
inlineinherited

convenience ioctl accessor for direct inter-kext IOCTL

◆ ioctl() [2/2]

os_result dxd::usb_stream_device::ioctl ( unsigned int ioctl,
const void * in,
size_t size_in,
void * out,
size_t size_out,
size_t & size )
inlineoverrideprotectedvirtual

usb IOCTL handler

virtual ioctl() gets called by the dynax driver framework for usb device IOCTL handling.

implemented handler

  • dx::ioctl::stream::open (user space):
  • dxd::ioctl::stream::open (kernel):

checks endpoint address,

obtains stream index from endpoint address

checks if stream is opened;

detaches mapping from stream

checks endpoint address,

checks stream user mode mapping,

checks endpoint address,

checks stream user mode mapping,

  • dx::ioctl::stream::puid
    • out: USB serial number - if present
    - <i>dx::ioctl::stream::clock::samplerate</i>
        - in: clock domain ID (ignored since the supported devices only
            have one clock domain so far)
            + optional (unsigned int) samplerate,
        - out:
            optional (unsigned int) samplerate, or
            optional dx::iobridge<unsigned int> samplerate map

/

Todo
clean way of switching SR of device or endpoint, /when streams are opened or closed

checks clock domain validity,

prevent samplerate setting when streaming

setup stream DMA to be used with the new samplerate

  • dx::usb::descriptor - obtain generic USB device descriptor
    • in: none,
    • out: dx::usb::device_descriptor
  • dx::usb::string - obtain generic USB device string
    • in: (char) string index,
    • out: unsigned short[] unicode string from device
  • dx::usb::configuration - select/obtain USB configuration
    • in: optional (unsigned char) configuration,
    • out: optional (unsigned char) configuration,
Parameters
ioctlIOCTL
inbuffer pointer containing data from user mode
size_insize of the buffer containing data from user mode
outbuffer pointer accepting data to be returned to user mode
size_outsize of the buffer accepting data to be returned to user mode
sizeactual size of data to be returned to user mode

Reimplemented from dxd::device.

+ Here is the call graph for this function:

◆ launch() [1/2]

os_result dxd::usb_device::launch ( )
inlineoverrideprotectedvirtualinherited

IOKit: USB launch.

This method:

  • opens the USB device for exclusive access,
  • selects default USB configuration
  • iterates over and opens all USB interfaces

Reimplemented from dxd::device.

+ Here is the call graph for this function:

◆ launch() [2/2]

os_result dxd::usb_device::launch ( )
inlineoverrideprotectedvirtualinherited

WDK: USB device initialization callback.

obtain vage speed info

obtains the device descriptor,

and select USB configuration #1.

Reimplemented from dxd::device.

+ Here is the call graph for this function:

◆ notify_clients()

os_result dxd::device::notify_clients ( )
inlineinherited

◆ open()

os_result dxd::usb_stream_device::open ( const dx::stream::open< dx::usb::endpoint > & open,
dxd::stream::opened< dx::circular > * opened,
size_t & size )
inlineprotected

checks endpoint address,

obtains stream index from endpoint address

opens device receiver endpoint and checks its status,

registers this client, and returns

  • kernel space address of shared buffer,
  • kernel data available event pointer
  • kernel backingstore space available pointer
+ Here is the caller graph for this function:

◆ open_interfaces()

os_result dxd::usb_device::open_interfaces ( )
inlineprotectedinherited
+ Here is the caller graph for this function:

◆ operator const::IOLock *()

dxd::mutex::operator const::IOLock * ( ) const
inlineinherited

◆ operator::DEVICE_OBJECT *()

dxd::usb_device::operator::DEVICE_OBJECT * ( ) const
inlineinherited

◆ operator::IOLock *()

dxd::mutex::operator::IOLock * ( )
inlineinherited

◆ operator::IOUSBHostDevice *()

dxd::usb_device::operator::IOUSBHostDevice * ( ) const
inlineinherited

IOKit: IOUSBDevice* implicit cast.

◆ property()

template<typename type_t >
os_result dxd::device::property ( const char * key,
type_t & value ) const
inlineinherited

provider property request

try if property is an OSString

or, try to get it as OSData

+ Here is the caller graph for this function:

◆ query() [1/2]

template<typename type_t >
os_result dxd::device::query ( const char * key,
type_t & value )
inherited

device property request

device string property request

Todo
move into property class

try if property is an OSString

get it as OSData

◆ query() [2/2]

template<>
os_result dxd::device::query ( const char * key,
unsigned int & value )
inherited

(defined(doxygen)||defined(DXD_EXTERN))

device integer property request

◆ request() [1/4]

template<typename data_t >
os_result dxd::usb_device::request ( const dx::usb::control & control,
data_t & data )
inlineinherited

IOKit: synchronously sends an USB request.

Todo
USB device control request timeout
Parameters
controlthe USB request control defining the request type
datadata to transmit or receive
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ request() [2/4]

template<typename data_t >
os_result dxd::usb_device::request ( const dx::usb::control & control,
data_t & data )
inlineinherited
Parameters
controlthe USB request control defining the request type
datadata to transmit or receive
+ Here is the call graph for this function:

◆ request() [3/4]

os_result dxd::usb_device::request ( const dx::usb::control & control,
void * data,
size_t & size )
inlineinherited
Parameters
controlthe USB request control defining the request type
datadata to transmit or receive
sizesize of the actual transaction
+ Here is the call graph for this function:

◆ request() [4/4]

os_result dxd::usb_device::request ( const dx::usb::control & control,
void * data,
size_t & size )
inlineinherited

◆ set()

os_result dxd::device::set ( const char * key,
unsigned int value )
inlineinherited

◆ sleep()

os_result dxd::usb_stream_device::sleep ( )
inlineoverrideprotectedvirtual

device PNP sleep virtual method

virtual sleep() gets called by the dynax driver framework for device PNP sleep handling.

stops all endpoints

Reimplemented from dxd::device.

◆ speed() [1/2]

speed dxd::usb_device::speed ( ) const
inlineinherited

◆ speed() [2/2]

speed dxd::usb_device::speed ( ) const
inlineinherited
Todo
implement WDK low/super speed check for dxd::usb_device.speed()

◆ start()

bool dxd::usb_device::start ( ::IOService * provider)
inlineoverrideprotectedinherited

IOKit: USB start.

+ Here is the caller graph for this function:

◆ state()

os_result dxd::usb_device::state ( ) const
inlineinherited
Todo
find out if isInactive() is equivalent to getState()
+ Here is the caller graph for this function:

◆ string() [1/4]

os_result dxd::usb_device::string ( unsigned char idx,
char * string,
unsigned char & chars )
inlineinherited

◆ string() [2/4]

os_result dxd::usb_device::string ( unsigned char idx,
char * string,
unsigned char & chars,
dx::usb::language language = dx::usb::language::standard )
inlineinherited

IOKit: request the USB string descriptor for the index.

Parameters
idxindex of the string to request
stringpreallocated string buffer
charsnumber of characters returned
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ string() [3/4]

template<typename string_t >
os_result dxd::usb_device::string ( unsigned char idx,
string_t & string )
inlineinherited
+ Here is the call graph for this function:

◆ string() [4/4]

template<typename string_t >
os_result dxd::usb_device::string ( unsigned char idx,
string_t & string )
inlineinherited
+ Here is the call graph for this function:

◆ wake()

os_result dxd::usb_stream_device::wake ( )
inlineoverrideprotectedvirtual

device PNP wake virtual method

virtual wake() gets called by the dynax driver framework for device PNP wake handling.

starts all endpoints

Reimplemented from dxd::device.

Member Data Documentation

◆ clock

dxd::usb_stream_device::clock dxd::usb_stream_device::clock

◆ status

os_result dxd::mutex::status =not_initialized
inherited

◆ streams

scoped<stream> dxd::usb_stream_device::streams[0x20] {}

list of open streams


The documentation for this class was generated from the following file:

(c) copyright 2009 dynamic acoustics e.U. generated on Fri Feb 23 2024

a closed source license may be obtained by requesting a written permission from dynamic acoustics e.U.
however - governmental use generally and military use especially is strictly prohibited though.