#!/bin/busybox sh export TERM=linux # expect to be run from /boot, where the boot partition is mounted (readonly) export LOG=$(mktemp) #LOG=/dev/null # high brightness echo '10' > /sys/devices/platform/backlight/backlight/backlight/brightness #echo -e "\e[?3c" echo -e "\e[32m" # green echo "firstboot script running..." | tee -a ${LOG} echo # run a custom script if present - could be used to fix u-boot and such if test -r "${BOOTDIR}/firstboot.custom.sh"; then echo "Running a specific firstboot script..." | tee -a ${LOG} (cd "${BOOTDIR}" && sh firstboot.custom.sh) | tee -a ${LOG} echo "Finished running a specific firstboot script." | tee -a ${LOG} fi echo " " sleep 1 LICENSE=" The software provided is offered without \ any warranties or guarantees of any kind, either \ expressed or implied. The use of this software is \ entirely at your own risk. We shall not be held \ responsible for any damages, losses, or adverse \ consequences arising from the use or misuse of this software. \n\n \Z5Do you acknowledge and agree to these terms?\Zn \n\n Select an option & press START" ## Create temp file to store variable for menu choice TEMP=$(mktemp) ## Access /boot directory mount -o remount,rw "${BOOTDIR}" | tee -a ${LOG} # list of available devices in u-boot Environment parameters' read from FORCE_VERSION devices_ID=" bittboy2x_v1 bittboy2x_v2 bittboy3.5 q20 q90 v90 pocketgo pocketgo_TE xyc_gc9306 m3_r61520 m3_rm68090 m3_hx8347d m3_gc9306 " # list of available devices in u-boot Environment parameters' read from Auto-Detection method devices_auto_ID=" st7789s bittboy bittboy2 bittboy3 xyc m3 " # list of available devices in this flashing procedure read from DETECTED_VERSION in u-boot Environment parameters' DETECTED_1="V90/Q90/Q20/PocketGo ST7789S controller" DETECTED_2="GC9306/GC9305 controller from gc9306fb" DETECTED_3="SUP M3 unknown controller Works with R61520" DETECTED_4="bittboy2x_v1 r61520fb controller" DETECTED_5="bittboy3.5/bittboy2x_v2 ST7789S controller" DETECTED_6="RM68090 controller" DETECTED_7="R61520 controller" DETECTED_8="R61505W controller" DETECTED_9="HX8347-D controller" DETECTED_10="UNKNOWN" ## Defaulting to "not found the console in string list" FOUND_CONSOLE=false FOUND_CONSOLE_AUTO=false find_console_func(){ for i in $devices_ID; do if test "$i" = "$CONSOLE_VARIANT"; then FOUND_CONSOLE=true break fi done } find_console_auto_func(){ for i in $devices_auto_ID; do if test "$i" = "$CONSOLE_VARIANT"; then FOUND_CONSOLE_AUTO=true break fi done } # try to read what handheld we're on when calling func console_var_func(){ if (test -r "${BOOTDIR}/console.cfg"); then source "${BOOTDIR}/console.cfg" else export CONSOLE_VARIANT="unknown" fi } detect_console_func(){ console_var_func find_console_func find_console_auto_func } # write logs, sync & unmount MAIN before reboot/poweroff safe_shutdown_func(){ echo "please wait a few seconds for a ${SHUTDOWN}...." | tee -a ${LOG} dmesg > ${HOME}/dmesg.txt mv ${LOG} ${HOME}/log_firstboot.txt sync sleep 1 mount -o remount,ro "${BOOTDIR}" | tee -a ${LOG} umount /dev/mmcblk0p4 | tee -a ${LOG} #umount /dev/mmcblk0p1 | tee -a ${LOG} # this fails sleep 4 } safe_reboot_func(){ SHUTDOWN=reboot safe_shutdown_func reboot } safe_poweroff_func(){ SHUTDOWN=poweroff safe_shutdown_func poweroff } console_unknown_func(){ echo "CONSOLE_VARIANT=unknown" > ${BOOTDIR}/console.cfg echo "##DO_NOT_REMOVE_THIS_LINE##" >> ${BOOTDIR}/console.cfg } ## Default CONSOLE_VARIANT for st7789s screens default_console_func(){ echo "CONSOLE_VARIANT=pocketgo" > ${BOOTDIR}/console.cfg cp ${BOOTDIR}/suniv-f1c100s-miyoo-4bit.dtb ${BOOTDIR}/suniv-f1c100s-miyoo.dtb # No need to overwrite uboot FORCE version for default so continue procedure CONSOLE_OVERWRITE=false } #Test-prompt dialogs fo various scenarios test_image_func(){ dialog --backtitle "MiyooCFW 2.0" --no-shadow --defaultno --ok-label NO --cancel-label Inverted --stdout --title " Test Image" \ --colors --pause "\n\n \Z5Are your colors Inverted?\Zn\n\nSelect an option & press START" 12 34 10 echo $? > $TEMP ## Read the user's last choice from the tmp file CHOICE=$(cat $TEMP) # "NO" choice for Test_Image msgbox DIALOG_OK exit code ## thus we have valid version and simply continue if test $CHOICE -eq 0; then dialog --backtitle "MiyooCFW 2.0" --no-shadow --timeout 2 --msgbox "Colors are correct, proceed with flashing" 0 0 # "INVERTED" choice for Test_Iamge msgbox DIALOG_CANCEL exit code and -1/255 ## thus correct "invert" colors parameter on video driver else #TODO - make "invert" flag overwriting less dependent echo "INVERT=${INVERSION}" >> ${HOME}/options.cfg safe_reboot_func fi } test_video_func(){ dialog --backtitle "MiyooCFW 2.0" --no-shadow --defaultno --ok-label NO --cancel-label "Flipped!" --extra-button --extra-label YES --stdout --title " Test Video" \ --colors --pause "\n\n \Z5Can you see this message?\Zn\n\nSelect an option & press START" 12 34 10 echo $? > $TEMP ## Read the user's first choice from the tmp file CHOICE=$(cat $TEMP) # "YES" choice for Test_Video msgbox DIALOG_EXTRA exit code if test $CHOICE -eq 3; then # Correct variant for st7789s (non forced) echo "CONSOLE_VARIANT=st7789s" > ${BOOTDIR}/console.cfg # "Flipped!" choice for Test_Video msgbox DIALOG_CANCEL exit code elif test $CHOICE -eq 1; then # Test_Flip-prompt double checks if user selected correct answer for 1'st video test test_flip_func # "NO" or timeout choice for Test_Video msgbox thus DIALOG_OK exit code elif test $CHOICE -eq 0; then # Correct variant for bittboy2x_v1 (non forced) echo "CONSOLE_VARIANT=bittboy" > ${BOOTDIR}/console.cfg safe_reboot_func # Error (DIALOG_ERROR) or ESCAPE button pressed (DIALOG_ESCAPE) thus exit code -1/255 else dialog --backtitle "MiyooCFW 2.0" --no-shadow --timeout 2 --msgbox "Invalid choice, please redo the test!" 0 0 sleep 1.5 fi } test_video2_func(){ dialog --backtitle "MiyooCFW 2.0" --no-shadow --defaultno --ok-label NO --cancel-label YES --stdout --title " Test Video'2" \ --colors --pause "\n\n \Z5Can you see this message?\Zn\n\nSelect an option & press START" 12 34 10 echo $? > $TEMP ## Read the user's last choice from the tmp file CHOICE=$(cat $TEMP) # "YES" choice for Test_Video'2 msgbox DIALOG_CANCEL exit code ## thus we have valid version, just update to FORCE_VERSION and continue if test $CHOICE -eq 1; then echo "CONSOLE_VARIANT=bittboy2x_v1" > ${BOOTDIR}/console.cfg # "NO" or timeout choice for Test_Video msgbox thus DIALOG_OK exit code 0 (or ERROR/ESCAPE with -1/255) ## correct variant to unknown and redo whole flashing_prd again else console_unknown_func safe_reboot_func fi } test_keyboard_func(){ dialog --backtitle "MiyooCFW 2.0" --no-shadow --ok-label NO --cancel-label YES --stdout --title " Test Keyboard" \ --colors --pause "\n\n \Z5Does D-pad works correctly?\Zn\n\nSelect an option & press START" 12 34 10 echo $? > $TEMP ## Read the user's last choice from the tmp file CHOICE=$(cat $TEMP) # "YES" choice for Test_Keyboard msgbox DIALOG_CANCEL exit code ## thus we have valid version, just update to FORCE_VERSION and continue if test $CHOICE -eq 1; then if test "$CONSOLE_VARIANT" == "bittboy3"; then echo "CONSOLE_VARIANT=bittboy3.5" > ${BOOTDIR}/console.cfg elif test "$CONSOLE_VARIANT" == "bittboy2"; then echo "CONSOLE_VARIANT=bittboy2x_v2" > ${BOOTDIR}/console.cfg elif test "$CONSOLE_VARIANT" == "xyc"; then echo "CONSOLE_VARIANT=xyc_gc9306" > ${BOOTDIR}/console.cfg # Test_Image-prompt if proper "invert" colors parameter was loaded: INVERSION=1 #applied only if colors are inverted test_image_func elif test "$CONSOLE_VARIANT" == "m3"; then echo "CONSOLE_VARIANT=m3_gc9306" > ${BOOTDIR}/console.cfg fi # "NO" or timeout choice for Test_Keyboard msgbox DIALOG_OK exit code ## thus correct Auto-Detection variant and reboot elif test $CHOICE -eq 0; then if test "$CONSOLE_VARIANT" == "bittboy3"; then echo "CONSOLE_VARIANT=bittboy2" > ${BOOTDIR}/console.cfg elif test "$CONSOLE_VARIANT" == "bittboy2"; then console_unknown_func elif test "$CONSOLE_VARIANT" == "xyc"; then console_unknown_func elif test "$CONSOLE_VARIANT" == "m3"; then echo "CONSOLE_VARIANT=xyc" > ${BOOTDIR}/console.cfg fi safe_reboot_func # Error (DIALOG_ERROR) or ESCAPE button pressed (DIALOG_ESCAPE) thus exit code -1/255 else dialog --backtitle "MiyooCFW 2.0" --no-shadow --timeout 2 --msgbox "Invalid choice, please redo the test!" 0 0 sleep 1.5 fi } test_variant_func(){ dialog --backtitle "MiyooCFW 2.0" --no-shadow --defaultno --ok-label NO --cancel-label YES --stdout --title " Test Variant" \ --colors --pause "Does this device match yours?" 0 0 15 echo $? > $TEMP ## Read the user's last choice from the tmp file CHOICE=$(cat $TEMP) # Any choice different than "YES" from Test_Variant - that is 0/-1/255 exit code ## correct variant to unknown and redo whole flashing_prd again if !(test $CHOICE -eq 1); then console_unknown_func safe_reboot_func fi } test_flip_func(){ if (dialog --backtitle "MiyooCFW 2.0" --no-shadow --stdout --ok-label YES --cancel-label NO --title "Test Flip" --pause " \n Flipped? \n\nAre you sure?!" 12 15 10); then # Correct variant for bittboy3.5 (non forced) and display info about flipped image echo "CONSOLE_VARIANT=bittboy3" > ${BOOTDIR}/console.cfg dialog --backtitle "MiyooCFW 2.0" --no-shadow --timeout 2 --msgbox "Image flipped! correct&reboot" 0 0 sleep 1.5 #TODO: use special Unicode characters to draw text upside-down e.g.: ## dialog --backtitle "MiyooCFW 2.0" --no-shadow --timeout 2 --msgbox "ƃuᴉʇooqǝɹ⅋uᴉʇɔǝɹɹoɔ 'pǝddᴉןɟ ǝƃɐɯᴉ \n\n image flipped, correcting&rebooting" 0 0 safe_reboot_func else dialog --backtitle "MiyooCFW 2.0" --no-shadow --timeout 2 --msgbox "Invalid choice, please redo the test!" 0 0 sleep 1.5 fi } #Checking if device at hand is operational within flashing procedure CONSOLE_DETECTED=false if (grep -qE "${DETECTED_1}|${DETECTED_2}|${DETECTED_3}|${DETECTED_4}|${DETECTED_5}|${DETECTED_6}|${DETECTED_7}|${DETECTED_8}|${DETECTED_9}|${DETECTED_10}" "${BOOTDIR}/uEnv.txt"); then CONSOLE_DETECTED=true fi # I - Test_Block detect_console_func if ! $FOUND_CONSOLE && ! $FOUND_CONSOLE_AUTO && $CONSOLE_DETECTED; then if (grep -q "$DETECTED_1" "${BOOTDIR}/uEnv.txt"); then dialog --backtitle "MiyooCFW 2.0" --no-shadow --timeout 3 --msgbox "Auto-Detected $DETECTED_1" 0 0 # Test_Video-prompt if proper miyoo video's version driver was loaded: ## Loop Test_Video until correct selection has been performed (CHOICE=0/3) ### former CHOICE=1 meant safe_reboot if correct and shouldn't reach to this point while true; do test_video_func if !(test $CHOICE -eq -1 || test $CHOICE -eq 1 || test $CHOICE -eq 255); then break fi done elif (grep -q "$DETECTED_2" "${BOOTDIR}/uEnv.txt"); then dialog --backtitle "MiyooCFW 2.0" --no-shadow --timeout 3 --msgbox "Auto-Detected $DETECTED_2" 0 0 echo "CONSOLE_VARIANT=m3" > ${BOOTDIR}/console.cfg elif (grep -q "$DETECTED_3" "${BOOTDIR}/uEnv.txt"); then dialog --backtitle "MiyooCFW 2.0" --no-shadow --timeout 3 --msgbox "Auto-Detected $DETECTED_3" 0 0 echo "CONSOLE_VARIANT=m3_r61520" > ${BOOTDIR}/console.cfg # Test_Image-prompt if proper "invert" colors parameter was loaded: INVERSION=0 #applied only if colors are inverted test_image_func # look in II Test block for following DETECTED versions as these imply devices_auto_ID variants: ## DETECTED_4 - bittboy ## DETECTED_5 - bittboy3/2 elif (grep -q "$DETECTED_6" "${BOOTDIR}/uEnv.txt"); then dialog --backtitle "MiyooCFW 2.0" --no-shadow --timeout 3 --msgbox "Auto-Detected $DETECTED_6" 0 0 echo "CONSOLE_VARIANT=m3_rm68090" > ${BOOTDIR}/console.cfg elif (grep -q "$DETECTED_7" "${BOOTDIR}/uEnv.txt"); then dialog --backtitle "MiyooCFW 2.0" --no-shadow --timeout 3 --msgbox "Auto-Detected $DETECTED_7" 0 0 #echo "CONSOLE_VARIANT=r61520" > ${BOOTDIR}/console.cfg elif (grep -q "$DETECTED_8" "${BOOTDIR}/uEnv.txt"); then dialog --backtitle "MiyooCFW 2.0" --no-shadow --timeout 3 --msgbox "Auto-Detected $DETECTED_8" 0 0 #echo "CONSOLE_VARIANT=r61505w" > ${BOOTDIR}/console.cfg elif (grep -q "$DETECTED_9" "${BOOTDIR}/uEnv.txt"); then dialog --backtitle "MiyooCFW 2.0" --no-shadow --timeout 3 --msgbox "Auto-Detected $DETECTED_9" 0 0 echo "CONSOLE_VARIANT=m3_hx8347d" > ${BOOTDIR}/console.cfg elif (grep -q "$DETECTED_10" "${BOOTDIR}/uEnv.txt"); then dialog --backtitle "MiyooCFW 2.0" --no-shadow --timeout 3 --msgbox "Auto-Detected $DETECTED_10" 0 0 #echo "CONSOLE_VARIANT=unknown-error" > ${BOOTDIR}/console.cfg fi # Overwrite CONSOLE_VARIANT from new entry source "${BOOTDIR}/console.cfg" fi # II - Test_Block ## Defaulting to console overwriting inactive CONSOLE_OVERWRITE=false ## Test if console have been found in devices_auto_ID detect_console_func ## test if no device specified in console.cfg if ! $FOUND_CONSOLE && $FOUND_CONSOLE_AUTO && $CONSOLE_DETECTED; then # show selection menu for ST7789S devices if (test "$CONSOLE_VARIANT" == "st7789s" && grep -q "$DETECTED_1" "${BOOTDIR}/uEnv.txt"); then dialog --backtitle "MiyooCFW 2.0" --no-shadow --clear --timeout 60 --title "Select your device:" --menu " " 15 40 5 \ 1 "Powkiddy Q20" \ 2 "Powkiddy Q90" \ 3 "Powkiddy V90" \ 4 "PocketGO (default)" \ 5 "PocketGO with TE pin" \ 2> $TEMP ## Defaulting to console overwriting active CONSOLE_OVERWRITE=true ## Read the user's choice from the file CHOICE=$(cat $TEMP) ## Perform actions based on the user's choice case $CHOICE in 1) echo "CONSOLE_VARIANT=q20" > ${BOOTDIR}/console.cfg cp ${BOOTDIR}/suniv-f1c100s-miyoo-4bit.dtb ${BOOTDIR}/suniv-f1c100s-miyoo.dtb ;; 2) echo "CONSOLE_VARIANT=q90" > ${BOOTDIR}/console.cfg cp ${BOOTDIR}/suniv-f1c100s-miyoo-4bit.dtb ${BOOTDIR}/suniv-f1c100s-miyoo.dtb ;; 3) echo "CONSOLE_VARIANT=v90" > ${BOOTDIR}/console.cfg cp ${BOOTDIR}/suniv-f1c100s-miyoo-4bit.dtb ${BOOTDIR}/suniv-f1c100s-miyoo.dtb ;; 4) default_console_func ;; 5) echo "CONSOLE_VARIANT=pocketgo_TE" > ${BOOTDIR}/console.cfg cp ${BOOTDIR}/suniv-f1c100s-miyoo-4bit.dtb ${BOOTDIR}/suniv-f1c100s-miyoo.dtb ;; *) dialog --backtitle "MiyooCFW 2.0" --no-shadow --timeout 4 --msgbox "Invalid choice. Exiting and selecting default device from autodetection." 0 0 default_console_func sleep 0.1 ;; esac elif (((test "$CONSOLE_VARIANT" == "bittboy2" || test "$CONSOLE_VARIANT" == "bittboy3") && grep -q "$DETECTED_5" "${BOOTDIR}/uEnv.txt") || ((test "$CONSOLE_VARIANT" == "xyc" || test "$CONSOLE_VARIANT" == "m3") && grep -q "$DETECTED_2" "${BOOTDIR}/uEnv.txt")); then if (grep -q "$DETECTED_5" "${BOOTDIR}/uEnv.txt"); then dialog --backtitle "MiyooCFW 2.0" --no-shadow --timeout 3 --msgbox "Auto-Detected $DETECTED_5" 0 0 elif (grep -q "$DETECTED_2" "${BOOTDIR}/uEnv.txt"); then dialog --backtitle "MiyooCFW 2.0" --no-shadow --timeout 4 --msgbox "Correcting $DETECTED_2 - wait for further instructions" 0 0 fi # Test_Keyboard-prompt if proper miyoo.kbd version was loaded: ## Loop Test_Keyboard until correct selection has been performed (CHOICE=0/1) while true; do test_keyboard_func if !(test $CHOICE -eq -1 || test $CHOICE -eq 255); then break fi done elif (test "$CONSOLE_VARIANT" == "bittboy" && grep -q "$DETECTED_4" "${BOOTDIR}/uEnv.txt") ; then dialog --backtitle "MiyooCFW 2.0" --no-shadow --timeout 3 --msgbox "Auto-Detected $DETECTED_4" 0 0 # Test_Video'2-prompt if proper miyoo video's version driver was loaded: test_video2_func fi fi # III - Test_Block detect_console_func BITTBOY_CONFIG=false MIYOO_CONFIG=false if $FOUND_CONSOLE; then # Info_Box about selected/edited device in console.cfg case $CONSOLE_VARIANT in bittboy2x_v1) dialog --backtitle "MiyooCFW 2.0" --no-shadow --colors --timeout 2 --ok-label " Your device " --msgbox " BittBoy2x v1" 5 18 BITTBOY_CONFIG=true ;; bittboy2x_v2) dialog --backtitle "MiyooCFW 2.0" --no-shadow --colors --timeout 2 --ok-label " Your device " --msgbox " BittBoy2x v2" 5 18 BITTBOY_CONFIG=true ;; bittboy3.5) dialog --backtitle "MiyooCFW 2.0" --no-shadow --colors --timeout 2 --ok-label " Your device " --msgbox " BittBoy3.5" 5 18 BITTBOY_CONFIG=true ;; q20) dialog --backtitle "MiyooCFW 2.0" --no-shadow --colors --timeout 2 --ok-label " Your device " --msgbox " Powkiddy Q20" 5 18 MIYOO_CONFIG=true ;; q90) dialog --backtitle "MiyooCFW 2.0" --no-shadow --colors --timeout 2 --ok-label " Your device " --msgbox " Powkiddy Q90" 5 18 MIYOO_CONFIG=true ;; v90) dialog --backtitle "MiyooCFW 2.0" --no-shadow --colors --timeout 2 --ok-label " Your device " --msgbox " Powkiddy V90" 5 18 MIYOO_CONFIG=true ;; pocketgo) dialog --backtitle "MiyooCFW 2.0" --no-shadow --colors --timeout 2 --ok-label " Your device " --msgbox " PocketGo" 5 18 MIYOO_CONFIG=true ;; pocketgo_TE) dialog --backtitle "MiyooCFW 2.0" --no-shadow --colors --timeout 2 --ok-label " Your device " --msgbox " PocketGo+TE" 5 18 MIYOO_CONFIG=true ;; xyc_gc9306) dialog --backtitle "MiyooCFW 2.0" --no-shadow --colors --timeout 2 --ok-label " Your device " --msgbox " XYC Q8" 5 18 MIYOO_CONFIG=true ;; m3_r61520) dialog --backtitle "MiyooCFW 2.0" --no-shadow --colors --timeout 2 --ok-label " Your device " --msgbox " SUP M3\n (controller of r61520fb)" 6 29 MIYOO_CONFIG=true ;; m3_rm68090) dialog --backtitle "MiyooCFW 2.0" --no-shadow --colors --timeout 2 --ok-label " Your device " --msgbox " SUP M3\n(RM68090 controller)" 6 24 MIYOO_CONFIG=true ;; m3_hx8347d) dialog --backtitle "MiyooCFW 2.0" --no-shadow --colors --timeout 2 --ok-label " Your device " --msgbox " SUP M3\n(HX8347D controller)" 6 24 MIYOO_CONFIG=true ;; m3_gc9306) dialog --backtitle "MiyooCFW 2.0" --no-shadow --colors --timeout 2 --ok-label " Your device " --msgbox " SUP M3\n(GC9306 controller)" 6 24 MIYOO_CONFIG=true ;; *) dialog --backtitle "MiyooCFW 2.0" --no-shadow --colors --timeout 2 --ok-label " Your device " --msgbox "\Zb\Z1 Unknown-Error\Zn" 5 18 esac # Test_Variant-prompt if correct CONSOLE_VARIANT has been written to console.cfg test_variant_func else dialog --backtitle "MiyooCFW 2.0" --no-shadow --colors --timeout 2 --ok-label " Your device " --msgbox "\Zb\Z1 Unknown\Zn" 5 18 console_unknown_func fi # License_agreement-prompt if (dialog --backtitle "MiyooCFW 2.0" --no-shadow --clear --ok-label NO --cancel-label YES --stdout --title " License agreement" \ --colors --pause "\n \ZbMiyooCFW\Zn\n$LICENSE" 22 60 30 || test $? -eq 255); then echo -en " We understand. Have a nice day!\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n" sleep 1 console_unknown_func safe_poweroff_func fi # Format swap parition /sbin/mkswap /dev/mmcblk0p3 /sbin/swapon /dev/mmcblk0p3 sync sleep 1 mount -o remount,ro "${BOOTDIR}" | tee -a ${LOG} #define priamry partitions FS types P4_FS_TYPE="BTRFS" P5_FS_TYPE="EXT4" #grep all partitions current size SD_SIZE=$(cat "/sys/block/mmcblk0/size") P1_SIZE=$(cat "/sys/block/mmcblk0/mmcblk0p1/size") # BOOT P2_SIZE=$(cat "/sys/block/mmcblk0/mmcblk0p2/size") # ROOTFS P3_SIZE=$(cat "/sys/block/mmcblk0/mmcblk0p3/size") # SWAP P4_SIZE=$(cat "/sys/block/mmcblk0/mmcblk0p4/size") # MAIN P5_SIZE=$(cat "/sys/block/mmcblk0/mmcblk0p5/size") # ROMS SD_SIZE_IN_MiB=$((SD_SIZE * 512 / 1024 / 1024)) SD_SIZE_IN_GiB=$((SD_SIZE * 512 / 1024 / 1024 / 1024)) BOOT_SIZE=$(((1016+1 - 1000 + 1024) * 1024 / 512)) #bootloader partition=1016K (see `genimage` script in buildroot) ## boot_size calculated to 512 byte sector size blocks, adding +1K as a safety measure for roundups (at fatresize we use KibiBits) ## adding 1M (1024) for GPT align offset #Calculate unallocated left space to expand ROMS partition: SD_MAX_UNALL_SIZE="$((${SD_SIZE} - (${P1_SIZE} + ${P2_SIZE} + ${P3_SIZE} + ${P4_SIZE} + ${P5_SIZE}) - $BOOT_SIZE))" SD_MAX_UNALL_SIZE_IN_MiB=$((SD_MAX_UNALL_SIZE * 512 / 1024 / 1024)) SD_MAX_UNALL_SIZE_IN_GiB=$(echo "scale=1; ${SD_MAX_UNALL_SIZE} * 512 / 1024 / 1024 / 1024" | bc) #Calculate available space for 5'th partition (ROMS): SD_MAX_AVAIL_SIZE="$((${SD_SIZE} - (${P1_SIZE} + ${P2_SIZE} + ${P3_SIZE} + ${P4_SIZE}) - $BOOT_SIZE))" SD_MAX_AVAIL_SIZE_IN_KiB=$((SD_MAX_AVAIL_SIZE * 512 / 1024)) # Change_MAIN_FileSystem-prompt for the p4 partition if requested CHANGE_FS_P4=false if (dialog --backtitle "MiyooCFW 2.0" --no-shadow --clear --stdout --ok-label ${P4_FS_TYPE}\(default\) --cancel-label EXT4 --title " Change FileSystem" \ --colors --pause "\n\n\Z5Change default FileSystem of MAIN?\Zn\n\n BTRFS - safe & reliable\Zn\n\n EXT4 - fast & optimal\Zn\n\n Select an option & press START \n\n \ZbWARNING:\Zn\n After 30min changes\n to MAIN partition won't be possible." 15 60 1800); then echo "Selected ${P4_FS_TYPE} for MAIN partition, continuing with default setup." | tee -a ${LOG} sleep 2 else P4_FS_TYPE="EXT4" echo -en "\n\nConverting the MAIN partition filesystem to ${P4_FS_TYPE} type.\n\n" | tee -a ${LOG} echo -en "This can take a few minutes, be patient!" sleep 3 mkdir "${ROMS}"/backup rsync -a --info=nonreg0 --info=progress2 "${HOME}" "${ROMS}"/backup umount /dev/mmcblk0p4 | tee -a ${LOG} clear echo -en "\n\n" mkfs.ext4 -d "${ROMS}"/backup/"${HOME}" -L MAIN -v -F /dev/mmcblk0p4 | tee -a ${LOG} sleep 2 e2fsck -y /dev/mmcblk0p4 | tee -a ${LOG} mount /dev/mmcblk0p4 "${HOME}" -o rw,sync,exec | tee -a ${LOG} #cp -v -a "${ROMS}"/backup/"${HOME}" / rm -r "${ROMS}"/backup CHANGE_FS_P4=true fi ## Correct inittab for new p4 filesystem type if ( $CHANGE_FS_P4 ); then mount -o remount,rw / / sed -i "s|\(::sysinit:/bin/mount /dev/mmcblk0p4\).*|\1 "${HOME}" -o rw,sync,exec|" /etc/inittab mount -o remount,ro / / fi # Change_ROMS_FileSystem-prompt for the p5 partition if requested CHANGE_FS_P5=false dialog --backtitle "MiyooCFW 2.0" --no-shadow --clear --stdout --ok-label "${P5_FS_TYPE}(def.)" --cancel-label BTRFS --extra-button --extra-label FAT32 --title " Change FileSystem" \ --colors --pause "\n\n\Z5Change default FileSystem for ROMS?\Zn\n\nEXT4 - fast write/read & UNIX compliant\Zn\n\nBTRFS - slow read but poweroff safe, UNIX compliant\Zn\n\nFAT32 - slow on-device write but Windows compatbile\Zn\n\n Select an option & press START \n\n \ZbWARNING:\Zn\n After 30min changes to ROMS\n partition won't be possible." 25 60 1800 echo $? > $TEMP ## Read the user's first choice from the tmp file CHOICE=$(cat $TEMP) if test $CHOICE -eq 0; then echo "Selected ${P5_FS_TYPE} for ROMS partition, continuing with default setup." | tee -a ${LOG} sleep 2 elif test $CHOICE -eq 3; then P5_FS_TYPE="FAT32" CHANGE_FS_P5=true elif test $CHOICE -eq 1; then P5_FS_TYPE="BTRFS" CHANGE_FS_P5=true else dialog --backtitle "MiyooCFW 2.0" --no-shadow --timeout 2 --msgbox "Invalid choice, continuing with default setup!" 0 0 sleep 1.5 fi if ( $CHANGE_FS_P5 ); then echo -en "\n\nConverting the ROMS partition filesystem to ${P5_FS_TYPE} type.\n\n" | tee -a ${LOG} echo -en "This can take a few minutes, be patient!" sleep 3 mkdir "${HOME}"/backup rsync -a --info=nonreg0 --info=progress2 "${ROMS}" "${HOME}"/backup umount /dev/mmcblk0p5 | tee -a ${LOG} clear echo -en "\n\n" if test "${P5_FS_TYPE}" == "FAT32"; then mkfs.vfat -n ROMS -v -F32 /dev/mmcblk0p5 | tee -a ${LOG} sleep 2 fsck.fat -y /dev/mmcblk0p5 | tee -a ${LOG} mount /dev/mmcblk0p5 "${ROMS}" -t vfat -o rw,utf8 | tee -a ${LOG} rsync -rvt --modify-window=1 --exclude "lost+found" --info=nonreg0 --info=progress2 "${HOME}"/backup"${ROMS}" / elif test "${P5_FS_TYPE}" == "BTRFS"; then mkfs.btrfs -r "${HOME}"/backup"${ROMS}" -v -f -L ROMS /dev/mmcblk0p5 | tee -a ${LOG} sleep 2 btrfsck -y /dev/mmcblk0p5 | tee -a ${LOG} mount /dev/mmcblk0p5 "${ROMS}" -o commit=5,flushoncommit,noatime,nodiratime | tee -a ${LOG} fi rm -r "${HOME}"/backup ## Correct inittab for new p5 filesystem type mount -o remount,rw / / if test "${P5_FS_TYPE}" == "FAT32"; then sed -i "s|\(::sysinit:/bin/mount /dev/mmcblk0p5\).*|\1 "${ROMS}" -t vfat -o rw,utf8|" /etc/inittab elif test "${P5_FS_TYPE}" == "BTRFS"; then sed -i "s|\(::sysinit:/bin/mount /dev/mmcblk0p5\).*|\1 "${ROMS}" -o commit=5,flushoncommit,noatime,nodiratime|" /etc/inittab fi mount -o remount,ro / / fi # Expand_ROMS_Partition-prompt for the p5 (ROMS) partition if requested RESIZE_COMMENCED=false if (dialog --backtitle "MiyooCFW 2.0" --no-shadow --clear --stdout --ok-label YES --cancel-label NO --title " AUTO-RESIZE" \ --colors --pause "\n\n \Z5Expand ROMS partition?\Zn\n\n Select an option & press START \n\n \ZbWARNING:\Zn\n After 30min auto-resize\n of ${P5_FS_TYPE} partition will begin." 15 60 1800); then clear SD_MAX_AVAIL_SIZE_IN_GiB=$(echo "scale=1; ${SD_MAX_AVAIL_SIZE_IN_KiB} / 1024 / 1024" | bc) #only to inform user about end point for resize SD_MAX_AVAIL_SIZE_IN_GB=$(echo "scale=1; ${SD_MAX_AVAIL_SIZE_IN_KiB} * 1024 / 1000 / 1000 / 1000" | bc) P5_SIZE_IN_GB=$(echo "scale=1; ${P5_SIZE} * 512 / 1000 / 1000 / 1000" | bc) # roundup GB value to 0,1GB for integer calculations: SD_MAX_AVAIL_SIZE_IN_GBx10=$(echo "$SD_MAX_AVAIL_SIZE_IN_GB" | tr -d ".") P5_SIZE_IN_GBx10=$(echo "$P5_SIZE_IN_GB" | tr -d ".") #Sanity checks if we don't down- or over-resize partition: RESIZE_ABORT=false if (test "$P5_SIZE_IN_GBx10" -ge "$SD_MAX_AVAIL_SIZE_IN_GBx10" || test "$SD_MAX_UNALL_SIZE_IN_MiB" -le 15); then echo "Your ROMS partition is greater than available space for resizing or you lack unallocated sectors space" | tee -a ${LOG} sleep 1.5 RESIZE_ABORT=true fi if test "${P5_FS_TYPE}" == "FAT32" ; then if test "$SD_SIZE_IN_GiB" -gt 128; then if (dialog --clear --stdout --ok-label NO --cancel-label YES --title " \Zb\Z1WARNING!\Zn" \ --colors --pause "\nYour SD card exceeds max. size for auto-resizing! \n\nWe could however expand it to 118GB. \n\n \ZuDo you AGREE?\Zn \n\n\ZbINFO: For microSD >128GB big we\n recommend to use your PC!\Zn" 0 0 30 || test $? -eq 255); then dialog --clear --colors --timeout 2 --msgbox " FAT resizing \ZuABORTED!\Zn" 5 27 clear RESIZE_ABORT=true else SD_MAX_AVAIL_SIZE_IN_KiB=123731968 fi fi fi if ! $RESIZE_ABORT; then echo "The full size of your SD is ${SD_SIZE_IN_MiB}MB large" | tee -a ${LOG} echo "Unallocated space available for resizing equals ${SD_MAX_UNALL_SIZE_IN_GiB}GB," | tee -a ${LOG} echo "and more precisely it's ${SD_MAX_UNALL_SIZE_IN_MiB}MB big" | tee -a ${LOG} echo "Resizing the ROMS (${P5_FS_TYPE}) partition to ${SD_MAX_AVAIL_SIZE_IN_GiB}GB." | tee -a ${LOG} umount /dev/mmcblk0p5 | tee -a ${LOG} if test "${P5_FS_TYPE}" == "FAT32"; then echo "This can take a minute, so be patient!" | tee -a ${LOG} #TODO: fix outputting logs from fatresize stdout fatresize --size="${SD_MAX_AVAIL_SIZE_IN_KiB}"ki -v -p /dev/mmcblk0p5 -n5 | tee -a ${LOG} fsck.fat -y /dev/mmcblk0p5 | tee -a ${LOG} #echo -n -e \\xEB\\x58\\x90 > /dev/mmcblk0p5 sync mount -t vfat -o rw,utf8 /dev/mmcblk0p5 "${ROMS}" | tee -a ${LOG} else echo "This can take a few seconds." | tee -a ${LOG} P5_START_POINT=` parted --script /dev/mmcblk0 unit MB print | grep '5' | tail -n1 | awk '{print $2}'` parted -a optimal /dev/mmcblk0 --script rm '5' | tee -a ${LOG} parted -a optimal /dev/mmcblk0 --script mkpart roms $P5_START_POINT 100% | tee -a ${LOG} partx -u /dev/mmcblk0 | tee -a ${LOG} if test "${P5_FS_TYPE}" == "BTRFS"; then mount /dev/mmcblk0p5 "${ROMS}" -o rw,noatime | tee -a ${LOG} btrfs filesystem resize max ${ROMS} | tee -a ${LOG} else #EXT4 resize2fs /dev/mmcblk0p5 | tee -a ${LOG} e2fsck -y /dev/mmcblk0p5 | tee -a ${LOG} mount /dev/mmcblk0p5 "${ROMS}" -o rw,noatime,nodiratime | tee -a ${LOG} fi partprobe fi RESIZE_COMMENCED=true else echo "ROMS partition resizing was aborted!" | tee -a ${LOG} sleep 2 fi fi if ! $RESIZE_COMMENCED && test "${P5_FS_TYPE}" == "FAT32" ; then sgdisk --typecode=5:0700 /dev/mmcblk0 # Microsoft basic data - partition type partprobe fi # output FS table with type df -Th >> ${LOG} # Cleanup - delete the temporary file storing variable value rm $TEMP # disable this script mount -o remount,rw "${BOOTDIR}" | tee -a ${LOG} echo "Disabling the firstboot script." | tee -a ${LOG} mv "${BOOTDIR}/firstboot" "${BOOTDIR}/firstboot.done" | tee -a ${LOG} mount -o remount,ro "${BOOTDIR}" | tee -a ${LOG} # copy over the config files echo "Copying default configuration files into place..." | tee -a ${LOG} if $BITTBOY_CONFIG; then cp "${HOME}/gmenu2x/input_bittboy.conf" "${HOME}/gmenu2x/input.conf" elif $MIYOO_CONFIG; then cp "${HOME}/gmenu2x/input_miyoo.conf" "${HOME}/gmenu2x/input.conf" fi sync echo "firstboot script finished." | tee -a ${LOG} touch ${HOME}/firstboot.completed echo #install IPK packages echo "starting ipk install manager..." | tee -a ${LOG} ${BOOTDIR}/ipk_install.sh | tee -a ${LOG} # Reboot device if CONSOLE_VARIANT was overwritten from $CHOICE so that it could be applied in u-boot by readID ## or found firstboot custom script if ($CONSOLE_OVERWRITE || test -r "${BOOTDIR}/firstboot.custom.sh"); then safe_reboot_func else #just grep logs from temp directory before continuing yes | mv ${LOG} ${HOME}/log_firstboot.txt fi