128 lines
3.6 KiB
Bash
128 lines
3.6 KiB
Bash
|
#!/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)"
|