aboutsummaryrefslogtreecommitdiff
path: root/nand-utils/load_nandsim.sh
diff options
context:
space:
mode:
Diffstat (limited to 'nand-utils/load_nandsim.sh')
-rwxr-xr-xnand-utils/load_nandsim.sh127
1 files changed, 127 insertions, 0 deletions
diff --git a/nand-utils/load_nandsim.sh b/nand-utils/load_nandsim.sh
new file mode 100755
index 0000000..4d9f0cb
--- /dev/null
+++ b/nand-utils/load_nandsim.sh
@@ -0,0 +1,127 @@
+#!/bin/sh -euf
+
+#
+# This script inserts NAND simulator module to emulate NAND flash of specified
+# size.
+#
+# Author: Artem Bityutskiy
+#
+
+fatal()
+{
+ echo "Error: $1" 1>&2
+ exit 1
+}
+
+usage()
+{
+ cat 1>&2 <<EOF
+Load NAND simulator to simulate flash of a specified size.
+
+Usage: ${0##*/} <size in MiB> <eraseblock size in KiB> \\
+ <page size (512 or 2048)>
+
+Only the first parameter is mandatory. Default eraseblock size
+is 16KiB, default NAND page size is 512 bytes.
+
+Only the following combinations are supported:
+--------------------------------------------------
+| size (MiB) | EB size (KiB) | Page size (bytes) |
+--------------------------------------------------
+| 16 | 16 | 512 |
+| 32 | 16 | 512 |
+| 64 | 16 | 512 |
+| 128 | 16 | 512 |
+| 256 | 16 | 512 |
+| 64 | 64 | 2048 |
+| 64 | 128 | 2048 |
+| 64 | 256 | 2048 |
+| 64 | 512 | 2048 |
+| 128 | 64 | 2048 |
+| 128 | 128 | 2048 |
+| 128 | 256 | 2048 |
+| 128 | 512 | 2048 |
+| 256 | 64 | 2048 |
+| 256 | 128 | 2048 |
+| 256 | 256 | 2048 |
+| 256 | 512 | 2048 |
+| 512 | 64 | 2048 |
+| 512 | 128 | 2048 |
+| 512 | 256 | 2048 |
+| 512 | 512 | 2048 |
+| 1024 | 64 | 2048 |
+| 1024 | 128 | 2048 |
+| 1024 | 256 | 2048 |
+| 1024 | 512 | 2048 |
+--------------------------------------------------
+EOF
+}
+
+if grep -q "NAND simulator" /proc/mtd; then
+ fatal "nandsim is already loaded"
+fi
+
+if [ "$#" -lt "1" ]; then
+ usage
+ exit 1
+fi
+
+size="$1"
+eb_size="$2"
+page_size="$3"
+if [ "$#" = "1" ]; then
+ eb_size="16"
+ page_size="512"
+elif [ "$#" = "2" ]; then
+ page_size="512"
+fi
+
+if [ "$page_size" -eq 512 ] && [ "$eb_size" -ne "16" ]; then
+ fatal "only 16KiB eraseblocks are possible in case of 512 bytes page"
+fi
+
+first=
+second=
+third=
+fourth=
+
+if [ "$page_size" -eq "512" ]; then
+ first="0x20"
+ case "$size" in
+ 16) second=0x33 ;;
+ 32) second=0x35 ;;
+ 64) second=0x36 ;;
+ 128) second=0x78 ;;
+ 256) second=0x71 ;;
+ *) fatal "flash size ${size}MiB is not supported, try 16, 32, 64 or 256"
+ esac
+elif [ "$page_size" -eq "2048" ]; then
+ case "$eb_size" in
+ 64) fourth="0x05" ;;
+ 128) fourth="0x15" ;;
+ 256) fourth="0x25" ;;
+ 512) fourth="0x35" ;;
+ *) fatal "eraseblock ${eb_size}KiB is not supported"
+ esac
+
+
+ case "$size" in
+ 64) first="0x20"; second="0xa2"; third="0x00 ";;
+ 128) first="0xec"; second="0xa1"; third="0x00 ";;
+ 256) first="0x20"; second="0xaa"; third="0x00 ";;
+ 512) first="0x20"; second="0xac"; third="0x00 ";;
+ 1024) first="0xec"; second="0xd3"; third="0x51 ";;
+ *) fatal "unable to emulate ${size}MiB flash with ${eb_size}KiB eraseblock"
+ esac
+else
+ fatal "bad NAND page size ${page_size}KiB, it has to be either 512 or 2048"
+fi
+
+first="first_id_byte=$first"
+second="second_id_byte=$second"
+[ -z "$third" ] || third="third_id_byte=$third"
+[ -z "$fourth" ] || fourth="fourth_id_byte=$fourth"
+
+modprobe nandsim "$first" "$second" $third $fourth
+
+echo "Loaded NAND simulator (${size}MiB, ${eb_size}KiB eraseblock, $page_size bytes NAND page)"