init 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950
  1. #!/bin/bash
  2. # ============================================================
  3. # This is the standard Ubuntu initramfs initialization process
  4. # ============================================================
  5. # Default PATH differs between shells, and is not automatically exported
  6. # by klibc dash. Make it consistent.
  7. export PATH=/sbin:/usr/sbin:/bin:/usr/bin
  8. [ -d /dev ] || mkdir -m 0755 /dev
  9. [ -d /root ] || mkdir -m 0700 /root
  10. [ -d /sys ] || mkdir /sys
  11. [ -d /proc ] || mkdir /proc
  12. [ -d /tmp ] || mkdir /tmp
  13. mkdir -p /var/lock
  14. mount -t sysfs -o nodev,noexec,nosuid sysfs /sys
  15. mount -t proc -o nodev,noexec,nosuid proc /proc
  16. # Some things don't work properly without /etc/mtab.
  17. ln -sf /proc/mounts /etc/mtab
  18. echo "1 1 1 1" > /proc/sys/kernel/printk
  19. grep -q '\<quiet\>' /proc/cmdline || echo "Loading, please wait..."
  20. # Note that this only becomes /dev on the real filesystem if udev's scripts
  21. # are used; which they will be, but it's worth pointing out
  22. if ! mount -t devtmpfs -o nosuid,mode=0755 udev /dev; then
  23. echo "W: devtmpfs not available, falling back to tmpfs for /dev"
  24. mount -t tmpfs -o nosuid,mode=0755 udev /dev
  25. [ -e /dev/console ] || mknod -m 0600 /dev/console c 5 1
  26. [ -e /dev/null ] || mknod /dev/null c 1 3
  27. fi
  28. mkdir /dev/pts
  29. mount -t devpts -o noexec,nosuid,gid=5,mode=0620 devpts /dev/pts || true
  30. mount -t tmpfs -o "noexec,nosuid,size=80%,mode=0755" tmpfs /run
  31. mkdir -m 0755 /run/initramfs
  32. # Export the dpkg architecture
  33. export DPKG_ARCH=
  34. . /conf/arch.conf
  35. # Set modprobe env
  36. export MODPROBE_OPTIONS="-qb"
  37. # Export relevant variables
  38. export ROOT=
  39. export ROOTDELAY=
  40. export ROOTFLAGS=
  41. export ROOTFSTYPE=
  42. export IP=
  43. export BOOT=
  44. export BOOTIF=
  45. export UBIMTD=
  46. export break=
  47. export init=/sbin/init
  48. export quiet=y
  49. export readonly=y
  50. export rootmnt=/root
  51. export debug=
  52. export panic=
  53. export blacklist=
  54. export resume=
  55. export resume_offset=
  56. export drop_caps=
  57. export fastboot=n
  58. export forcefsck=n
  59. export fsckfix=
  60. export recovery=
  61. export BOOT_CARDTYPE="unknown"
  62. export OTHER_CARDTYPE="unknown"
  63. export BOOT_CARDDEV="9"
  64. export OTHER_CARDDEV="9"
  65. export CARD_TYPE="SD"
  66. # mdadm needs hostname to be set. This has to be done before the udev rules are called!
  67. if [ -f "/etc/hostname" ]; then
  68. /bin/hostname -F /etc/hostname >/dev/null 2>&1
  69. fi
  70. # Bring in the main config
  71. . /conf/initramfs.conf
  72. for conf in conf/conf.d/*; do
  73. [ -f ${conf} ] && . ${conf}
  74. done
  75. . /scripts/functions
  76. echo "1 1 1 1" > /proc/sys/kernel/printk
  77. BOOTDELAY=60
  78. DEFAULTBOOT="1"
  79. # Parse command line options
  80. for x in $(cat /proc/cmdline); do
  81. case $x in
  82. boot_card_type=*)
  83. BOOT_CARDTYPE=${x#boot_card_type=}
  84. ;;
  85. boot_card_dev=*)
  86. BOOT_CARDDEV=${x#boot_card_dev=}
  87. ;;
  88. cardtype=*)
  89. CARD_TYPE=${x#cardtype=}
  90. ;;
  91. boot_delay=*)
  92. BOOTDELAY="${x#boot_delay=}"
  93. case ${BOOTDELAY} in
  94. *[![:digit:].]*)
  95. BOOTDELAY=60
  96. ;;
  97. esac
  98. ;;
  99. default_boot=*)
  100. DEFAULTBOOT="${x#default_boot=}"
  101. ;;
  102. quiet)
  103. quiet=y
  104. ;;
  105. ro)
  106. readonly=y
  107. ;;
  108. rw)
  109. readonly=n
  110. ;;
  111. break=*)
  112. break=${x#break=}
  113. ;;
  114. break)
  115. break=premount
  116. ;;
  117. esac
  118. done
  119. # Default to BOOT=local if no boot script defined.
  120. if [ -z "${BOOT}" ]; then
  121. BOOT=local
  122. fi
  123. if [ -n "${noresume}" ]; then
  124. export noresume
  125. unset resume
  126. else
  127. resume=${RESUME:-}
  128. fi
  129. maybe_break top
  130. # export BOOT variable value for compcache,
  131. # so we know if we run from casper
  132. export BOOT
  133. # Don't do log messages here to avoid confusing graphical boots
  134. run_scripts /scripts/init-top
  135. #maybe_break modules
  136. #[ -n "${netconsole}" ] && modprobe netconsole netconsole="${netconsole}"
  137. load_modules
  138. maybe_break premount
  139. run_scripts /scripts/init-premount
  140. maybe_break mount
  141. # Always load local and nfs (since these might be needed for /etc or
  142. # /usr, irrespective of the boot script used to mount the rootfs).
  143. . /scripts/local
  144. . /scripts/nfs
  145. . /scripts/${BOOT}
  146. parse_numeric ${ROOT}
  147. maybe_break mountroot
  148. mount_top
  149. mount_premount
  150. #mountroot
  151. if read_fstab_entry /usr; then
  152. mountfs /usr
  153. fi
  154. # Mount cleanup
  155. mount_bottom
  156. nfs_bottom
  157. local_bottom
  158. chown 0:0 /bin/*
  159. chown 0:0 /sbin/*
  160. echo "1 1 1 1" > /proc/sys/kernel/printk
  161. sleep 1
  162. # === Variables ===
  163. [ ! $BOOTDELAY -gt 4 ] && BOOTDELAY=5
  164. export SCRIPT_VERSION="v2.2"
  165. export O_BOARD="OD"
  166. export ODROID_DTB="odroid.dtb"
  167. export ODROID_FSTAB="fstab.odroid"
  168. export ODROID_IMAGE="Kernel"
  169. export ODROID_ASYSTEMIMAGE="androsystem.img"
  170. export BKP_PREFIX="OD"
  171. export NUMCARDS="1"
  172. export UPGRADE_ANDROID="no"
  173. export ASYSTEM_PART="2"
  174. export ADATA_PART="5"
  175. export ACACHE_PART="3"
  176. export ADATA_PART_ORIG="3"
  177. export ACACHE_PART_ORIG="4"
  178. export LINUX_PART="7"
  179. export LINUX2_PART="8"
  180. export OELEC_PART="6"
  181. _desc=""
  182. _ini_prefix="multiboot"
  183. _actmount="mnt1"
  184. _numos=0
  185. _menu_no=49
  186. _menu_key="1"
  187. _menuitem_1=""
  188. _menuitem_2=""
  189. _menuitem_3=""
  190. _menuitem_4=""
  191. _menuitem_5=""
  192. _menuitem_6=""
  193. _menuitem_7=""
  194. _menuitem_8=""
  195. _mndscr_1=""
  196. _mndscr_2=""
  197. _mndscr_3=""
  198. _mndscr_4=""
  199. _mndscr_5=""
  200. _mndscr_6=""
  201. _mndscr_7=""
  202. _mndscr_8=""
  203. _mncrd_1="1"
  204. _mncrd_2="1"
  205. _mncrd_3="1"
  206. _mncrd_4="1"
  207. _mncrd_5="1"
  208. _mncrd_6="1"
  209. _mncrd_7="1"
  210. _mncrd_8="1"
  211. _boot_delay=2
  212. _defboot="none"
  213. _defdescr="none"
  214. _defcard="1"
  215. boot_fail="yes"
  216. # =========================================================
  217. # === Set the variables depending on used Odroid board ===
  218. if [ -f /ODROID_C2 ]; then
  219. O_BOARD="C2"
  220. ADATA_PART_ORIG="4"
  221. ACACHE_PART_ORIG="3"
  222. ODROID_DTB="meson64_odroidc2.dtb"
  223. ODROID_FSTAB="fstab.odroidc2"
  224. ODROID_IMAGE="Image"
  225. ODROID_ASYSTEMIMAGE="rootsystem.img"
  226. BKP_PREFIX="C2"
  227. BOOT_CARDDEV="0"
  228. if [ -b /dev/mmcblk1p1 ]; then
  229. BOOT_CARDTYPE="EMMC"
  230. NUMCARDS="2"
  231. OTHER_CARDDEV="1"
  232. OTHER_CARDTYPE="SD"
  233. else
  234. BOOT_CARDTYPE="${CARD_TYPE}"
  235. fi
  236. elif [ -f /ODROID_XU ]; then
  237. O_BOARD="XU"
  238. ADATA_PART_ORIG="3"
  239. ACACHE_PART_ORIG="4"
  240. ODROID_DTB="exynos5422-odroidxu3.dtb"
  241. ODROID_FSTAB="fstab.odroidxu3"
  242. ODROID_IMAGE="zImage"
  243. ODROID_ASYSTEMIMAGE="system.img"
  244. BKP_PREFIX="XU"
  245. if [ "${BOOT_CARDTYPE}" = "none" ]; then
  246. BOOT_CARDTYPE="SD"
  247. if [ -b /dev/mmcblk1p1 ]; then
  248. NUMCARDS="2"
  249. BOOT_CARDDEV="1"
  250. OTHER_CARDDEV="0"
  251. OTHER_CARDTYPE="EMMC"
  252. else
  253. BOOT_CARDDEV="0"
  254. fi
  255. else
  256. [ "${BOOT_CARDTYPE}" = "eMMC" ] && BOOT_CARDTYPE="EMMC"
  257. if [ "${BOOT_CARDDEV}" = 1 ]; then
  258. NUMCARDS="2"
  259. if [ "${BOOT_CARDTYPE}" = "SD" ]; then
  260. OTHER_CARDDEV="0"
  261. OTHER_CARDTYPE="EMMC"
  262. else
  263. OTHER_CARDDEV="1"
  264. OTHER_CARDTYPE="SD"
  265. BOOT_CARDDEV="0"
  266. fi
  267. fi
  268. fi
  269. fi
  270. # =========================================================
  271. # === Functions ===
  272. # Get OS description from boot.ini
  273. #-----------------------------------------------------
  274. get_descr() {
  275. _desc=""
  276. local _descx=
  277. _descx=`cat /${_actmount}/${_ini_prefix}/$1 | grep \#DESCRIPTION`
  278. if [ ! "${_descx}" = "" ]; then
  279. _desc=$(echo ${_descx} | sed -r 's/^.{13}//')
  280. fi
  281. if [ "${_desc}" = "" ]; then
  282. _desc="${2}"
  283. fi
  284. }
  285. #-----------------------------------------------------
  286. #-----------------------------------------------------------------------------------------------------------------------
  287. change_afstab() {
  288. # === Configure Android fstab to mount the right partitions ===
  289. if [ -f /mnt_a/${ODROID_FSTAB} ]; then
  290. if [ "${1}" = "yes" ]; then
  291. # Two cards, boot to Android on NON Boot card
  292. if [ "${O_BOARD}" = "C2" ]; then
  293. sed -i "s/\/dev\/block\/mmcblk0/\/dev\/block\/mmcblk1/g" /mnt_a/${ODROID_FSTAB}
  294. else
  295. if [ "${OTHER_CARDTYPE}" = "SD" ]; then
  296. cp /mnt_a/${ODROID_FSTAB}.other /mnt_a/${ODROID_FSTAB}
  297. sed -i "s/setenv akernel zImage/setenv akernel \/multiboot\/zImage.andro_1/g" /mnt1/boot.ini
  298. else
  299. cp /mnt_a/${ODROID_FSTAB}.orig /mnt_a/${ODROID_FSTAB}
  300. sed -i "s/setenv akernel zImage/setenv akernel \/multiboot\/zImage.android/g" /mnt1/boot.ini
  301. fi
  302. fi
  303. else
  304. # One or two cards, boot to Android on Boot card
  305. if [ "${O_BOARD}" = "C2" ]; then
  306. # Restore boot device if modified earlier
  307. sed -i "s/\/dev\/block\/mmcblk1/\/dev\/block\/mmcblk0/g" /mnt_a/${ODROID_FSTAB}
  308. else
  309. if [ "${NUMCARDS}" = "1" ]; then
  310. cp /mnt_a/${ODROID_FSTAB}.orig /mnt_a/${ODROID_FSTAB}
  311. sed -i "s/setenv akernel zImage/setenv akernel \/multiboot\/zImage.android/g" /mnt1/boot.ini
  312. else
  313. # Two cards, boot to Android on Boot card
  314. if [ "${BOOT_CARDTYPE}" = "SD" ] && [ "${BOOT_CARDDEV}" = "1" ]; then
  315. cp /mnt_a/${ODROID_FSTAB}.other /mnt_a/${ODROID_FSTAB}
  316. sed -i "s/setenv akernel zImage/setenv akernel \/multiboot\/zImage.andro_1/g" /mnt1/boot.ini
  317. else
  318. cp /mnt_a/${ODROID_FSTAB}.orig /mnt_a/${ODROID_FSTAB}
  319. sed -i "s/setenv akernel zImage/setenv akernel \/multiboot\/zImage.android/g" /mnt1/boot.ini
  320. fi
  321. fi
  322. fi
  323. fi
  324. if [ "${O_BOARD}" = "XU" ]; then
  325. cp -f /mnt_a/${ODROID_FSTAB} /mnt_a/${ODROID_FSTAB}.sdboot
  326. fi
  327. else
  328. printf "\033[31m\033[1m %s not found\033[22m\033[37m" "${ODROID_FSTAB}"
  329. cp /mnt1/${_ini_prefix}/boot.ini.multi /mnt1/boot.ini > /dev/null 2>&1
  330. [ "${O_BOARD}" = "XU" ] && cp /mnt1/${_ini_prefix}/boot.scr.multi /mnt1/boot.scr > /dev/null 2>&1
  331. sleep 3
  332. umount /mnt_a > /dev/null 2>&1
  333. return 1
  334. fi
  335. return 0
  336. }
  337. #-----------------------------------------------------------------------------------------------------------------------
  338. #----------------------------------------------------------------------------------------------------------------------
  339. # =======================================================================
  340. # On C2 boot drive is always mmcblk0 and is mounted on /mnt1
  341. # On XU3/XU4 boot drive can be mmcblk0 or mmcblk1 and is mounted on /mnt1
  342. # =======================================================================
  343. do_boot() {
  344. [ "${1}" = "none" ] && return 0
  345. local change_drive="no"
  346. local _oncard=""
  347. _actmount="mnt1"
  348. if [ "${3}" = "2" ]; then
  349. # Operating system on NON BOOT card
  350. _actmount="mnt2"
  351. change_drive="yes"
  352. fi
  353. if [ "${NUMCARDS}" = "2" ]; then
  354. if [ "${_actmount}" = "mnt1" ]; then
  355. _oncard=" on ${BOOT_CARDTYPE}"
  356. else
  357. _oncard=" on ${OTHER_CARDTYPE}"
  358. fi
  359. fi
  360. if [ -f /${_actmount}/${_ini_prefix}/${1} ]; then
  361. boot_fail="yes"
  362. printf "\r\033[2K"
  363. printf " Booting to \033[32m%s\033[37m\033[36m%s\033[37m" "${2}" "${_oncard}"
  364. # === Copy selected boot.ini to BOOT partition
  365. cp /${_actmount}/${_ini_prefix}/${1} /mnt1/boot.ini > /dev/null 2>&1
  366. if [ ! $? -eq 0 ]; then
  367. cp /mnt1/${_ini_prefix}/boot.ini.multi /mnt1/boot.ini > /dev/null 2>&1
  368. [ "${O_BOARD}" = "XU" ] && cp /mnt1/${_ini_prefix}/boot.scr.multi /mnt1/boot.scr > /dev/null 2>&1
  369. printf "\033[31m\033[1m ERROR copying /%s/%s/%s\033[22m\033[37m" "${_actmount}" "${_ini_prefix}" "${1}"
  370. sleep 3
  371. return 1
  372. fi
  373. sleep 1
  374. if [ "${change_drive}" = "yes" ]; then
  375. # === boot.ini from NON-BOOT card, prepare it for boot from BOOT card ===
  376. if [ "${O_BOARD}" = "C2" ]; then
  377. # for kernel/initrd/dtb loading
  378. sed -i "s/fatload mmc 0:1/fatload mmc 1:1/g" /mnt1/boot.ini
  379. # for boot.ini loading from /multiboot (it was changed with previous sed operation!)
  380. sed -i "s/1:1 0x60000000/0:1 0x60000000/g" /mnt1/boot.ini
  381. else
  382. # for kernel/initrd/dtb loading
  383. sed -i "s/setenv change_osdev no/setenv change_osdev yes/g" /mnt1/boot.ini
  384. fi
  385. fi
  386. if [ "${1}" = "boot.ini.android" ]; then
  387. # === mount destination android system partition to prepare android fstab ===
  388. mkdir /mnt_a > /dev/null 2>&1
  389. if [ "${change_drive}" = "yes" ]; then
  390. mount -t ext4 /dev/mmcblk${OTHER_CARDDEV}p2 /mnt_a > /dev/null 2>&1
  391. else
  392. mount -t ext4 /dev/mmcblk${BOOT_CARDDEV}p2 /mnt_a > /dev/null 2>&1
  393. fi
  394. if [ $? -ne 0 ]; then
  395. printf "\033[31m\033[1m Mount Android system partition ERROR\033[22m\033[37m"
  396. cp /mnt1/${_ini_prefix}/boot.ini.multi /mnt1/boot.ini > /dev/null 2>&1
  397. [ "${O_BOARD}" = "XU" ] && cp /mnt1/${_ini_prefix}/boot.scr.multi /mnt1/boot.scr > /dev/null 2>&1
  398. sleep 3
  399. umount /mnt_a > /dev/null 2>&1
  400. return 1
  401. fi
  402. # === Configure Android fstab to mount the right partitions ===
  403. change_afstab "${change_drive}"
  404. [ $? -ne 0 ] && return 1
  405. umount /mnt_a > /dev/null 2>&1
  406. # =============================================================
  407. if [ "${O_BOARD}" = "C2" ] && [ "${change_drive}" = "yes" ]; then
  408. # on C2 prepare boot.ini for boot from sdcard, not needed on XU
  409. sed -i "s/root=\/dev\/mmcblk0p2/root=\/dev\/mmcblk1p2/g" /mnt1/boot.ini
  410. fi
  411. fi
  412. if [ "${O_BOARD}" = "XU" ]; then
  413. # Convert boot.ini to boot.scr
  414. mkimage -C none -A arm -T script -d /mnt1/boot.ini /mnt1/boot.scr > /dev/null 2>&1
  415. if [ $? -ne 0 ]; then
  416. printf "\033[31m\033[1m mkimage (boot.scr) ERROR\033[22m\033[37m"
  417. cp /mnt1/${_ini_prefix}/boot.ini.multi /mnt1/boot.ini > /dev/null 2>&1
  418. cp /mnt1/${_ini_prefix}/boot.scr.multi /mnt1/boot.scr > /dev/null 2>&1
  419. sleep 3
  420. umount /mnt_a > /dev/null 2>&1
  421. return 1
  422. fi
  423. if [ -f /mnt1/multiboot/newscr ]; then
  424. mkimage -C none -A arm -T script -d /mnt1/multiboot/boot.ini.multi /mnt1/multiboot/boot.scr.multi > /dev/null 2>&1
  425. if [ $? -ne 0 ]; then
  426. printf "\033[31m\033[1m mkimage (boot.scr.multi) ERROR\033[22m\033[37m"
  427. cp /mnt1/${_ini_prefix}/boot.ini.multi /mnt1/boot.ini > /dev/null 2>&1
  428. cp /mnt1/${_ini_prefix}/boot.scr.multi /mnt1/boot.scr > /dev/null 2>&1
  429. sleep 3
  430. umount /mnt_a > /dev/null 2>&1
  431. return 1
  432. fi
  433. rm -f /mnt1/multiboot/newscr > /dev/null 2>&1
  434. fi
  435. fi
  436. sleep 1
  437. umount /mnt1
  438. umount /mnt2 > /dev/null 2>&1
  439. fsck.fat -aw /dev/mmcblk${BOOT_CARDDEV}p1 > /dev/null 2>&1
  440. reboot
  441. fi
  442. }
  443. #----------------------------------------------------------------------------------------------------------------------
  444. #------------------------------------------------------
  445. set_menu_key() {
  446. _menu_key="\\$(printf '%03o' ${_menu_no})"
  447. if [ $_menu_no -eq 49 ]; then
  448. _menuitem_1="${1}"
  449. _mndscr_1="${_desc}"
  450. [ "${_actmount}" = "mnt2" ] && _mncrd_1="2"
  451. elif [ $_menu_no -eq 50 ]; then
  452. _menuitem_2="${1}"
  453. _mndscr_2="${_desc}"
  454. [ "${_actmount}" = "mnt2" ] && _mncrd_2="2"
  455. elif [ $_menu_no -eq 51 ]; then
  456. _menuitem_3="${1}"
  457. _mndscr_3="${_desc}"
  458. [ "${_actmount}" = "mnt2" ] && _mncrd_3="2"
  459. elif [ $_menu_no -eq 52 ]; then
  460. _menuitem_4="${1}"
  461. _mndscr_4="${_desc}"
  462. [ "${_actmount}" = "mnt2" ] && _mncrd_4="2"
  463. elif [ $_menu_no -eq 53 ]; then
  464. _menuitem_5="${1}"
  465. _mndscr_5="${_desc}"
  466. [ "${_actmount}" = "mnt2" ] && _mncrd_5="2"
  467. elif [ $_menu_no -eq 54 ]; then
  468. _menuitem_6="${1}"
  469. _mndscr_6="${_desc}"
  470. [ "${_actmount}" = "mnt2" ] && _mncrd_6="2"
  471. elif [ $_menu_no -eq 55 ]; then
  472. _menuitem_7="${1}"
  473. _mndscr_7="${_desc}"
  474. [ "${_actmount}" = "mnt2" ] && _mncrd_7="2"
  475. elif [ $_menu_no -eq 56 ]; then
  476. _menuitem_8="${1}"
  477. _mndscr_8="${_desc}"
  478. [ "${_actmount}" = "mnt2" ] && _mncrd_8="2"
  479. fi
  480. let _menu_no=_menu_no+1
  481. let _numos=_numos+1
  482. }
  483. #------------------------------------------------------
  484. #---------------------------------------------------------------------------------------------
  485. # shellcheck disable=SC2059
  486. get_menu_items() {
  487. local _oncard=""
  488. if [ "${NUMCARDS}" = "2" ]; then
  489. if [ "${_actmount}" = "mnt1" ]; then
  490. _oncard=" on ${BOOT_CARDTYPE}"
  491. else
  492. _oncard=" on ${OTHER_CARDTYPE}"
  493. fi
  494. fi
  495. if [ -f /${_actmount}/${_ini_prefix}/boot.ini.android ]; then
  496. get_descr "boot.ini.android" "Android"
  497. set_menu_key "boot.ini.android"
  498. printf "\033[36m \033[32m\033[1m${_menu_key}\033[22m\033[36m boot to \033[32m${_desc}\033[36m${_oncard}\n"
  499. fi
  500. if [ -f /${_actmount}/${_ini_prefix}/boot.ini.linux ]; then
  501. get_descr "boot.ini.linux" "Linux"
  502. set_menu_key "boot.ini.linux"
  503. printf "\033[36m \033[33m\033[1m${_menu_key}\033[22m\033[36m boot to \033[33m${_desc}\033[36m${_oncard}\n"
  504. fi
  505. if [ -f /${_actmount}/${_ini_prefix}/boot.ini.oelec ]; then
  506. get_descr "boot.ini.oelec" "OpenElec"
  507. set_menu_key "boot.ini.oelec"
  508. printf "\033[36m \033[37m\033[1m${_menu_key}\033[22m\033[36m boot to \033[37m${_desc}\033[36m${_oncard}\n"
  509. fi
  510. if [ -f /${_actmount}/${_ini_prefix}/boot.ini.linux2 ]; then
  511. get_descr "boot.ini.linux2" "Linux #2"
  512. set_menu_key "boot.ini.linux2"
  513. printf "\033[36m \033[33m\033[1m${_menu_key}\033[22m\033[36m boot to \033[33m${_desc}\033[36m${_oncard}\n"
  514. fi
  515. }
  516. #---------------------------------------------------------------------------------------------
  517. #-----------------------------------------------------------------------------------------------------
  518. do_halt() {
  519. umount /mnt1 > /dev/null 2>&1
  520. umount /mnt2 > /dev/null 2>&1
  521. local B="X"
  522. local _reboot_delay=60
  523. while [ $_reboot_delay -gt 0 ]; do
  524. printf "\r\033[2K"
  525. printf " \033[31m\033[1m%s, press R to reboot %s\033[22m\033[37m\r" "${1}" "$_reboot_delay"
  526. if read -n 1 -t 1 -s B; then
  527. _reboot_delay=60
  528. if [ "${B}" = "r" ] || [ "${B}" = "R" ]; then
  529. printf "\r\033[2K"
  530. reboot
  531. fi
  532. else
  533. let _reboot_delay=_reboot_delay-1
  534. fi
  535. done
  536. reboot
  537. }
  538. #-----------------------------------------------------------------------------------------------------
  539. #-----------------------------------------------------------------------------------------------------------------
  540. os_detect() {
  541. _desc=""
  542. _ini_prefix="multiboot"
  543. _actmount="mnt1"
  544. _numos=0
  545. _menu_no=49
  546. _menu_key="1"
  547. _menuitem_1=""
  548. _menuitem_2=""
  549. _menuitem_3=""
  550. _menuitem_4=""
  551. _menuitem_5=""
  552. _menuitem_6=""
  553. _menuitem_7=""
  554. _menuitem_8=""
  555. _mndscr_1=""
  556. _mndscr_2=""
  557. _mndscr_3=""
  558. _mndscr_4=""
  559. _mndscr_5=""
  560. _mndscr_6=""
  561. _mndscr_7=""
  562. _mndscr_8=""
  563. _mncrd_1="1"
  564. _mncrd_2="1"
  565. _mncrd_3="1"
  566. _mncrd_4="1"
  567. _mncrd_5="1"
  568. _mncrd_6="1"
  569. _mncrd_7="1"
  570. _mncrd_8="1"
  571. _boot_delay=2
  572. _defboot="none"
  573. _defdescr="none"
  574. _defcard="1"
  575. # prepare cards mount points
  576. mkdir /mnt1 > /dev/null 2>&1
  577. mkdir /mnt2 > /dev/null 2>&1
  578. umount /mnt1 > /dev/null 2>&1
  579. umount /mnt2 > /dev/null 2>&1
  580. umount /mnt > /dev/null 2>&1
  581. clear
  582. # Detect new partitions after install
  583. blkid > /dev/null 2>&1
  584. # ================================
  585. # Mount available cards
  586. # ================================
  587. mount -t vfat /dev/mmcblk${BOOT_CARDDEV}p1 /mnt1 > /dev/null 2>&1
  588. if [ $? -eq 0 ]; then
  589. if [ "${NUMCARDS}" = "2" ]; then
  590. mount -t vfat /dev/mmcblk${OTHER_CARDDEV}p1 /mnt2 > /dev/null 2>&1
  591. if [ $? -ne 0 ]; then
  592. OTHER_CARDDEV="9"
  593. fi
  594. fi
  595. else
  596. # === SOMETHING IS VERY WRONG ===
  597. do_halt "BOOT CARD NOT MOUNTABLE"
  598. fi
  599. clear
  600. printf "\n"
  601. printf "\033[36m\033[1m\n"
  602. if [ "${O_BOARD}" = "C2" ]; then
  603. printf " ============================\n"
  604. printf " = ODROID C2 BOOT MENU %s =\n" "${SCRIPT_VERSION}"
  605. printf " ============================\n"
  606. else
  607. printf " =================================\n"
  608. printf " = ODROID XU3/XU4 BOOT MENU %s =\n" "${SCRIPT_VERSION}"
  609. printf " =================================\n"
  610. fi
  611. if [ "${NUMCARDS}" = "2" ]; then
  612. printf "\033[22m Two cards detected, booted from \033[1m%s\033[22m\033[37m\n\n" "${BOOT_CARDTYPE}"
  613. else
  614. printf "\033[22m Booted from \033[1m%s\033[22m\033[37m\n\n" "${BOOT_CARDTYPE}"
  615. fi
  616. #===================================================
  617. # === Detect available OS's and print menu items ===
  618. #===================================================
  619. _menu_no=49
  620. # Scan boot card first
  621. _actmount="mnt1"
  622. if [ -b /dev/disk/by-label/sduserdata ] || [ -b /dev/disk/by-label/emuserdata ]; then
  623. get_menu_items
  624. if [ "${NUMCARDS}" = "2" ]; then
  625. _actmount="mnt2"
  626. [ ! ${_numos} -eq 0 ] && printf "\n"
  627. get_menu_items
  628. fi
  629. [ ${_numos} -eq 0 ] && printf "\033[36m \033[36m\033[1m!\033[22m NO OS DETECTED\033[36m\n"
  630. else
  631. [ ${_numos} -eq 0 ] && printf "\033[36m \033[36m\033[1m!\033[22m NO MULTIBOOT CARD DETECTED\033[36m\n"
  632. fi
  633. printf "\n"
  634. printf " \033[36m\033[1mB\033[22m Backup Android/Linux/OpenElec\033[36m\n"
  635. printf " \033[36m\033[1mU\033[22m Update Android\033[36m\n"
  636. printf " \033[33m\033[1mI\033[22m Prepare the card for MultiBoot, Install OS's\033[36m\n"
  637. printf "\n"
  638. printf " \033[36m\033[1mX\033[22m Exit to busybox shell\033[36m\n"
  639. printf " \033[33m\033[1mR\033[22m Reboot\033[36m\n"
  640. printf "\n"
  641. printf "\n"
  642. # === Get default boot ===
  643. if [ "${DEFAULTBOOT}" = "1" ] && [ ! "${_menuitem_1}" = "none" ]; then
  644. _defboot="${_menuitem_1}"
  645. _defdescr="${_mndscr_1}"
  646. _defcard="${_mncrd_1}"
  647. elif [ "${DEFAULTBOOT}" = "2" ] && [ ! "${_menuitem_2}" = "none" ]; then
  648. _defboot="${_menuitem_2}"
  649. _defdescr="${_mndscr_2}"
  650. _defcard="${_mncrd_2}"
  651. elif [ "${DEFAULTBOOT}" = "3" ] && [ ! "${_menuitem_3}" = "none" ]; then
  652. _defboot="${_menuitem_3}"
  653. _defdescr="${_mndscr_3}"
  654. _defcard="${_mncrd_3}"
  655. elif [ "${DEFAULTBOOT}" = "4" ] && [ ! "${_menuitem_4}" = "none" ]; then
  656. _defboot="${_menuitem_4}"
  657. _defdescr="${_mndscr_4}"
  658. _defcard="${_mncrd_4}"
  659. elif [ "${DEFAULTBOOT}" = "5" ] && [ ! "${_menuitem_5}" = "none" ]; then
  660. _defboot="${_menuitem_5}"
  661. _defdescr="${_mndscr_5}"
  662. _defcard="${_mncrd_5}"
  663. elif [ "${DEFAULTBOOT}" = "6" ] && [ ! "${_menuitem_6}" = "none" ]; then
  664. _defboot="${_menuitem_6}"
  665. _defdescr="${_mndscr_6}"
  666. _defcard="${_mncrd_6}"
  667. elif [ "${DEFAULTBOOT}" = "7" ] && [ ! "${_menuitem_7}" = "none" ]; then
  668. _defboot="${_menuitem_7}"
  669. _defdescr="${_mndscr_7}"
  670. _defcard="${_mncrd_7}"
  671. elif [ "${DEFAULTBOOT}" = "8" ] && [ ! "${_menuitem_8}" = "none" ]; then
  672. _defboot="${_menuitem_8}"
  673. _defdescr="${_mndscr_8}"
  674. _defcard="${_mncrd_8}"
  675. fi
  676. if [ "${_defboot}" = "none" ]; then
  677. if [ ! "${_menuitem_1}" = "none" ]; then
  678. _defboot="${_menuitem_1}"
  679. _defdescr="${_mndscr_1}"
  680. _defcard="${_mncrd_1}"
  681. DEFAULTBOOT="1"
  682. elif [ ! "${_menuitem_2}" = "none" ]; then
  683. _defboot="${_menuitem_2}"
  684. _defdescr="${_mndscr_2}"
  685. _defcard="${_mncrd_2}"
  686. DEFAULTBOOT="2"
  687. elif [ ! "${_menuitem_3}" = "none" ]; then
  688. _defboot="${_menuitem_3}"
  689. _defdescr="${_mndscr_3}"
  690. _defcard="${_mncrd_3}"
  691. DEFAULTBOOT="3"
  692. elif [ ! "${_menuitem_4}" = "none" ]; then
  693. _defboot="${_menuitem_4}"
  694. _defdescr="${_mndscr_4}"
  695. _defcard="${_mncrd_4}"
  696. DEFAULTBOOT="4"
  697. elif [ ! "${_menuitem_5}" = "none" ]; then
  698. _defboot="${_menuitem_5}"
  699. _defdescr="${_mndscr_5}"
  700. _defcard="${_mncrd_5}"
  701. DEFAULTBOOT="5"
  702. elif [ ! "${_menuitem_6}" = "none" ]; then
  703. _defboot="${_menuitem_6}"
  704. _defdescr="${_mndscr_6}"
  705. _defcard="${_mncrd_6}"
  706. DEFAULTBOOT="6"
  707. elif [ ! "${_menuitem_7}" = "none" ]; then
  708. _defboot="${_menuitem_7}"
  709. _defdescr="${_mndscr_7}"
  710. _defcard="${_mncrd_7}"
  711. DEFAULTBOOT="7"
  712. elif [ ! "${_menuitem_8}" = "none" ]; then
  713. _defboot="${_menuitem_8}"
  714. _defdescr="${_mndscr_8}"
  715. _defcard="${_mncrd_8}"
  716. DEFAULTBOOT="8"
  717. fi
  718. fi
  719. }
  720. #-----------------------------------------------------------------------------------------------------------------
  721. os_detect
  722. # ======================================
  723. # === Main loop, never exit ===
  724. # === Wait for user OS/action select ===
  725. # ======================================
  726. _boot_delay=$BOOTDELAY
  727. # === Detect available Operating Systems ===
  728. while true; do
  729. printf "\r\033[2K"
  730. printf "\033[37m Select an option or boot to menu item \033[36m\033[1m%s\033[22m in\033[31m\033[1m %s \033[22m\033[37mseconds" "${DEFAULTBOOT}" "${_boot_delay}"
  731. A="Z"
  732. if read -n 1 -t 1 -s A; then
  733. _boot_delay=$BOOTDELAY
  734. if [ "${A}" = "B" ]; then
  735. # === BACKUP ===
  736. if [ -f /backup.script ]; then
  737. umount /mnt1 > /dev/null 2>&1
  738. umount /mnt2 > /dev/null 2>&1
  739. sleep 1
  740. # =========================
  741. # Execute the backup script
  742. /backup.script
  743. # =========================
  744. A="Z"
  745. os_detect
  746. _boot_delay=$BOOTDELAY
  747. else
  748. printf "\r\033[2K"
  749. printf " BACKUP SCRIPT NOT FOUND!"
  750. sleep 4
  751. fi
  752. elif [ "${A}" = "I" ]; then
  753. # === UNIVERSAL INSTALLER ===
  754. if [ -f /install.script ]; then
  755. umount /mnt1 > /dev/null 2>&1
  756. umount /mnt2 > /dev/null 2>&1
  757. sleep 1
  758. # ============================
  759. # Execute the installer script
  760. UPGRADE_ANDROID="no"
  761. /install.script
  762. # ============================
  763. A="Z"
  764. os_detect
  765. _boot_delay=$BOOTDELAY
  766. else
  767. printf "\r\033[2K"
  768. printf " INSTALL SCRIPT NOT FOUND!"
  769. sleep 4
  770. fi
  771. elif [ "${A}" = "U" ]; then
  772. # === ANDROID UPGRADE ====
  773. if [ -f /install.script ]; then
  774. umount /mnt1 > /dev/null 2>&1
  775. umount /mnt2 > /dev/null 2>&1
  776. sleep 1
  777. # =========================
  778. # Execute the backup script
  779. UPGRADE_ANDROID="yes"
  780. /install.script
  781. # =========================
  782. A="Z"
  783. os_detect
  784. _boot_delay=$BOOTDELAY
  785. else
  786. printf "\r\033[2K"
  787. printf " BACKUP SCRIPT NOT FOUND!"
  788. sleep 4
  789. fi
  790. elif [ "${A}" = "X" ]; then
  791. # === ENTER BUSYBOX ===
  792. clear
  793. printf "\n\n\n Entering \033[32mBusybox\033[37m shell\n"
  794. printf " Execute \033[32mexit\033[37m to return to menu\n\n"
  795. umount /mnt1 > /dev/null 2>&1
  796. umount /mnt2 > /dev/null 2>&1
  797. sleep 1
  798. #For C2 show cursor
  799. [ "${O_BOARD}" = "C2" ] && tput cnorm
  800. #===============
  801. break="bbox"
  802. maybe_break bbox
  803. #===============
  804. printf "\n \033[32mBusybox exited\033[37m\n"
  805. sleep 2
  806. #For C2 hide cursor
  807. [ "${O_BOARD}" = "C2" ] && tput civis
  808. A="Z"
  809. os_detect
  810. _boot_delay=$BOOTDELAY
  811. elif [ "${A}" = "R" ]; then
  812. # REBOOT ===
  813. _reboot_delay=10
  814. B="X"
  815. while [ $_reboot_delay -gt 0 ]; do
  816. printf "\r\033[2K"
  817. printf " \033[33m\033[1mREBOOT in %s sec, press \033[22ma\033[1m to abort, \033[22mr\033[1m to reboot \033[22m\033[37m\r" "$_reboot_delay"
  818. if read -n 1 -t 1 -s B; then
  819. _reboot_delay=10
  820. if [ "${B}" = "a" ] || [ "${B}" = "A" ]; then
  821. printf "\r\033[2K"
  822. break
  823. elif [ "${B}" = "r" ] || [ "${B}" = "R" ]; then
  824. _reboot_delay=0
  825. break
  826. fi
  827. else
  828. let _reboot_delay=_reboot_delay-1
  829. fi
  830. done
  831. if [ $_reboot_delay -eq 0 ]; then
  832. cp -f /*.ppm /mnt1 > /dev/null 2>&1
  833. umount /mnt1 > /dev/null 2>&1
  834. umount /mnt2 > /dev/null 2>&1
  835. reboot
  836. fi
  837. elif [ "${A}" = "s" ]; then
  838. # SCREENSHOT ===
  839. fbcat > /mb_menu.ppm
  840. elif [ $_numos -gt 0 ]; then
  841. # === BOOT to selected OS
  842. boot_fail="no"
  843. [ "${A}" = "1" ] && [ ! "${_menuitem_1}" = "none" ] && do_boot "${_menuitem_1}" "${_mndscr_1}" "${_mncrd_1}"
  844. [ "${A}" = "2" ] && [ ! "${_menuitem_2}" = "none" ] && do_boot "${_menuitem_2}" "${_mndscr_2}" "${_mncrd_2}"
  845. [ "${A}" = "3" ] && [ ! "${_menuitem_3}" = "none" ] && do_boot "${_menuitem_3}" "${_mndscr_3}" "${_mncrd_3}"
  846. [ "${A}" = "4" ] && [ ! "${_menuitem_4}" = "none" ] && do_boot "${_menuitem_4}" "${_mndscr_4}" "${_mncrd_4}"
  847. [ "${A}" = "5" ] && [ ! "${_menuitem_5}" = "none" ] && do_boot "${_menuitem_5}" "${_mndscr_5}" "${_mncrd_5}"
  848. [ "${A}" = "6" ] && [ ! "${_menuitem_6}" = "none" ] && do_boot "${_menuitem_6}" "${_mndscr_6}" "${_mncrd_6}"
  849. [ "${A}" = "7" ] && [ ! "${_menuitem_7}" = "none" ] && do_boot "${_menuitem_7}" "${_mndscr_7}" "${_mncrd_7}"
  850. [ "${A}" = "8" ] && [ ! "${_menuitem_8}" = "none" ] && do_boot "${_menuitem_8}" "${_mndscr_8}" "${_mncrd_8}"
  851. if [ "${boot_fail}" = "yes" ]; then
  852. # === BOOT ERROR ===
  853. sleep 4
  854. os_detect
  855. _boot_delay=$BOOTDELAY
  856. fi
  857. fi
  858. else
  859. let _boot_delay=_boot_delay-1
  860. if [ $_boot_delay -eq 0 ]; then
  861. # Default boot
  862. [ $_numos -gt 0 ] && [ ! "${_defboot}" = "none" ] && do_boot "${_defboot}" "${_defdescr}" "${_defcard}"
  863. # === BOOT ERROR ===
  864. sleep 4
  865. os_detect
  866. _boot_delay=$BOOTDELAY
  867. fi
  868. fi
  869. printf "\r"
  870. done
  871. # Just in case...
  872. printf "\n\n"
  873. umount /mnt1 > /dev/null 2>&1
  874. umount /mnt2 > /dev/null 2>&1
  875. printf "\033[36m REBOOT ...\n"
  876. reboot
  877. #---------------------------------------------------------------------------