3 # YAFFS: Yet another FFS. A NAND-flash specific file system.
5 # Copyright (C) 2002-2018 Aleph One Ltd.
7 # Created by Charles Manning <charles@aleph1.co.uk>
9 # This program is free software; you can redistribute it and/or modify
10 # it under the terms of the GNU General Public License version 2 as
11 # published by the Free Software Foundation.
13 # Patch YAFFS into the kernel
15 # args: l/c : link or copy
16 # kpath : Full path to kernel sources to be patched
18 # Somewhat "inspired by" the mtd patchin script
28 # To be a Linux directory, it must have a Makefile
31 # Display usage of this script
33 echo "usage: $0 c/l m/s kernelpath"
34 echo " if c/l is c, then copy. If l then link"
35 echo " if m/s is m, then use multi version code. If s then use single version code"
46 if [ $COPYORLINK = l ]; then
48 elif [ $COPYORLINK = c ]; then
51 echo "unknown copy or link type"
55 if [ $MULTIORSINGLE = m ]; then
56 VFS_CODE="yaffs_vfs_multi.c"
57 MTD_CODE="yaffs_mtdif_multi.c"
58 YPORTENV="yportenv_multi.h"
59 KCONFIG_SRC="Kconfig_multi"
60 elif [ $MULTIORSINGLE = s ]; then
61 VFS_CODE="yaffs_vfs_single.c"
62 MTD_CODE="yaffs_mtdif_single.c"
63 YPORTENV="yportenv_single.h"
64 KCONFIG_SRC="Kconfig_single"
67 echo "*** Warning ***"
68 echo "You have chosen to use the single kernel variant of the yaffs VFS glue code"
69 echo "that only works with the latest Linux kernel tree. If you are using an older"
70 echo "version of Linux then you probably wanted to use the multi-version variant by"
71 echo "re-running the patch-ker.sh script using m as a the second argument."
72 echo " ie $0 $COPYORLINK m $LINUXDIR"
75 echo "unknown multi/single version selection"
80 # Check if kerneldir contains a Makefile
81 if [ ! -f $LINUXDIR/Makefile ]
83 echo "Directory $LINUXDIR does not exist or is not a kernel source directory";
88 VERSION=`grep -s VERSION <$LINUXDIR/Makefile | head -n 1 | sed s/'VERSION = '//`
89 PATCHLEVEL=`grep -s PATCHLEVEL <$LINUXDIR/Makefile | head -n 1 | sed s/'PATCHLEVEL = '//`
90 SUBLEVEL=`grep -s SUBLEVEL <$LINUXDIR/Makefile | head -n 1 | sed s/'SUBLEVEL = '//`
92 # Can we handle this version?
93 if [ $VERSION$PATCHLEVEL -lt 26 ]
95 echo "Cannot patch kernel version $VERSION.$PATCHLEVEL.$SUBLEVEL, must be 2.6.x or higher"
100 KCONFIG=$LINUXDIR/fs/Kconfig
101 KCONFIGOLD=$LINUXDIR/fs/Kconfig.pre.yaffs
102 YAFFS_PATCHED_STRING=`grep -s yaffs <$KCONFIG | head -n 1`
104 MAKEFILE=$LINUXDIR/fs/Makefile
105 MAKEFILEOLD=$LINUXDIR/fs/Makefile.pre.yaffs
107 if [ ! -z "$YAFFS_PATCHED_STRING" ]
110 echo "$KCONFIG already mentions YAFFS, so we will not change it"
112 # Change the fs/Kconfig file
113 # Save the old Kconfig
114 # Copy all stuff up to JFFS
115 # Insert some YAFFS stuff
116 # Copy all the rest of the stuff
119 echo "Updating $KCONFIG"
120 mv -f $KCONFIG $KCONFIGOLD
121 sed -n -e "/[Jj][Ff][Ff][Ss]/,99999 ! p" $KCONFIGOLD >$KCONFIG
123 # echo "# Patched by YAFFS" >>$KCONFIG
124 echo "source \"fs/yaffs2/Kconfig\"">>$KCONFIG
126 sed -n -e "/[Jj][Ff][Ff][Ss]/,99999 p" $KCONFIGOLD >>$KCONFIG
128 # now do fs/Makefile -- simply add the target at the end
129 echo "Updating $MAKEFILE"
130 cp -f $MAKEFILE $MAKEFILEOLD
132 # echo "# Patched by YAFFS" >>$MAKEFILE
133 echo "obj-\$(CONFIG_YAFFS_FS) += yaffs2/" >>$MAKEFILE
137 YAFFSDIR=$LINUXDIR/fs/yaffs2
141 echo "$YAFFSDIR exists, so not patching. If you want to replace what is"
142 echo "already there then delete $YAFFSDIR and re-run this script"
143 echo " eg. \"rm -rf $YAFFSDIR\" "
145 rm yaffs*.mod.c 2> /dev/null
146 mkdir $LINUXDIR/fs/yaffs2
147 $CPY $PWD/Makefile.kernel $LINUXDIR/fs/yaffs2/Makefile
148 $CPY $PWD/$KCONFIG_SRC $LINUXDIR/fs/yaffs2/Kconfig
149 $CPY $PWD/*.c $PWD/*.h $LINUXDIR/fs/yaffs2
150 rm $LINUXDIR/fs/yaffs2/yaffs_vfs*.c $LINUXDIR/fs/yaffs2/yaffs_mtdif*.c
151 rm $LINUXDIR/fs/yaffs2/yportenv*.h
152 rm $LINUXDIR/fs/yaffs2/moduleconfig.h
153 $CPY $PWD/$VFS_CODE $LINUXDIR/fs/yaffs2/yaffs_vfs.c
154 $CPY $PWD/$MTD_CODE $LINUXDIR/fs/yaffs2/yaffs_mtdif.c
155 $CPY $PWD/$YPORTENV $LINUXDIR/fs/yaffs2/yportenv.h