1773f019ad9fc836d9aa1a36fff38158aad38239
[pub/lufa.git] / Bootloaders / HID / HostLoaderApp_Python / hid_bootloader_loader.py
1 """
2 LUFA Library
3 Copyright (C) Dean Camera, 2013.
4
5 dean [at] fourwalledcubicle [dot] com
6 www.lufa-lib.org
7 """
8
9 """
10 Front-end programmer for the LUFA HID class bootloader.
11
12 Usage:
13 python hid_bootloader_loader.py <Device> <Input>.hex
14
15 Example:
16 python hid_bootloader_loader.py at90usb1287 Mouse.hex
17
18 Requires the pywinusb (https://pypi.python.org/pypi/pywinusb/) and
19 IntelHex (http://bialix.com/intelhex/) libraries.
20 """
21
22 import sys
23 import pywinusb.hid as hid
24 from intelhex import IntelHex
25
26 # Device information table
27 device_info_map = dict()
28 device_info_map['at90usb1287'] = {'page_size': 256, 'flash_kb': 128}
29 device_info_map['at90usb1286'] = {'page_size': 256, 'flash_kb': 128}
30 device_info_map['at90usb647'] = {'page_size': 256, 'flash_kb': 64}
31 device_info_map['at90usb646'] = {'page_size': 256, 'flash_kb': 64}
32 device_info_map['atmega32u4'] = {'page_size': 128, 'flash_kb': 32}
33 device_info_map['atmega32u2'] = {'page_size': 128, 'flash_kb': 32}
34 device_info_map['atmega16u4'] = {'page_size': 128, 'flash_kb': 16}
35 device_info_map['atmega16u2'] = {'page_size': 128, 'flash_kb': 16}
36 device_info_map['at90usb162'] = {'page_size': 128, 'flash_kb': 16}
37 device_info_map['atmega8u2'] = {'page_size': 128, 'flash_kb': 8}
38 device_info_map['at90usb82'] = {'page_size': 128, 'flash_kb': 8}
39
40
41 def get_hid_device_handle():
42 hid_device_filter = hid.HidDeviceFilter(vendor_id=0x03EB,
43 product_id=0x2067)
44
45 valid_hid_devices = hid_device_filter.get_devices()
46
47 if len(valid_hid_devices) is 0:
48 return None
49 else:
50 return valid_hid_devices[0]
51
52
53 def send_page_data(hid_device, address, data):
54 output_report_data = [0]
55 output_report_data.extend([address & 0xFF, address >> 8])
56 output_report_data.extend(data)
57
58 hid_device.send_output_report(output_report_data)
59
60
61 def main(hex_filename, device_info):
62 hid_device = get_hid_device_handle()
63
64 if hid_device is None:
65 print("No valid HID device found.")
66 sys.exit(1)
67
68 try:
69 hid_device.open()
70
71 print("Connected to bootloader.")
72
73 hex_data = IntelHex(hex_filename)
74
75 for addr in range(0, hex_data.maxaddr(), device_info['page_size']):
76 page_data = [hex_data[i] for i in range(addr, addr+device_info['page_size'])]
77
78 print("Writing address 0x%04X-0x%04X" % (addr, addr+device_info['page_size']))
79
80 if device_info['flash_kb'] < 64:
81 send_page_data(hid_device, addr, page_data)
82 else:
83 send_page_data(hid_device, addr >> 8, page_data)
84
85 print("Programming complete, starting application.")
86 send_page_data(hid_device, 0xFFFF, [0] * device_info['page_size'])
87
88 finally:
89 hid_device.close()
90
91
92 if __name__ == '__main__':
93 hex_filename = sys.argv[2]
94
95 try:
96 device_info = device_info_map[sys.argv[1]]
97 except:
98 print("Unknown device name specified.")
99 sys.exit(1)
100
101 main(hex_filename, device_info)