diff --git a/Marlin/src/HAL/HAL_LPC1768/upload_extra_script.py b/Marlin/src/HAL/HAL_LPC1768/upload_extra_script.py
new file mode 100644
index 0000000000000000000000000000000000000000..4a5a2b57c2cf4df7aa840552bb073c2d7776435d
--- /dev/null
+++ b/Marlin/src/HAL/HAL_LPC1768/upload_extra_script.py
@@ -0,0 +1,134 @@
+#
+# sets output_port
+#  if target_filename is found then that drive is used
+#  else if target_drive is found then that drive is used
+#
+
+target_filename = "FIRMWARE.CUR"
+target_drive = "REARM"
+
+
+import platform
+current_OS = platform.system()
+
+if current_OS == 'Windows':
+
+    #
+    # platformio.ini will accept this for a Windows upload port designation: 'upload_port = L:'
+    #   Windows - doesn't care about the disk's name, only cares about the drive letter
+    #
+
+    #
+    # get all drives on this computer
+    #
+
+    import subprocess
+
+    driveStr = subprocess.check_output("fsutil fsinfo drives")  # typical result (string): 'Drives: C:\ D:\ E:\ F:\ G:\ H:\ I:\ J:\ K:\ L:\ M:\ Y:\ Z:\'
+    driveStr = driveStr.strip().lstrip('Drives: ')  # typical result (string): 'C:\ D:\ E:\ F:\ G:\ H:\ I:\ J:\ K:\ L:\ M:\ Y:\ Z:\'
+    drives = driveStr.split()  # typical result (array of stings): ['C:\\', 'D:\\', 'E:\\', 'F:\\', 'G:\\', 'H:\\', 'I:\\', 'J:\\', 'K:\\', 'L:\\', 'M:\\', 'Y:\\', 'Z:\\']
+
+    #
+    # scan top directory of each drive for FIRMWARE.CUR
+    #   return first drive found
+    #
+
+    import os
+    target_file_found = False
+    target_drive_found = False
+    for drive in drives:
+      final_drive_name = drive.strip().rstrip('\\')   # typical result (string): 'C:'
+      # modified version of walklevel()
+      level=0
+      some_dir = "/"
+      some_dir = some_dir.rstrip(os.path.sep)
+      assert os.path.isdir(some_dir)
+      num_sep = some_dir.count(os.path.sep)
+      for root, dirs, files in os.walk(final_drive_name):
+        num_sep_this = root.count(os.path.sep)
+        if num_sep + level <= num_sep_this:
+          del dirs[:]
+        volume_info = subprocess.check_output('fsutil fsinfo volumeinfo ' + final_drive_name)
+        if target_drive in volume_info and target_file_found == False:  # set upload if not found target file yet
+          target_drive_found = True
+          upload_disk = root
+        if target_filename in files:
+          if target_file_found == False:
+            upload_disk = root
+          target_file_found = True
+
+    #
+    # set upload_port to drive if found
+    #
+
+    if target_file_found == True or target_drive_found == True:
+      Import("env")
+      env.Replace(
+          UPLOAD_PORT = upload_disk
+      )
+
+
+
+if current_OS == 'Linux':
+
+    #
+    # platformio.ini will accept this for a Linux upload port designation: 'upload_port = /media/media_name/drive'
+    #
+
+    import os
+    target_file_found = False
+    target_drive_found = False
+    medias = os.listdir('/media')  #
+    for media in medias:
+      drives = os.listdir('/media/' + media)  #
+      if target_drive in drives and target_file_found == False:  # set upload if not found target file yet
+        target_drive_found = True
+        upload_disk = '/media/' + media + '/' + target_drive + '/'
+      for drive in drives:
+        files = os.listdir('/media/' + media + '/' + drive )  #
+        if target_filename in files:
+          if target_file_found == False:
+            upload_disk = '/media/' + media + '/' + drive + '/'
+            target_file_found = True
+
+    #
+    # set upload_port to drive if found
+    #
+
+    if target_file_found == True or target_drive_found == True:
+      Import("env")
+      env.Replace(
+        UPLOAD_FLAGS = "-P$UPLOAD_PORT",
+        UPLOAD_PORT = upload_disk
+      )
+
+
+if current_OS == 'Darwin':  # MAC
+
+    #
+    # platformio.ini will accept this for a OSX upload port designation: 'upload_port = /media/media_name/drive'
+    #
+
+    import os
+    drives = os.listdir('/Volumes')  #  human readable names
+    target_file_found = False
+    target_drive_found = False
+    if target_drive in drives and target_file_found == False:  # set upload if not found target file yet
+      target_drive_found = True
+      upload_disk = '/Volumes/' + drive + '/'
+    for drive in drives:
+      target_file_found = True
+      filenames = os.listdir('/Volumes/' + drive + '/')
+      if target_filename in filenames:
+        if target_file_found == False:
+          upload_disk = '/Volumes/' + drive + '/'
+        target_file_found = True
+    #
+    # set upload_port to drive if found
+    #
+
+    if target_file_found == True or target_drive_found == True:
+      Import("env")
+      env.Replace(
+          UPLOAD_PORT = upload_disk
+      )
diff --git a/platformio.ini b/platformio.ini
index 2ef554daa2ae2ea71ce8647862db35bc8ed5f8e3..db7f4e75931140f44342fcb1180ead97d7537238 100644
--- a/platformio.ini
+++ b/platformio.ini
@@ -103,7 +103,7 @@ platform     = atmelsam
 framework    = arduino
 board        = due
 build_flags  = ${common.build_flags}
-  -funwind-tables 
+  -funwind-tables
   -mpoke-function-name
 lib_deps     = ${common.lib_deps}
 lib_ignore   = c1921b4
@@ -127,7 +127,7 @@ lib_extra_dirs  = frameworks
 lib_deps        = CMSIS-LPC1768
   https://github.com/MarlinFirmware/U8glib-HAL/archive/dev.zip
   TMC2130Stepper@>=2.2.1
-extra_scripts   = Marlin/src/HAL/HAL_LPC1768/lpc1768_flag_script.py
+extra_scripts   = Marlin/src/HAL/HAL_LPC1768/lpc1768_flag_script.py, Marlin/src/HAL/HAL_LPC1768/upload_extra_script.py
 src_filter      = ${common.default_src_filter}
 monitor_baud    = 250000