summaryrefslogtreecommitdiff
path: root/load_nandsim.sh
blob: 1bb31e1ce521cbce5b4d53b4d8abcf85d1cbaaac (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
#!/bin/bash

#
# 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
if [ "$?" != "0" ]; then
	fatal "Error: cannot load nandsim"
fi

echo "Loaded NAND simulator (${size}MiB, ${eb_size}KiB eraseblock, $page_size bytes NAND page)"