From ea5fc6aecd56a89f26ec281150ea0ca5ff1b3d7a Mon Sep 17 00:00:00 2001 From: WMXZ-EU Date: Wed, 19 Oct 2016 11:29:46 +0200 Subject: [PATCH 01/13] added windows routines added soft boot for windows added functionality to list teensy on usb --- Makefile | 11 +- teensy_loader_cli.c | 331 ++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 322 insertions(+), 20 deletions(-) diff --git a/Makefile b/Makefile index d778af0..31fde1a 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,5 @@ -OS ?= LINUX -#OS ?= WINDOWS +#OS ?= LINUX +OS = WINDOWS #OS ?= MACOSX #OS ?= BSD @@ -16,11 +16,14 @@ teensy_loader_cli: teensy_loader_cli.c else ifeq ($(OS), WINDOWS) -CC = i586-mingw32msvc-gcc +#CC = i586-mingw32msvc-gcc +CC ?= gcc CFLAGS ?= -O2 -Wall teensy_loader_cli.exe: teensy_loader_cli.c $(CC) $(CFLAGS) -s -DUSE_WIN32 -o teensy_loader_cli.exe teensy_loader_cli.c -lhid -lsetupapi +cleanw: + del /F teensy_loader_cli teensy_loader_cli.exe else ifeq ($(OS), MACOSX) ifeq ($(USE_LIBUSB), YES) @@ -45,9 +48,7 @@ CFLAGS ?= -O2 -Wall teensy_loader_cli: teensy_loader_cli.c $(CC) $(CFLAGS) -s -DUSE_UHID -o teensy_loader_cli teensy_loader_cli.c - endif - clean: rm -f teensy_loader_cli teensy_loader_cli.exe diff --git a/teensy_loader_cli.c b/teensy_loader_cli.c index d505216..6d68ba9 100644 --- a/teensy_loader_cli.c +++ b/teensy_loader_cli.c @@ -37,12 +37,13 @@ void usage(const char *err) { if(err != NULL) fprintf(stderr, "%s\n\n", err); fprintf(stderr, - "Usage: teensy_loader_cli --mcu= [-w] [-h] [-n] [-b] [-v] \n" + "Usage: teensy_loader_cli --mcu= [-w] [-r] [-s] [-n] [-b] [-v] \n" "\t-w : Wait for device to appear\n" "\t-r : Use hard reboot if device not online\n" "\t-s : Use soft reboot if device not online (Teensy3.x only)\n" "\t-n : No reboot after programming\n" "\t-b : Boot only, do not program\n" + "\t-l : list Teensy\n" "\t-v : Verbose output\n" "\nUse `teensy_loader_cli --list-mcus` to list supported MCUs.\n" "\nFor more information, please visit:\n" @@ -80,6 +81,11 @@ int boot_only = 0; int code_size = 0, block_size = 0; const char *filename=NULL; +// for listing of connected teensies +int list_only = 0; +void list_teensies(); + + /****************************************************************/ /* */ @@ -95,13 +101,19 @@ int main(int argc, char **argv) // parse command line arguments parse_options(argc, argv); + if( list_only) + { verbose = 1; + list_teensies(); + exit(0); + } + if (!filename && !boot_only) { usage("Filename must be specified"); } if (!code_size) { usage("MCU type must be specified"); } - printf_verbose("Teensy Loader, Command Line, Version 2.0\n"); + printf_verbose("Teensy Loader, Command Line, Version 2.0 (WMXZ)\n"); if (boot_only) { if (! teensy_open()) { @@ -186,7 +198,9 @@ int main(int argc, char **argv) } else { die("Unknown code/block size\n"); } - r = teensy_write(buf, write_size, first_block ? 3.0 : 0.25); +// printf("%d %d\n", addr,code_size); +// r = teensy_write(buf, write_size, first_block ? 3.0 : 0.25); + r = teensy_write(buf, write_size, first_block ? 3.0 : 0.5); if (!r) die("error writing to Teensy\n"); first_block = 0; } @@ -416,14 +430,14 @@ HANDLE open_usb_device(int vid, int pid) int write_usb_device(HANDLE h, void *buf, int len, int timeout) { static HANDLE event = NULL; - unsigned char tmpbuf[1089]; + unsigned char tmpbuf[1090]; OVERLAPPED ov; DWORD n, r; if (len > sizeof(tmpbuf) - 1) return 0; if (event == NULL) { event = CreateEvent(NULL, TRUE, TRUE, NULL); - if (!event) return 0; + if (!event) return -1; } ResetEvent(&event); memset(&ov, 0, sizeof(ov)); @@ -431,16 +445,16 @@ int write_usb_device(HANDLE h, void *buf, int len, int timeout) tmpbuf[0] = 0; memcpy(tmpbuf + 1, buf, len); if (!WriteFile(h, tmpbuf, len + 1, NULL, &ov)) { - if (GetLastError() != ERROR_IO_PENDING) return 0; + if (GetLastError() != ERROR_IO_PENDING) return -2; r = WaitForSingleObject(event, timeout); if (r == WAIT_TIMEOUT) { CancelIo(h); - return 0; + return -3; } - if (r != WAIT_OBJECT_0) return 0; + if (r != WAIT_OBJECT_0) return -4; } - if (!GetOverlappedResult(h, &ov, &n, FALSE)) return 0; - if (n <= 0) return 0; + if (!GetOverlappedResult(h, &ov, &n, FALSE)) return -5; + if (n <= 0) return -6; return 1; } @@ -469,9 +483,10 @@ int teensy_write(void *buf, int len, double timeout) { int r; if (!win32_teensy_handle) return 0; + delay(0.25); r = write_usb_device(win32_teensy_handle, buf, len, (int)(timeout * 1000.0)); - //if (!r) print_win32_err(); - return r; + if (!r) print_win32_err(); + return r>0; } void teensy_close(void) @@ -493,12 +508,297 @@ int hard_reboot(void) return r; } -int soft_reboot(void) +/*********** following for soft reboot on teensy **********************/ + +typedef struct hid_struct { + HANDLE h; + int vid; + int pid; +} hid_struct_t; + +int is_teensyduino_hid(int vid, int pid) +{ + if (vid == 0x16C0) { + if (pid == 0x0478) return 1; //WMXZ needed to recognize Teensy for Programming + if (pid == 0x0482) return 1; + if (pid == 0x0484) return 1; + if (pid == 0x0485) return 1; + if (pid == 0x0486) return 1; + if (pid == 0x0488) return 1; + } + return 0; +} + +void verbosePrintTeensyType(int capUsage) +{ + if((int)(capUsage) == 0x001D) + printf_verbose(" have Teensy 3.0\n"); + else if((int)(capUsage) == 0x001E) + printf_verbose(" have Teensy 3.1\n"); + else if((int)(capUsage) == 0x0020) + printf_verbose(" have Teensy LC\n"); + else if((int)(capUsage) == 0x0021) + printf_verbose(" have Teensy 3.2\n"); + else if((int)(capUsage) == 0x0022) + printf_verbose(" have Teensy 3.6\n"); + else if((int)(capUsage) == 0x0023) + printf_verbose(" have Teensy 3.5\n"); +} + +int hid_send_feature(hid_struct_t *h) { - printf("Soft reboot is not implemented for Win32\n"); + unsigned char buf[5] = {0, 0xA9, 0x45, 0xC2, 0x6B}; + + printf_verbose("hid_send_feature\n"); + if ((h->vid == 0x16C0) && !(h->pid == 0x0478)) // we need to be rebooted + if (!HidD_SetFeature(h->h, buf, 5)) { + printf("error sending reboot command\n"); + } + CloseHandle(h->h); return 0; } +hid_struct_t * find_teensy_hid(void) +{ + GUID guid; + HDEVINFO info; + DWORD index=0, reqd_size; + SP_DEVICE_INTERFACE_DATA iface; + SP_DEVICE_INTERFACE_DETAIL_DATA *details; + HIDD_ATTRIBUTES attrib; + struct hid_struct *hid; + PHIDP_PREPARSED_DATA hid_data; + HIDP_CAPS capabilities; + HANDLE h; + BOOL ret; + + printf_verbose("\n **** Find teensy on HID device list ****\n"); + + HidD_GetHidGuid(&guid); + info = SetupDiGetClassDevs(&guid, NULL, NULL, DIGCF_PRESENT | DIGCF_DEVICEINTERFACE); + if (info == INVALID_HANDLE_VALUE) return 0; + for (index=0; 1 ;index++) { + iface.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA); + ret = SetupDiEnumDeviceInterfaces(info, NULL, &guid, index, &iface); + if (!ret) return 0; + + SetupDiGetInterfaceDeviceDetail(info, &iface, NULL, 0, &reqd_size, NULL); + details = (SP_DEVICE_INTERFACE_DETAIL_DATA *)malloc(reqd_size); + if (details == NULL) continue; + + memset(details, 0, reqd_size); + details->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA); + ret = SetupDiGetDeviceInterfaceDetail(info, &iface, details, reqd_size, NULL, NULL); + if (!ret) { + free(details); + continue; + } + h = CreateFile(details->DevicePath, GENERIC_READ|GENERIC_WRITE, + FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, + OPEN_EXISTING, 0, NULL); + free(details); + if (h == INVALID_HANDLE_VALUE) continue; + // + attrib.Size = sizeof(HIDD_ATTRIBUTES); + ret = HidD_GetAttributes(h, &attrib); + if (!ret) { + CloseHandle(h); + continue; + } + + char stringBuffer[32]; stringBuffer[0]=0; + HidD_GetSerialNumberString(h,stringBuffer,32); + printf_verbose("\nfound_hid:\n"); + printf_verbose(" vid = 0x%04X,", (int)(attrib.VendorID)); + printf_verbose(" pid = 0x%04X", (int)(attrib.ProductID)); + printf_verbose(" ser = %ls\n", stringBuffer); + + if (!is_teensyduino_hid(attrib.VendorID, attrib.ProductID)) { + CloseHandle(h); + printf_verbose("no Teensy\n"); + continue; + } + if (!HidD_GetPreparsedData(h, &hid_data)) { + CloseHandle(h); + continue; + } + if (!HidP_GetCaps(hid_data, &capabilities)) { + HidD_FreePreparsedData(hid_data); + CloseHandle(h); + continue; + } + printf_verbose(" use = 0x%04X 0x%04X\n", (int)(capabilities.UsagePage), (int)(capabilities.Usage)); + if ((((int)(attrib.ProductID)==0x0478) && (capabilities.UsagePage != 0xFF9C)) + || (((int)(attrib.ProductID)!=0x0478) && (capabilities.UsagePage != 0xFFC9))) + { + HidD_FreePreparsedData(hid_data); + CloseHandle(h); + continue; + } + HidD_FreePreparsedData(hid_data); + + verbosePrintTeensyType((int)(capabilities.Usage)); + printf_verbose("\n"); + // + hid = (struct hid_struct *)malloc(sizeof(struct hid_struct)); + if (!hid) { + // TODO: should this close the handle and continue? + return 0; + } + hid->h = h; // handle for + hid->vid = attrib.VendorID; + hid->pid = attrib.ProductID; + return hid; + } +} + +int multi_has(void *buf, const char *str) +{ + const char *p; + int len; + + len = strlen(str); + for (p = (const char *)buf; *p; p += strlen(p) + 1) {if (strnicmp(p, str, len) == 0) return 1; } + return 0; +} + +int find_teensy_serial(char *name) +{ + GUID guid; + DWORD n, size, type; + HDEVINFO info; + LONG r; + SP_DEVINFO_DATA data; + HKEY key; + BYTE buf[1024]; + int com; + + printf_verbose("\n **** Find teensy on Serial ports ****\n"); + if (!SetupDiClassGuidsFromName("Ports", &guid, 1, &n) || + (info =SetupDiGetClassDevs(&guid, NULL, NULL, DIGCF_PRESENT)) == INVALID_HANDLE_VALUE) + { + printf_verbose("Unable to get GUID for Ports class\n"); + return 0; + } + + for (n = 0; ; n++) { + data.cbSize = sizeof(data); + if (!SetupDiEnumDeviceInfo(info, n, &data)) break; + printf_verbose("\nDevice Instance: %ld\n", data.DevInst); + if (!SetupDiGetDeviceRegistryProperty(info, &data, + SPDRP_HARDWAREID , &type, buf, sizeof(buf), NULL)) + { + continue; + } + printf_verbose(" DeviceRegistryProperty: acquired\n"); + + if (type != REG_MULTI_SZ) continue; +// printf_verbose(" Key type: REG_MULTI_SZ\n"); +// if (verbose) print_multi(buf); + if (!(multi_has(buf, "USB\\Vid_16c0&Pid_0483") + || multi_has(buf, "USB\\Vid_16c0&Pid_0487") + || multi_has(buf, "USB\\Vid_16c0&Pid_0485") + || multi_has(buf, "USB\\Vid_16c0&Pid_0476"))) continue; + + printf_verbose("Found Teensy:\n"); + key = SetupDiOpenDevRegKey(info, &data, DICS_FLAG_GLOBAL, + 0, DIREG_DEV, KEY_QUERY_VALUE); + if (key == INVALID_HANDLE_VALUE) continue; +// printf_verbose(" Registry Key: acquired\n"); + + size = sizeof(buf); + r = RegQueryValueEx(key, "Name", NULL, &type, buf, &size); + printf_verbose(" Name: \"%s\"\n", buf); + + r = RegQueryValueEx(key, "PortName", NULL, &type, buf, &size); + printf_verbose(" PortName: \"%s\"\n", buf); + RegCloseKey(key); + if (r != ERROR_SUCCESS || type != REG_SZ) continue; + + com = 0; + if (sscanf((char *)buf, "COM%d", &com) != 1) continue; + if (com < 1 || com > 999) continue; + sprintf(name, "\\\\.\\COM%d", com); // Microsoft KB115831 + break; +// add_serial_name(name); + } + SetupDiDestroyDeviceInfoList(info); + return com; + +} +HANDLE open_port(const char *path) +{ + HANDLE port_handle = INVALID_HANDLE_VALUE; + port_handle = CreateFile(path, GENERIC_READ | GENERIC_WRITE, + 0, 0, OPEN_EXISTING, 0, NULL); + if (port_handle == INVALID_HANDLE_VALUE) return 0; + return port_handle; +} + +int send_break(HANDLE port_handle) +{ + COMMCONFIG port_cfg, port_cfg_134; + DWORD len; + + if (port_handle == INVALID_HANDLE_VALUE) return -1; + len = sizeof(COMMCONFIG); + if (!GetCommConfig(port_handle, &port_cfg, &len)) return -1; + memcpy(&port_cfg_134, &port_cfg, sizeof(COMMCONFIG)); +// + port_cfg_134.dcb.BaudRate = 134; + if (!SetCommConfig(port_handle, &port_cfg_134, len)) return -1; + return 0; +} + +void close_port(HANDLE port_handle) +{ + if (port_handle == INVALID_HANDLE_VALUE) return; + CloseHandle(port_handle); + port_handle = INVALID_HANDLE_VALUE; +} + + +int soft_reboot(void) +{ + HANDLE serial_handle; + char name[32]; + + hid_struct_t *hid; + hid = find_teensy_hid(); + if(hid) + { + hid_send_feature(hid); + return 1; + } + + if(!find_teensy_serial(name)) + { + printf("Error: no teensy found for soft reboot\n"); + return 0; + } + // + serial_handle = open_port(name); + if (!serial_handle) + { + printf("Error: cannot open teensy for soft reboot\n"); + return 0; + } + // + send_break(serial_handle); + close_port(serial_handle); + CloseHandle(serial_handle); + // + serial_handle = NULL; + return 1; +} + +void list_teensies() +{ + char name[32]; + + find_teensy_hid(); + find_teensy_serial(name); +} #endif @@ -1035,7 +1335,7 @@ static const struct { {"atmega32u4", 32256, 128}, {"at90usb646", 64512, 256}, {"at90usb1286", 130048, 256}, -#if defined(USE_LIBUSB) || defined(USE_APPLE_IOKIT) +#if defined(USE_LIBUSB) || defined(USE_APPLE_IOKIT) || defined(USE_WIN32) {"mkl26z64", 63488, 512}, {"mk20dx128", 131072, 1024}, {"mk20dx256", 262144, 1024}, @@ -1089,6 +1389,7 @@ void parse_flag(char *arg) case 'n': reboot_after_programming = 0; break; case 'v': verbose = 1; break; case 'b': boot_only = 1; break; + case 'l': list_only = 1; break; default: fprintf(stderr, "Unknown flag '%c'\n\n", arg[i]); usage(NULL); From 39738b399db0a8fbe8479ca6ab3a77f84708c832 Mon Sep 17 00:00:00 2001 From: WMXZ-EU Date: Wed, 19 Oct 2016 11:40:49 +0200 Subject: [PATCH 02/13] minor changes added option in help removed (WMXZ) from title --- teensy_loader_cli.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/teensy_loader_cli.c b/teensy_loader_cli.c index 6d68ba9..c0bbd93 100644 --- a/teensy_loader_cli.c +++ b/teensy_loader_cli.c @@ -37,13 +37,13 @@ void usage(const char *err) { if(err != NULL) fprintf(stderr, "%s\n\n", err); fprintf(stderr, - "Usage: teensy_loader_cli --mcu= [-w] [-r] [-s] [-n] [-b] [-v] \n" + "Usage: teensy_loader_cli --mcu= [-w] [-r] [-s] [-n] [-b] [-l] [-v] \n" "\t-w : Wait for device to appear\n" "\t-r : Use hard reboot if device not online\n" "\t-s : Use soft reboot if device not online (Teensy3.x only)\n" "\t-n : No reboot after programming\n" "\t-b : Boot only, do not program\n" - "\t-l : list Teensy\n" + "\t-l : list Teensies\n" "\t-v : Verbose output\n" "\nUse `teensy_loader_cli --list-mcus` to list supported MCUs.\n" "\nFor more information, please visit:\n" @@ -113,7 +113,7 @@ int main(int argc, char **argv) if (!code_size) { usage("MCU type must be specified"); } - printf_verbose("Teensy Loader, Command Line, Version 2.0 (WMXZ)\n"); + printf_verbose("Teensy Loader, Command Line, Version 2.0.1\n"); if (boot_only) { if (! teensy_open()) { From 34735ba1d7678457977dd66053e8f6ff6a6aa953 Mon Sep 17 00:00:00 2001 From: Frank Date: Wed, 19 Oct 2016 12:05:40 +0200 Subject: [PATCH 03/13] Update Readme --- README.md | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 431cf33..4b2131c 100644 --- a/README.md +++ b/README.md @@ -23,9 +23,11 @@ Required command line parameters: ``` -mmcu= : Specify Processor. You must specify the target processor. This syntax is the same as used by gcc, which makes integrating with your Makefile easier. Valid options are: --mmcu=mk20dx256 : Teensy 3.1 (linux & mac only) --mmcu=mk20dx128 : Teensy 3.0 (linux & mac only) --mmcu=mkl26z64 : Teensy-LC (linux & mac only) +-mmcu=mk66fx1m0 : Teensy 3.6 +-mmcu=mk64fx512 : Teensy 3.5 +-mmcu=mk20dx256 : Teensy 3.1/3.2 +-mmcu=mk20dx128 : Teensy 3.0 +-mmcu=mkl26z64 : Teensy-LC -mmcu=atmega32u4 : Teensy 2.0 -mmcu=at90usb1286 : Teensy++ 2.0 -mmcu=at90usb162 : Teensy 1.0 From eb3ecdfdb88d600294d8b198470bb6e171660d10 Mon Sep 17 00:00:00 2001 From: WMXZ-EU Date: Wed, 19 Oct 2016 12:30:05 +0200 Subject: [PATCH 04/13] more list_teensies Added dummy list_teensies for non-windows cases --- teensy_loader_cli.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/teensy_loader_cli.c b/teensy_loader_cli.c index c0bbd93..c573fd7 100644 --- a/teensy_loader_cli.c +++ b/teensy_loader_cli.c @@ -799,6 +799,11 @@ void list_teensies() find_teensy_hid(); find_teensy_serial(name); } +#else +void list_teensies() +{ printf("Error: list teensies not implemented: use wondows"); +} + #endif From cee6494cc546dbab0e23fb9628f3df89dee40112 Mon Sep 17 00:00:00 2001 From: Frank Date: Wed, 19 Oct 2016 12:39:50 +0200 Subject: [PATCH 05/13] Incr. MAX_MEMORY_SIZE to 1048576 (Teensy 3.6) --- teensy_loader_cli.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/teensy_loader_cli.c b/teensy_loader_cli.c index c573fd7..0eb0b9a 100644 --- a/teensy_loader_cli.c +++ b/teensy_loader_cli.c @@ -1122,7 +1122,7 @@ int soft_reboot(void) // the maximum flash image size we can support // chips with larger memory may be used, but only this // much intel-hex data can be loaded into memory! -#define MAX_MEMORY_SIZE 0x40000 +#define MAX_MEMORY_SIZE 1048576 static unsigned char firmware_image[MAX_MEMORY_SIZE]; static unsigned char firmware_mask[MAX_MEMORY_SIZE]; From e8e3c3704604a20905cb8b59ee98ec21aff96500 Mon Sep 17 00:00:00 2001 From: WMXZ-EU Date: Thu, 20 Oct 2016 15:53:30 +0200 Subject: [PATCH 06/13] minimized write delay --- teensy_loader_cli.c | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/teensy_loader_cli.c b/teensy_loader_cli.c index 0eb0b9a..4428504 100644 --- a/teensy_loader_cli.c +++ b/teensy_loader_cli.c @@ -199,8 +199,7 @@ int main(int argc, char **argv) die("Unknown code/block size\n"); } // printf("%d %d\n", addr,code_size); -// r = teensy_write(buf, write_size, first_block ? 3.0 : 0.25); - r = teensy_write(buf, write_size, first_block ? 3.0 : 0.5); + r = teensy_write(buf, write_size, first_block ? 3.0 : 0.25); if (!r) die("error writing to Teensy\n"); first_block = 0; } @@ -437,7 +436,7 @@ int write_usb_device(HANDLE h, void *buf, int len, int timeout) if (len > sizeof(tmpbuf) - 1) return 0; if (event == NULL) { event = CreateEvent(NULL, TRUE, TRUE, NULL); - if (!event) return -1; + if (!event) return 0; } ResetEvent(&event); memset(&ov, 0, sizeof(ov)); @@ -445,16 +444,16 @@ int write_usb_device(HANDLE h, void *buf, int len, int timeout) tmpbuf[0] = 0; memcpy(tmpbuf + 1, buf, len); if (!WriteFile(h, tmpbuf, len + 1, NULL, &ov)) { - if (GetLastError() != ERROR_IO_PENDING) return -2; + if (GetLastError() != ERROR_IO_PENDING) return 0; r = WaitForSingleObject(event, timeout); if (r == WAIT_TIMEOUT) { CancelIo(h); - return -3; + return 0; } - if (r != WAIT_OBJECT_0) return -4; + if (r != WAIT_OBJECT_0) return 0; } - if (!GetOverlappedResult(h, &ov, &n, FALSE)) return -5; - if (n <= 0) return -6; + if (!GetOverlappedResult(h, &ov, &n, FALSE)) return 0; + if (n <= 0) return 0; return 1; } @@ -483,10 +482,10 @@ int teensy_write(void *buf, int len, double timeout) { int r; if (!win32_teensy_handle) return 0; - delay(0.25); + delay(0.05); // min delay needed to avoid error 32: "A device attached to the system is not functioning" r = write_usb_device(win32_teensy_handle, buf, len, (int)(timeout * 1000.0)); if (!r) print_win32_err(); - return r>0; + return r; } void teensy_close(void) @@ -801,7 +800,7 @@ void list_teensies() } #else void list_teensies() -{ printf("Error: list teensies not implemented: use wondows"); +{ printf("Error: list teensies not implemented: use windows"); } #endif From 436ba4d08346ffbc6596da0ad67f887a37c17e35 Mon Sep 17 00:00:00 2001 From: WMXZ-EU Date: Wed, 9 Nov 2016 21:10:28 +0100 Subject: [PATCH 07/13] some cosmetics --- teensy_loader_cli.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/teensy_loader_cli.c b/teensy_loader_cli.c index 4428504..8e68fb4 100644 --- a/teensy_loader_cli.c +++ b/teensy_loader_cli.c @@ -482,7 +482,7 @@ int teensy_write(void *buf, int len, double timeout) { int r; if (!win32_teensy_handle) return 0; - delay(0.05); // min delay needed to avoid error 32: "A device attached to the system is not functioning" + delay(0.1); // min delay needed to avoid error 32: "A device attached to the system is not functioning" r = write_usb_device(win32_teensy_handle, buf, len, (int)(timeout * 1000.0)); if (!r) print_win32_err(); return r; From df250d8b1c003bef96adefe38ef38a13cb5b7765 Mon Sep 17 00:00:00 2001 From: WMXZ-EU Date: Mon, 19 Dec 2016 19:50:27 +0100 Subject: [PATCH 08/13] update --- Makefile | 2 +- teensy_loader_cli.c | 34 ++++++++++++++++++++++++---------- 2 files changed, 25 insertions(+), 11 deletions(-) diff --git a/Makefile b/Makefile index 31fde1a..b7d2298 100644 --- a/Makefile +++ b/Makefile @@ -20,7 +20,7 @@ else ifeq ($(OS), WINDOWS) CC ?= gcc CFLAGS ?= -O2 -Wall teensy_loader_cli.exe: teensy_loader_cli.c - $(CC) $(CFLAGS) -s -DUSE_WIN32 -o teensy_loader_cli.exe teensy_loader_cli.c -lhid -lsetupapi + $(CC) $(CFLAGS) -s -DUSE_WIN32 -o teensy_loader_cli.exe teensy_loader_cli.c -lhid -lsetupapi -lwinmm cleanw: del /F teensy_loader_cli teensy_loader_cli.exe diff --git a/teensy_loader_cli.c b/teensy_loader_cli.c index 8e68fb4..b3415cf 100644 --- a/teensy_loader_cli.c +++ b/teensy_loader_cli.c @@ -1,7 +1,7 @@ /* Teensy Loader, Command Line Interface * Program and Reboot Teensy Board with HalfKay Bootloader * http://www.pjrc.com/teensy/loader_cli.html - * Copyright 2008-2010, PJRC.COM, LLC + * Copyright 2008-2016, PJRC.COM, LLC * * You may redistribute this program and/or modify it under the terms * of the GNU General Public License as published by the Free Software @@ -113,7 +113,7 @@ int main(int argc, char **argv) if (!code_size) { usage("MCU type must be specified"); } - printf_verbose("Teensy Loader, Command Line, Version 2.0.1\n"); + printf_verbose("Teensy Loader, Command Line, Version 2.1.z\n"); if (boot_only) { if (! teensy_open()) { @@ -198,8 +198,7 @@ int main(int argc, char **argv) } else { die("Unknown code/block size\n"); } -// printf("%d %d\n", addr,code_size); - r = teensy_write(buf, write_size, first_block ? 3.0 : 0.25); + r = teensy_write(buf, write_size, first_block ? 5.0 : 0.5); if (!r) die("error writing to Teensy\n"); first_block = 0; } @@ -220,6 +219,14 @@ int main(int argc, char **argv) /* */ /* USB Access - libusb (Linux & FreeBSD) */ /* */ +/* Uses libusb v0.1. To install: */ +/* - [debian, ubuntu, mint] apt install libusb-dev */ +/* - [redhat, centos] yum install libusb-devel */ +/* - [fedora] dnf install libusb-devel */ +/* - [arch linux] pacman -S libusb-compat */ +/* - [gentoo] emerge dev-libs/libusb-compat */ +/* */ +/* - [freebsd] seems to be preinstalled */ /****************************************************************/ #if defined(USE_LIBUSB) @@ -481,11 +488,18 @@ int teensy_open(void) int teensy_write(void *buf, int len, double timeout) { int r; + uint32_t begin, now, total; if (!win32_teensy_handle) return 0; - delay(0.1); // min delay needed to avoid error 32: "A device attached to the system is not functioning" - r = write_usb_device(win32_teensy_handle, buf, len, (int)(timeout * 1000.0)); - if (!r) print_win32_err(); - return r; + total = (uint32_t)(timeout * 1000.0); + begin = timeGetTime(); + now = begin; + do { + r = write_usb_device(win32_teensy_handle, buf, len, total - (now - begin)); + if (r > 0) return 1; + Sleep(10); + now = timeGetTime(); + } while (now - begin < total); + return 0; } void teensy_close(void) @@ -1121,7 +1135,7 @@ int soft_reboot(void) // the maximum flash image size we can support // chips with larger memory may be used, but only this // much intel-hex data can be loaded into memory! -#define MAX_MEMORY_SIZE 1048576 +#define MAX_MEMORY_SIZE 0x100000 static unsigned char firmware_image[MAX_MEMORY_SIZE]; static unsigned char firmware_mask[MAX_MEMORY_SIZE]; @@ -1450,5 +1464,5 @@ void boot(unsigned char *buf, int write_size) buf[0] = 0xFF; buf[1] = 0xFF; buf[2] = 0xFF; - teensy_write(buf, write_size, 0.25); + teensy_write(buf, write_size, 0.5); } From 57c5e041809f7ab8a7c61d144b5ccd4179c797d1 Mon Sep 17 00:00:00 2001 From: WMXZ-EU Date: Mon, 6 Feb 2017 11:14:48 +0100 Subject: [PATCH 09/13] added exe file --- teensy_loader_cli.exe | Bin 0 -> 22016 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 teensy_loader_cli.exe diff --git a/teensy_loader_cli.exe b/teensy_loader_cli.exe new file mode 100644 index 0000000000000000000000000000000000000000..78b2fd2840ef87283cc5f25e1e16c22b8489539b GIT binary patch literal 22016 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 tk$;DW?m!PsasC}7|3l<|2M<_w)Uh0-Ev Date: Mon, 6 Feb 2017 11:18:12 +0100 Subject: [PATCH 10/13] modified help text flag -s indicated programming mode via software --- teensy_loader_cli.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/teensy_loader_cli.c b/teensy_loader_cli.c index b3415cf..a943ad1 100644 --- a/teensy_loader_cli.c +++ b/teensy_loader_cli.c @@ -40,7 +40,7 @@ void usage(const char *err) "Usage: teensy_loader_cli --mcu= [-w] [-r] [-s] [-n] [-b] [-l] [-v] \n" "\t-w : Wait for device to appear\n" "\t-r : Use hard reboot if device not online\n" - "\t-s : Use soft reboot if device not online (Teensy3.x only)\n" + "\t-s : Use software to put devive into programming mode (Teensy3.x only)\n" "\t-n : No reboot after programming\n" "\t-b : Boot only, do not program\n" "\t-l : list Teensies\n" From b6d4e778b7f7b537e875a2b37d8c5473924b23d9 Mon Sep 17 00:00:00 2001 From: WMXZ-EU Date: Fri, 10 Feb 2017 13:45:30 +0100 Subject: [PATCH 11/13] corrected T3.5 usage --- teensy_loader_cli.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/teensy_loader_cli.c b/teensy_loader_cli.c index a943ad1..6b2cb80 100644 --- a/teensy_loader_cli.c +++ b/teensy_loader_cli.c @@ -554,7 +554,7 @@ void verbosePrintTeensyType(int capUsage) printf_verbose(" have Teensy 3.2\n"); else if((int)(capUsage) == 0x0022) printf_verbose(" have Teensy 3.6\n"); - else if((int)(capUsage) == 0x0023) + else if((int)(capUsage) == 0x001F) printf_verbose(" have Teensy 3.5\n"); } From c8821d7c924c809e68a29119d6cb7a428b0e088f Mon Sep 17 00:00:00 2001 From: WMXZ-EU Date: Fri, 10 Feb 2017 13:46:25 +0100 Subject: [PATCH 12/13] added exe --- teensy_loader_cli.exe | Bin 22016 -> 22528 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/teensy_loader_cli.exe b/teensy_loader_cli.exe index 78b2fd2840ef87283cc5f25e1e16c22b8489539b..ea68d80ad8a625daa99292a238511d9597c9eff0 100644 GIT binary patch delta 1346 zcmYjQdrVVj6#vfU4hWW%ht(DeT;xK#P_W2jSw^5!ahsWg$;06kMg$3N2*ZMj3$Q=>qT&PM6qXn<4hZ{0t7uvC9$ZdFDqcOo%P(F4Us}fD4*!k%VI#dSg6pFZRfH{(YoJBRj~s_Xadu&PWNf1>1{B)Z z#Npj;j?ZnivB&#VRqbwKoL}aA*D}A#dEqj@&-sRBKE-*upBHyNEOdBf*UsQEQPxqC z(Y$GTXU>l1&E}2bd0mOoM5^cAm5fdFyUBf9NnxA!4h@J7Y*eIGGmu=*Jx(vGs`hJV z5yd4-3rU?+o2Sb!m-yu)n5);pNi5b|VGKXizXum^TK_S8haVa8;09hdm|zL#3@5;h zN29i^wG~n1U*=WS@lF4Nss?GDWjqiCt|Uumw(Pm}x2iga8}(f4#IWd9Z~#rwd*Dax zjW)w|9E#3_dpH%XhesG4JCAfl(aUF0TpT@ljMl6u_ z=@Lq)-wfF^AIz9@*uI|^YQ~#V4p?w?ybM{G9iIWO7^cayH9;m{|-MLG~%ymK-z9&DH6VrXt8nV{736_Qmw8SnX}uC&8|>0p&<*W-)q|k z$vDJ4T^oWObD(v;0=~}L79>2KXfu39xu`NdZ`gBrNmYH$+`5>UV&DfGes=AUC6`^6 zT_4D1#}&(ndq~3dNoS#6@g~iP(1pJx$HM>ySaLOC+x%N}GgK_aH!ORozd_3uOApDO zFCY09?IOo#2tW31hA8ji!ch_?25HvUa9v6oT*Jzgmt&ueW@C4E$QqAGe%+e{a{LKL zQeK0*7@B$m7V$yq3EIhnYug1@ilX%#6ypV}*>Hfzw*Ki$oX)ZA$MraA%}AZ&%I{uP zJtf!E7)062?~LxrbCtxlCrn^W+rC792(sN*wx&G@Fzv5ssFLh;QhlRcs;p|NX{wTH z_Hy1(SKUxiTU)cYTB@z9RPr;!gD?tKR`7*lIgGW^gu`it*g-!wa=b_)U5Lqt3DA?y r@f_)tJey+ac delta 1299 zcmYk5e@t6d6vyv*ya8h+Eg<7{Ezpj~52di8Fnv6HEP7-hyV!Gz5bOX$q7;Mib$p4*yW^WM$peDAsE zopbJK+eK)*0Nzs@qS)$hn&~6ffgrJ5(i~^{Hb?X(!kNj%7#2f98ND(18)QQfMhd&3 z6rDmQIIxx03iU&w4uGkV;$IOkt}aHc5n&H5uXDi!p4834i|R|U&j@e?2lXB}fr_CH z8u2|tJ+z<@mqwfs_XDl-aYtyak5@?Vi|6`S{C;9v!bWIRcPC84$+RXR=)1g47H>Ng zHuuH>FXwlOXOC%`*44teeUaNQtlHmjyL{EY!tJfA_6)Zl3EP#OGv%&;?5T~uEXr%k z6*g89q<3LptYood3_nhEnoXqoUw(kGxj`?vS2@eu15?xbe2}eu?Fpl#k2_`YdTnaa_+*|}f>^A4wmw4U_x2ci)7xG5;?5(Ty@i6#b=)1Rg zXuZ4Oe)y9E7&O15XO(nlMn~;9M|Ec5x#TT$?NiAu4<4#km@6QWTFZSB$Y;nw)b%-a zi@AI{-Voj!Jf4yt$-Rdh_*qIW?86%=S>VCg)NFVSA5VP}hOjyH6!hW!)MvqfWtL-! zNlvOaU-sXLX3Ra>^eRu(j1!h3uwar^hKI1wnhy##TJ12U_E|RzAgWi>3Sp!9IZCFR zYB=CMfA;7;emcq*&S{7}udp13kEYucj_!Z-Za3xXNfx;^*?im+8%;E#6RW~gG!c8F8h6@x zV{Gm(FooB1dub+HH+2Zp)hOCOf*tsYJW1+{bLATstuhzaP~7Ggt)cd6G3ivb%-B~?=VN&f Date: Wed, 7 Dec 2022 08:04:39 +0100 Subject: [PATCH 13/13] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 4b2131c..0e1f4b8 100644 --- a/README.md +++ b/README.md @@ -42,7 +42,7 @@ Optional command line parameters: `-r` : Use hard reboot if device not online. Perform a hard reset using a second Teensy running this [rebooter](rebootor) code, with pin C7 connected to the reset pin on your main Teensy. While this requires using a second board, it allows a Makefile to fully automate reprogramming your Teensy. No manual button press is required! -`-s` : Use sort reboot if device not online. Perform a sort reset request by searching for any Teensy running USB Serial code built by Teensyduino. A request to reboot is transmitted to the first device found. +`-s` : Use soft reboot if device not online. Perform a soft reset request by searching for any Teensy running USB Serial code built by Teensyduino. A request to reboot is transmitted to the first device found. `-n` : No reboot after programming. After programming the hex file, do not reboot. HalfKay remains running. This option may be useful if you wish to program the code but do not intend for it to run until the Teensy is installed inside a system with its I/O pins connected.