| 
									
										
										
										
											2020-05-28 14:52:22 -04:00
										 |  |  | diff --git a/cli/Makefile b/cli/Makefile
 | 
					
						
							|  |  |  | index dee725e..d038615 100644
 | 
					
						
							|  |  |  | --- a/cli/Makefile
 | 
					
						
							|  |  |  | +++ b/cli/Makefile
 | 
					
						
							|  |  |  | @@ -3,6 +3,7 @@ CFLAGS=-c -Wall
 | 
					
						
							|  |  |  |  LDFLAGS= | 
					
						
							|  |  |  |  SOURCES=main.c | 
					
						
							|  |  |  |  INCLUDE_DIRS=-I . | 
					
						
							|  |  |  | +CHECK=1
 | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  |  ifeq ($(OS),Windows_NT) | 
					
						
							|  |  |  |  	SOURCES+=hid-win.c | 
					
						
							|  |  |  | @@ -15,19 +16,21 @@ else
 | 
					
						
							|  |  |  |  		SOURCES+=rs232.c | 
					
						
							|  |  |  |  		LIBS=-framework IOKit -framework CoreFoundation | 
					
						
							|  |  |  |  	else | 
					
						
							|  |  |  | +		CHECK:=$(shell pkg-config --exists libusb-1.0 && echo 1)
 | 
					
						
							|  |  |  |  		SOURCES+=hid-libusb.c | 
					
						
							|  |  |  |  		SOURCES+=rs232.c | 
					
						
							|  |  |  |  		LIBS=`pkg-config libusb-1.0 --libs` -lrt -lpthread | 
					
						
							|  |  |  |  		INCLUDE_DIRS+=`pkg-config libusb-1.0 --cflags` | 
					
						
							|  |  |  |  		CFLAGS+=-std=gnu99 | 
					
						
							|  |  |  |  		LDFLAGS+=-no-pie | 
					
						
							|  |  |  | -		endif
 | 
					
						
							|  |  |  | +	endif
 | 
					
						
							|  |  |  |  endif | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  |  OBJECTS=$(SOURCES:.c=.o) | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  |  EXECUTABLE = hid-flash | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  | +ifeq ($(CHECK), 1)
 | 
					
						
							|  |  |  |  all: $(SOURCES) $(EXECUTABLE) | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  |  $(EXECUTABLE): $(OBJECTS) | 
					
						
							|  |  |  | @@ -35,6 +38,11 @@ $(EXECUTABLE): $(OBJECTS)
 | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  |  .c.o: | 
					
						
							|  |  |  |  	$(CC) $(CFLAGS) $(INCLUDE_DIRS) $< -o $@ | 
					
						
							|  |  |  | +else
 | 
					
						
							|  |  |  | +all:
 | 
					
						
							|  |  |  | +	@echo "    hid-flash requires libusb-1.0, please install with:"
 | 
					
						
							|  |  |  | +	@echo "    sudo apt-get install libusb-1.0"
 | 
					
						
							|  |  |  | +endif
 | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  |  clean: | 
					
						
							|  |  |  |  	rm -f $(OBJECTS) $(EXECUTABLE) $(EXECUTABLE).exe | 
					
						
							|  |  |  | diff --git a/cli/main.c b/cli/main.c
 | 
					
						
							|  |  |  | index a6a8f7f..84abc33 100644
 | 
					
						
							|  |  |  | --- a/cli/main.c
 | 
					
						
							|  |  |  | +++ b/cli/main.c
 | 
					
						
							|  |  |  | @@ -19,6 +19,12 @@
 | 
					
						
							|  |  |  |  *	by Vassilis Serasidis <avrsite@yahoo.gr> | 
					
						
							|  |  |  |  *	This HID bootloader work with bluepill + STM32duino + Arduino IDE <http://www.stm32duino.com/> | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  | +* Modified 4/24/2020
 | 
					
						
							|  |  |  | +* by Eric Callahan <arksine.code@gmail.com>
 | 
					
						
							|  |  |  | +* This version of hid-flash has been modified to work with Klipper.
 | 
					
						
							|  |  |  | +* The serial port argument is now optional.  If entered and found this program
 | 
					
						
							|  |  |  | +* will attempt to force Klipper jump to the bootloader by connecting at
 | 
					
						
							|  |  |  | +* 1200 baud and enabling DTR.
 | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  |  #include <stdlib.h> | 
					
						
							|  |  |  | @@ -37,6 +43,8 @@
 | 
					
						
							|  |  |  |  #define PID           0xBEBA | 
					
						
							|  |  |  |  #define FIRMWARE_VER  0x0300 | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  | +#define MAX_PAGE_SIZE 2048
 | 
					
						
							|  |  |  | +
 | 
					
						
							|  |  |  |  int serial_init(char *argument, uint8_t __timer); | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  | @@ -73,45 +81,48 @@ int main(int argc, char *argv[]) {
 | 
					
						
							|  |  |  |    int i; | 
					
						
							|  |  |  |    setbuf(stdout, NULL); | 
					
						
							|  |  |  |    uint8_t _timer = 0; | 
					
						
							|  |  |  | -  
 | 
					
						
							|  |  |  | +
 | 
					
						
							|  |  |  |    printf("\n+-----------------------------------------------------------------------+\n"); | 
					
						
							|  |  |  |    printf  ("|         HID-Flash v2.2.1 - STM32 HID Bootloader Flash Tool            |\n"); | 
					
						
							|  |  |  |    printf  ("|     (c)      2018 - Bruno Freitas       http://www.brunofreitas.com   |\n"); | 
					
						
							|  |  |  |    printf  ("|     (c) 2018-2019 - Vassilis Serasidis  https://www.serasidis.gr      |\n"); | 
					
						
							|  |  |  |    printf  ("|   Customized for STM32duino ecosystem   https://www.stm32duino.com    |\n"); | 
					
						
							|  |  |  |    printf  ("+-----------------------------------------------------------------------+\n\n"); | 
					
						
							|  |  |  | -  
 | 
					
						
							|  |  |  | -  if(argc < 3) {
 | 
					
						
							|  |  |  | -    printf("Usage: hid-flash <bin_firmware_file> <comport> <delay (optional)>\n");
 | 
					
						
							|  |  |  | +
 | 
					
						
							|  |  |  | +  // TODO:  This really needs an option parser
 | 
					
						
							|  |  |  | +  if(argc < 2) {
 | 
					
						
							|  |  |  | +    printf("Usage: hid-flash <bin_firmware_file> <comport (optional)> <delay (optional)>\n");
 | 
					
						
							|  |  |  |      return 1; | 
					
						
							|  |  |  |    }else if(argc == 4){ | 
					
						
							|  |  |  |      _timer = atol(argv[3]); | 
					
						
							|  |  |  |    } | 
					
						
							|  |  |  | -  
 | 
					
						
							|  |  |  | +
 | 
					
						
							|  |  |  |    firmware_file = fopen(argv[1], "rb"); | 
					
						
							|  |  |  |    if(!firmware_file) { | 
					
						
							|  |  |  |      printf("> Error opening firmware file: %s\n", argv[1]); | 
					
						
							|  |  |  |      return error; | 
					
						
							|  |  |  |    } | 
					
						
							|  |  |  | -  
 | 
					
						
							|  |  |  | -  if(serial_init(argv[2], _timer) == 0){ //Setting up Serial port
 | 
					
						
							|  |  |  | -    RS232_CloseComport();
 | 
					
						
							|  |  |  | -  }else{
 | 
					
						
							|  |  |  | -    printf("> Unable to open the [%s]\n",argv[2]);
 | 
					
						
							|  |  |  | +
 | 
					
						
							|  |  |  | +  if (argc > 2) {
 | 
					
						
							|  |  |  | +    if(serial_init(argv[2], _timer) == 0){ //Setting up Serial port
 | 
					
						
							|  |  |  | +      RS232_CloseComport();
 | 
					
						
							|  |  |  | +    }else{
 | 
					
						
							|  |  |  | +      printf("> Unable to open the [%s]\n",argv[2]);
 | 
					
						
							|  |  |  | +    }
 | 
					
						
							|  |  |  |    } | 
					
						
							|  |  |  | -  
 | 
					
						
							|  |  |  | +
 | 
					
						
							|  |  |  |    hid_init(); | 
					
						
							|  |  |  | -  
 | 
					
						
							|  |  |  | +
 | 
					
						
							|  |  |  |    printf("> Searching for [%04X:%04X] device...\n",VID,PID); | 
					
						
							|  |  |  | -  
 | 
					
						
							|  |  |  | +
 | 
					
						
							|  |  |  |    struct hid_device_info *devs, *cur_dev; | 
					
						
							|  |  |  |    uint8_t valid_hid_devices = 0; | 
					
						
							|  |  |  | -  
 | 
					
						
							|  |  |  | +
 | 
					
						
							|  |  |  |    for(i=0;i<10;i++){ //Try up to 10 times to open the HID device. | 
					
						
							|  |  |  |      devs = hid_enumerate(VID, PID); | 
					
						
							|  |  |  |      cur_dev = devs; | 
					
						
							|  |  |  |      while (cur_dev) { //Search for valid HID Bootloader USB devices | 
					
						
							|  |  |  | -      if((cur_dev->vendor_id == VID)&&(cur_dev->product_id = PID)){
 | 
					
						
							|  |  |  | +      if((cur_dev->vendor_id == VID)&&(cur_dev->product_id == PID)){
 | 
					
						
							|  |  |  |          valid_hid_devices++; | 
					
						
							|  |  |  |          if(cur_dev->release_number < FIRMWARE_VER){ //The STM32 board has firmware lower than 3.00 | 
					
						
							|  |  |  |            printf("\nError - Please update the firmware to the latest version (v3.00+)"); | 
					
						
							|  |  |  | @@ -129,18 +140,18 @@ int main(int argc, char *argv[]) {
 | 
					
						
							|  |  |  |      printf("\nError - [%04X:%04X] device is not found :(",VID,PID); | 
					
						
							|  |  |  |      error = 1; | 
					
						
							|  |  |  |      goto exit; | 
					
						
							|  |  |  | -  } 
 | 
					
						
							|  |  |  | -  
 | 
					
						
							|  |  |  | +  }
 | 
					
						
							|  |  |  | +
 | 
					
						
							|  |  |  |    handle = hid_open(VID, PID, NULL); | 
					
						
							|  |  |  | -  
 | 
					
						
							|  |  |  | +
 | 
					
						
							|  |  |  |    if (i == 10 && handle != NULL) { | 
					
						
							|  |  |  |      printf("\n> Unable to open the [%04X:%04X] device.\n",VID,PID); | 
					
						
							|  |  |  |      error = 1; | 
					
						
							|  |  |  |      goto exit; | 
					
						
							|  |  |  |    } | 
					
						
							|  |  |  | - 
 | 
					
						
							|  |  |  | +
 | 
					
						
							|  |  |  |    printf("\n> [%04X:%04X] device is found !\n",VID,PID); | 
					
						
							|  |  |  | -  
 | 
					
						
							|  |  |  | +
 | 
					
						
							|  |  |  |    // Send RESET PAGES command to put HID bootloader in initial stage... | 
					
						
							|  |  |  |    memset(hid_tx_buf, 0, sizeof(hid_tx_buf)); //Fill the hid_tx_buf with zeros. | 
					
						
							|  |  |  |    memcpy(&hid_tx_buf[1], CMD_RESET_PAGES, sizeof(CMD_RESET_PAGES)); | 
					
						
							|  |  |  | @@ -161,7 +172,7 @@ int main(int argc, char *argv[]) {
 | 
					
						
							|  |  |  |    memset(page_data, 0, sizeof(page_data)); | 
					
						
							|  |  |  |    read_bytes = fread(page_data, 1, sizeof(page_data), firmware_file); | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  | -  while(read_bytes > 0) {
 | 
					
						
							|  |  |  | +  while(1) {
 | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  |      for(int i = 0; i < SECTOR_SIZE; i += HID_TX_SIZE - 1) { | 
					
						
							|  |  |  |        memcpy(&hid_tx_buf[1], page_data + i, HID_TX_SIZE - 1); | 
					
						
							|  |  |  | @@ -169,7 +180,7 @@ int main(int argc, char *argv[]) {
 | 
					
						
							|  |  |  |        if((i % 1024) == 0){ | 
					
						
							|  |  |  |          printf("."); | 
					
						
							|  |  |  |        } | 
					
						
							|  |  |  | -      
 | 
					
						
							|  |  |  | +
 | 
					
						
							|  |  |  |        // Flash is unavailable when writing to it, so USB interrupt may fail here | 
					
						
							|  |  |  |        if(!usb_write(handle, hid_tx_buf, HID_TX_SIZE)) { | 
					
						
							|  |  |  |          printf("> Error while flashing firmware data.\n"); | 
					
						
							|  |  |  | @@ -179,20 +190,31 @@ int main(int argc, char *argv[]) {
 | 
					
						
							|  |  |  |        n_bytes += (HID_TX_SIZE - 1); | 
					
						
							|  |  |  |        usleep(500); | 
					
						
							|  |  |  |      } | 
					
						
							|  |  |  | -    
 | 
					
						
							|  |  |  | +
 | 
					
						
							|  |  |  |      printf(" %d Bytes\n", n_bytes); | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  |      do{ | 
					
						
							|  |  |  |        hid_read(handle, hid_rx_buf, 9); | 
					
						
							|  |  |  |        usleep(500); | 
					
						
							|  |  |  | -    }while(hid_rx_buf[7] != 0x02);
 | 
					
						
							|  |  |  | -    
 | 
					
						
							|  |  |  | +    // Exit the loop if we recieve 0x02 or 0x03
 | 
					
						
							|  |  |  | +    }while((hid_rx_buf[7] & 0xFE) != 0x02);
 | 
					
						
							|  |  |  | +
 | 
					
						
							|  |  |  |      memset(page_data, 0, sizeof(page_data)); | 
					
						
							|  |  |  |      read_bytes = fread(page_data, 1, sizeof(page_data), firmware_file); | 
					
						
							|  |  |  | +
 | 
					
						
							|  |  |  | +    // For stm32f1 high density devices (2K page size) will receive a
 | 
					
						
							|  |  |  | +    // 0x03 command acknowledgement above.  In that case, we must
 | 
					
						
							|  |  |  | +    // make sure that we send a full 2K so the last page is written.
 | 
					
						
							|  |  |  | +    // Note that this issue does not affect STM32F4 devices with larger
 | 
					
						
							|  |  |  | +    // page sizes.
 | 
					
						
							|  |  |  | +    if (read_bytes == 0) {
 | 
					
						
							|  |  |  | +      if (hid_rx_buf[7] != 0x03 || (n_bytes % MAX_PAGE_SIZE) == 0)
 | 
					
						
							|  |  |  | +        break;
 | 
					
						
							|  |  |  | +    }
 | 
					
						
							|  |  |  |    } | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  |    printf("\n> Done!\n"); | 
					
						
							|  |  |  | -  
 | 
					
						
							|  |  |  | +
 | 
					
						
							|  |  |  |    // Send CMD_REBOOT_MCU command to reboot the microcontroller... | 
					
						
							|  |  |  |    memset(hid_tx_buf, 0, sizeof(hid_tx_buf)); | 
					
						
							|  |  |  |    memcpy(&hid_tx_buf[1], CMD_REBOOT_MCU, sizeof(CMD_REBOOT_MCU)); | 
					
						
							|  |  |  | @@ -203,7 +225,7 @@ int main(int argc, char *argv[]) {
 | 
					
						
							|  |  |  |    if(!usb_write(handle, hid_tx_buf, HID_TX_SIZE)) { | 
					
						
							|  |  |  |      printf("> Error while sending <reboot mcu> command.\n"); | 
					
						
							|  |  |  |    } | 
					
						
							|  |  |  | -  
 | 
					
						
							|  |  |  | +
 | 
					
						
							|  |  |  |  exit: | 
					
						
							|  |  |  |    if(handle) { | 
					
						
							|  |  |  |      hid_close(handle); | 
					
						
							|  |  |  | @@ -214,22 +236,24 @@ exit:
 | 
					
						
							|  |  |  |    if(firmware_file) { | 
					
						
							|  |  |  |      fclose(firmware_file); | 
					
						
							|  |  |  |    } | 
					
						
							|  |  |  | -  
 | 
					
						
							|  |  |  | -  printf("> Searching for [%s] ...\n",argv[2]);
 | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  | -  for(int i=0;i<5;i++){
 | 
					
						
							|  |  |  | -    if(RS232_OpenComport(argv[2]) == 0){
 | 
					
						
							|  |  |  | -      printf("> [%s] is found !\n",argv[2] );
 | 
					
						
							|  |  |  | -      break;
 | 
					
						
							|  |  |  | +  if (argc > 2) {
 | 
					
						
							|  |  |  | +    printf("> Searching for [%s] ...\n",argv[2]);
 | 
					
						
							|  |  |  | +
 | 
					
						
							|  |  |  | +    for(int i=0;i<5;i++){
 | 
					
						
							|  |  |  | +      if(RS232_OpenComport(argv[2]) == 0){
 | 
					
						
							|  |  |  | +        printf("> [%s] is found !\n",argv[2] );
 | 
					
						
							|  |  |  | +        break;
 | 
					
						
							|  |  |  | +      }
 | 
					
						
							|  |  |  | +      sleep(1);
 | 
					
						
							|  |  |  | +    }
 | 
					
						
							|  |  |  | +
 | 
					
						
							|  |  |  | +    if(i==5){
 | 
					
						
							|  |  |  | +      printf("> Comport is not found\n");
 | 
					
						
							|  |  |  |      } | 
					
						
							|  |  |  | -    sleep(1);
 | 
					
						
							|  |  |  | -  }
 | 
					
						
							|  |  |  | -  
 | 
					
						
							|  |  |  | -  if(i==5){
 | 
					
						
							|  |  |  | -    printf("> Comport is not found\n");
 | 
					
						
							|  |  |  |    } | 
					
						
							|  |  |  |    printf("> Finish\n"); | 
					
						
							|  |  |  | -  
 | 
					
						
							|  |  |  | +
 | 
					
						
							|  |  |  |    return error; | 
					
						
							|  |  |  |  } | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  | @@ -240,20 +264,14 @@ int serial_init(char *argument, uint8_t __timer) {
 | 
					
						
							|  |  |  |      return(1); | 
					
						
							|  |  |  |    } | 
					
						
							|  |  |  |    printf("> Toggling DTR...\n"); | 
					
						
							|  |  |  | -  
 | 
					
						
							|  |  |  | +
 | 
					
						
							|  |  |  |    RS232_disableRTS(); | 
					
						
							|  |  |  | -  RS232_enableDTR();
 | 
					
						
							|  |  |  | -  usleep(200000L);
 | 
					
						
							|  |  |  |    RS232_disableDTR(); | 
					
						
							|  |  |  |    usleep(200000L); | 
					
						
							|  |  |  |    RS232_enableDTR(); | 
					
						
							|  |  |  |    usleep(200000L); | 
					
						
							|  |  |  | -  RS232_disableDTR();
 | 
					
						
							|  |  |  | -  usleep(200000L);
 | 
					
						
							|  |  |  | -  RS232_send_magic();
 | 
					
						
							|  |  |  | -  usleep(200000L);
 | 
					
						
							|  |  |  |    RS232_CloseComport(); | 
					
						
							|  |  |  | -  
 | 
					
						
							|  |  |  | +
 | 
					
						
							|  |  |  |    //printf("A %i\n",__timer); | 
					
						
							|  |  |  |    if (__timer > 0) { | 
					
						
							|  |  |  |      usleep(__timer); | 
					
						
							|  |  |  | diff --git a/cli/rs232.c b/cli/rs232.c
 | 
					
						
							|  |  |  | index 067ef1a..ce7de08 100644
 | 
					
						
							|  |  |  | --- a/cli/rs232.c
 | 
					
						
							|  |  |  | +++ b/cli/rs232.c
 | 
					
						
							|  |  |  | @@ -80,12 +80,12 @@
 | 
					
						
							|  |  |  |      new_termios.c_cc[VEOL2]    = 0; | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  | -    if (cfsetispeed(&new_termios, B9600) != 0) {
 | 
					
						
							|  |  |  | -        fprintf(stderr, "cfsetispeed(&new_termios, B9600) failed: %s\n", strerror(errno));
 | 
					
						
							|  |  |  | +    if (cfsetispeed(&new_termios, B1200) != 0) {
 | 
					
						
							|  |  |  | +        fprintf(stderr, "cfsetispeed(&new_termios, B1200) failed: %s\n", strerror(errno));
 | 
					
						
							|  |  |  |          return 1; | 
					
						
							|  |  |  |      } | 
					
						
							|  |  |  | -    if (cfsetospeed(&new_termios, B9600) != 0) {
 | 
					
						
							|  |  |  | -        fprintf(stderr, "cfsetospeed(&new_termios, B9600) failed: %s\n", strerror(errno));
 | 
					
						
							|  |  |  | +    if (cfsetospeed(&new_termios, B1200) != 0) {
 | 
					
						
							|  |  |  | +        fprintf(stderr, "cfsetospeed(&new_termios, B1200) failed: %s\n", strerror(errno));
 | 
					
						
							|  |  |  |          return 1; | 
					
						
							|  |  |  |      } | 
					
						
							|  |  |  |   |