@ECHO OFF
@SETLOCAL enabledelayedexpansion
ECHO Xingji Technology flash script version 2.4
:: use fastboot that come with the package
SET fastboot=.\tools\WIN\fastboot.exe
SET restore_root=D:\\__FAST_RESTORE__
SET images=.\images
::
:: command line options to override the defaults
::
SET flash_userdata=0
SET erase_userdata=0
SET flash_boot_debug_img=0
SET para_flash=1
SET serial_number=
SET device_list=
SET device_count=0
SET opts=
SET flash_script=%0
SET no_reboot=0
SET gpt_updated=0
::
:: process command line options
::
:proc_option
SET bad_option=1
SET no_reboot_option=0
SET flash_boot_debug_img_option=0
IF "%1" == "" GOTO :start_flashing
IF "%1" == "/?" GOTO :check_bad_option
IF "%1" == "/h" GOTO :check_bad_option
IF "%1" == "/H" GOTO :check_bad_option
:: flash userdata?
IF "%1" == "/u" (
SET flash_userdata=1
SHIFT
SET bad_option=0
SET opts=%opts% /u
GOTO :check_bad_option
)
:: erase userdata?
IF "%1" == "/eu" (
SET erase_userdata=1
SHIFT
SET bad_option=0
SET opts=%opts% /eu
GOTO :check_bad_option
)
:: flash boot-debug.img?
IF "%1" == "/bd" SET flash_boot_debug_img_option=1
IF %flash_boot_debug_img_option% == 1 (
SET flash_boot_debug_img=1
SHIFT
SET bad_option=0
SET opts=%opts% /bd
GOTO :check_bad_option
)
:: disable para-flash
IF "%1" == "/s" (
SET para_flash=0
SHIFT
SET bad_option=0
GOTO :check_bad_option
)
:: disable fastboot reboot
IF "%1" == "/nr" SET no_reboot_option=1
IF %no_reboot_option% == 1 (
SET no_reboot=1
SHIFT
SET bad_option=0
SET opts=%opts% /nr
GOTO :check_bad_option
)
:: specify device number
IF NOT "%1" == "/d" GOTO :unknown_option
IF NOT "%serial_number%" == "" ECHO Too many possible serial numbers
IF NOT "%serial_number%" == "" GOTO :check_bad_option
SHIFT
IF "%1" == "" ECHO No serial number specified.
IF "%1" == "" GOTO :check_bad_option
SET var=%1
IF "%var:~0,1%" == "/" ECHO Bad serial number: %var%
IF "%var:~0,1%" == "/" GOTO :check_bad_option
SET serial_number=%1
SHIFT
SET bad_option=0
GOTO :check_bad_option
:: unknown take as serial by default
:unknown_option
SET var=%1
IF "%var:~0,1%" == "/" ECHO Unknown option: %var%
IF "%var:~0,1%" == "/" GOTO :check_bad_option
IF NOT "%serial_number%" == "" ECHO Too many possible serial numbers
IF NOT "%serial_number%" == "" GOTO :check_bad_option
SET serial_number=%1
SHIFT
SET bad_option=0
GOTO :check_bad_option
:check_bad_option
IF %bad_option% == 1 (
CALL :show_usage
EXIT /b 1
)
GOTO :proc_option
::
:: Start flashing
::
:start_flashing
IF %flash_userdata% == 1 SET erase_userdata=1
ECHO.
ECHO. Flashing Options:
ECHO. – flash userdata: %flash_userdata%
ECHO. – erase userdata: %erase_userdata%
ECHO. – no-reboot: %no_reboot%
ECHO. – flash boot-debug.img: %flash_boot_debug_img%
ECHO.
:: Wait for fastboot device enumeration
ECHO.
ECHO. Waiting for fastboot enumeration…
ECHO.
CALL :enumerate_all_devices
IF %errorlevel% NEQ 0 EXIT /b 1
ECHO. There are %device_count% device(s) connected: %device_list%
IF %device_count% == 1 (
SET /A para_flash=0
)
IF NOT "%serial_number%" == "" (
CALL :flash_one_device
IF !errorlevel! NEQ 0 EXIT /b 1
) else (
FOR %%D in (%device_list::= %) do (
ECHO. Trying to flash device %%D
IF %para_flash% == 0 (
CALL SET serial_number=%%D
CALL :flash_one_device
) else (
start cmd /k Call %flash_script% %opts% /s /d %%D
)
)
)
ECHO. All devices are flashed!
PAUSE
EXIT /b 0
:: ————————————————————————
:: Functions start here
:: ————————————————————————
:flash_one_device:
IF "%serial_number%" == "" (
ECHO. No device specified
EXIT /b 1
)
:: Check whether the phone is connected
CALL SET replaced=%%device_list:%serial_number%=%%
IF "%replaced%" == "%device_list%" (
ECHO. Device %serial_number% is not connected
EXIT /b 1
)
CALL :get_is_userspace is_userspace
IF "!is_userspace!" == "yes" (
ECHO.
ECHO. [ERROR] You are in fastbootd mode, not allowed for using flashall.
ECHO. Bootloader mode required, enter by using: fastboot reboot bootloader
ECHO. OR following fastboot-package-how-to.md document.
EXIT /b 1
)
ECHO.
ECHO. Starting flashing device %serial_number%…
ECHO.
ECHO.
ECHO. Backup partitions …
ECHO.
CALL :fastboot_backup modemst1
::IF %errorlevel% NEQ 0 EXIT /b 1
CALL :fastboot_backup modemst2
::IF %errorlevel% NEQ 0 EXIT /b 1
CALL :fastboot_backup fsg
::IF %errorlevel% NEQ 0 EXIT /b 1
CALL :fastboot_backup frp
::IF %errorlevel% NEQ 0 EXIT /b 1
CALL :fastboot_backup persist
::IF %errorlevel% NEQ 0 EXIT /b 1
CALL :fastboot_backup ctags
::IF %errorlevel% NEQ 0 EXIT /b 1
CALL :fastboot_backup ctags_backup
::IF %errorlevel% NEQ 0 EXIT /b 1
:: Another overall backup
SET backup_dir=.\%serial_number%
SET restore_dir=%restore_root%\%serial_number%
XCOPY /Y /I /E /Q .\TOOLS %restore_root%
ECHO N|XCOPY /I /E /Q %backup_dir% %restore_dir%
CALL :get_release_gpt release_gpt
IF !errorlevel! NEQ 0 EXIT /b 1
CALL :get_current_gpt current_gpt
IF !errorlevel! NEQ 0 EXIT /b 1
IF "!current_gpt!" == "FAILED" (
SET current_gpt=0
)
IF !release_gpt! NEQ !current_gpt! (
ECHO.
ECHO. Flashing GPT …
ECHO.
CALL :fastboot_flash partition:0 %images%\gpt_both0.bin
IF !errorlevel! NEQ 0 EXIT /b 1
SET gpt_updated=1
)
ECHO. Awlays flash slot a
%fastboot% -s %serial_number% set_active a
ECHO.
ECHO. Flashing bootloader …
ECHO.
CALL :fastboot_flash abl %images%\abl.elf
IF !errorlevel! NEQ 0 GOTO :flash_bl_err_handler
CALL :fastboot_flash aop %images%\aop.mbn
IF !errorlevel! NEQ 0 GOTO :flash_bl_err_handler
CALL :fastboot_flash aop_config %images%\aop_devcfg.mbn
IF !errorlevel! NEQ 0 GOTO :flash_bl_err_handler
CALL :fastboot_flash devcfg %images%\devcfg.mbn
IF !errorlevel! NEQ 0 GOTO :flash_bl_err_handler
CALL :fastboot_flash hyp %images%\hypvm.mbn
IF !errorlevel! NEQ 0 GOTO :flash_bl_err_handler
CALL :fastboot_flash keymaster %images%\keymint.mbn
IF !errorlevel! NEQ 0 GOTO :flash_bl_err_handler
CALL :fastboot_flash storsec %images%\storsec.mbn
IF !errorlevel! NEQ 0 GOTO :flash_bl_err_handler
CALL :fastboot_flash tz %images%\tz.mbn
IF !errorlevel! NEQ 0 GOTO :flash_bl_err_handler
CALL :fastboot_flash qupfw %images%\qupv3fw.elf
IF !errorlevel! NEQ 0 GOTO :flash_bl_err_handler
CALL :fastboot_flash uefisecapp %images%\uefi_sec.mbn
IF !errorlevel! NEQ 0 GOTO :flash_bl_err_handler
CALL :fastboot_flash uefi %images%\uefi.elf
IF !errorlevel! NEQ 0 GOTO :flash_bl_err_handler
CALL :fastboot_flash xbl_config %images%\xbl_config.elf
IF !errorlevel! NEQ 0 GOTO :flash_bl_err_handler
CALL :fastboot_flash xbl %images%\xbl_s.melf
IF !errorlevel! NEQ 0 GOTO :flash_bl_err_handler
CALL :fastboot_flash imagefv %images%\imagefv.elf
IF !errorlevel! NEQ 0 GOTO :flash_bl_err_handler
CALL :fastboot_flash shrm %images%\shrm.elf
IF !errorlevel! NEQ 0 GOTO :flash_bl_err_handler
CALL :fastboot_flash cpucp %images%\cpucp.elf
IF !errorlevel! NEQ 0 GOTO :flash_bl_err_handler
CALL :fastboot_flash featenabler %images%\featenabler.mbn
IF !errorlevel! NEQ 0 GOTO :flash_bl_err_handler
CALL :fastboot_flash toolsfv %images%\tools.fv
IF !errorlevel! NEQ 0 GOTO :flash_bl_err_handler
CALL :fastboot_flash multiimgqti %images%\multi_image_qti.mbn
IF !errorlevel! NEQ 0 GOTO :flash_bl_err_handler
CALL :fastboot_flash multiimgoem %images%\multi_image.mbn
IF %errorlevel% NEQ 0 GOTO :flash_bl_err_handler
IF EXIST %images%\XblRamdump.elf CALL :fastboot_flash xbl_ramdump %images%\XblRamdump.elf
IF %errorlevel% NEQ 0 GOTO :flash_bl_err_handler
::ECHO.
::ECHO. Rebooting bootloader …
::ECHO.
::CALL :fastboot_reboot_bl
::timeout /t 5
CALL :restore_handler
IF %errorlevel% NEQ 0 EXIT /b 1
:flash_modem
ECHO.
ECHO. Flashing modem SW…
ECHO.
CALL :fastboot_flash modem %images%\NON-HLOS.bin
IF %errorlevel% NEQ 0 EXIT /b 1
CALL :fastboot_flash bluetooth %images%\BTFM.bin
IF %errorlevel% NEQ 0 EXIT /b 1
CALL :fastboot_flash dsp %images%\dspso.bin
IF %errorlevel% NEQ 0 EXIT /b 1
:flash_vbmeta
ECHO.
ECHO. Flashing vbmeta…
ECHO.
CALL :fastboot_flash vbmeta %images%\vbmeta.img
IF %errorlevel% NEQ 0 EXIT /b 1
CALL :fastboot_flash vbmeta_system %images%\vbmeta_system.img
IF %errorlevel% NEQ 0 EXIT /b 1
:flash_ap
ECHO.
ECHO. Flashing AP Images…
ECHO.
CALL :fastboot_flash init_boot %images%\init_boot.img
IF %errorlevel% NEQ 0 EXIT /b 1
IF %flash_boot_debug_img% == 0 (
CALL :fastboot_flash boot %images%\boot.img
IF %errorlevel% NEQ 0 EXIT /b 1
CALL :fastboot_flash vendor_boot %images%\vendor_boot.img
IF %errorlevel% NEQ 0 EXIT /b 1
) ELSE (
CALL :fastboot_flash boot %images%\boot.img
IF %errorlevel% NEQ 0 EXIT /b 1
CALL :fastboot_flash vendor_boot %images%\vendor_boot-debug.img
IF %errorlevel% NEQ 0 EXIT /b 1
)
CALL :fastboot_flash dtbo %images%\dtbo.img
IF %errorlevel% NEQ 0 EXIT /b 1
IF EXIST %images%\recovery.img CALL :fastboot_flash recovery %images%\recovery.img
IF %errorlevel% NEQ 0 EXIT /b 1
CALL :fastboot_flash super %images%\super.img
IF !errorlevel! NEQ 0 EXIT /b 1
IF EXIST %images%\erf.bin CALL :fastboot_flash erf %images%\erf.bin
IF %errorlevel% NEQ 0 EXIT /b 1
IF EXIST %images%\logo.img CALL :fastboot_flash logo %images%\logo.img
IF %errorlevel% NEQ 0 EXIT /b 1
:: Erase userdata?
:erase_userdata
IF %erase_userdata% == 1 (
GOTO :do_erase_userdata
)
GOTO :flash_userdata
:do_erase_userdata
ECHO. Erasing userdata and metadata…
CALL :fastboot_erase userdata
IF %errorlevel% NEQ 0 EXIT /b 1
CALL :fastboot_erase metadata
IF %errorlevel% NEQ 0 EXIT /b 1
:: Flash userdata?
:flash_userdata
IF %flash_userdata% == 1 (
GOTO :do_flash_userdata
)
GOTO :all_done
:do_flash_userdata
ECHO. Flashing userdata…
CALL :fastboot_flash userdata %images%\userdata.img
IF %errorlevel% NEQ 0 EXIT /b 1
CALL :fastboot_flash metadata %images%\metadata.img
IF %errorlevel% NEQ 0 EXIT /b 1
ECHO. clearing bootmode…
%fastboot% -s %serial_number% oem ctag bootmode ""
ECHO. clearing bootmode…
%fastboot% -s %serial_number% oem ctag console false
:all_done
ECHO.
ECHO. All images flashed successfully!
IF %no_reboot% == 0 (
ECHO. Rebooting device…
ECHO.
%fastboot% -s %serial_number% reboot
)
EXIT /b 0
:show_usage
ECHO.
ECHO Usage: %~nx0 [OPTION...]
ECHO.
ECHO. Options:
ECHO. /? Help
ECHO. /u Flash userdata
ECHO. /eu Erase userdata
ECHO. /bd Flash boot-debug.img
ECHO. /ap Flash AP images only
ECHO. /s Flash all phones sequentially
ECHO. /nr No reboot after flashing
ECHO. /d device_serial The device serial number to be flashed. If there is no
ECHO. device specified, all phones will be flashed.
ECHO. device_serial The device serial number to be flashed. If there is no
ECHO. device specified, all phones will be flashed.
ECHO.
EXIT /b 0
:enumerate_all_devices
SET /A wait_time=1
SET /A ret=0
:loop
FOR /F "usebackq tokens=1" %%X in (`%fastboot% devices`) do (
IF NOT "%%X" == "" (
SET /A device_count+=1
SET device_list=!device_list! %%X
)
)
IF "%device_list%" == "" (
ping -n 2 127.0.0.1 > NUL
SET /A wait_time+=1
IF %wait_time% == 10 (
ECHO. Not found any devices connected. Please check and try again.
ECHO.
SET /A ret=1
GOTO :exit_enumeration
)
GOTO :loop
)
IF NOT "%serial_number%" == "" (
:: Check whether the phone is connected
CALL SET replaced=%%device_list:%serial_number%=%%
IF "%replaced%" == "%device_list%" (
ECHO. Device %serial_number% is not connected
EXIT /b 1
)
)
ECHO. Fastboot device is ready!!
:exit_enumeration
EXIT /b %ret%
:fastboot_flash
ECHO. Executing "%fastboot% -s %serial_number% flash %~1 %~2"
%fastboot% -s %serial_number% flash %~1 %~2
IF %errorlevel% NEQ 0 EXIT /b 1
ECHO.
EXIT /b 0
:fastboot_reboot_bl
ECHO. Executing %fastboot% -s %serial_number% reboot-bootloader
%fastboot% -s %serial_number% reboot-bootloader
IF %errorlevel% NEQ 0 EXIT /b 1
:: to allow time for fastboot de-enumeration before continuing
ping -n 5 127.0.0.1 > NUL
EXIT /b 0
:fastboot_erase
ECHO. Executing "%fastboot% -s %serial_number% erase %~1"
%fastboot% -s %serial_number% erase %~1
IF %errorlevel% NEQ 0 EXIT /b 1
ECHO.
ENDLOCAL
EXIT /b 0
:fastboot_backup
ECHO. Executing "%fastboot% -s %serial_number% oem partition pull %~1"
%fastboot% -s %serial_number% oem partition pull %~1
IF %errorlevel% NEQ 0 EXIT /b 1
ECHO.
EXIT /b 0
:get_release_gpt
FOR /F "tokens=2,2 delims==" %%X IN ('FINDSTR /i "gpt" release-info.md') DO (SET rel_gpt=%%X)
SET %1=%rel_gpt%
EXIT /b 0
:get_current_gpt
FOR /F "tokens=2" %%X IN ('%fastboot% -s %serial_number% getvar gpt-version 2^>^&1 ^| FINDSTR gpt-version') DO (SET curr_gpt=%%X)
SET %1=%curr_gpt%
EXIT /b 0
:get_is_userspace
FOR /F "tokens=2" %%X IN ('%fastboot% -s %serial_number% getvar is-userspace 2^>^&1 ^| FINDSTR is-userspace') DO (SET is_uspace=%%X)
SET %1=%is_uspace%
EXIT /b 0
:get_product
FOR /F "tokens=2" %%X IN ('%fastboot% -s %serial_number% getvar product 2^>^&1 ^| FINDSTR product') DO (SET prod=%%X)
SET %1=%prod%
EXIT /b 0
:restore_handler
IF "%gpt_updated%" == "1" (
ECHO.
ECHO. Restoring device %serial_number%…
ECHO.
IF EXIST %serial_number%\persist.bin CALL :fastboot_flash persist %serial_number%\persist.bin
IF EXIST %serial_number%\frp.bin CALL :fastboot_flash frp %serial_number%\frp.bin
IF EXIST %serial_number%\ctags.bin CALL :fastboot_flash ctags %serial_number%\ctags.bin
IF EXIST %serial_number%\ctags_backup.bin CALL :fastboot_flash ctags_backup %serial_number%\ctags_backup.bin
IF EXIST %serial_number%\fsg.bin CALL :fastboot_flash fsg %serial_number%\fsg.bin
IF EXIST %serial_number%\modemst1.bin CALL :fastboot_flash modemst1 %serial_number%\modemst1.bin
IF EXIST %serial_number%\modemst2.bin CALL :fastboot_flash modemst2 %serial_number%\modemst2.bin
)
EXIT /b 0
:flash_bl_err_handler
CALL :restore_handler
ECHO.
ECHO. Error on flashing %serial_number%…
ECHO.
EXIT /b 1