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

116 lines
3.5 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 pywinusb.hid as hid
except:
if os.name == "nt":
logging.error("PyWinUSB is required on a Windows Machine")
class PyWinUSB(Interface):
"""
This class provides basic functions to access
a USB HID device using pywinusb:
- write/read an endpoint
"""
vid = 0
pid = 0
def __init__(self):
# Vendor page and usage_id = 2
self.report = []
self.rcv_data = []
self.device = None
return
# handler called when a report is received
def rx_handler(self, data):
#logging.debug("rcv: %s", data[1:])
self.rcv_data.append(data[1:])
def open(self):
self.device.set_raw_data_handler(self.rx_handler)
self.device.open()
@staticmethod
def getAllConnectedInterface(vid, pid):
"""
returns all the connected devices which matches PyWinUSB.vid/PyWinUSB.pid.
returns an array of PyWinUSB (Interface) objects
"""
all_devices = hid.find_all_hid_devices()
# keep devices with good vid/pid
for d in all_devices:
if (d.vendor_id != vid) or (d.product_id != pid):
all_devices.remove(d)
if not all_devices:
logging.debug("No Mbed device connected")
return
boards = []
for dev in all_devices:
try:
dev.open()
report = dev.find_output_reports()
if (len(report) == 1):
new_board = PyWinUSB()
new_board.report = report[0]
new_board.vendor_name = dev.vendor_name
new_board.product_name = dev.product_name
new_board.vid = dev.vendor_id
new_board.pid = dev.product_id
new_board.device = dev
new_board.device.set_raw_data_handler(new_board.rx_handler)
boards.append(new_board)
except Exception as e:
logging.error("Receiving Exception: %s", e)
dev.close()
return boards
def write(self, data):
"""
write data on the OUT endpoint associated to the HID interface
"""
for _ in range(64 - len(data)):
data.append(0)
#logging.debug("send: %s", data)
self.report.send([0] + data)
return
def read(self, timeout = -1):
"""
read data on the IN endpoint associated to the HID interface
"""
while len(self.rcv_data) == 0:
pass
return self.rcv_data.pop(0)
def close(self):
"""
close the interface
"""
logging.debug("closing interface")
self.device.close()