123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127 |
- #!/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)"
|