Mercurial > louis > kiibohd-controller
annotate LoadFile/teensy_loader_cli.c @ 412:e7a3be42ae1e
Debug code for interconnect cable debugging
author | Jacob Alexander <haata@kiibohd.com> |
---|---|
date | Sat, 20 Feb 2016 13:27:49 -0800 |
parents | ab4515606277 |
children |
rev | line source |
---|---|
129
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
1 /* Teensy Loader, Command Line Interface |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
2 * Program and Reboot Teensy Board with HalfKay Bootloader |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
3 * http://www.pjrc.com/teensy/loader_cli.html |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
4 * Copyright 2008-2010, PJRC.COM, LLC |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
5 * Modifications 2014, Jacob Alexander <haata@kiibohd.com> |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
6 * |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
7 * You may redistribute this program and/or modify it under the terms |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
8 * of the GNU General Public License as published by the Free Software |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
9 * Foundation, version 3 of the License. |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
10 * |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
11 * This program is distributed in the hope that it will be useful, |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
14 * GNU General Public License for more details. |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
15 * |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
16 * You should have received a copy of the GNU General Public License |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
17 * along with this program. If not, see http://www.gnu.org/licenses/ |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
18 */ |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
19 |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
20 /* Want to incorporate this code into a proprietary application?? |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
21 * Just email paul@pjrc.com to ask. Usually it's not a problem, |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
22 * but you do need to ask to use this code in any way other than |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
23 * those permitted by the GNU General Public License, version 3 */ |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
24 |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
25 /* For non-root permissions on ubuntu or similar udev-based linux |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
26 * http://www.pjrc.com/teensy/49-teensy.rules |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
27 */ |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
28 |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
29 |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
30 #include <stdio.h> |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
31 #include <stdlib.h> |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
32 #include <stdint.h> |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
33 #include <stdarg.h> |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
34 #include <string.h> |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
35 #include <unistd.h> |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
36 |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
37 void usage(void) |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
38 { |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
39 fprintf(stderr, "Usage: teensy_loader_cli -mmcu=<MCU> [-w] [-h] [-n] [-v] <file.hex>\n"); |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
40 fprintf(stderr, "\t-w : Wait for device to appear\n"); |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
41 fprintf(stderr, "\t-r : Use hard reboot if device not online\n"); |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
42 fprintf(stderr, "\t-n : No reboot after programming\n"); |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
43 fprintf(stderr, "\t-v : Verbose output\n"); |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
44 #if defined(USE_LIBUSB) |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
45 fprintf(stderr, "\n<MCU> = atmega32u4 | at90usb162 | at90usb646 | at90usb1286 | mk20dx128 | mk20dx256\n"); |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
46 #else |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
47 fprintf(stderr, "\n<MCU> = atmega32u4 | at90usb162 | at90usb646 | at90usb1286\n"); |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
48 #endif |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
49 fprintf(stderr, "\nFor more information, please visit:\n"); |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
50 fprintf(stderr, "http://www.pjrc.com/teensy/loader_cli.html\n"); |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
51 exit(1); |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
52 } |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
53 |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
54 // USB Access Functions |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
55 int teensy_open(void); |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
56 int teensy_write(void *buf, int len, double timeout); |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
57 void teensy_close(void); |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
58 int hard_reboot(void); |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
59 |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
60 // Intel Hex File Functions |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
61 int read_intel_hex(const char *filename); |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
62 int ihex_bytes_within_range(int begin, int end); |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
63 void ihex_get_data(int addr, int len, unsigned char *bytes); |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
64 int memory_is_blank(int addr, int block_size); |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
65 |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
66 // Misc stuff |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
67 int printf_verbose(const char *format, ...); |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
68 void delay(double seconds); |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
69 void die(const char *str, ...); |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
70 void parse_options(int argc, char **argv); |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
71 |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
72 // options (from user via command line args) |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
73 int wait_for_device_to_appear = 0; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
74 int hard_reboot_device = 0; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
75 int reboot_after_programming = 1; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
76 int verbose = 0; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
77 int code_size = 0, block_size = 0; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
78 const char *filename=NULL; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
79 |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
80 |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
81 /****************************************************************/ |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
82 /* */ |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
83 /* Main Program */ |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
84 /* */ |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
85 /****************************************************************/ |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
86 |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
87 int main(int argc, char **argv) |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
88 { |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
89 unsigned char buf[2048]; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
90 int num, addr, r, write_size=block_size+2; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
91 int first_block=1, waited=0; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
92 |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
93 // parse command line arguments |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
94 parse_options(argc, argv); |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
95 if (!filename) { |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
96 fprintf(stderr, "Filename must be specified\n\n"); |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
97 usage(); |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
98 } |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
99 if (!code_size) { |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
100 fprintf(stderr, "MCU type must be specified\n\n"); |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
101 usage(); |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
102 } |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
103 printf_verbose("Teensy Loader, Command Line, Version 2.0, Kiibohd-Mods\n"); |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
104 |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
105 // read the intel hex file |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
106 // this is done first so any error is reported before using USB |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
107 num = read_intel_hex(filename); |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
108 if (num < 0) die("error reading intel hex file \"%s\"", filename); |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
109 printf_verbose("Read \"%s\": %d bytes, %.1f%% usage\n", |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
110 filename, num, (double)num / (double)code_size * 100.0); |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
111 |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
112 // open the USB device |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
113 while (1) { |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
114 if (teensy_open()) break; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
115 if (hard_reboot_device) { |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
116 if (!hard_reboot()) die("Unable to find rebootor\n"); |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
117 printf_verbose("Hard Reboot performed\n"); |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
118 hard_reboot_device = 0; // only hard reboot once |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
119 wait_for_device_to_appear = 1; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
120 } |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
121 if (!wait_for_device_to_appear) die("Unable to open device\n"); |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
122 if (!waited) { |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
123 printf_verbose("Waiting for Teensy device...\n"); |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
124 printf_verbose(" (hint: press the reset button)\n"); |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
125 waited = 1; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
126 } |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
127 delay(0.25); |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
128 } |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
129 printf_verbose("Found HalfKay Bootloader\n"); |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
130 |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
131 // if we waited for the device, read the hex file again |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
132 // perhaps it changed while we were waiting? |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
133 if (waited) { |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
134 num = read_intel_hex(filename); |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
135 if (num < 0) die("error reading intel hex file \"%s\"", filename); |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
136 printf_verbose("Read \"%s\": %d bytes, %.1f%% usage\n", |
308 | 137 filename, num, (double)num / (double)code_size * 100.0); |
129
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
138 } |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
139 |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
140 // program the data |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
141 printf_verbose("Programming"); |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
142 fflush(stdout); |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
143 for (addr = 0; addr < code_size; addr += block_size) { |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
144 if (!first_block && !ihex_bytes_within_range(addr, addr + block_size - 1)) { |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
145 // don't waste time on blocks that are unused, |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
146 // but always do the first one to erase the chip |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
147 continue; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
148 } |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
149 if (!first_block && memory_is_blank(addr, block_size)) continue; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
150 printf_verbose("."); |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
151 if (code_size < 0x10000) { |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
152 buf[0] = addr & 255; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
153 buf[1] = (addr >> 8) & 255; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
154 ihex_get_data(addr, block_size, buf + 2); |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
155 write_size = block_size + 2; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
156 } else if (block_size == 256) { |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
157 buf[0] = (addr >> 8) & 255; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
158 buf[1] = (addr >> 16) & 255; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
159 ihex_get_data(addr, block_size, buf + 2); |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
160 write_size = block_size + 2; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
161 } else if (block_size >= 1024) { |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
162 buf[0] = addr & 255; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
163 buf[1] = (addr >> 8) & 255; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
164 buf[2] = (addr >> 16) & 255; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
165 memset(buf + 3, 0, 61); |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
166 ihex_get_data(addr, block_size, buf + 64); |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
167 write_size = block_size + 64; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
168 } else { |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
169 die("Unknown code/block size\n"); |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
170 } |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
171 r = teensy_write(buf, write_size, first_block ? 3.0 : 0.25); |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
172 if (!r) die("error writing to Teensy\n"); |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
173 first_block = 0; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
174 } |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
175 printf_verbose("\n"); |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
176 |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
177 // reboot to the user's new code |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
178 if (reboot_after_programming) { |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
179 printf_verbose("Booting\n"); |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
180 buf[0] = 0xFF; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
181 buf[1] = 0xFF; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
182 buf[2] = 0xFF; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
183 memset(buf + 3, 0, sizeof(buf) - 3); |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
184 teensy_write(buf, write_size, 0.25); |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
185 } |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
186 teensy_close(); |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
187 return 0; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
188 } |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
189 |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
190 |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
191 |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
192 |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
193 /****************************************************************/ |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
194 /* */ |
145
3d21ecd24e31
Windows is now working with libusb1.0 for the teensy-loader-cli.
Jacob Alexander <haata@kiibohd.com>
parents:
144
diff
changeset
|
195 /* USB Access - libusb (Linux, Windows & FreeBSD) */ |
129
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
196 /* */ |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
197 /****************************************************************/ |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
198 |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
199 #if defined(USE_LIBUSB) |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
200 |
144
35acc12e98d3
Porting teensy-loader-cli to use libusb-1.0 (from 0.1).
Jacob Alexander <haata@kiibohd.com>
parents:
129
diff
changeset
|
201 #include <libusb-1.0/libusb.h> |
129
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
202 |
144
35acc12e98d3
Porting teensy-loader-cli to use libusb-1.0 (from 0.1).
Jacob Alexander <haata@kiibohd.com>
parents:
129
diff
changeset
|
203 struct libusb_device_handle *open_usb_device( int vid, int pid ) |
129
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
204 { |
144
35acc12e98d3
Porting teensy-loader-cli to use libusb-1.0 (from 0.1).
Jacob Alexander <haata@kiibohd.com>
parents:
129
diff
changeset
|
205 libusb_device **devs; |
35acc12e98d3
Porting teensy-loader-cli to use libusb-1.0 (from 0.1).
Jacob Alexander <haata@kiibohd.com>
parents:
129
diff
changeset
|
206 struct libusb_device_handle *handle = NULL; |
35acc12e98d3
Porting teensy-loader-cli to use libusb-1.0 (from 0.1).
Jacob Alexander <haata@kiibohd.com>
parents:
129
diff
changeset
|
207 struct libusb_device_handle *ret = NULL; |
35acc12e98d3
Porting teensy-loader-cli to use libusb-1.0 (from 0.1).
Jacob Alexander <haata@kiibohd.com>
parents:
129
diff
changeset
|
208 |
35acc12e98d3
Porting teensy-loader-cli to use libusb-1.0 (from 0.1).
Jacob Alexander <haata@kiibohd.com>
parents:
129
diff
changeset
|
209 if ( libusb_init( NULL ) != 0 ) |
35acc12e98d3
Porting teensy-loader-cli to use libusb-1.0 (from 0.1).
Jacob Alexander <haata@kiibohd.com>
parents:
129
diff
changeset
|
210 fprintf( stderr, "libusb_init failed.\n" ); |
35acc12e98d3
Porting teensy-loader-cli to use libusb-1.0 (from 0.1).
Jacob Alexander <haata@kiibohd.com>
parents:
129
diff
changeset
|
211 |
35acc12e98d3
Porting teensy-loader-cli to use libusb-1.0 (from 0.1).
Jacob Alexander <haata@kiibohd.com>
parents:
129
diff
changeset
|
212 size_t count = libusb_get_device_list( NULL, &devs ); |
35acc12e98d3
Porting teensy-loader-cli to use libusb-1.0 (from 0.1).
Jacob Alexander <haata@kiibohd.com>
parents:
129
diff
changeset
|
213 if ( count < 0 ) |
35acc12e98d3
Porting teensy-loader-cli to use libusb-1.0 (from 0.1).
Jacob Alexander <haata@kiibohd.com>
parents:
129
diff
changeset
|
214 fprintf( stderr, "libusb_get_device_list failed.\n" ); |
35acc12e98d3
Porting teensy-loader-cli to use libusb-1.0 (from 0.1).
Jacob Alexander <haata@kiibohd.com>
parents:
129
diff
changeset
|
215 |
35acc12e98d3
Porting teensy-loader-cli to use libusb-1.0 (from 0.1).
Jacob Alexander <haata@kiibohd.com>
parents:
129
diff
changeset
|
216 for ( size_t c = 0; c < count; c++ ) |
35acc12e98d3
Porting teensy-loader-cli to use libusb-1.0 (from 0.1).
Jacob Alexander <haata@kiibohd.com>
parents:
129
diff
changeset
|
217 { |
35acc12e98d3
Porting teensy-loader-cli to use libusb-1.0 (from 0.1).
Jacob Alexander <haata@kiibohd.com>
parents:
129
diff
changeset
|
218 struct libusb_device_descriptor desc; |
35acc12e98d3
Porting teensy-loader-cli to use libusb-1.0 (from 0.1).
Jacob Alexander <haata@kiibohd.com>
parents:
129
diff
changeset
|
219 libusb_device *dev = devs[c]; |
35acc12e98d3
Porting teensy-loader-cli to use libusb-1.0 (from 0.1).
Jacob Alexander <haata@kiibohd.com>
parents:
129
diff
changeset
|
220 |
35acc12e98d3
Porting teensy-loader-cli to use libusb-1.0 (from 0.1).
Jacob Alexander <haata@kiibohd.com>
parents:
129
diff
changeset
|
221 if ( libusb_get_device_descriptor( dev, &desc ) < 0 ) |
35acc12e98d3
Porting teensy-loader-cli to use libusb-1.0 (from 0.1).
Jacob Alexander <haata@kiibohd.com>
parents:
129
diff
changeset
|
222 fprintf( stderr, "libusb_get_device_descriptor failed.\n" ); |
35acc12e98d3
Porting teensy-loader-cli to use libusb-1.0 (from 0.1).
Jacob Alexander <haata@kiibohd.com>
parents:
129
diff
changeset
|
223 |
35acc12e98d3
Porting teensy-loader-cli to use libusb-1.0 (from 0.1).
Jacob Alexander <haata@kiibohd.com>
parents:
129
diff
changeset
|
224 //printf("ID: %04x Product: %04x\n", desc.idVendor, desc.idProduct ); |
35acc12e98d3
Porting teensy-loader-cli to use libusb-1.0 (from 0.1).
Jacob Alexander <haata@kiibohd.com>
parents:
129
diff
changeset
|
225 // Not correct device |
35acc12e98d3
Porting teensy-loader-cli to use libusb-1.0 (from 0.1).
Jacob Alexander <haata@kiibohd.com>
parents:
129
diff
changeset
|
226 if ( desc.idVendor != vid || desc.idProduct != pid ) |
35acc12e98d3
Porting teensy-loader-cli to use libusb-1.0 (from 0.1).
Jacob Alexander <haata@kiibohd.com>
parents:
129
diff
changeset
|
227 continue; |
129
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
228 |
144
35acc12e98d3
Porting teensy-loader-cli to use libusb-1.0 (from 0.1).
Jacob Alexander <haata@kiibohd.com>
parents:
129
diff
changeset
|
229 // Attempt to open the device |
35acc12e98d3
Porting teensy-loader-cli to use libusb-1.0 (from 0.1).
Jacob Alexander <haata@kiibohd.com>
parents:
129
diff
changeset
|
230 if ( libusb_open( dev, &handle ) != 0 ) |
35acc12e98d3
Porting teensy-loader-cli to use libusb-1.0 (from 0.1).
Jacob Alexander <haata@kiibohd.com>
parents:
129
diff
changeset
|
231 { |
35acc12e98d3
Porting teensy-loader-cli to use libusb-1.0 (from 0.1).
Jacob Alexander <haata@kiibohd.com>
parents:
129
diff
changeset
|
232 fprintf( stderr, "Found device but unable to open\n" ); |
35acc12e98d3
Porting teensy-loader-cli to use libusb-1.0 (from 0.1).
Jacob Alexander <haata@kiibohd.com>
parents:
129
diff
changeset
|
233 continue; |
129
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
234 } |
144
35acc12e98d3
Porting teensy-loader-cli to use libusb-1.0 (from 0.1).
Jacob Alexander <haata@kiibohd.com>
parents:
129
diff
changeset
|
235 |
35acc12e98d3
Porting teensy-loader-cli to use libusb-1.0 (from 0.1).
Jacob Alexander <haata@kiibohd.com>
parents:
129
diff
changeset
|
236 // Only required on Linux, other platforms will just ignore this call |
35acc12e98d3
Porting teensy-loader-cli to use libusb-1.0 (from 0.1).
Jacob Alexander <haata@kiibohd.com>
parents:
129
diff
changeset
|
237 libusb_detach_kernel_driver( handle, 0 ); |
35acc12e98d3
Porting teensy-loader-cli to use libusb-1.0 (from 0.1).
Jacob Alexander <haata@kiibohd.com>
parents:
129
diff
changeset
|
238 |
35acc12e98d3
Porting teensy-loader-cli to use libusb-1.0 (from 0.1).
Jacob Alexander <haata@kiibohd.com>
parents:
129
diff
changeset
|
239 // Mac OS-X - removing this call to usb_claim_interface() might allow |
35acc12e98d3
Porting teensy-loader-cli to use libusb-1.0 (from 0.1).
Jacob Alexander <haata@kiibohd.com>
parents:
129
diff
changeset
|
240 // this to work, even though it is a clear misuse of the libusb API. |
35acc12e98d3
Porting teensy-loader-cli to use libusb-1.0 (from 0.1).
Jacob Alexander <haata@kiibohd.com>
parents:
129
diff
changeset
|
241 // normally Apple's IOKit should be used on Mac OS-X |
35acc12e98d3
Porting teensy-loader-cli to use libusb-1.0 (from 0.1).
Jacob Alexander <haata@kiibohd.com>
parents:
129
diff
changeset
|
242 // XXX Is this still valid with libusb-1.0? |
35acc12e98d3
Porting teensy-loader-cli to use libusb-1.0 (from 0.1).
Jacob Alexander <haata@kiibohd.com>
parents:
129
diff
changeset
|
243 |
35acc12e98d3
Porting teensy-loader-cli to use libusb-1.0 (from 0.1).
Jacob Alexander <haata@kiibohd.com>
parents:
129
diff
changeset
|
244 // Attempt to claim interface |
35acc12e98d3
Porting teensy-loader-cli to use libusb-1.0 (from 0.1).
Jacob Alexander <haata@kiibohd.com>
parents:
129
diff
changeset
|
245 int err = libusb_claim_interface( handle, 0 ); |
35acc12e98d3
Porting teensy-loader-cli to use libusb-1.0 (from 0.1).
Jacob Alexander <haata@kiibohd.com>
parents:
129
diff
changeset
|
246 if ( err < 0 ) |
35acc12e98d3
Porting teensy-loader-cli to use libusb-1.0 (from 0.1).
Jacob Alexander <haata@kiibohd.com>
parents:
129
diff
changeset
|
247 { |
35acc12e98d3
Porting teensy-loader-cli to use libusb-1.0 (from 0.1).
Jacob Alexander <haata@kiibohd.com>
parents:
129
diff
changeset
|
248 libusb_close( handle ); |
35acc12e98d3
Porting teensy-loader-cli to use libusb-1.0 (from 0.1).
Jacob Alexander <haata@kiibohd.com>
parents:
129
diff
changeset
|
249 fprintf( stderr, "Unable to claim interface, check USB permissions: %d\n", err ); |
35acc12e98d3
Porting teensy-loader-cli to use libusb-1.0 (from 0.1).
Jacob Alexander <haata@kiibohd.com>
parents:
129
diff
changeset
|
250 continue; |
35acc12e98d3
Porting teensy-loader-cli to use libusb-1.0 (from 0.1).
Jacob Alexander <haata@kiibohd.com>
parents:
129
diff
changeset
|
251 } |
35acc12e98d3
Porting teensy-loader-cli to use libusb-1.0 (from 0.1).
Jacob Alexander <haata@kiibohd.com>
parents:
129
diff
changeset
|
252 |
35acc12e98d3
Porting teensy-loader-cli to use libusb-1.0 (from 0.1).
Jacob Alexander <haata@kiibohd.com>
parents:
129
diff
changeset
|
253 ret = handle; |
35acc12e98d3
Porting teensy-loader-cli to use libusb-1.0 (from 0.1).
Jacob Alexander <haata@kiibohd.com>
parents:
129
diff
changeset
|
254 break; |
129
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
255 } |
144
35acc12e98d3
Porting teensy-loader-cli to use libusb-1.0 (from 0.1).
Jacob Alexander <haata@kiibohd.com>
parents:
129
diff
changeset
|
256 |
35acc12e98d3
Porting teensy-loader-cli to use libusb-1.0 (from 0.1).
Jacob Alexander <haata@kiibohd.com>
parents:
129
diff
changeset
|
257 libusb_free_device_list( devs, 1 ); |
35acc12e98d3
Porting teensy-loader-cli to use libusb-1.0 (from 0.1).
Jacob Alexander <haata@kiibohd.com>
parents:
129
diff
changeset
|
258 |
35acc12e98d3
Porting teensy-loader-cli to use libusb-1.0 (from 0.1).
Jacob Alexander <haata@kiibohd.com>
parents:
129
diff
changeset
|
259 return ret; |
129
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
260 } |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
261 |
144
35acc12e98d3
Porting teensy-loader-cli to use libusb-1.0 (from 0.1).
Jacob Alexander <haata@kiibohd.com>
parents:
129
diff
changeset
|
262 static struct libusb_device_handle *libusb_teensy_handle = NULL; |
129
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
263 |
144
35acc12e98d3
Porting teensy-loader-cli to use libusb-1.0 (from 0.1).
Jacob Alexander <haata@kiibohd.com>
parents:
129
diff
changeset
|
264 int teensy_open() |
129
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
265 { |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
266 teensy_close(); |
144
35acc12e98d3
Porting teensy-loader-cli to use libusb-1.0 (from 0.1).
Jacob Alexander <haata@kiibohd.com>
parents:
129
diff
changeset
|
267 |
35acc12e98d3
Porting teensy-loader-cli to use libusb-1.0 (from 0.1).
Jacob Alexander <haata@kiibohd.com>
parents:
129
diff
changeset
|
268 libusb_teensy_handle = open_usb_device( 0x16C0, 0x0478 ); |
35acc12e98d3
Porting teensy-loader-cli to use libusb-1.0 (from 0.1).
Jacob Alexander <haata@kiibohd.com>
parents:
129
diff
changeset
|
269 |
35acc12e98d3
Porting teensy-loader-cli to use libusb-1.0 (from 0.1).
Jacob Alexander <haata@kiibohd.com>
parents:
129
diff
changeset
|
270 if ( libusb_teensy_handle ) |
35acc12e98d3
Porting teensy-loader-cli to use libusb-1.0 (from 0.1).
Jacob Alexander <haata@kiibohd.com>
parents:
129
diff
changeset
|
271 return 1; |
35acc12e98d3
Porting teensy-loader-cli to use libusb-1.0 (from 0.1).
Jacob Alexander <haata@kiibohd.com>
parents:
129
diff
changeset
|
272 |
129
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
273 return 0; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
274 } |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
275 |
144
35acc12e98d3
Porting teensy-loader-cli to use libusb-1.0 (from 0.1).
Jacob Alexander <haata@kiibohd.com>
parents:
129
diff
changeset
|
276 int teensy_write( void *buf, int len, double timeout ) |
129
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
277 { |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
278 int r; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
279 |
144
35acc12e98d3
Porting teensy-loader-cli to use libusb-1.0 (from 0.1).
Jacob Alexander <haata@kiibohd.com>
parents:
129
diff
changeset
|
280 if ( !libusb_teensy_handle ) |
35acc12e98d3
Porting teensy-loader-cli to use libusb-1.0 (from 0.1).
Jacob Alexander <haata@kiibohd.com>
parents:
129
diff
changeset
|
281 return 0; |
35acc12e98d3
Porting teensy-loader-cli to use libusb-1.0 (from 0.1).
Jacob Alexander <haata@kiibohd.com>
parents:
129
diff
changeset
|
282 |
35acc12e98d3
Porting teensy-loader-cli to use libusb-1.0 (from 0.1).
Jacob Alexander <haata@kiibohd.com>
parents:
129
diff
changeset
|
283 while ( timeout > 0 ) { |
35acc12e98d3
Porting teensy-loader-cli to use libusb-1.0 (from 0.1).
Jacob Alexander <haata@kiibohd.com>
parents:
129
diff
changeset
|
284 r = libusb_control_transfer( libusb_teensy_handle, |
35acc12e98d3
Porting teensy-loader-cli to use libusb-1.0 (from 0.1).
Jacob Alexander <haata@kiibohd.com>
parents:
129
diff
changeset
|
285 0x21, 9, 0x0200, 0, |
35acc12e98d3
Porting teensy-loader-cli to use libusb-1.0 (from 0.1).
Jacob Alexander <haata@kiibohd.com>
parents:
129
diff
changeset
|
286 (unsigned char *)buf, len, |
35acc12e98d3
Porting teensy-loader-cli to use libusb-1.0 (from 0.1).
Jacob Alexander <haata@kiibohd.com>
parents:
129
diff
changeset
|
287 (int)(timeout * 1000.0) ); |
35acc12e98d3
Porting teensy-loader-cli to use libusb-1.0 (from 0.1).
Jacob Alexander <haata@kiibohd.com>
parents:
129
diff
changeset
|
288 |
35acc12e98d3
Porting teensy-loader-cli to use libusb-1.0 (from 0.1).
Jacob Alexander <haata@kiibohd.com>
parents:
129
diff
changeset
|
289 if ( r >= 0 ) |
35acc12e98d3
Porting teensy-loader-cli to use libusb-1.0 (from 0.1).
Jacob Alexander <haata@kiibohd.com>
parents:
129
diff
changeset
|
290 return 1; |
35acc12e98d3
Porting teensy-loader-cli to use libusb-1.0 (from 0.1).
Jacob Alexander <haata@kiibohd.com>
parents:
129
diff
changeset
|
291 |
129
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
292 //printf("teensy_write, r=%d\n", r); |
144
35acc12e98d3
Porting teensy-loader-cli to use libusb-1.0 (from 0.1).
Jacob Alexander <haata@kiibohd.com>
parents:
129
diff
changeset
|
293 usleep( 10000 ); |
129
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
294 timeout -= 0.01; // TODO: subtract actual elapsed time |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
295 } |
144
35acc12e98d3
Porting teensy-loader-cli to use libusb-1.0 (from 0.1).
Jacob Alexander <haata@kiibohd.com>
parents:
129
diff
changeset
|
296 |
129
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
297 return 0; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
298 } |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
299 |
144
35acc12e98d3
Porting teensy-loader-cli to use libusb-1.0 (from 0.1).
Jacob Alexander <haata@kiibohd.com>
parents:
129
diff
changeset
|
300 void teensy_close() |
129
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
301 { |
144
35acc12e98d3
Porting teensy-loader-cli to use libusb-1.0 (from 0.1).
Jacob Alexander <haata@kiibohd.com>
parents:
129
diff
changeset
|
302 if ( !libusb_teensy_handle) |
35acc12e98d3
Porting teensy-loader-cli to use libusb-1.0 (from 0.1).
Jacob Alexander <haata@kiibohd.com>
parents:
129
diff
changeset
|
303 return; |
35acc12e98d3
Porting teensy-loader-cli to use libusb-1.0 (from 0.1).
Jacob Alexander <haata@kiibohd.com>
parents:
129
diff
changeset
|
304 |
35acc12e98d3
Porting teensy-loader-cli to use libusb-1.0 (from 0.1).
Jacob Alexander <haata@kiibohd.com>
parents:
129
diff
changeset
|
305 libusb_release_interface( libusb_teensy_handle, 0 ); |
35acc12e98d3
Porting teensy-loader-cli to use libusb-1.0 (from 0.1).
Jacob Alexander <haata@kiibohd.com>
parents:
129
diff
changeset
|
306 libusb_close( libusb_teensy_handle ); |
35acc12e98d3
Porting teensy-loader-cli to use libusb-1.0 (from 0.1).
Jacob Alexander <haata@kiibohd.com>
parents:
129
diff
changeset
|
307 |
129
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
308 libusb_teensy_handle = NULL; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
309 } |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
310 |
144
35acc12e98d3
Porting teensy-loader-cli to use libusb-1.0 (from 0.1).
Jacob Alexander <haata@kiibohd.com>
parents:
129
diff
changeset
|
311 int hard_reboot() |
129
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
312 { |
144
35acc12e98d3
Porting teensy-loader-cli to use libusb-1.0 (from 0.1).
Jacob Alexander <haata@kiibohd.com>
parents:
129
diff
changeset
|
313 struct libusb_device_handle *rebootor; |
129
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
314 int r; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
315 |
144
35acc12e98d3
Porting teensy-loader-cli to use libusb-1.0 (from 0.1).
Jacob Alexander <haata@kiibohd.com>
parents:
129
diff
changeset
|
316 rebootor = open_usb_device( 0x16C0, 0x0477 ); |
35acc12e98d3
Porting teensy-loader-cli to use libusb-1.0 (from 0.1).
Jacob Alexander <haata@kiibohd.com>
parents:
129
diff
changeset
|
317 |
35acc12e98d3
Porting teensy-loader-cli to use libusb-1.0 (from 0.1).
Jacob Alexander <haata@kiibohd.com>
parents:
129
diff
changeset
|
318 if (!rebootor) |
35acc12e98d3
Porting teensy-loader-cli to use libusb-1.0 (from 0.1).
Jacob Alexander <haata@kiibohd.com>
parents:
129
diff
changeset
|
319 return 0; |
35acc12e98d3
Porting teensy-loader-cli to use libusb-1.0 (from 0.1).
Jacob Alexander <haata@kiibohd.com>
parents:
129
diff
changeset
|
320 |
35acc12e98d3
Porting teensy-loader-cli to use libusb-1.0 (from 0.1).
Jacob Alexander <haata@kiibohd.com>
parents:
129
diff
changeset
|
321 r = libusb_control_transfer( rebootor, |
35acc12e98d3
Porting teensy-loader-cli to use libusb-1.0 (from 0.1).
Jacob Alexander <haata@kiibohd.com>
parents:
129
diff
changeset
|
322 0x21, 9, 0x0200, 0, |
35acc12e98d3
Porting teensy-loader-cli to use libusb-1.0 (from 0.1).
Jacob Alexander <haata@kiibohd.com>
parents:
129
diff
changeset
|
323 (unsigned char*)"reboot", 6, |
35acc12e98d3
Porting teensy-loader-cli to use libusb-1.0 (from 0.1).
Jacob Alexander <haata@kiibohd.com>
parents:
129
diff
changeset
|
324 100 ); |
35acc12e98d3
Porting teensy-loader-cli to use libusb-1.0 (from 0.1).
Jacob Alexander <haata@kiibohd.com>
parents:
129
diff
changeset
|
325 |
35acc12e98d3
Porting teensy-loader-cli to use libusb-1.0 (from 0.1).
Jacob Alexander <haata@kiibohd.com>
parents:
129
diff
changeset
|
326 libusb_release_interface( rebootor, 0 ); |
35acc12e98d3
Porting teensy-loader-cli to use libusb-1.0 (from 0.1).
Jacob Alexander <haata@kiibohd.com>
parents:
129
diff
changeset
|
327 libusb_close( rebootor ); |
35acc12e98d3
Porting teensy-loader-cli to use libusb-1.0 (from 0.1).
Jacob Alexander <haata@kiibohd.com>
parents:
129
diff
changeset
|
328 |
35acc12e98d3
Porting teensy-loader-cli to use libusb-1.0 (from 0.1).
Jacob Alexander <haata@kiibohd.com>
parents:
129
diff
changeset
|
329 if (r < 0) |
35acc12e98d3
Porting teensy-loader-cli to use libusb-1.0 (from 0.1).
Jacob Alexander <haata@kiibohd.com>
parents:
129
diff
changeset
|
330 return 0; |
35acc12e98d3
Porting teensy-loader-cli to use libusb-1.0 (from 0.1).
Jacob Alexander <haata@kiibohd.com>
parents:
129
diff
changeset
|
331 |
129
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
332 return 1; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
333 } |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
334 |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
335 #endif |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
336 |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
337 |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
338 |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
339 /****************************************************************/ |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
340 /* */ |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
341 /* USB Access - Apple's IOKit, Mac OS-X */ |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
342 /* */ |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
343 /****************************************************************/ |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
344 |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
345 #if defined(USE_APPLE_IOKIT) |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
346 |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
347 // http://developer.apple.com/technotes/tn2007/tn2187.html |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
348 #include <IOKit/IOKitLib.h> |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
349 #include <IOKit/hid/IOHIDLib.h> |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
350 #include <IOKit/hid/IOHIDDevice.h> |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
351 |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
352 struct usb_list_struct { |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
353 IOHIDDeviceRef ref; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
354 int pid; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
355 int vid; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
356 struct usb_list_struct *next; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
357 }; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
358 |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
359 static struct usb_list_struct *usb_list=NULL; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
360 static IOHIDManagerRef hid_manager=NULL; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
361 |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
362 void attach_callback(void *context, IOReturn r, void *hid_mgr, IOHIDDeviceRef dev) |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
363 { |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
364 CFTypeRef type; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
365 struct usb_list_struct *n, *p; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
366 int32_t pid, vid; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
367 |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
368 if (!dev) return; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
369 type = IOHIDDeviceGetProperty(dev, CFSTR(kIOHIDVendorIDKey)); |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
370 if (!type || CFGetTypeID(type) != CFNumberGetTypeID()) return; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
371 if (!CFNumberGetValue((CFNumberRef)type, kCFNumberSInt32Type, &vid)) return; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
372 type = IOHIDDeviceGetProperty(dev, CFSTR(kIOHIDProductIDKey)); |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
373 if (!type || CFGetTypeID(type) != CFNumberGetTypeID()) return; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
374 if (!CFNumberGetValue((CFNumberRef)type, kCFNumberSInt32Type, &pid)) return; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
375 n = (struct usb_list_struct *)malloc(sizeof(struct usb_list_struct)); |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
376 if (!n) return; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
377 //printf("attach callback: vid=%04X, pid=%04X\n", vid, pid); |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
378 n->ref = dev; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
379 n->vid = vid; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
380 n->pid = pid; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
381 n->next = NULL; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
382 if (usb_list == NULL) { |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
383 usb_list = n; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
384 } else { |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
385 for (p = usb_list; p->next; p = p->next) ; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
386 p->next = n; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
387 } |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
388 } |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
389 |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
390 void detach_callback(void *context, IOReturn r, void *hid_mgr, IOHIDDeviceRef dev) |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
391 { |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
392 struct usb_list_struct *p, *tmp, *prev=NULL; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
393 |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
394 p = usb_list; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
395 while (p) { |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
396 if (p->ref == dev) { |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
397 if (prev) { |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
398 prev->next = p->next; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
399 } else { |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
400 usb_list = p->next; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
401 } |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
402 tmp = p; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
403 p = p->next; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
404 free(tmp); |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
405 } else { |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
406 prev = p; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
407 p = p->next; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
408 } |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
409 } |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
410 } |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
411 |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
412 void init_hid_manager(void) |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
413 { |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
414 CFMutableDictionaryRef dict; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
415 IOReturn ret; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
416 |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
417 if (hid_manager) return; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
418 hid_manager = IOHIDManagerCreate(kCFAllocatorDefault, kIOHIDOptionsTypeNone); |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
419 if (hid_manager == NULL || CFGetTypeID(hid_manager) != IOHIDManagerGetTypeID()) { |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
420 if (hid_manager) CFRelease(hid_manager); |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
421 printf_verbose("no HID Manager - maybe this is a pre-Leopard (10.5) system?\n"); |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
422 return; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
423 } |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
424 dict = CFDictionaryCreateMutable(kCFAllocatorDefault, 0, |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
425 &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks); |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
426 if (!dict) return; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
427 IOHIDManagerSetDeviceMatching(hid_manager, dict); |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
428 CFRelease(dict); |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
429 IOHIDManagerScheduleWithRunLoop(hid_manager, CFRunLoopGetCurrent(), kCFRunLoopDefaultMode); |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
430 IOHIDManagerRegisterDeviceMatchingCallback(hid_manager, attach_callback, NULL); |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
431 IOHIDManagerRegisterDeviceRemovalCallback(hid_manager, detach_callback, NULL); |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
432 ret = IOHIDManagerOpen(hid_manager, kIOHIDOptionsTypeNone); |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
433 if (ret != kIOReturnSuccess) { |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
434 IOHIDManagerUnscheduleFromRunLoop(hid_manager, |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
435 CFRunLoopGetCurrent(), kCFRunLoopDefaultMode); |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
436 CFRelease(hid_manager); |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
437 printf_verbose("Error opening HID Manager"); |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
438 } |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
439 } |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
440 |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
441 static void do_run_loop(void) |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
442 { |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
443 while (CFRunLoopRunInMode(kCFRunLoopDefaultMode, 0, true) == kCFRunLoopRunHandledSource) ; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
444 } |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
445 |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
446 IOHIDDeviceRef open_usb_device(int vid, int pid) |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
447 { |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
448 struct usb_list_struct *p; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
449 IOReturn ret; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
450 |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
451 init_hid_manager(); |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
452 do_run_loop(); |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
453 for (p = usb_list; p; p = p->next) { |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
454 if (p->vid == vid && p->pid == pid) { |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
455 ret = IOHIDDeviceOpen(p->ref, kIOHIDOptionsTypeNone); |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
456 if (ret == kIOReturnSuccess) return p->ref; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
457 } |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
458 } |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
459 return NULL; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
460 } |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
461 |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
462 void close_usb_device(IOHIDDeviceRef dev) |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
463 { |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
464 struct usb_list_struct *p; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
465 |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
466 do_run_loop(); |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
467 for (p = usb_list; p; p = p->next) { |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
468 if (p->ref == dev) { |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
469 IOHIDDeviceClose(dev, kIOHIDOptionsTypeNone); |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
470 return; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
471 } |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
472 } |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
473 } |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
474 |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
475 static IOHIDDeviceRef iokit_teensy_reference = NULL; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
476 |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
477 int teensy_open(void) |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
478 { |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
479 teensy_close(); |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
480 iokit_teensy_reference = open_usb_device(0x16C0, 0x0478); |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
481 if (iokit_teensy_reference) return 1; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
482 return 0; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
483 } |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
484 |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
485 int teensy_write(void *buf, int len, double timeout) |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
486 { |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
487 IOReturn ret; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
488 |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
489 // timeouts do not work on OS-X |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
490 // IOHIDDeviceSetReportWithCallback is not implemented |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
491 // even though Apple documents it with a code example! |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
492 // submitted to Apple on 22-sep-2009, problem ID 7245050 |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
493 if (!iokit_teensy_reference) return 0; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
494 ret = IOHIDDeviceSetReport(iokit_teensy_reference, |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
495 kIOHIDReportTypeOutput, 0, buf, len); |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
496 if (ret == kIOReturnSuccess) return 1; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
497 return 0; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
498 } |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
499 |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
500 void teensy_close(void) |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
501 { |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
502 if (!iokit_teensy_reference) return; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
503 close_usb_device(iokit_teensy_reference); |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
504 iokit_teensy_reference = NULL; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
505 } |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
506 |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
507 int hard_reboot(void) |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
508 { |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
509 IOHIDDeviceRef rebootor; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
510 IOReturn ret; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
511 |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
512 rebootor = open_usb_device(0x16C0, 0x0477); |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
513 if (!rebootor) return 0; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
514 ret = IOHIDDeviceSetReport(rebootor, |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
515 kIOHIDReportTypeOutput, 0, (uint8_t *)("reboot"), 6); |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
516 close_usb_device(rebootor); |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
517 if (ret == kIOReturnSuccess) return 1; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
518 return 0; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
519 } |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
520 |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
521 #endif |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
522 |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
523 |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
524 |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
525 /****************************************************************/ |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
526 /* */ |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
527 /* USB Access - BSD's UHID driver */ |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
528 /* */ |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
529 /****************************************************************/ |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
530 |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
531 #if defined(USE_UHID) |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
532 |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
533 // Thanks to Todd T Fries for help getting this working on OpenBSD |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
534 // and to Chris Kuethe for the initial patch to use UHID. |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
535 |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
536 #include <sys/ioctl.h> |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
537 #include <fcntl.h> |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
538 #include <dirent.h> |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
539 #include <dev/usb/usb.h> |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
540 #ifndef USB_GET_DEVICEINFO |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
541 #include <dev/usb/usb_ioctl.h> |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
542 #endif |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
543 |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
544 int open_usb_device(int vid, int pid) |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
545 { |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
546 int r, fd; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
547 DIR *dir; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
548 struct dirent *d; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
549 struct usb_device_info info; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
550 char buf[256]; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
551 |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
552 dir = opendir("/dev"); |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
553 if (!dir) return -1; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
554 while ((d = readdir(dir)) != NULL) { |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
555 if (strncmp(d->d_name, "uhid", 4) != 0) continue; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
556 snprintf(buf, sizeof(buf), "/dev/%s", d->d_name); |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
557 fd = open(buf, O_RDWR); |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
558 if (fd < 0) continue; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
559 r = ioctl(fd, USB_GET_DEVICEINFO, &info); |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
560 if (r < 0) { |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
561 // NetBSD: added in 2004 |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
562 // OpenBSD: added November 23, 2009 |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
563 // FreeBSD: missing (FreeBSD 8.0) - USE_LIBUSB works! |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
564 die("Error: your uhid driver does not support" |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
565 " USB_GET_DEVICEINFO, please upgrade!\n"); |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
566 close(fd); |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
567 closedir(dir); |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
568 exit(1); |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
569 } |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
570 //printf("%s: v=%d, p=%d\n", buf, info.udi_vendorNo, info.udi_productNo); |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
571 if (info.udi_vendorNo == vid && info.udi_productNo == pid) { |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
572 closedir(dir); |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
573 return fd; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
574 } |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
575 close(fd); |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
576 } |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
577 closedir(dir); |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
578 return -1; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
579 } |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
580 |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
581 static int uhid_teensy_fd = -1; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
582 |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
583 int teensy_open(void) |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
584 { |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
585 teensy_close(); |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
586 uhid_teensy_fd = open_usb_device(0x16C0, 0x0478); |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
587 if (uhid_teensy_fd < 0) return 0; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
588 return 1; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
589 } |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
590 |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
591 int teensy_write(void *buf, int len, double timeout) |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
592 { |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
593 int r; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
594 |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
595 // TODO: imeplement timeout... how?? |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
596 r = write(uhid_teensy_fd, buf, len); |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
597 if (r == len) return 1; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
598 return 0; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
599 } |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
600 |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
601 void teensy_close(void) |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
602 { |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
603 if (uhid_teensy_fd >= 0) { |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
604 close(uhid_teensy_fd); |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
605 uhid_teensy_fd = -1; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
606 } |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
607 } |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
608 |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
609 int hard_reboot(void) |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
610 { |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
611 int r, rebootor_fd; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
612 |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
613 rebootor_fd = open_usb_device(0x16C0, 0x0477); |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
614 if (rebootor_fd < 0) return 0; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
615 r = write(rebootor_fd, "reboot", 6); |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
616 delay(0.1); |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
617 close(rebootor_fd); |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
618 if (r == 6) return 1; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
619 return 0; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
620 } |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
621 |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
622 #endif |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
623 |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
624 |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
625 |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
626 /****************************************************************/ |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
627 /* */ |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
628 /* Read Intel Hex File */ |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
629 /* */ |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
630 /****************************************************************/ |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
631 |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
632 // the maximum flash image size we can support |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
633 // chips with larger memory may be used, but only this |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
634 // much intel-hex data can be loaded into memory! |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
635 #define MAX_MEMORY_SIZE 0x40000 |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
636 |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
637 static unsigned char firmware_image[MAX_MEMORY_SIZE]; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
638 static unsigned char firmware_mask[MAX_MEMORY_SIZE]; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
639 static int end_record_seen=0; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
640 static int byte_count; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
641 static unsigned int extended_addr = 0; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
642 static int parse_hex_line(char *line); |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
643 |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
644 int read_intel_hex(const char *filename) |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
645 { |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
646 FILE *fp; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
647 int i, lineno=0; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
648 char buf[1024]; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
649 |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
650 byte_count = 0; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
651 end_record_seen = 0; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
652 for (i=0; i<MAX_MEMORY_SIZE; i++) { |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
653 firmware_image[i] = 0xFF; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
654 firmware_mask[i] = 0; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
655 } |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
656 extended_addr = 0; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
657 |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
658 fp = fopen(filename, "r"); |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
659 if (fp == NULL) { |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
660 //printf("Unable to read file %s\n", filename); |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
661 return -1; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
662 } |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
663 while (!feof(fp)) { |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
664 *buf = '\0'; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
665 if (!fgets(buf, sizeof(buf), fp)) break; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
666 lineno++; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
667 if (*buf) { |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
668 if (parse_hex_line(buf) == 0) { |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
669 printf("Warning, HEX parse error line %d\n", lineno); |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
670 return -2; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
671 } |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
672 } |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
673 if (end_record_seen) break; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
674 if (feof(stdin)) break; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
675 } |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
676 fclose(fp); |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
677 return byte_count; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
678 } |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
679 |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
680 |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
681 /* from ihex.c, at http://www.pjrc.com/tech/8051/pm2_docs/intel-hex.html */ |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
682 |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
683 /* parses a line of intel hex code, stores the data in bytes[] */ |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
684 /* and the beginning address in addr, and returns a 1 if the */ |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
685 /* line was valid, or a 0 if an error occured. The variable */ |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
686 /* num gets the number of bytes that were stored into bytes[] */ |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
687 |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
688 |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
689 int |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
690 parse_hex_line(char *line) |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
691 { |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
692 int addr, code, num; |
308 | 693 int sum, len, cksum, i; |
694 char *ptr; | |
129
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
695 |
308 | 696 num = 0; |
697 if (line[0] != ':') return 0; | |
698 if (strlen(line) < 11) return 0; | |
699 ptr = line+1; | |
700 if (!sscanf(ptr, "%02x", &len)) return 0; | |
701 ptr += 2; | |
702 if ((int)strlen(line) < (11 + (len * 2)) ) return 0; | |
703 if (!sscanf(ptr, "%04x", &addr)) return 0; | |
704 ptr += 4; | |
705 /* printf("Line: length=%d Addr=%d\n", len, addr); */ | |
706 if (!sscanf(ptr, "%02x", &code)) return 0; | |
129
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
707 if (addr + extended_addr + len >= MAX_MEMORY_SIZE) return 0; |
308 | 708 ptr += 2; |
709 sum = (len & 255) + ((addr >> 8) & 255) + (addr & 255) + (code & 255); | |
129
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
710 if (code != 0) { |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
711 if (code == 1) { |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
712 end_record_seen = 1; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
713 return 1; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
714 } |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
715 if (code == 2 && len == 2) { |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
716 if (!sscanf(ptr, "%04x", &i)) return 1; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
717 ptr += 4; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
718 sum += ((i >> 8) & 255) + (i & 255); |
308 | 719 if (!sscanf(ptr, "%02x", &cksum)) return 1; |
129
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
720 if (((sum & 255) + (cksum & 255)) & 255) return 1; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
721 extended_addr = i << 4; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
722 //printf("ext addr = %05X\n", extended_addr); |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
723 } |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
724 if (code == 4 && len == 2) { |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
725 if (!sscanf(ptr, "%04x", &i)) return 1; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
726 ptr += 4; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
727 sum += ((i >> 8) & 255) + (i & 255); |
308 | 728 if (!sscanf(ptr, "%02x", &cksum)) return 1; |
129
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
729 if (((sum & 255) + (cksum & 255)) & 255) return 1; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
730 extended_addr = i << 16; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
731 //printf("ext addr = %08X\n", extended_addr); |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
732 } |
308 | 733 return 1; // non-data line |
129
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
734 } |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
735 byte_count += len; |
308 | 736 while (num != len) { |
737 if (sscanf(ptr, "%02x", &i) != 1) return 0; | |
129
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
738 i &= 255; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
739 firmware_image[addr + extended_addr + num] = i; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
740 firmware_mask[addr + extended_addr + num] = 1; |
308 | 741 ptr += 2; |
742 sum += i; | |
743 (num)++; | |
744 if (num >= 256) return 0; | |
745 } | |
746 if (!sscanf(ptr, "%02x", &cksum)) return 0; | |
747 if (((sum & 255) + (cksum & 255)) & 255) return 0; /* checksum error */ | |
748 return 1; | |
129
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
749 } |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
750 |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
751 int ihex_bytes_within_range(int begin, int end) |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
752 { |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
753 int i; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
754 |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
755 if (begin < 0 || begin >= MAX_MEMORY_SIZE || |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
756 end < 0 || end >= MAX_MEMORY_SIZE) { |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
757 return 0; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
758 } |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
759 for (i=begin; i<=end; i++) { |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
760 if (firmware_mask[i]) return 1; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
761 } |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
762 return 0; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
763 } |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
764 |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
765 void ihex_get_data(int addr, int len, unsigned char *bytes) |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
766 { |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
767 int i; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
768 |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
769 if (addr < 0 || len < 0 || addr + len >= MAX_MEMORY_SIZE) { |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
770 for (i=0; i<len; i++) { |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
771 bytes[i] = 255; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
772 } |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
773 return; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
774 } |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
775 for (i=0; i<len; i++) { |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
776 if (firmware_mask[addr]) { |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
777 bytes[i] = firmware_image[addr]; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
778 } else { |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
779 bytes[i] = 255; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
780 } |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
781 addr++; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
782 } |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
783 } |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
784 |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
785 int memory_is_blank(int addr, int block_size) |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
786 { |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
787 if (addr < 0 || addr > MAX_MEMORY_SIZE) return 1; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
788 |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
789 while (block_size && addr < MAX_MEMORY_SIZE) { |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
790 if (firmware_mask[addr] && firmware_image[addr] != 255) return 0; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
791 addr++; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
792 block_size--; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
793 } |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
794 return 1; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
795 } |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
796 |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
797 |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
798 |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
799 |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
800 /****************************************************************/ |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
801 /* */ |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
802 /* Misc Functions */ |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
803 /* */ |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
804 /****************************************************************/ |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
805 |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
806 int printf_verbose(const char *format, ...) |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
807 { |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
808 va_list ap; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
809 int r; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
810 |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
811 va_start(ap, format); |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
812 if (verbose) { |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
813 r = vprintf(format, ap); |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
814 fflush(stdout); |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
815 return r; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
816 } |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
817 return 0; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
818 } |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
819 |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
820 void delay(double seconds) |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
821 { |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
822 #ifdef WIN32 |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
823 Sleep(seconds * 1000.0); |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
824 #else |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
825 usleep(seconds * 1000000.0); |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
826 #endif |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
827 } |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
828 |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
829 void die(const char *str, ...) |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
830 { |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
831 va_list ap; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
832 |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
833 va_start(ap, str); |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
834 vfprintf(stderr, str, ap); |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
835 fprintf(stderr, "\n"); |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
836 exit(1); |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
837 } |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
838 |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
839 #if defined(WIN32) |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
840 #define strcasecmp stricmp |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
841 #endif |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
842 |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
843 void parse_options(int argc, char **argv) |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
844 { |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
845 int i; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
846 const char *arg; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
847 |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
848 for (i=1; i<argc; i++) { |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
849 arg = argv[i]; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
850 //printf("arg: %s\n", arg); |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
851 if (*arg == '-') { |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
852 if (strcmp(arg, "-w") == 0) { |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
853 wait_for_device_to_appear = 1; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
854 } else if (strcmp(arg, "-r") == 0) { |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
855 hard_reboot_device = 1; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
856 } else if (strcmp(arg, "-n") == 0) { |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
857 reboot_after_programming = 0; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
858 } else if (strcmp(arg, "-v") == 0) { |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
859 verbose = 1; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
860 } else if (strncmp(arg, "-mmcu=", 6) == 0) { |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
861 if (strcasecmp(arg+6, "at90usb162") == 0) { |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
862 code_size = 15872; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
863 block_size = 128; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
864 } else if (strcasecmp(arg+6, "atmega32u4") == 0) { |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
865 code_size = 32256; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
866 block_size = 128; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
867 } else if (strcasecmp(arg+6, "at90usb646") == 0) { |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
868 code_size = 64512; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
869 block_size = 256; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
870 } else if (strcasecmp(arg+6, "at90usb1286") == 0) { |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
871 code_size = 130048; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
872 block_size = 256; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
873 #if defined(USE_LIBUSB) |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
874 } else if (strcasecmp(arg+6, "mk20dx128") == 0) { |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
875 code_size = 131072; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
876 block_size = 1024; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
877 } else if (strcasecmp(arg+6, "mk20dx256") == 0) { |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
878 code_size = 262144; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
879 block_size = 1024; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
880 #endif |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
881 } else { |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
882 die("Unknown MCU type\n"); |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
883 } |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
884 } |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
885 } else { |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
886 filename = argv[i]; |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
887 } |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
888 } |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
889 } |
0bad1499ec19
Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff
changeset
|
890 |