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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
ab4515606277 Fix whitespace
Rowan Decker <Smasher816@gmail.com>
parents: 145
diff changeset
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
ab4515606277 Fix whitespace
Rowan Decker <Smasher816@gmail.com>
parents: 145
diff changeset
693 int sum, len, cksum, i;
ab4515606277 Fix whitespace
Rowan Decker <Smasher816@gmail.com>
parents: 145
diff changeset
694 char *ptr;
129
0bad1499ec19 Adding teensy-loader-cli so it's not required.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
695
308
ab4515606277 Fix whitespace
Rowan Decker <Smasher816@gmail.com>
parents: 145
diff changeset
696 num = 0;
ab4515606277 Fix whitespace
Rowan Decker <Smasher816@gmail.com>
parents: 145
diff changeset
697 if (line[0] != ':') return 0;
ab4515606277 Fix whitespace
Rowan Decker <Smasher816@gmail.com>
parents: 145
diff changeset
698 if (strlen(line) < 11) return 0;
ab4515606277 Fix whitespace
Rowan Decker <Smasher816@gmail.com>
parents: 145
diff changeset
699 ptr = line+1;
ab4515606277 Fix whitespace
Rowan Decker <Smasher816@gmail.com>
parents: 145
diff changeset
700 if (!sscanf(ptr, "%02x", &len)) return 0;
ab4515606277 Fix whitespace
Rowan Decker <Smasher816@gmail.com>
parents: 145
diff changeset
701 ptr += 2;
ab4515606277 Fix whitespace
Rowan Decker <Smasher816@gmail.com>
parents: 145
diff changeset
702 if ((int)strlen(line) < (11 + (len * 2)) ) return 0;
ab4515606277 Fix whitespace
Rowan Decker <Smasher816@gmail.com>
parents: 145
diff changeset
703 if (!sscanf(ptr, "%04x", &addr)) return 0;
ab4515606277 Fix whitespace
Rowan Decker <Smasher816@gmail.com>
parents: 145
diff changeset
704 ptr += 4;
ab4515606277 Fix whitespace
Rowan Decker <Smasher816@gmail.com>
parents: 145
diff changeset
705 /* printf("Line: length=%d Addr=%d\n", len, addr); */
ab4515606277 Fix whitespace
Rowan Decker <Smasher816@gmail.com>
parents: 145
diff changeset
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
ab4515606277 Fix whitespace
Rowan Decker <Smasher816@gmail.com>
parents: 145
diff changeset
708 ptr += 2;
ab4515606277 Fix whitespace
Rowan Decker <Smasher816@gmail.com>
parents: 145
diff changeset
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
ab4515606277 Fix whitespace
Rowan Decker <Smasher816@gmail.com>
parents: 145
diff changeset
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
ab4515606277 Fix whitespace
Rowan Decker <Smasher816@gmail.com>
parents: 145
diff changeset
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
ab4515606277 Fix whitespace
Rowan Decker <Smasher816@gmail.com>
parents: 145
diff changeset
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
ab4515606277 Fix whitespace
Rowan Decker <Smasher816@gmail.com>
parents: 145
diff changeset
736 while (num != len) {
ab4515606277 Fix whitespace
Rowan Decker <Smasher816@gmail.com>
parents: 145
diff changeset
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
ab4515606277 Fix whitespace
Rowan Decker <Smasher816@gmail.com>
parents: 145
diff changeset
741 ptr += 2;
ab4515606277 Fix whitespace
Rowan Decker <Smasher816@gmail.com>
parents: 145
diff changeset
742 sum += i;
ab4515606277 Fix whitespace
Rowan Decker <Smasher816@gmail.com>
parents: 145
diff changeset
743 (num)++;
ab4515606277 Fix whitespace
Rowan Decker <Smasher816@gmail.com>
parents: 145
diff changeset
744 if (num >= 256) return 0;
ab4515606277 Fix whitespace
Rowan Decker <Smasher816@gmail.com>
parents: 145
diff changeset
745 }
ab4515606277 Fix whitespace
Rowan Decker <Smasher816@gmail.com>
parents: 145
diff changeset
746 if (!sscanf(ptr, "%02x", &cksum)) return 0;
ab4515606277 Fix whitespace
Rowan Decker <Smasher816@gmail.com>
parents: 145
diff changeset
747 if (((sum & 255) + (cksum & 255)) & 255) return 0; /* checksum error */
ab4515606277 Fix whitespace
Rowan Decker <Smasher816@gmail.com>
parents: 145
diff changeset
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