mbed-os/workspace_tools/debugger/pyOCD/interface/pyusb_backend.py

139 lines
4.7 KiB
Python

"""
mbed CMSIS-DAP debugger
Copyright (c) 2006-2013 ARM Limited
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
"""
from interface import Interface
import logging, os
try:
import usb.core
import usb.util
except:
if os.name == "posix":
logging.error("PyUSB is required on a Linux Machine")
class PyUSB(Interface):
"""
This class provides basic functions to access
a USB HID device using pyusb:
- write/read an endpoint
"""
vid = 0
pid = 0
def __init__(self):
self.ep_out = None
self.ep_in = None
self.dev = None
@staticmethod
def getAllConnectedInterface(vid, pid):
"""
returns all the connected devices which matches PyUSB.vid/PyUSB.pid.
returns an array of PyUSB (Interface) objects
"""
# find all devices matching the vid/pid specified
all_devices = usb.core.find(find_all=True, idVendor=vid, idProduct=pid)
if all_devices is None:
logging.debug("No device connected")
return None
boards = []
# iterate on all devices found
for board in all_devices:
intf_number = 0
found = False
# get active config
config = board.get_active_configuration()
# iterate on all interfaces:
# - if we found a HID interface -> CMSIS-DAP
for interface in config:
if interface.bInterfaceClass == 0x03:
intf_number = interface.bInterfaceNumber
found = True
break
if found == False:
continue
try:
if board.is_kernel_driver_active(intf_number) is True:
board.detach_kernel_driver(intf_number)
except Exception as e:
print e
pass
intf = usb.util.find_descriptor(config, bInterfaceNumber = intf_number)
ep_out = usb.util.find_descriptor(intf,
# match the first OUT endpoint
custom_match = \
lambda e: \
usb.util.endpoint_direction(e.bEndpointAddress) == \
usb.util.ENDPOINT_OUT
)
ep_in = usb.util.find_descriptor(intf,
# match the first IN endpoint
custom_match = \
lambda e: \
usb.util.endpoint_direction(e.bEndpointAddress) == \
usb.util.ENDPOINT_IN
)
product_name = usb.util.get_string(board, 256, 2)
vendor_name = usb.util.get_string(board, 256, 1)
if ep_out is None or ep_in is None:
logging.error('Endpoints not found')
return None
new_board = PyUSB()
new_board.ep_in = ep_in
new_board.ep_out = ep_out
new_board.dev = board
new_board.vid = vid
new_board.pid = pid
new_board.product_name = product_name
new_board.vendor_name = vendor_name
boards.append(new_board)
return boards
def write(self, data):
"""
write data on the OUT endpoint associated to the HID interface
"""
if self.ep_out is None:
raise ValueError('EP_OUT endpoint is NULL')
self.ep_out.write(data)
#logging.debug('sent: %s', data)
return
def read(self, timeout = -1):
"""
read data on the IN endpoint associated to the HID interface
"""
if self.ep_in is None:
raise ValueError('EP_IN endpoint is NULL')
data = self.ep_in.read(self.ep_in.wMaxPacketSize, timeout)
#logging.debug('received: %s', data)
return data