blob: bda3c790cf526c72ba527e6030c954443158b6ea [file] [log] [blame]
#!/bin/bash
#
# This script inserts NAND simulator module to emulate NAND flash of specified
# size.
#
# Author: Artem Bityutskiy
#
# Check if nandsim module is loaded
function nandsim_loaded()
{
local NANDSIM=`lsmod | grep nandsim`
if [ -n "$NANDSIM" ]; then
return 1
fi
return 0
}
nandsim_loaded
if (( $? != 0 )); then
echo "Error: nandsim is already loaded"
exit 1
fi
if (( $# < 1 )); then
echo "Load NAND simulator to simulate flash of a specified size."
echo ""
echo "Usage: ./load_nandsim.sh <size in MiB> <eraseblock size in KiB>"
echo " <page size (512 or 2048)>"
echo ""
echo "Only the first parameter is mandatory. Default eraseblock size"
echo "is 16KiB, default NAND page size is 512 bytes."
echo ""
echo "Only the following combinations are supported:"
echo "--------------------------------------------------"
echo "| size (MiB) | EB size (KiB) | Page size (bytes) |"
echo "--------------------------------------------------"
echo "| 16 | 16 | 512 |"
echo "| 32 | 16 | 512 |"
echo "| 64 | 16 | 512 |"
echo "| 128 | 16 | 512 |"
echo "| 256 | 16 | 512 |"
echo "| 64 | 64 | 2048 |"
echo "| 64 | 128 | 2048 |"
echo "| 64 | 256 | 2048 |"
echo "| 64 | 512 | 2048 |"
echo "| 128 | 64 | 2048 |"
echo "| 128 | 128 | 2048 |"
echo "| 128 | 256 | 2048 |"
echo "| 128 | 512 | 2048 |"
echo "| 256 | 64 | 2048 |"
echo "| 256 | 128 | 2048 |"
echo "| 256 | 256 | 2048 |"
echo "| 256 | 512 | 2048 |"
echo "| 512 | 64 | 2048 |"
echo "| 512 | 128 | 2048 |"
echo "| 512 | 256 | 2048 |"
echo "| 512 | 512 | 2048 |"
echo "| 1024 | 64 | 2048 |"
echo "| 1024 | 128 | 2048 |"
echo "| 1024 | 256 | 2048 |"
echo "| 1024 | 512 | 2048 |"
echo "--------------------------------------------------"
exit 1
fi
SZ=$1
EBSZ=$2
PGSZ=$3
if [[ $# == '1' ]]; then
EBSZ=16
PGSZ=512
elif [[ $# == '2' ]]; then
PGSZ=512
fi
if (( $PGSZ == 512 && $EBSZ != 16 )); then
echo "Error: only 16KiB eraseblocks are possible in case of 512 bytes page"
exit 1
fi
if (( $PGSZ == 512 )); then
case $SZ in
16) modprobe nandsim first_id_byte=0x20 second_id_byte=0x33 ;;
32) modprobe nandsim first_id_byte=0x20 second_id_byte=0x35 ;;
64) modprobe nandsim first_id_byte=0x20 second_id_byte=0x36 ;;
128) modprobe nandsim first_id_byte=0x20 second_id_byte=0x78 ;;
256) modprobe nandsim first_id_byte=0x20 second_id_byte=0x71 ;;
*) echo "Flash size ${SZ}MiB is not supported, try 16, 32, 64 or 256"
exit 1 ;;
esac
elif (( $PGSZ == 2048 )); then
case $EBSZ in
64) FOURTH=0x05 ;;
128) FOURTH=0x15 ;;
256) FOURTH=0x25 ;;
512) FOURTH=0x35 ;;
*) echo "Eraseblock ${EBSZ}KiB is not supported"
exit 1
esac
case $SZ in
64) modprobe nandsim first_id_byte=0x20 second_id_byte=0xa2 third_id_byte=0x00 fourth_id_byte=$FOURTH ;;
128) modprobe nandsim first_id_byte=0xec second_id_byte=0xa1 third_id_byte=0x00 fourth_id_byte=$FOURTH ;;
256) modprobe nandsim first_id_byte=0x20 second_id_byte=0xaa third_id_byte=0x00 fourth_id_byte=$FOURTH ;;
512) modprobe nandsim first_id_byte=0x20 second_id_byte=0xac third_id_byte=0x00 fourth_id_byte=$FOURTH ;;
1024) modprobe nandsim first_id_byte=0xec second_id_byte=0xd3 third_id_byte=0x51 fourth_id_byte=$FOURTH ;;
*) echo "Unable to emulate ${SZ}MiB flash with ${EBSZ}KiB eraseblock"
exit 1
esac
else
echo "Error: bad NAND page size ${PGSZ}KiB, it has to be either 512 or 2048"
exit 1
fi
if (( $? != 0 )); then
echo "Error: cannot load nandsim"
exit 1
fi
echo "Loaded NAND simulator (${SZ}MiB, ${EBSZ}KiB eraseblock, $PGSZ bytes NAND page)"
exit 0