Advertisement
Guest User

Olimex nandinstall A20 images source 06/11/2015

a guest
Nov 6th, 2015
227
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.08 KB | None | 0 0
  1. #!/bin/bash
  2. #
  3. # Author: cubieplayer(cubieplayer@github.com)
  4. # Modified by: Mitko Gamishev(hehopmajieh@debian.bg)
  5. # Filename: nandinstall.sh
  6. # Depends: md5
  7. # Description: This script can help transfer you system on
  8. # SD-card to NAND_DEVICE automatically. Supports the following
  9. # Distributions.
  10. #
  11. # Must work on most distributions :
  12. # When use with separate boot partitions, lease copy uImage, uEnv.tx to /boot partition
  13. #
  14. # U-Boot source:
  15. #
  16. # https://github.com/mmplayer/u-boot-sunxi
  17. #
  18. # Copyright (c) 2013, cubieplayer. All rights reserved.
  19. #
  20.  
  21. set -e
  22.  
  23. TESTING=false;
  24.  
  25. if [[ "$1" = "test" ]];then
  26. TESTING=true;
  27. fi
  28.  
  29. CWD="/usr/lib/nandinstall"
  30.  
  31. NANDPART="${CWD}/nand-part"
  32.  
  33. MMC_DEVICE="/dev/mmcblk0"
  34. NAND_DEVICE="/dev/nand"
  35. NANDA_DEVICE="/dev/nanda"
  36. NANDB_DEVICE="/dev/nandb"
  37. NAND1_DEVICE="/dev/nand1"
  38. NAND2_DEVICE="/dev/nand2"
  39.  
  40. DEVICE_A10="a10"
  41. DEVICE_A20="a20"
  42.  
  43. CPU_INFO="/proc/cpuinfo"
  44.  
  45. MNT_BOOT="/mnt/nanda"
  46. MNT_ROOT="/mnt/nandb"
  47. MNT_MMC="/mnt/mmc"
  48.  
  49. CURRENT_PART_DUMP="${CWD}/nand.tmp"
  50. EXCLUDE_FILE_LIST="${CWD}/exclude.txt"
  51.  
  52. COLOR_NORMAL=$(echo -e "\033[m")
  53. COLOR_BLUE=$(echo -e "\033[36m")
  54. COLOR_GREEN=$(echo -e "\033[32m")
  55. COLOR_YELLOW=$(echo -e "\033[33m")
  56. COLOR_GRAY=$(echo -e "\033[37m")
  57. COLOR_RED=$(echo -e "\033[31m")
  58.  
  59. ERR_DETECT_DEVICE="error: failed to detect your device"
  60.  
  61. NAND_BOOT_DEVICE=
  62. NAND_ROOT_DEVICE=
  63.  
  64. DEVICE_TYPE=
  65. MACH_ID=
  66.  
  67. echoBlue(){
  68. echo "${COLOR_BLUE}${1}${COLOR_NORMAL}"
  69. }
  70.  
  71. echoRed(){
  72. echo "${COLOR_RED}${1}${COLOR_NORMAL}"
  73. }
  74.  
  75. echoYellow(){
  76. echo "${COLOR_YELLOW}${1}${COLOR_NORMAL}"
  77. }
  78.  
  79. echoGreen(){
  80. echo "${COLOR_GREEN}${1}${COLOR_NORMAL}"
  81. }
  82.  
  83. promptyn () {
  84. while true; do
  85. read -p "$1 " yn
  86. case $yn in
  87. [Yy]* ) return 0;;
  88. [Nn]* ) return 1;;
  89. * ) echo "Please answer yes or no.";;
  90. esac
  91. done
  92. }
  93.  
  94. umountNand() {
  95. sync
  96. for n in ${NAND_DEVICE}*;do
  97. if [ "${NAND_DEVICE}" != "$n" ];then
  98. if mount|grep ${n};then
  99. umount -l $n
  100. fi
  101. fi
  102. done
  103. }
  104.  
  105. formatNand(){
  106. if [[ "$DEVICE_TYPE" = "${DEVICE_A20}" ]];then
  107. (echo y;) | $NANDPART -f a20 $NAND_DEVICE 128 'bootloader 2048' 'linux 0'
  108. else
  109. (echo y;) | $NANDPART -f a10 $NAND_DEVICE 16 'bootloader 2048' 'linux 0' >> /dev/null
  110. fi
  111. }
  112.  
  113. nandPartitionOK(){
  114. local partinfo=
  115. local partcount=
  116. local partbad=
  117. local partcount=
  118. if [[ "$DEVICE_TYPE" = "${DEVICE_A20}" ]];then
  119. partinfo=$($NANDPART -f a20 $NAND_DEVICE)
  120. else
  121. partinfo=$($NANDPART -f a10 $NAND_DEVICE)
  122. fi
  123. printf "$partinfo" | grep "all partition tables are bad" >> /dev/null
  124. if [ $? -eq 0 ];then
  125. return 1
  126. fi
  127.  
  128. partcount=$(printf "$partinfo" | grep "partitions" | sed 's/[^0-9]//g')
  129.  
  130. if [ "$partcount" != "2" ];then
  131. return 1
  132. fi
  133.  
  134. if ! test -b $NAND_BOOT_DEVICE;then
  135. return 1
  136. fi
  137.  
  138. if ! test -b $NAND_ROOT_DEVICE;then
  139. return 1
  140. fi
  141.  
  142. return 0
  143. }
  144.  
  145. mkFS(){
  146. mkfs.vfat $NAND_BOOT_DEVICE >> /dev/null
  147. mkfs.ext4 $NAND_ROOT_DEVICE >> /dev/null
  148. }
  149.  
  150. disableJournal(){
  151. tune2fs -o journal_data_writeback $NAND_ROOT_DEVICE >> /dev/null
  152. tune2fs -O ^has_journal $NAND_ROOT_DEVICE >> /dev/null
  153. e2fsck -f $NAND_ROOT_DEVICE
  154. }
  155.  
  156. mountDevice(){
  157. if [ ! -d $MNT_BOOT ];then
  158. mkdir $MNT_BOOT
  159. fi
  160. mount $NAND_BOOT_DEVICE $MNT_BOOT
  161.  
  162. if [ ! -d $MNT_ROOT ];then
  163. mkdir $MNT_ROOT
  164. fi
  165. mount $NAND_ROOT_DEVICE $MNT_ROOT
  166.  
  167. df | grep "/dev/mmcblk0p1" > /dev/null
  168. if [ "$?" != "0" ]; then
  169.  
  170. if [ ! -d $MNT_MMC ]; then
  171. mkdir $MNT_MMC
  172. fi
  173. mount $MMC_DEVICE'p1' $MNT_MMC
  174. else
  175. MNT_MMC=$(df | grep "/dev/mmcblk0p1" | awk '{print $6}')
  176. fi
  177. }
  178.  
  179. installBootloader(){
  180. rm -rf $MNT_BOOT/*
  181. rsync -avc $BOOTLOADER/* $MNT_BOOT
  182. rsync -avc $MNT_MMC/script.bin $MNT_MMC/uEnv.txt $MNT_MMC/uImage* $MNT_ROOT/boot/
  183. sed -e 's|root=/dev/mmcblk0p2|root='$NAND_ROOT_DEVICE'|g' -i $MNT_ROOT/boot/uEnv.txt
  184. if [[ "$DEVICE_TYPE" = "${DEVICE_A20}" ]];then
  185. echo "machid=${MACH_ID}" >> $MNT_ROOT/boot/uEnv.txt
  186. fi
  187. }
  188.  
  189. installRootfs(){
  190. set +e
  191. rsync -avc --exclude-from=$EXCLUDE_FILE_LIST / $MNT_ROOT
  192. set -e
  193. echoBlue "sync disk... please wait"
  194. sync
  195. }
  196.  
  197. patchRootfs(){
  198. cat > ${MNT_ROOT}/etc/fstab <<END
  199. #<file system> <mount point> <type> <options> <dump> <pass>
  200. $NAND_ROOT_DEVICE / ext4 defaults,noatime 0 1
  201. END
  202. }
  203.  
  204. ########## main ##########
  205.  
  206. ### check if root
  207. if [[ ${EUID} -ne 0 ]]; then
  208. echoRed "!!! This tool must be run as root"
  209. exit 1
  210. fi
  211.  
  212. ### check if running on SD-card fstab should contains "/dev/mmcblk0p1 /"
  213. set +e
  214.  
  215. cat /etc/fstab | awk '{if($2=="/") {print $1}}' | grep $MMC_DEVICE > /dev/null 2>&1
  216. if [[ $? -ne 0 ]];then
  217. echoRed "!!! This tool must be run on SD-card system"
  218. exit 2
  219. fi
  220.  
  221. ### determine device
  222. if [[ -f $CPU_INFO ]];then
  223. if cat $CPU_INFO | grep -q 'sun4i';then
  224. DEVICE_TYPE="$DEVICE_A10"
  225. elif cat $CPU_INFO | grep -q 'sun7i';then
  226. DEVICE_TYPE="${DEVICE_A20}"
  227. ### determine machid
  228. uname -r | grep '3.3.0' > /dev/null 2>&1
  229. if [[ $? -eq 0 ]];then
  230. MACH_ID='0f35'
  231. else
  232. MACH_ID='10bb'
  233. fi
  234. else
  235. echoRed "$ERR_DETECT_DEVICE, must be sun4i or sun7i device"
  236. exit 1
  237. fi
  238. else
  239. echoRed "$ERR_DETECT_DEVICE, ${CPU_INFO} is not exist"
  240. exit 1
  241. fi
  242.  
  243. set -e
  244.  
  245. ### The bootloader is ready now
  246. BOOTLOADER="${CWD}/${DEVICE_TYPE}/bootloader"
  247.  
  248. ### set nand device
  249. if [[ -b $NANDA_DEVICE ]];then
  250. NAND_BOOT_DEVICE="$NANDA_DEVICE"
  251. elif [[ -b $NAND1_DEVICE ]];then
  252. NAND_BOOT_DEVICE="$NAND1_DEVICE"
  253. fi
  254.  
  255. if [[ "$DEVICE_TYPE" = "$DEVICE_A10" ]];then
  256. NAND_ROOT_DEVICE="$NANDB_DEVICE"
  257. elif [[ "$DEVICE_TYPE" = "${DEVICE_A20}" ]];then
  258. if [[ -b "$NANDB_DEVICE" ]];then
  259. NAND_ROOT_DEVICE="$NANDB_DEVICE"
  260. elif [[ -b "$NAND2_DEVICE" ]];then
  261. NAND_ROOT_DEVICE="$NAND2_DEVICE"
  262. fi
  263. fi
  264.  
  265. echo "
  266.  
  267. # # ## ##### # # # # # ####
  268. # # # # # # ## # # ## # # #
  269. # # # # # # # # # # # # # #
  270. # ## # ###### ##### # # # # # # # # ###
  271. ## ## # # # # # ## # # ## # #
  272. # # # # # # # # # # # ####
  273.  
  274. "
  275. if promptyn "Your data on $NAND_DEVICE will lost, Are you sure to continue?[y/n]"; then
  276. umountNand
  277. echoBlue "Re-partitioning NAND device"
  278. formatNand
  279. echoBlue "Check partition table"
  280. if nandPartitionOK;then
  281. echoBlue "Formating NAND devices"
  282. mkFS
  283. echoBlue "Mount NAND partitions"
  284. mountDevice
  285. umountNand
  286. mountDevice
  287. echoBlue "Install and configure bootloader"
  288. installBootloader
  289. echoBlue "Transferring rootfs, please be patient"
  290. if ! $TESTING;then
  291. installRootfs
  292. patchRootfs
  293. fi
  294. umountNand
  295. echoBlue "Optimize NAND performance"
  296. disableJournal
  297. echo ""
  298. echoGreen "*** Success! remember to REMOVE your SD card from board ***"
  299. echoGreen "*** Read http://tinyurl.com/qyee5k2, if the board won't boot from NAND ***"
  300. echo ""
  301. if promptyn "shutdown now?";then
  302. shutdown -h now
  303. fi
  304. else
  305. echo ""
  306. echoRed "*** Re-partition NAND device ${NAND_DEVICE} failed, Partition table has damaged ***"
  307. echo ""
  308. echoYellow "To fix the partition table, You can try to run nandinstall again. If the error still there, then you need to use livesuit restore a factory image first, then run nandinstall."
  309. fi
  310. fi
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement