]> spindle.queued.net Git - xodist/blob - mkjffs2.sh
add xterm for erikg
[xodist] / mkjffs2.sh
1 #!/bin/bash -e
2 #
3 # Copyright © 2008  Andres Salomon <dilinger@queued.net>
4 #
5 # This file is free software; you can redistribute it and/or modify it
6 # under the terms of the GNU General Public License as published by
7 # the Free Software Foundation; either version 2 of the License, or
8 # (at your option) any later version.
9 #
10 # This program is distributed in the hope that it will be useful, but
11 # WITHOUT ANY WARRANTY; without even the implied warranty of
12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13 # General Public License for more details.
14 #
15 # You should have received a copy of the GNU General Public License
16 # along with this program; if not, write to the Free Software
17 # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
18
19 # see the update-nand format definition
20 # http://wiki.laptop.org/go/OFW_NAND_FLASH_Updater
21
22 . functions.sh
23
24 usage()
25 {
26         echo "" 1>&2
27         echo "Usage: $0 <root directory> <img>" 1>&2
28         echo "" 1>&2
29         exit 1
30 }
31
32 if [ "$#" != "2" ]; then
33         usage
34 fi
35
36 ROOT_DIR=$1
37 IMG_NAME=$2
38
39 if [ "${IMG_NAME}" == "${IMG_NAME/.img/.dat}" ]; then
40         DAT_NAME=${IMG_NAME}.dat
41 else
42         DAT_NAME=${IMG_NAME/.img/.dat}
43 fi
44
45 if [ ! -d "${ROOT_DIR}" ]; then
46         echo "" 1>&2
47         echo "*** Unable to find root directory!" 1>&2
48         usage
49 fi
50
51 check_for_cmds mkfs.jffs2 sumtool || exit 1
52 create_fstab ${ROOT_DIR} jffs2
53 create_ofwboot ${ROOT_DIR} jffs2
54
55 create_jffs2()
56 {
57         root_dir="$1"
58         out="$2"
59
60         # XXX:  do we want to switch to lzo?  (mkfs.jffs2 -X lzo)
61         mkfs.jffs2 -n -e128KiB -r ${root_dir} -o ${out}.pre
62         sumtool -n -p -e 128KiB -i ${out}.pre -o ${out}
63         rm -f ${out}.pre
64 }
65
66 do_sha256()
67 {
68         f=$1
69         eblocks=$((`stat --printf "%s\n" $f` / (128*1024)))
70         for b in $(seq 0 $(($eblocks - 1))); do
71                 sha=$(dd status=noxfer bs=128KiB skip=$b count=1 if=$f 2>/dev/null | sha256sum | cut -d- -f1)
72                 echo "eblock: `printf '%x' $b` sha256 $sha" >> ${IMG_NAME}
73         done
74 }
75
76 partition_map()
77 {
78         # 0x190 * 128KiB = 50MiB boot, and the rest for root
79         cat >${IMG_NAME}<<EOF
80 data:  ${DAT_NAME}
81 erase-all
82 partitions:  boot 190  root -1
83 set-partition: boot 
84 mark-pending: 0
85 EOF
86         do_sha256 "_boot.img"
87         cat >>${IMG_NAME}<<EOF
88 cleanmarkers
89 mark-complete: 0
90 set-partition: root
91 mark-pending: 0
92 EOF
93         do_sha256 "_root.img"
94         cat >>${IMG_NAME}<<EOF
95 cleanmarkers
96 mark-complete: 0
97 EOF
98 }
99
100 # create the boot partition
101 ln -s . ${ROOT_DIR}/boot/boot
102 create_jffs2 ${ROOT_DIR}/boot _boot.img
103 rm -f ${ROOT_DIR}/boot/boot
104
105 # create the root partition
106 mv ${ROOT_DIR}/boot _boot
107 mkdir ${ROOT_DIR}/boot
108 create_jffs2 ${ROOT_DIR} _root.img
109 rmdir ${ROOT_DIR}/boot
110 mv _boot ${ROOT_DIR}/boot
111
112 # concat partitions, finish up
113 partition_map
114 cat _boot.img _root.img > ${DAT_NAME}
115 rm -f _boot.img _root.img