PX4 bootload over usb with auto targetting works

This commit is contained in:
kevindehecker
2016-03-14 15:33:18 +01:00
parent 3a7d08685a
commit edf05df4a3
5 changed files with 122 additions and 26 deletions
+1 -2
View File
@@ -158,9 +158,8 @@ else ifeq ($(FLASH_MODE),PX4_BOOTLOADER)
# Program the device and start it.
upload: $(OBJDIR)/$(TARGET).bin
$(PAPARAZZI_SRC)/sw/tools/px4/px_mkfw.py --prototype $(PX4_PROTOTYPE) --image $(OBJDIR)/$(TARGET).bin > $(OBJDIR)/$(TARGET).px4
$(PAPARAZZI_SRC)/sw/tools/px4/set_target.py $(PX4_TARGET)
$(PAPARAZZI_SRC)/sw/tools/px4/set_target.py $(PX4_TARGET) $(OBJDIR)/$(TARGET).px4
$(PAPARAZZI_SRC)/sw/tools/px4/px_uploader.py --port $(PX4_BL_PORT) $(OBJDIR)/$(TARGET).px4
#
# no known flash mode
else
+1 -1
View File
@@ -34,7 +34,7 @@ RADIO_CONTROL_LED ?= none
BARO_LED ?= none
AHRS_ALIGNER_LED ?= none
GPS_LED ?= none
SYS_TIME_LED ?= none
SYS_TIME_LED ?= 1
#
# default UART configuration (modem, gps, spektrum)
-1
View File
@@ -21,7 +21,6 @@ PX4_PROTOTYPE ?= "${PAPARAZZI_HOME}/sw/tools/px4/px4io-v2.prototype"
PX4_TARGET = "fbw"
FLASH_MODE ?= PX4_BOOTLOADER
#
# default LED configuration
#
+48 -12
View File
@@ -38,32 +38,38 @@
#include "libopencm3/cm3/scb.h"
#include "mcu_periph/sys_time.h"
tid_t px4iobl_tid; ///< id for time out of the px4 bootloader reset
// define coms link for px4io f1
#define PX4IO_PORT (&((PX4IO_UART).device))
#define TELEM2_PORT (&((TELEM2_UART).device))
// weird that these below are not in protocol.h, which is from the firmware px4 repo
// below is copied from qgroundcontrol:
#define PROTO_INSYNC 0x12 //< 'in sync' byte sent before status
#define PROTO_EOC 0x20 //< end of command
#define PROTO_INSYNC 0x12 ///< 'in sync' byte sent before status
#define PROTO_EOC 0x20 ///< end of command
// Reply bytes
#define PROTO_OK 0x10 //< INSYNC/OK - 'ok' response
#define PROTO_FAILED 0x11 //< INSYNC/FAILED - 'fail' response
#define PROTO_INVALID 0x13 //< INSYNC/INVALID - 'invalid' response for bad commands
#define PROTO_OK 0x10 ///< INSYNC/OK - 'ok' response
#define PROTO_FAILED 0x11 ///< INSYNC/FAILED - 'fail' response
#define PROTO_INVALID 0x13 ///< INSYNC/INVALID - 'invalid' response for bad commands
// Command bytes
#define PROTO_GET_SYNC 0x21 //< NOP for re-establishing sync
#define PROTO_GET_DEVICE 0x22 //< get device ID bytes
#define PROTO_CHIP_ERASE 0x23 //< erase program area and reset program address
#define PROTO_LOAD_ADDRESS 0x24 //< set next programming address
#define PROTO_PROG_MULTI 0x27 //< write bytes at program address and increment
#define PROTO_GET_CRC 0x29 //< compute & return a CRC
#define PROTO_BOOT 0x30 //< boot the application
#define PROTO_GET_SYNC 0x21 ///< NOP for re-establishing sync
#define PROTO_GET_DEVICE 0x22 ///< get device ID bytes
#define PROTO_CHIP_ERASE 0x23 ///< erase program area and reset program address
#define PROTO_LOAD_ADDRESS 0x24 ///< set next programming address
#define PROTO_PROG_MULTI 0x27 ///< write bytes at program address and increment
#define PROTO_GET_CRC 0x29 ///< compute & return a CRC
#define PROTO_BOOT 0x30 ///< boot the application
bool_t setToBootloaderMode;
bool_t px4ioRebootTimeout;
void px4ioflash_init(void)
{
setToBootloaderMode = FALSE;
px4ioRebootTimeout = FALSE;
px4iobl_tid = sys_time_register_timer(15.0, NULL); //20 (fbw pprz bl timeout)-5 (px4 fmu bl timeout)
}
void px4ioflash_event(void)
@@ -121,6 +127,29 @@ void px4ioflash_event(void)
} else { // target fbw
//the target is the fbw, so reboot the fbw and switch to relay mode
//first check if the bootloader has not timeout:
if (sys_time_check_and_ack_timer(px4iobl_tid) || px4ioRebootTimeout) {
px4ioRebootTimeout= TRUE;
sys_time_cancel_timer(px4iobl_tid);
TELEM2_PORT->put_byte(TELEM2_PORT->periph, 'T');
TELEM2_PORT->put_byte(TELEM2_PORT->periph, 'I');
TELEM2_PORT->put_byte(TELEM2_PORT->periph, 'M');
TELEM2_PORT->put_byte(TELEM2_PORT->periph, 'E');
TELEM2_PORT->put_byte(TELEM2_PORT->periph, 'O');
TELEM2_PORT->put_byte(TELEM2_PORT->periph, 'U');
TELEM2_PORT->put_byte(TELEM2_PORT->periph, 'T'); // use 7 chars as answer
return;
} { // FBW OK OK hollay hollay :)
TELEM2_PORT->put_byte(TELEM2_PORT->periph, 'F');
TELEM2_PORT->put_byte(TELEM2_PORT->periph, 'B');
TELEM2_PORT->put_byte(TELEM2_PORT->periph, 'W');
TELEM2_PORT->put_byte(TELEM2_PORT->periph, 'O');
TELEM2_PORT->put_byte(TELEM2_PORT->periph, 'K');
TELEM2_PORT->put_byte(TELEM2_PORT->periph, 'O');
TELEM2_PORT->put_byte(TELEM2_PORT->periph, 'K'); // use 7 chars as answer
}
//stop all intermcu communication:
disable_inter_comm(true);
@@ -222,6 +251,13 @@ void px4ioflash_event(void)
}
} else {
TELEM2_PORT->put_byte(TELEM2_PORT->periph, 'E'); //TODO: find out what the PX4 protocol for error feedback is...
TELEM2_PORT->put_byte(TELEM2_PORT->periph, 'R');
TELEM2_PORT->put_byte(TELEM2_PORT->periph, 'R');
TELEM2_PORT->put_byte(TELEM2_PORT->periph, 'O');
TELEM2_PORT->put_byte(TELEM2_PORT->periph, 'R');
TELEM2_PORT->put_byte(TELEM2_PORT->periph, '!');
TELEM2_PORT->put_byte(TELEM2_PORT->periph, ' '); // use 7 chars as answer
}
}
} else if (TELEM2_PORT->char_available(TELEM2_PORT->periph)) {
+72 -10
View File
@@ -1,15 +1,77 @@
#!/usr/bin/python
#!/usr/bin/env python
import os
import sys
import serial
import glob
import time
print sys.argv[2]
portname = sys.argv[1]
if sys.argv[2] == "fbw" :
line = "pprz0"
else :
line = "pprz1"
target = sys.argv[1]
firmware_file = sys.argv[2]
#print line.rstrip() + " " + str(len(line))
ser = serial.Serial(portname)
ser.write(line)
print "Target: " + target
print "Firmware file: " + firmware_file
#test if pprz cdm is connected
mode =-1
port = ""
try :
port = "/dev/serial/by-id/usb-Paparazzi_UAV_CDC_Serial_STM32_*"
if len(glob.glob(port)) > 1:
print("Warning: multiple Paparazzi cdc devices found. Selecting the first one.")
port = glob.glob(port)[0]
ser = serial.Serial(port,timeout=0.5)
mode = 1
print ("Paparazzi CDC device found at port: " + port)
except (serial.serialutil.SerialException,IndexError) :
print("No Paparazzi CDC device found, looking further.")
if mode == 1 :
if target == "fbw" :
line = "pprz0"
else :
line = "pprz1"
print ("Sending target command to Paparazzi firmware...")
ser.flush()
ser.write(line)
if target == "fbw" :
try :
c = ser.read(7)
print ("AP responded with: " + c)
if c=="TIMEOUT" :
print("Error: FBW bootloader TIMEOUT. Power cycle the board and wait between 5 seconds to 20 seconds to retry.")
sys.exit(1)
elif c != "FBWOKOK" :
print("Error: unknown error. Power cycle the board and wait between 5 seconds to 20 seconds to retry.")
sys.exit(1)
except serial.serialutil.SerialException :
pass
print("Uploading using Paparazzi firmware...")
sys.exit(0)
if mode == -1 : #no pprz cdc was found, look for PX4
ports = glob.glob("/dev/serial/by-id/usb-3D_Robotics*")
ports.append(glob.glob("/dev/serial/by-id/pci-3D_Robotics*"))
for p in ports :
if len(p) > 0 :
try :
ser = serial.Serial(p,timeout=0.5)
port = p
mode = 2
print ("Original PX4 firmware CDC device found at port: " + port)
except serial.serialutil.SerialException :
print("Non working PX4 port found, continuing...")
if mode == -1 :
print("No original PX4 CDC firmware found either.")
print("Error: no compatible usb device found...")
sys.exit(1)
if target == "fbw" :
print("Error: original firmware cannot be used to upload the fbw code. Wait for the PX4 bootloader to exit (takes 5 seconds), or in case this is the first upload; first upload the Paparazzi ap target.")
sys.exit(1)
else :
print("Uploading AP using original PX4 firmware...")