123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252 |
- # Copyright (C) 2009-2011 Wander Lairson Costa
- #
- # The following terms apply to all files associated
- # with the software unless explicitly disclaimed in individual files.
- #
- # The authors hereby grant permission to use, copy, modify, distribute,
- # and license this software and its documentation for any purpose, provided
- # that existing copyright notices are retained in all copies and that this
- # notice is included verbatim in any distributions. No written agreement,
- # license, or royalty fee is required for any of the authorized uses.
- # Modifications to this software may be copyrighted by their authors
- # and need not follow the licensing terms described here, provided that
- # the new terms are clearly indicated on the first page of each file where
- # they apply.
- #
- # IN NO EVENT SHALL THE AUTHORS OR DISTRIBUTORS BE LIABLE TO ANY PARTY
- # FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
- # ARISING OUT OF THE USE OF THIS SOFTWARE, ITS DOCUMENTATION, OR ANY
- # DERIVATIVES THEREOF, EVEN IF THE AUTHORS HAVE BEEN ADVISED OF THE
- # POSSIBILITY OF SUCH DAMAGE.
- #
- # THE AUTHORS AND DISTRIBUTORS SPECIFICALLY DISCLAIM ANY WARRANTIES,
- # INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY,
- # FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. THIS SOFTWARE
- # IS PROVIDED ON AN "AS IS" BASIS, AND THE AUTHORS AND DISTRIBUTORS HAVE
- # NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR
- # MODIFICATIONS.
- r"""usb.control - USB standard control requests
- This module exports:
- get_status - get recipeint status
- clear_feature - clear a recipient feature
- set_feature - set a recipient feature
- get_descriptor - get a device descriptor
- set_descriptor - set a device descriptor
- get_configuration - get a device configuration
- set_configuration - set a device configuration
- get_interface - get a device interface
- set_interface - set a device interface
- """
- __author__ = 'Wander Lairson Costa'
- __all__ = ['get_status',
- 'clear_feature',
- 'set_feature',
- 'get_descriptor',
- 'set_descriptor',
- 'get_configuration',
- 'set_configuration',
- 'get_interface',
- 'set_interface',
- 'ENDPOINT_HALT',
- 'FUNCTION_SUSPEND',
- 'DEVICE_REMOTE_WAKEUP',
- 'U1_ENABLE',
- 'U2_ENABLE',
- 'LTM_ENABLE']
- import usb.util as util
- import usb.core as core
- def _parse_recipient(recipient, direction):
- if recipient is None:
- r = util.CTRL_RECIPIENT_DEVICE
- wIndex = 0
- elif isinstance(recipient, core.Interface):
- r = util.CTRL_RECIPIENT_INTERFACE
- wIndex = recipient.bInterfaceNumber
- elif isinstance(recipient, core.Endpoint):
- r = util.CTRL_RECIPIENT_ENDPOINT
- wIndex = recipient.bEndpointAddress
- else:
- raise ValueError('Invalid recipient.')
- bmRequestType = util.build_request_type(
- direction,
- util.CTRL_TYPE_STANDARD,
- r
- )
- return (bmRequestType, wIndex)
- # standard feature selectors from USB 2.0/3.0
- ENDPOINT_HALT = 0
- FUNCTION_SUSPEND = 0
- DEVICE_REMOTE_WAKEUP = 1
- U1_ENABLE = 48
- U2_ENABLE = 49
- LTM_ENABLE = 50
- def get_status(dev, recipient = None):
- r"""Return the status for the specified recipient.
- dev is the Device object to which the request will be
- sent to.
- The recipient can be None (on which the status will be queried
- on the device), an Interface or Endpoint descriptors.
- The status value is returned as an integer with the lower
- word being the two bytes status value.
- """
- bmRequestType, wIndex = _parse_recipient(recipient, util.CTRL_IN)
- ret = dev.ctrl_transfer(bmRequestType = bmRequestType,
- bRequest = 0x00,
- wIndex = wIndex,
- data_or_wLength = 2)
- return ret[0] | (ret[1] << 8)
- def clear_feature(dev, feature, recipient = None):
- r"""Clear/disable a specific feature.
- dev is the Device object to which the request will be
- sent to.
- feature is the feature you want to disable.
- The recipient can be None (on which the status will be queried
- on the device), an Interface or Endpoint descriptors.
- """
- bmRequestType, wIndex = _parse_recipient(recipient, util.CTRL_OUT)
- dev.ctrl_transfer(bmRequestType = bmRequestType,
- bRequest = 0x01,
- wIndex = wIndex,
- wValue = feature)
- def set_feature(dev, feature, recipient = None):
- r"""Set/enable a specific feature.
- dev is the Device object to which the request will be
- sent to.
- feature is the feature you want to enable.
- The recipient can be None (on which the status will be queried
- on the device), an Interface or Endpoint descriptors.
- """
- bmRequestType, wIndex = _parse_recipient(recipient, util.CTRL_OUT)
- dev.ctrl_transfer(bmRequestType = bmRequestType,
- bRequest = 0x03,
- wIndex = wIndex,
- wValue = feature)
- def get_descriptor(dev, desc_size, desc_type, desc_index, wIndex = 0):
- r"""Return the specified descriptor.
- dev is the Device object to which the request will be
- sent to.
- desc_size is the descriptor size.
- desc_type and desc_index are the descriptor type and index,
- respectively. wIndex index is used for string descriptors
- and represents the Language ID. For other types of descriptors,
- it is zero.
- """
- wValue = desc_index | (desc_type << 8)
- bmRequestType = util.build_request_type(
- util.CTRL_IN,
- util.CTRL_TYPE_STANDARD,
- util.CTRL_RECIPIENT_DEVICE
- )
- return dev.ctrl_transfer(
- bmRequestType = bmRequestType,
- bRequest = 0x06,
- wValue = wValue,
- wIndex = wIndex,
- data_or_wLength = desc_size
- )
- def set_descriptor(dev, desc, desc_type, desc_index, wIndex = None):
- r"""Update an existing descriptor or add a new one.
- dev is the Device object to which the request will be
- sent to.
- The desc parameter is the descriptor to be sent to the device.
- desc_type and desc_index are the descriptor type and index,
- respectively. wIndex index is used for string descriptors
- and represents the Language ID. For other types of descriptors,
- it is zero.
- """
- wValue = desc_index | (desc_type << 8)
- bmRequestType = util.build_request_type(
- util.CTRL_OUT,
- util.CTRL_TYPE_STANDARD,
- util.CTRL_RECIPIENT_DEVICE
- )
- dev.ctrl_transfer(
- bmRequestType = bmRequestType,
- bRequest = 0x07,
- wValue = wValue,
- wIndex = wIndex,
- data_or_wLength = desc
- )
- def get_configuration(dev):
- r"""Get the current active configuration of the device.
- dev is the Device object to which the request will be
- sent to.
- This function differs from the Device.get_active_configuration
- method because the later may use cached data, while this
- function always does a device request.
- """
- bmRequestType = util.build_request_type(
- util.CTRL_IN,
- util.CTRL_TYPE_STANDARD,
- util.CTRL_RECIPIENT_DEVICE
- )
- return dev.ctrl_transfer(
- bmRequestType,
- bRequest = 0x08,
- data_or_wLength = 1
- )[0]
- def set_configuration(dev, bConfigurationNumber):
- r"""Set the current device configuration.
- dev is the Device object to which the request will be
- sent to.
- """
- dev.set_configuration(bConfigurationNumber)
- def get_interface(dev, bInterfaceNumber):
- r"""Get the current alternate setting of the interface.
- dev is the Device object to which the request will be
- sent to.
- """
- bmRequestType = util.build_request_type(
- util.CTRL_IN,
- util.CTRL_TYPE_STANDARD,
- util.CTRL_RECIPIENT_INTERFACE
- )
- return dev.ctrl_transfer(
- bmRequestType = bmRequestType,
- bRequest = 0x0a,
- wIndex = bInterfaceNumber,
- data_or_wLength = 1
- )[0]
- def set_interface(dev, bInterfaceNumber, bAlternateSetting):
- r"""Set the alternate setting of the interface.
- dev is the Device object to which the request will be
- sent to.
- """
- dev.set_interface_altsetting(bInterfaceNumber, bAlternateSetting)
|