How to Find NOR Parameters
Table of Contents
Using the Datasheet
If you are writing a driver or do not have a working Linux kernel for the board, then you should use the datasheet to find the parameters for your NOR flash. This section describes where to find the relevant information for building JFFS2 or UBI images using the datasheet for your device.
Flash Vendor
The flash vendor is typically on the chip, although it can be difficult to discern at times.
- Atmel - Stylized "Atmel" Logo. Part numbers typically start with "AT".
- Spansion - Stylized "Spansion" Logo. Part numbers typically begin with "S".
- Intel - Large lowercase "i". Intel NOR flash parts are now owned by Numonyx.
- Numonyx - Stylized "N".
Flash Model
Like the vendor, it is easiest to look at the board's BOM. It is also typically on the chip, although it may include additional numbers and letters that indicate a particular subset of the model, making it somewhat difficult to find the datasheet.
Size or Density
The datasheet for the given part is the best place to find the size of the NOR flash chip. It is typically called the chip's density, and will be expressed in either MibiBytes (1*2^20 bytes), Words (typically 2 Bytes, or 16 bits) or even as MBits (MiB * 8). We are unaware of any manufacturer that expresses them in powers of 10 (like hard drive manufacturers).
Some datasheets may correspond to multiple densities of the same family of devices. In those cases, there is typically a section of the datasheet that will explain how to read the model number to determine the density of the chip.
The density, as well as other size parameters, are typically expressed in terms of the size of the data and the out-of-band (OOB) region that accompany each page. The OOB size can be ignored when passing parameters to JFFS2 or UBI.
Physical Erase Block Size
The physical erase block size (or PEB) is the size of each erasable block of NOR, typically called a sector. This value can be found in the datasheet under the feature summary section. It will be expressed in bytes or words.
Typically, NOR flash may have multiple sizes of erase blocks. Typically, there are a few small sectors at the beginning or end of the flash. These are referred to as "Bottom Boot Block" and "Top Boot Block" NOR flashes, respectively. When determining erase block size, always use the largest sector size.
Logical Erase Block Size
The logical erase block size (LEB) is an UBIFS-only term, and is not entirely straightforward to figure out. UBIFS prepends a header to every block of a certain size, and aligns it with the page. It is related to physical eraseblock size, minimum input/output unit size, and sub-page size. The easiest way to find it is to attach the device to UBI and see the output, as described below.
Some typical values:
- NOR flash with 1 byte min. I/O unit size: LEB size is PEB size minus 128
See: http://www.linux-mtd.infradead.org/faq/ubifs.html#L_find_lebsz
Page Size or Minimum I/O Size
Each device is divided into some number of pages. The page is the minimum block of data that can be read or programmed at a time. This corresponds to the minimum I/O size of the UBI subsystem.
For NOR flash, this value is almost always 1.
Bus Width
Bus width describes the number of data lines used to connect the flash chip to the memory controller, which is usually part of the SOC.
The chip's bus width can be found in the datasheet. Like density, a single datasheet may be used for chips of varying bus-widths, so you may need to find the section that describes how to decode the model number in order to determine the value. It is typically 16 bits.
You can also tell the bus width by looking at the schematic, although this is prone to error.
Using UBI
When a device is attached to UBI, the kernel will print a summary of the parameters of the chip. It can be found using either dmesg or ubiattach.
NOTE: You should use ubiformat to format the partition before doing this.
# ubiattach /dev/ubi_ctrl -m0 UBI: attaching mtd0 to ubi0 UBI: physical eraseblock size: 65536 bytes (64 KiB) UBI: logical eraseblock size: 65408 bytes UBI: smallest flash I/O unit: 1 UBI: VID header offset: 64 (aligned 64) UBI: data offset: 128 UBI: attached mtd0 to ubi0 UBI: MTD device name: "NOR partition" UBI: MTD device size: 8 MiB UBI: number of good PEBs: 128 UBI: number of bad PEBs: 0 UBI: max. allowed volumes: 128 UBI: wear-leveling threshold: 4096 UBI: number of internal volumes: 1 UBI: number of user volumes: 0 UBI: available PEBs: 124 UBI: total number of reserved PEBs: 4 UBI: number of PEBs reserved for bad PEB handling: 0 UBI: max/mean erase counter: 0/0 UBI: background thread "ubi_bgt0d" started, PID 925 UBI device number 0, total 128 LEBs (8372224 bytes, 8.0 MiB), available 124 LEBs (8110592 bytes, 7.7 MiB), LEB size 65408 bytes (63.9 KiB)
The -m flag refers to the mtd partition, so the above example is the geometry of /dev/mtd0.
Using the Kernel
The kernel messages will provide some information about the NOR device. You can execute the dmesg command to see the results of the NOR driver's initialization:
physmap platform flash device: 00800000 at 10000000 physmap-flash.0: Found 1 x16 devices at 0x0 in 16-bit bank Amd/Fujitsu Extended Query Table at 0x0041 number of CFI chips: 1 cfi_cmdset_0002: Disabling erase-suspend-program due to code brokenness. RedBoot partition parsing not available Using physmap partition information Creating 1 MTD partitions on "physmap-flash.0": 0x00000000-0x00800000 : "NOR partition"
Based on this, you can determine the partition scheme of the device, and bus width.
The proc subsystem in the Linux kernel will give you some information about the NOR flash, but typically not enough to get everything up and running.
The file /proc/mtd contains the basic information about all MTDs on your board:
# cat /proc/mtd dev: size erasesize name mtd0: 00800000 00010000 "NOR partition" mtd1: 10000000 00020000 "NAND partition" mtd2: 00840000 00000420 "spi0.0-AT45DB642x"
Size corresponds to the density (in bytes), and erasesize corresponds to the Physical Erase Block size (in Bytes).
Common NOR Parameters
Board | Flash Vendor | Flash Model | Size | Physical Erase Block Size | Logical Erase Block Size | Page Size (Min I/O Size) | Bus width (Bits) | Datasheet | Notes |
---|---|---|---|---|---|---|---|---|---|
AMCC 440EPx | Spansion | S29GL512N | 64 MiB | 128 KiB | 130944 bytes | 1 Byte | 16 | S29GL256N | - |
at91cap9a-dk | Atmel | AT49BV642D | 8 MiB | 64 KiB | 65408 bytes | 1 Byte | 16 | AT49BV642D | - |
iq8134x MC/SC | Numonyx/Intel | 28F256P30T | 32 MiB | 128 KiB | 130944 bytes | 1 Byte | 16 | P30 Flash Memory | - |
Numonyx/Intel | 28F128J3D-75 | 16 MiB | 128 KiB | 130944 bytes | 1 Byte | 8/16 | J3 v.D Embedded Flash Memory | - | |
kixrp435 | Numonyx/Intel | PC28F128P30T85 | 16 MiB | 128 KiB | 130944 bytes | 1 Byte | 16 | P30 Flash Memory | - |
mpc8313e-rdb | Spansion | S29GL064A 90TFIR3 | 8 MiB | 64 KiB | 65408 bytes | 1 Byte | 16 | S29GL064A | - |
- | Spansion | S29GL128P | 16 MiB | 128 KiB | 130944 bytes | 1 Byte | 16 | S29GL128A | - |
- | Spansion | S29GL256P | 32 MiB | 128 KiB | 130944 bytes | 1 Byte | 16 | S29GL256A | - |