diff --git a/Tools/px_uploader.py b/Tools/px_uploader.py index 3f628eaed6..b35e5bc372 100755 --- a/Tools/px_uploader.py +++ b/Tools/px_uploader.py @@ -682,7 +682,28 @@ class uploader(object): return True - def send_reboot(self): + def send_protocol_splitter_format(self, data): + # Header Structure: + # bits: 1 2 3 4 5 6 7 8 + # header[0] - | Magic | (='S') + # header[1] - |T| LenH | (T - 0: mavlink; 1: rtps) + # header[2] - | LenL | + # header[3] - | Checksum | + + MAGIC = 83 + + len_bytes = len(data).to_bytes(2, "big") + LEN_H = len_bytes[0] & 127 + LEN_L = len_bytes[1] & 255 + CHECKSUM = MAGIC ^ LEN_H ^ LEN_L + + header_ints = [MAGIC, LEN_H, LEN_L, CHECKSUM] + header_bytes = struct.pack("{}B".format(len(header_ints)), *header_ints) + + self.__send(header_bytes) + self.__send(data) + + def send_reboot(self, use_protocol_splitter_format=False): if (not self.__next_baud_flightstack()): return False @@ -693,15 +714,19 @@ class uploader(object): print("If the board does not respond, unplug and re-plug the USB connector.", file=sys.stderr) try: + send_fct = self.__send + if use_protocol_splitter_format: + send_fct = self.send_protocol_splitter_format + # try MAVLINK command first self.port.flush() - self.__send(uploader.MAVLINK_REBOOT_ID1) - self.__send(uploader.MAVLINK_REBOOT_ID0) + send_fct(uploader.MAVLINK_REBOOT_ID1) + send_fct(uploader.MAVLINK_REBOOT_ID0) # then try reboot via NSH - self.__send(uploader.NSH_INIT) - self.__send(uploader.NSH_REBOOT_BL) - self.__send(uploader.NSH_INIT) - self.__send(uploader.NSH_REBOOT) + send_fct(uploader.NSH_INIT) + send_fct(uploader.NSH_REBOOT_BL) + send_fct(uploader.NSH_INIT) + send_fct(uploader.NSH_REBOOT) self.port.flush() self.port.baudrate = self.baudrate_bootloader except Exception: @@ -726,9 +751,13 @@ def main(): parser.add_argument('--baud-flightstack', action="store", default="57600", help="Comma-separated list of baud rate of the serial port (default is 57600) when communicating with flight stack (Mavlink or NSH), only required for true serial ports.") parser.add_argument('--force', action='store_true', default=False, help='Override board type check, or silicon errata checks and continue loading') parser.add_argument('--boot-delay', type=int, default=None, help='minimum boot delay to store in flash') + parser.add_argument('--use-protocol-splitter-format', action='store_true', help='use protocol splitter format for reboot') parser.add_argument('firmware', action="store", help="Firmware file to be uploaded") args = parser.parse_args() + if args.use_protocol_splitter_format: + print("Using protocol splitter format to reboot pixhawk!") + # warn people about ModemManager which interferes badly with Pixhawk if os.path.exists("/usr/sbin/ModemManager"): print("==========================================================================================================") @@ -830,7 +859,7 @@ def main(): except Exception: - if not up.send_reboot(): + if not up.send_reboot(args.use_protocol_splitter_format): break # wait for the reboot, without we might run into Serial I/O Error 5