#!/bin/bash #radiobox: dialog --radiolist text 0 0 0 1 sun4i on 2 sun5i off NAME=$(basename $0) CWD=$(pwd) DIALOG_OUTPUT=/tmp/$$ LOGFILE=${NAME}.log quit () { echo $* exit 1 } radiobox_dialog () { TITLE=$1 shift STRING="" for A in $* do [ "$STRING" = "" ] && STRING="$STRING $A . on" || STRING="$STRING $A . off" done dialog --radiolist "${TITLE}" 0 0 0 $STRING 2>$DIALOG_OUTPUT } HWPACK=nofileatall while [ ! -f $HWPACK ] do ENTRIES=$(ls *_hwpack_*) radiobox_dialog "Choose the hwpack to use" $ENTRIES HWPACK=$(cat $DIALOG_OUTPUT) done echo "Chosen hwpack: $HWPACK" > $LOGFILE echo "tar xf $HWPACK -C /tmp" >> $LOGFILE [ -d /tmp/hwpack ] && rm -rf /tmp/hwpack tar xf $HWPACK -C /tmp ( cd /tmp/hwpack/boards ENTRIES=$(find . -maxdepth 1 -type d -name "???*" -printf "%f ") radiobox_dialog "Choose Hardware" $ENTRIES ) HARDWARE=$(cat $DIALOG_OUTPUT) echo "Chosen hardware: $HARDWARE" >> $LOGFILE ( cd /tmp/hwpack/boards/$HARDWARE ENTRIES=$(find . -maxdepth 1 -type d -name "???*" -printf "%f ") radiobox_dialog "Choose Board" $ENTRIES ) DEVICE=$(cat $DIALOG_OUTPUT) echo "Chosen device: $DEVICE" >> $LOGFILE ( cd /tmp/hwpack/kernel ENTRIES=$(ls *_uImage.${HARDWARE} |sed -e "s/_.*$//") radiobox_dialog "Choose Kervel" $ENTRIES ) KERNEL=$(cat $DIALOG_OUTPUT) echo "Chosen kernel: $KERNEL" >> $LOGFILE dialog --msgbox "Please insert your target device so that I can detect the correct size. If the device is already inserted please remove it and reinsert. The last device that the kernel detects will be suggested as default. Nothing will be written to the device it's just to get the correct size." 0 0 ENTRIES=$(dmesg |grep -E "sd.:|mmcblk.:" |sort -ru |sed -e "s/.*\(sd.\):.*/\1/" |sed -e "s/.*\(mmcblk.\):.*/\1/") radiobox_dialog "Choose Target Device" $ENTRIES askme TARGET_DEV=/dev/$(cat $DIALOG_OUTPUT) echo "Chosen target device: $TARGET_DEV" >> $LOGFILE TARGET_SIZE=$(fdisk -l $TARGET_DEV |grep "Disk.*$TARGET_DEV" |awk '{print $(NF-1)}') if [ "$TARGET_SIZE" = "" ] then dialog --inputbox "Size of your desigred target image in Mb" 0 0 2>$DIALOG_OUTPUT TARGET_SIZE=$(($(cat $DIALOG_OUTPUT) * 1048576)) fi echo "Target device size in bytes: $TARGET_SIZE" >> $LOGFILE dialog --inputbox "How big do you want the boot partition to be (Mb) ? Min 16Mb" 0 0 16 2>$DIALOG_OUTPUT BOOTPARTITION_SIZE=$(($(cat $DIALOG_OUTPUT) * 2048)) echo "Boot partition size in sectors:i $BOOTPARTITION_SIZE" >> $LOGFILE dialog --inputbox "How big do you want the root partition to be (Mb) ? Min 460Mb or 0 to maximize" 0 0 460 2>$DIALOG_OUTPUT ROOTPARTITION_SIZE=$(($(cat $DIALOG_OUTPUT) * 2048)) [ $ROOTPARTITION_SIZE -eq 0 ] && ROOTPARTITION_SIZE="" echo "Root partition size in sectors: $ROOTPARTITION_SIZE" >> $LOGFILE dialog --inputbox "How would you like to call the raw image ? " 0 0 "raw_card.img" 2>$DIALOG_OUTPUT IMAGE_NAME=$(cat $DIALOG_OUTPUT) echo "Image name: $IMAGE_NAME" >> $LOGFILE [ "$(losetup -a)" != "" ] && quit "Aborting: there are loop devices in use" echo "dd if=/dev/zero of=$IMAGE_NAME bs=1024 count=$(($TARGET_SIZE / 1024))" >> $LOGFILE dd if=/dev/zero of=$IMAGE_NAME bs=1024 count=$(($TARGET_SIZE / 1024)) >> $LOGFILE 2>&1 cat <> $LOGFILE sfdisk -f -uS $IMAGE_NAME 2048,$BOOTPARTITION_SIZE,L,* $(($BOOTPARTITION_SIZE + 2049)),$ROOTPARTITION_SIZE,L 0,0,0 0,0,0 EOT cat <> $LOGFILE 2>&1 2048,$BOOTPARTITION_SIZE,L,* $(($BOOTPARTITION_SIZE + 2049)),$ROOTPARTITION_SIZE,L 0,0,0 0,0,0 EOT echo "losetup -o 1048576 --sizelimit $(($BOOTPARTITION_SIZE * 512)) /dev/loop0 $IMAGE_NAME" >> $LOGFILE losetup -o 1048576 --sizelimit $(($BOOTPARTITION_SIZE * 512)) /dev/loop0 $IMAGE_NAME if [ "$ROOTPARTITION_SIZE" = "" ] then echo "losetup -o $(($BOOTPARTITION_SIZE * 512 + 1049088)) /dev/loop1 $IMAGE_NAME" >> $LOGFILE losetup -o $(($BOOTPARTITION_SIZE * 512 + 1049088)) /dev/loop1 $IMAGE_NAME else echo "losetup -o $(($BOOTPARTITION_SIZE * 512 + 1049088)) --sizelimit $(($ROOTPARTITION_SIZE * 512)) /dev/loop1 $IMAGE_NAME" >> $LOGFILE losetup -o $(($BOOTPARTITION_SIZE * 512 + 1049088)) --sizelimit $(($ROOTPARTITION_SIZE * 512)) /dev/loop1 $IMAGE_NAME fi echo "losetup /dev/loop2 --sizelimit 1048575 $IMAGE_NAME" >> $LOGFILE losetup /dev/loop2 --sizelimit 1048575 $IMAGE_NAME ENTRIES="ext2 ext4" radiobox_dialog "Choose your root filesystem type" $ENTRIES ROOTFSTYPE=$(cat $DIALOG_OUTPUT) echo "mkfs.$ROOTFSTYPE /dev/loop1" >> $LOGFILE mkfs.$ROOTFSTYPE /dev/loop1 >> $LOGFILE 2>&1 #the bootloader if [ -f /tmp/hwpack/boards/${HARDWARE}/${DEVICE}/sunxi-spl.bin ] then echo "mkfs.vfat /dev/loop0" >> $LOGFILE mkfs.vfat /dev/loop0 >> $LOGFILE 2>&1 echo "dd if=/tmp/hwpack/boards/${HARDWARE}/${DEVICE}/sunxi-spl.bin of=/dev/loop2 bs=1024 seek=8" >> $LOGFILE dd if=/tmp/hwpack/boards/${HARDWARE}/${DEVICE}/sunxi-spl.bin of=/dev/loop2 bs=1024 seek=8 >> $LOGFILE 2>&1 echo "dd if=/tmp/hwpack/boards/${HARDWARE}/${DEVICE}/u-boot.bin of=/dev/loop2 bs=1024 seek=32" >> $LOGFILE dd if=/tmp/hwpack/boards/${HARDWARE}/${DEVICE}/u-boot.bin of=/dev/loop2 bs=1024 seek=32 >> $LOGFILE 2>&1 elif [ -f /tmp/hwpack/boards/${HARDWARE}/${DEVICE}/u-boot-sunxi-with-spl.bin ] then echo "mkfs.ext2 /dev/loop0" >> $LOGFILE mkfs.ext2 /dev/loop0 >> $LOGFILE 2>&1 echo "dd /tmp/hwpack/boards/${HARDWARE}/${DEVICE}/u-boot-sunxi-with-spl.bin of=/dev/loop2 bs=1024 seek=8" >> $LOGFILE dd /tmp/hwpack/boards/${HARDWARE}/${DEVICE}/u-boot-sunxi-with-spl.bin of=/dev/loop2 bs=1024 seek=8 >> $LOGFILE 2>&1 fi echo "dd if=/tmp/hwpack/boards/uEnv-img.bin of=/dev/loop2 bs=1024 seek=544" >> $LOGFILE dd if=/tmp/hwpack/boards/uEnv-img.bin of=/dev/loop2 bs=1024 seek=544 >> $LOGFILE 2>&1 sync #the boot partition mount /dev/loop0 /mnt/floppy cp /tmp/hwpack/kernel/${KERNEL}_uImage.$HARDWARE /mnt/floppy/uImage >> $LOGFILE 2>&1 cp /tmp/hwpack/kernel/boot.scr /mnt/floppy >> $LOGFILE 2>&1 cp /tmp/hwpack/boards/${HARDWARE}/${DEVICE}/script.bin /mnt/floppy >> $LOGFILE 2>&1 if [ -f /tmp/hwpack/boards/${HARDWARE}/${DEVICE}/sunxi-spl.bin ] then (cd /mnt/floppy cat << EOF >boot.cmd kernel=uImage setenv bootargs console=\${console} root=\${root} loglevel=\${loglevel} \${panic arg} \${extraargs} fatload mmc 0 0x43000000 script.bin fatload mmc 0 0x48000000 \${kernel} watchdog 0 bootm 0x48000000 EOF cat << EOF > uEnv.txt console=tty0 loglevel=5 root=/dev/mmcblk0p2 ro rootwait extraargs=console=ttyS0,115200 disp.screen0_output_mode=EDID:1280x720p60 hdmi.audio=EDID:0 sunxi_g2d_mem_reserve=0 sunxi_ve_mem_reserve=0 sunxi_fb_mem_reserve=16 sunxi_no_mali_mem_reserve EOF ) elif [ -f /tmp/hwpack/boards/${HARDWARE}/${DEVICE}/u-boot-sunxi-with-spl.bin ] then (cd /mnt/floppy cat << EOF >boot.cmd kernel=uImage setenv bootargs console=\${console} root=\${root} loglevel=\${loglevel} \${panicarg} \${extraargs} ext2load mmc 0 0x43000000 script.bin ext2load mmc 0 0x48000000 \${kernel} watchdog 0 bootm 0x48000000 EOF cat << EOF > uEnv.txt console=tty0 loglevel=5 root=/dev/mmcblk0p2 ro rootwait extraargs=console=ttyS0,115200 disp.screen0_output_mode=EDID:1280x720p60 hdmi.audio=EDID:0 sunxi_g2d_mem_reserve=0 sunxi_ve_mem_reserve=0 sunxi_fb_mem_reserve=16 sunxi_no_mali_mem_reserve EOF ) fi sync umount /mnt/floppy #the root filesystem mount /dev/loop1 /mnt/floppy ROOTTARBALL=nofileatall while [ ! -f $ROOTTARBALL ] do ENTRIES=$(ls *root*.t*z*) radiobox_dialog "Choose root image tarball" $ENTRIES ROOTTARBALL=$(cat $DIALOG_OUTPUT) done tar xpf $ROOTTARBALL -C /mnt/floppy >> $LOGFILE 2>&1 mkdir -p /mnt/floppy/lib/modules/${KERNEL}.${HARDWARE}+ >> $LOGFILE 2>&1 if [ -d /tmp/hwpack/modules/${KERNEL}.${HARDWARE}+ ] then cp -apr /tmp/hwpack/modules/${KERNEL}.${HARDWARE}+/* /mnt/floppy/lib/modules/${KERNEL}.${HARDWARE}+/ >> $LOGFILE 2>&1 elif [ -d /tmp/hwpack/modules/${KERNEL}.${HARDWARE} ] then cp -apr /tmp/hwpack/modules/${KERNEL}.${HARDWARE}/* /mnt/floppy/lib/modules/${KERNEL}.${HARDWARE}+/ >> $LOGFILE 2>&1 fi cat << EOF > /mnt/floppy/etc/fstab proc /proc proc defaults 0 0 /dev/mmcblk0p2 / $ROOTFSTYPE errors=remount-ro,noatime 0 1 EOF mv /mnt/floppy/etc/rc.d/rc.modules-* /mnt/floppy/etc/rc.d/rc.modules >/dev/null 2>&1 for module in sw_ahci_platform lcd hdmi ump disp mali mali_drm 8192cu do echo "#/sbin/modprobe $module" >> /mnt/floppy/etc/rc.d/rc.modules done chmod a+x /mnt/floppy/etc/rc.d/rc.modules >> $LOGFILE 2>&1 sync umount /mnt/floppy ################ dialog --msgbox "$IMAGE_NAME was created and the loop devices used to create it will remain untill you hit OK. Pleas check that everything is right befor you hit OK. You can then write the image to your target device with something like this: cat $IMAGE_NAME > $TARGET_DEV" 0 0 losetup -d /dev/loop0 losetup -d /dev/loop1 losetup -d /dev/loop2 rm -f $DIALOG_OUTPUT