pyedbglib.hidtransport¶
pyedbglib.hidtransport.cyhidapi¶
HID transport layer based on Cython and Hidapi
- class pyedbglib.hidtransport.cyhidapi.CyHidApiTransport¶
Bases:
HidTransportBase
Implements all Cython / HIDAPI transport methods
- detect_devices()¶
Detect connected CMSIS-DAP devices, populating an internal list
- Returns:
number of devices connected
- hid_connect(device)¶
Make a HID connection to the debugger
- Parameters:
device – USB device to connect to
- hid_disconnect()¶
Disconnect from HID
- hid_info()¶
Retrieve USB descriptor information
- hid_read()¶
Reads HID data
- Returns:
data read
- hid_transfer(data_send)¶
Sends HID data and receives response
- Parameters:
data_send –
- Returns:
response
- hid_write(data_send)¶
Sends HID data
- Parameters:
data_send – data to send
- Returns:
number of bytes sent
pyedbglib.hidtransport.hidtransportbase¶
Base class for all HID transport mechanisms.
- class pyedbglib.hidtransport.hidtransportbase.HidTool(vendor_id, product_id, serial_number, product_string='', manufacturer_string='')¶
Bases:
object
Holds transport and DAP properties of a CMSIS-DAP debugger.
Used to select the debugger to use if multiple debuggers are connected.
- set_packet_size(packet_size)¶
Sets the packet size
- Parameters:
packet_size – bytes per packet
- set_product_string(product_string)¶
Sets the product string
- Parameters:
product_string – product name string
- class pyedbglib.hidtransport.hidtransportbase.HidTransportBase¶
Bases:
object
Base class for HID transports
- connect(serial_number=None, product=None)¶
Makes a HID connection to a debugger
- Parameters:
serial_number – instance serial number to connect to
product – product type to connect to
- Returns:
True if successfully connected to a tool, False if not
- detect_devices()¶
Raise error as this method needs to be overridden.
- disconnect()¶
Release the HID connection
- get_matching_tools(serial_number_substring='', product=None)¶
Returns a list of tools matching the given serial_number_substring and product.
- Parameters:
serial_number_substring –
can be an empty string or a subset of a serial number. Not case sensitive This function will do matching of the last part of the devices serial numbers to the serial_number_substring. Examples:
’123’ will match “MCHP3252000000043123” but not “MCP32520001230000000”
’’ will match any serial number
product – product type to connect to. If None any tool matching the serial_number_substring will be returned
- Returns:
List of matching tools
- get_report_size()¶
Get the packet size in bytes
- Returns:
bytes per packet/report
- hid_connect(device)¶
Raise error as this method needs to be overridden.
- hid_disconnect()¶
Raise error as this method needs to be overridden.
- hid_info()¶
Raise error as this method needs to be overridden.
pyedbglib.hidtransport.hidtransportfactory¶
Factory for HID transport connections.
Currently supports only Cython/HIDAPI
- pyedbglib.hidtransport.hidtransportfactory.hid_transport(library='hidapi')¶
Dispatch a transport layer for the OS in question
The transport layer is typically used to connect to a tool and then it is passed in as a parameter when creating protocol objects. An example where the transport layer is used to create an instance of the housekeepingprotocol for communication with the PKOB nano (nEDBG) debugger:
from pyedbglib.hidtransport.hidtransportfactory import hid_transport transport = hid_transport() connect_status = False try: connect_status = transport.connect(serial_number='', product='nedbg') except IOError as error: print("Unable to connect to USB device ({})".format(error)) if not connect_status: print("Unable to connect to USB device") housekeeper = housekeepingprotocol.Jtagice3HousekeepingProtocol(transport)
- Parameters:
library (string) – Transport library to use, currently only ‘hidapi’ is supported which will use the libusb hidapi
- Returns:
Instance of transport layer object
- Return type:
class:cyhidapi:CyHidApiTransport
- Raises:
PyedbglibNotSupportedError – if library specified is not supported
pyedbglib.hidtransport.toolinfo¶
Gathering of all known Microchip CMSIS-DAP debuggers and default EP sizes
- pyedbglib.hidtransport.toolinfo.TOOL_SHORTNAME_TO_USB_PRODUCT_STRING = {'atmelice': 'Atmel-ICE', 'edbg': 'EDBG', 'icd4': 'MPLAB ICD 4', 'ice4': 'MPLAB ICE 4', 'jtagice3': 'JTAGICE3', 'medbg': 'mEDBG', 'nedbg': 'nEDBG', 'pickit4': 'MPLAB PICkit 4', 'powerdebugger': 'Power Debugger', 'snap': 'MPLAB Snap'}¶
Some Atmel/Microchip ‘3G’ tools (EDBG, Atmel-ICE, PowerDebugger) have ‘dual configuration’ HID interfaces. The ‘default’ configuration has a 512-byte HID report size, while the ‘strict’ and ‘minimal’ configurations both have 64-byte report size. The switching mechanism is not implemented in a USB-standard way; it is managed using atprogram.exe (part of Microchip Studio 7) and the configuration is persistent in the tool.
- The configuration currently in use can be determined by:
atprogram.exe parameters –get-ep-size
- and the configuration can be altered by:
atprogram.exe parameters –set-ep-size [default|strict|minimal]
- On Linux and Mac the configuration can be detected using usb.core, see:
def detect_hid_packet_size(product_id, serial_number):
- On Windows the configuration is adjusted after connecting, see:
def adjust_hid_packet_size(transport, device):
- pyedbglib.hidtransport.toolinfo.adjust_hid_packet_size(transport, device)¶
Active HIDAPI based HID packet size detection and adjustment
Detecting report size using the descriptor before connecting is not simple on Windows. Instead an active detection is done after connecting by sending a small packet to ask the tool for its frame size. This query frame is small enough to succeed on both 64- and 512-byte variants, and an adjustment can be made after detection since HIDAPI on Windows is tolerant to EP-size mismatches.
- Parameters:
transport – HID transport object, already connected
device – device currently connected. Size is adjusted before returning
- pyedbglib.hidtransport.toolinfo.detect_hid_packet_size(product_id, serial_number)¶
pyUSB based HID packet size detection
On Linux and Mac the configuration in use can easily be determined by inspecting the descriptor.
- Parameters:
product_id – USB PID to look for
serial_number – USB serial number to match
- Returns:
detected report size, or 0 if no match is found
- pyedbglib.hidtransport.toolinfo.get_default_report_size(pid)¶
Retrieve default EP report size based on known PIDs
- Parameters:
pid – product ID
- Returns:
packet size
- pyedbglib.hidtransport.toolinfo.tool_shortname_to_product_string_name(shortname)¶
Mapping for common short names of tools to product string name
The intention is that this function is always run on the tool name and that the conversion only happens if the name is a known shortname. If the shortname is not known of if the name provided is already a valid Product string name then the provided shortname parameter will just be returned unchanged. So if the name already is a correct Product string name it is still safe to run this conversion funtion on it.
- Parameters:
shortname – shortname typically used by atbackend (powerdebugger, atmelice etc.)
- Returns:
String to look for in USB product strings to identify the tool