mirror of
https://github.com/portapack-mayhem/mayhem-firmware.git
synced 2026-09-13 01:59:29 +00:00
Flashing: overhaul mayhem_flasher.bat with serial fallback and improved UX (#3074)
* Refactor mayhem_flasher.bat to streamline firmware flashing process and add serial fallback for device connection * Improve COM port selection logic in mayhem_flasher.bat for better user input handling * Enhance error handling in firmware flashing process for improved user feedback
This commit is contained in:
+175
-81
@@ -1,4 +1,5 @@
|
|||||||
@echo off
|
@echo off
|
||||||
|
setlocal EnableDelayedExpansion
|
||||||
|
|
||||||
echo =========================================================
|
echo =========================================================
|
||||||
echo PortaPack Mayhem - Device Flasher
|
echo PortaPack Mayhem - Device Flasher
|
||||||
@@ -57,10 +58,7 @@ exit /b
|
|||||||
REM ── Action 1: Flash Mayhem ─────────────────────────────────
|
REM ── Action 1: Flash Mayhem ─────────────────────────────────
|
||||||
:flash_mayhem
|
:flash_mayhem
|
||||||
echo.
|
echo.
|
||||||
if "%DEVICE_CHOICE%"=="1" set FIRMWARE=firmware\firmware_hackrf.bin
|
call :set_firmware
|
||||||
if "%DEVICE_CHOICE%"=="2" set FIRMWARE=firmware\firmware_portarf.bin
|
|
||||||
if "%DEVICE_CHOICE%"=="3" set FIRMWARE=firmware\firmware_hpro.bin
|
|
||||||
|
|
||||||
if "%DEVICE_CHOICE%"=="1" (
|
if "%DEVICE_CHOICE%"=="1" (
|
||||||
echo If your device has a PortaPack attached, switch it to HackRF mode first by
|
echo If your device has a PortaPack attached, switch it to HackRF mode first by
|
||||||
echo selecting the "HackRF" option from the main menu.
|
echo selecting the "HackRF" option from the main menu.
|
||||||
@@ -68,22 +66,9 @@ if "%DEVICE_CHOICE%"=="1" (
|
|||||||
)
|
)
|
||||||
echo Firmware: %FIRMWARE%
|
echo Firmware: %FIRMWARE%
|
||||||
echo.
|
echo.
|
||||||
|
call :check_file_exists "%FIRMWARE%" "firmware file" || (pause & exit /b)
|
||||||
if not exist %FIRMWARE% (
|
call :do_flash
|
||||||
echo ERROR: The firmware file "%FIRMWARE%" was not found.
|
if "!FLASH_OK!"=="1" call :print_success
|
||||||
echo Please ensure you have downloaded the latest release from:
|
|
||||||
echo https://release.hackrf.app/
|
|
||||||
echo.
|
|
||||||
pause
|
|
||||||
exit /b
|
|
||||||
)
|
|
||||||
|
|
||||||
echo.
|
|
||||||
"utils/hackrf_spiflash.exe" -R -w %FIRMWARE%
|
|
||||||
echo.
|
|
||||||
echo If your device does not boot after flashing, see the troubleshooting wiki:
|
|
||||||
echo https://github.com/portapack-mayhem/mayhem-firmware/wiki/Wont-boot
|
|
||||||
echo.
|
|
||||||
pause
|
pause
|
||||||
exit /b
|
exit /b
|
||||||
|
|
||||||
@@ -101,24 +86,10 @@ echo 1. Hold down both the DFU and RESET buttons.
|
|||||||
echo 2. Release the RESET button first (the one closest to the edge).
|
echo 2. Release the RESET button first (the one closest to the edge).
|
||||||
echo 3. Then release the DFU button.
|
echo 3. Then release the DFU button.
|
||||||
echo.
|
echo.
|
||||||
|
call :set_dfu_file
|
||||||
if "%DEVICE_CHOICE%"=="3" (
|
call :check_file_exists "%DFU_FILE%" "DFU file" || (pause & exit /b)
|
||||||
set DFU_FILE=firmware\hackrf_hpro_usb.dfu
|
|
||||||
) else (
|
|
||||||
set DFU_FILE=firmware\hackrf_usb.dfu
|
|
||||||
)
|
|
||||||
|
|
||||||
if not exist "%DFU_FILE%" (
|
|
||||||
echo ERROR: "%DFU_FILE%" was not found.
|
|
||||||
echo Please ensure you have downloaded the latest release from:
|
|
||||||
echo https://release.hackrf.app/
|
|
||||||
echo.
|
|
||||||
pause
|
|
||||||
exit /b
|
|
||||||
)
|
|
||||||
|
|
||||||
echo.
|
echo.
|
||||||
"utils/dfu-util-static.exe" --device 1fc9:000c --download "%DFU_FILE%"
|
call :do_dfu
|
||||||
echo.
|
echo.
|
||||||
pause
|
pause
|
||||||
exit /b
|
exit /b
|
||||||
@@ -136,55 +107,80 @@ echo 1. Hold down both the DFU and RESET buttons.
|
|||||||
echo 2. Release the RESET button first (the one closest to the edge).
|
echo 2. Release the RESET button first (the one closest to the edge).
|
||||||
echo 3. Then release the DFU button.
|
echo 3. Then release the DFU button.
|
||||||
echo.
|
echo.
|
||||||
|
call :set_dfu_file
|
||||||
if "%DEVICE_CHOICE%"=="3" (
|
call :check_file_exists "%DFU_FILE%" "DFU file" || (pause & exit /b)
|
||||||
set DFU_FILE=firmware\hackrf_hpro_usb.dfu
|
call :set_firmware
|
||||||
) else (
|
call :check_file_exists "%FIRMWARE%" "firmware file" || (pause & exit /b)
|
||||||
set DFU_FILE=firmware\hackrf_usb.dfu
|
|
||||||
)
|
|
||||||
|
|
||||||
if not exist "%DFU_FILE%" (
|
|
||||||
echo ERROR: "%DFU_FILE%" was not found.
|
|
||||||
echo Please ensure you have downloaded the latest release from:
|
|
||||||
echo https://release.hackrf.app/
|
|
||||||
echo.
|
|
||||||
pause
|
|
||||||
exit /b
|
|
||||||
)
|
|
||||||
|
|
||||||
if "%DEVICE_CHOICE%"=="1" set FIRMWARE=firmware\firmware_hackrf.bin
|
|
||||||
if "%DEVICE_CHOICE%"=="2" set FIRMWARE=firmware\firmware_portarf.bin
|
|
||||||
if "%DEVICE_CHOICE%"=="3" set FIRMWARE=firmware\firmware_hpro.bin
|
|
||||||
|
|
||||||
if not exist "%FIRMWARE%" (
|
|
||||||
echo ERROR: The firmware file "%FIRMWARE%" was not found.
|
|
||||||
echo Please ensure you have downloaded the latest release from:
|
|
||||||
echo https://release.hackrf.app/
|
|
||||||
echo.
|
|
||||||
pause
|
|
||||||
exit /b
|
|
||||||
)
|
|
||||||
|
|
||||||
echo Step 1 of 2: Loading HackRF firmware via DFU...
|
echo Step 1 of 2: Loading HackRF firmware via DFU...
|
||||||
echo.
|
echo.
|
||||||
"utils/dfu-util-static.exe" --device 1fc9:000c --download "%DFU_FILE%"
|
call :do_dfu
|
||||||
|
|
||||||
echo.
|
echo.
|
||||||
echo DFU complete. Waiting 5 seconds for device to re-enumerate...
|
echo DFU complete. Waiting 5 seconds for device to reconnect...
|
||||||
timeout /t 5 /nobreak >nul
|
timeout /t 5 /nobreak >nul
|
||||||
|
|
||||||
echo.
|
echo.
|
||||||
echo Step 2 of 2: Flashing Mayhem firmware (%FIRMWARE%)...
|
echo Step 2 of 2: Flashing Mayhem firmware (%FIRMWARE%)...
|
||||||
echo.
|
echo.
|
||||||
"utils/hackrf_spiflash.exe" -R -w "%FIRMWARE%"
|
call :do_flash
|
||||||
echo.
|
if "!FLASH_OK!"=="1" call :print_success
|
||||||
echo If your device does not boot after flashing, see the troubleshooting wiki:
|
|
||||||
echo https://github.com/portapack-mayhem/mayhem-firmware/wiki/Wont-boot
|
|
||||||
echo.
|
|
||||||
pause
|
pause
|
||||||
exit /b
|
exit /b
|
||||||
|
|
||||||
|
|
||||||
|
REM ── Serial fallback: boot device into HackRF mode via serial ──
|
||||||
|
:serial_fallback
|
||||||
|
set SERIAL_OK=0
|
||||||
|
set COM_PORT=
|
||||||
|
echo.
|
||||||
|
|
||||||
|
REM Enumerate available COM ports into a temp file
|
||||||
|
powershell -NoProfile -Command "[System.IO.Ports.SerialPort]::GetPortNames() | Sort-Object | ForEach-Object { $_ }" > "%TEMP%\mayhem_comports.txt" 2>nul
|
||||||
|
|
||||||
|
REM Count and index ports
|
||||||
|
set PORT_COUNT=0
|
||||||
|
for /f "usebackq tokens=*" %%P in ("%TEMP%\mayhem_comports.txt") do (
|
||||||
|
set /a PORT_COUNT+=1
|
||||||
|
set PORT_!PORT_COUNT!=%%P
|
||||||
|
)
|
||||||
|
|
||||||
|
if !PORT_COUNT! equ 0 (
|
||||||
|
goto :eof
|
||||||
|
)
|
||||||
|
|
||||||
|
if !PORT_COUNT! equ 1 (
|
||||||
|
set COM_PORT=!PORT_1!
|
||||||
|
) else (
|
||||||
|
echo Multiple COM ports detected. Select the one your device is on:
|
||||||
|
echo.
|
||||||
|
for /l %%I in (1,1,!PORT_COUNT!) do (
|
||||||
|
echo %%I. !PORT_%%I!
|
||||||
|
)
|
||||||
|
echo.
|
||||||
|
set /p PORT_CHOICE="Enter your choice (1-!PORT_COUNT!): "
|
||||||
|
set COM_PORT=
|
||||||
|
for /l %%I in (1,1,!PORT_COUNT!) do (
|
||||||
|
if "!PORT_CHOICE!"=="%%I" set COM_PORT=!PORT_%%I!
|
||||||
|
)
|
||||||
|
if not defined COM_PORT (
|
||||||
|
echo Invalid selection.
|
||||||
|
goto :eof
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
echo Connecting to !COM_PORT!...
|
||||||
|
powershell -NoProfile -Command "$p = New-Object System.IO.Ports.SerialPort('!COM_PORT!', 115200, [System.IO.Ports.Parity]::None, 8, [System.IO.Ports.StopBits]::One); try { $p.Open(); $p.Write('hackrf' + [char]13 + [char]10); Start-Sleep -Milliseconds 500 } catch { Write-Host ('Serial error: ' + $_.Exception.Message); exit 1 }; try { $p.Close() } catch {}; exit 0"
|
||||||
|
if %ERRORLEVEL% equ 0 (
|
||||||
|
set SERIAL_OK=1
|
||||||
|
echo Switching to HackRF mode, waiting for device...
|
||||||
|
timeout /t 7 /nobreak >nul
|
||||||
|
) else (
|
||||||
|
echo Could not open !COM_PORT!. Make sure the port is not in use.
|
||||||
|
)
|
||||||
|
goto :eof
|
||||||
|
|
||||||
|
|
||||||
REM ── Action 4: Flash factory HackRF firmware ────────────────
|
REM ── Action 4: Flash factory HackRF firmware ────────────────
|
||||||
:flash_factory
|
:flash_factory
|
||||||
echo.
|
echo.
|
||||||
@@ -200,17 +196,115 @@ if "%DEVICE_CHOICE%"=="3" (
|
|||||||
set FACTORY_BIN=firmware\hackrf_usb.bin
|
set FACTORY_BIN=firmware\hackrf_usb.bin
|
||||||
)
|
)
|
||||||
|
|
||||||
if not exist "%FACTORY_BIN%" (
|
call :check_file_exists "%FACTORY_BIN%" "factory firmware" || (pause & exit /b)
|
||||||
echo ERROR: "%FACTORY_BIN%" was not found.
|
|
||||||
echo Please ensure you have downloaded the latest release from:
|
|
||||||
echo https://release.hackrf.app/
|
|
||||||
echo.
|
|
||||||
pause
|
|
||||||
exit /b
|
|
||||||
)
|
|
||||||
|
|
||||||
echo.
|
echo.
|
||||||
"utils/hackrf_spiflash.exe" -R -w "%FACTORY_BIN%"
|
"utils/hackrf_spiflash.exe" -R -w "%FACTORY_BIN%"
|
||||||
echo.
|
echo.
|
||||||
pause
|
pause
|
||||||
exit /b
|
exit /b
|
||||||
|
|
||||||
|
|
||||||
|
REM ── Helper: Set FIRMWARE based on DEVICE_CHOICE ─────────────
|
||||||
|
:set_firmware
|
||||||
|
if "%DEVICE_CHOICE%"=="1" set FIRMWARE=firmware\firmware_hackrf.bin
|
||||||
|
if "%DEVICE_CHOICE%"=="2" set FIRMWARE=firmware\firmware_portarf.bin
|
||||||
|
if "%DEVICE_CHOICE%"=="3" set FIRMWARE=firmware\firmware_hpro.bin
|
||||||
|
goto :eof
|
||||||
|
|
||||||
|
|
||||||
|
REM ── Helper: Set DFU_FILE based on DEVICE_CHOICE ─────────────
|
||||||
|
:set_dfu_file
|
||||||
|
if "%DEVICE_CHOICE%"=="3" (
|
||||||
|
set DFU_FILE=firmware\hackrf_hpro_usb.dfu
|
||||||
|
) else (
|
||||||
|
set DFU_FILE=firmware\hackrf_usb.dfu
|
||||||
|
)
|
||||||
|
goto :eof
|
||||||
|
|
||||||
|
|
||||||
|
REM ── Helper: Check a required file exists ─────────────────────
|
||||||
|
REM %1 = quoted file path %2 = human-readable label
|
||||||
|
:check_file_exists
|
||||||
|
if not exist %1 (
|
||||||
|
echo ERROR: The %~2 file %1 was not found.
|
||||||
|
echo Please ensure you have downloaded the latest release from:
|
||||||
|
echo https://release.hackrf.app/
|
||||||
|
echo.
|
||||||
|
exit /b 1
|
||||||
|
)
|
||||||
|
exit /b 0
|
||||||
|
|
||||||
|
|
||||||
|
REM ── Helper: Flash FIRMWARE with serial fallback ───────────────
|
||||||
|
:do_flash
|
||||||
|
set FLASH_OK=0
|
||||||
|
"utils/hackrf_spiflash.exe" -R -w "%FIRMWARE%"
|
||||||
|
if %ERRORLEVEL% equ 0 (
|
||||||
|
set FLASH_OK=1
|
||||||
|
goto :eof
|
||||||
|
)
|
||||||
|
call :serial_fallback
|
||||||
|
if "!SERIAL_OK!"=="1" (
|
||||||
|
echo.
|
||||||
|
echo Device should now be in HackRF mode. Retrying flash...
|
||||||
|
echo.
|
||||||
|
"utils/hackrf_spiflash.exe" -R -w "%FIRMWARE%"
|
||||||
|
if !ERRORLEVEL! equ 0 (
|
||||||
|
set FLASH_OK=1
|
||||||
|
) else (
|
||||||
|
echo.
|
||||||
|
call :print_error
|
||||||
|
)
|
||||||
|
) else (
|
||||||
|
echo.
|
||||||
|
call :print_error
|
||||||
|
)
|
||||||
|
goto :eof
|
||||||
|
|
||||||
|
|
||||||
|
REM ── Helper: Run DFU flash ────────────────────────────────────
|
||||||
|
:do_dfu
|
||||||
|
"utils/dfu-util-static.exe" --device 1fc9:000c --download "%DFU_FILE%"
|
||||||
|
goto :eof
|
||||||
|
|
||||||
|
|
||||||
|
REM ── Helper: Print error banner ──────────────────────────────
|
||||||
|
:print_error
|
||||||
|
echo.
|
||||||
|
echo $$$$$$\
|
||||||
|
echo $$ __$$\
|
||||||
|
echo $$ / $$ ^| $$$$$$\ $$$$$$\ $$$$$$$\
|
||||||
|
echo $$ ^| $$ ^|$$ __$$\ $$ __$$\ $$ _____^|
|
||||||
|
echo $$ ^| $$ ^|$$ / $$ ^|$$ / $$ ^|\$$$$$$\
|
||||||
|
echo $$ ^| $$ ^|$$ ^| $$ ^|$$ ^| $$ ^| \____$$\
|
||||||
|
echo $$$$$$ ^|\$$$$$$ ^|$$$$$$$ ^|$$$$$$$ ^|
|
||||||
|
echo \______/ \______/ $$ ____/ \_______/
|
||||||
|
echo $$ ^|
|
||||||
|
echo $$ ^|
|
||||||
|
echo \__^|
|
||||||
|
echo.
|
||||||
|
echo ERROR: Device not found. Make sure your device is connected,
|
||||||
|
echo powered on, and in HackRF mode, then try again.
|
||||||
|
echo.
|
||||||
|
goto :eof
|
||||||
|
|
||||||
|
|
||||||
|
REM ── Helper: Print success banner ─────────────────────────────
|
||||||
|
:print_success
|
||||||
|
echo.
|
||||||
|
echo ______ __ __ ______ ______ ________ ______ ______
|
||||||
|
echo / \ ^| \ ^| \ / \ / \ ^| \ / \ / \
|
||||||
|
echo ^| $$$$$$\^| $$ ^| $$^| $$$$$$\^| $$$$$$\^| $$$$$$$$^| $$$$$$\^| $$$$$$\
|
||||||
|
echo ^| $$___\$$^| $$ ^| $$^| $$ \$$^| $$ \$$^| $$__ ^| $$___\$$^| $$___\$$
|
||||||
|
echo \$$ \ ^| $$ ^| $$^| $$ ^| $$ ^| $$ \ \$$ \ \$$ \
|
||||||
|
echo _\$$$$$$\^| $$ ^| $$^| $$ __ ^| $$ __ ^| $$$$$ _\$$$$$$\ _\$$$$$$\
|
||||||
|
echo ^| \__^| $$^| $$__/ $$^| $$__/ \^| $$__/ \^| $$_____ ^| \__^| $$^| \__^| $$
|
||||||
|
echo \$$ $$ \$$ $$ \$$ $$ \$$ $$^| $$ \ \$$ $$ \$$ $$
|
||||||
|
echo \$$$$$$ \$$$$$$ \$$$$$$ \$$$$$$ \$$$$$$$$ \$$$$$$ \$$$$$$
|
||||||
|
echo.
|
||||||
|
echo Firmware flashed successfully. Your device is rebooting...
|
||||||
|
echo.
|
||||||
|
echo If your device does not boot after flashing, see the troubleshooting wiki:
|
||||||
|
echo https://github.com/portapack-mayhem/mayhem-firmware/wiki/Wont-boot
|
||||||
|
echo.
|
||||||
|
goto :eof
|
||||||
|
|||||||
Reference in New Issue
Block a user