MTD NAND Driver Programming Interface
|  | Next

# MTD NAND Driver Programming Interface

### Thomas Gleixner

`<tglx@linutronix.de>`

Copyright © 2004 Thomas Gleixner

This documentation is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License version 2 as published by the Free Software Foundation.

This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.

You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA

For more details see the file COPYING in the source distribution of Linux.

Table of Contents

1. Introduction
2. Known Bugs And Assumptions
3. Documentation hints
  Function identifiers [XXX]
  Struct member identifiers [XXX]
4. Basic board driver
  Basic defines
  Partition defines
  Hardware control function
  Device ready function
  Init function
  Exit function
5. Advanced board driver functions
  Multiple chip control
  Hardware ECC support
    Functions and constants
    Hardware ECC with syndrome calculation
  Bad block table support
    Flash based tables
    User defined tables
  Spare area (auto)placement
    Placement defined by fs driver
    Automatic placement
    User space placement selection
  Spare area autoplacement default schemes
    256 byte pagesize
    512 byte pagesize
    2048 byte pagesize
6. Filesystem support
7. Tools
8. Constants
  Chip option constants
    Constants for chip id table
    Constants for runtime options
  ECC selection constants
  Hardware control related constants
  Bad block table related constants
9. Structures
  struct nand_hw_control — Control structure for hardware controller (e.g ECC generator) shared among independent devices
  struct nand_ecc_ctrl — Control structure for ecc
  struct nand_buffers — buffer structure for read/write
  struct nand_chip — NAND Private Flash Chip Data
  struct nand_flash_dev — NAND Flash Device ID Structure
  struct nand_manufacturers — NAND Flash Manufacturer ID Structure
  struct nand_bbt_descr — bad block table descriptor
  struct platform_nand_chip — chip level device structure
  struct platform_nand_ctrl — controller level device structure
  struct platform_nand_data — container structure for platform-specific data
10. Public Functions Provided
  nand_scan_ident — [NAND Interface] Scan for the NAND device
  nand_scan_tail — [NAND Interface] Scan for the NAND device
  nand_scan — [NAND Interface] Scan for the NAND device
  nand_release — [NAND Interface] Free resources held by the NAND device
  nand_scan_bbt — [NAND Interface] scan, find, read and maybe create bad block table(s)
  nand_default_bbt — [NAND Interface] Select a default bad block table for the device
  nand_calculate_ecc — [NAND Interface] Calculate 3-byte ECC for 256-byte block
  nand_correct_data — [NAND Interface] Detect and correct bit error(s)
11. Internal Functions Provided
  nand_release_device — [GENERIC] release chip
  nand_read_byte — [DEFAULT] read one byte from the chip
  nand_read_byte16 — [DEFAULT] read one byte endianess aware from the chip
  nand_read_word — [DEFAULT] read one word from the chip
  nand_select_chip — [DEFAULT] control CE line
  nand_write_buf — [DEFAULT] write buffer to chip
  nand_read_buf — [DEFAULT] read chip data into buffer
  nand_verify_buf — [DEFAULT] Verify chip data against buffer
  nand_write_buf16 — [DEFAULT] write buffer to chip
  nand_read_buf16 — [DEFAULT] read chip data into buffer
  nand_verify_buf16 — [DEFAULT] Verify chip data against buffer
  nand_block_bad — [DEFAULT] Read bad block marker from the chip
  nand_default_block_markbad — [DEFAULT] mark a block bad
  nand_check_wp — [GENERIC] check if the chip is write protected
  nand_block_checkbad — [GENERIC] Check if a block is marked bad
  nand_command — [DEFAULT] Send command to NAND device
  nand_command_lp — [DEFAULT] Send command to NAND large page device
  nand_get_device — [GENERIC] Get chip for selected access
  nand_wait — [DEFAULT] wait until the command is done
  nand_read_page_raw — [Intern] read raw page data without ecc
  nand_read_page_swecc — [REPLACABLE] software ecc based page read function
  nand_read_page_hwecc — [REPLACABLE] hardware ecc based page read function
  nand_read_page_syndrome — [REPLACABLE] hardware ecc syndrom based page read
  nand_transfer_oob — [Internal] Transfer oob to client buffer
  nand_do_read_ops — [Internal] Read data with ECC
  nand_read — [MTD Interface] MTD compability function for nand_do_read_ecc
  nand_read_oob_std — [REPLACABLE] the most common OOB data read function
  nand_read_oob_syndrome — [REPLACABLE] OOB data read function for HW ECC
  nand_write_oob_std — [REPLACABLE] the most common OOB data write function
  nand_write_oob_syndrome — [REPLACABLE] OOB data write function for HW ECC
  nand_do_read_oob — [Intern] NAND read out-of-band
  nand_read_oob — [MTD Interface] NAND read data and/or out-of-band
  nand_write_page_raw — [Intern] raw page write function
  nand_write_page_swecc — [REPLACABLE] software ecc based page write function
  nand_write_page_hwecc — [REPLACABLE] hardware ecc based page write function
  nand_write_page_syndrome — [REPLACABLE] hardware ecc syndrom based page write
  nand_write_page — [REPLACEABLE] write one page
  nand_fill_oob — [Internal] Transfer client buffer to oob
  nand_do_write_ops — [Internal] NAND write with ECC
  nand_write — [MTD Interface] NAND write with ECC
  nand_do_write_oob — [MTD Interface] NAND write out-of-band
  nand_write_oob — [MTD Interface] NAND write data and/or out-of-band
  single_erase_cmd — [GENERIC] NAND standard block erase command function
  multi_erase_cmd — [GENERIC] AND specific block erase command function
  nand_erase — [MTD Interface] erase block(s)
  nand_erase_nand — [Internal] erase block(s)
  nand_sync — [MTD Interface] sync
  nand_block_isbad — [MTD Interface] Check if block at offset is bad
  nand_block_markbad — [MTD Interface] Mark block at the given offset as bad
  nand_suspend — [MTD Interface] Suspend the NAND flash
  nand_resume — [MTD Interface] Resume the NAND flash
  check_pattern — [GENERIC] check if a pattern is in the buffer
  check_short_pattern — [GENERIC] check if a pattern is in the buffer
  read_bbt — [GENERIC] Read the bad block table starting from page
  read_abs_bbt — [GENERIC] Read the bad block table starting at a given page
  read_abs_bbts — [GENERIC] Read the bad block table(s) for all chips starting at a given page
  create_bbt — [GENERIC] Create a bad block table by scanning the device
  search_bbt — [GENERIC] scan the device for a specific bad block table
  search_read_bbts — [GENERIC] scan the device for bad block table(s)
  write_bbt — [GENERIC] (Re)write the bad block table
  nand_memory_bbt — [GENERIC] create a memory based bad block table
  check_create — [GENERIC] create and write bbt(s) if necessary
  mark_bbt_region — [GENERIC] mark the bad block table regions
  nand_update_bbt — [NAND Interface] update bad block table(s)
  nand_isbad_bbt — [NAND Interface] Check if a block is bad
12. Credits

|  | Next
|  | Chapter 1. Introduction