mirror of https://github.com/ARMmbed/mbed-os.git
116 lines
3.5 KiB
Python
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()
|