1235537Sgber#- 2235537Sgber# Copyright (C) 2009-2012 Semihalf 3235537Sgber# All rights reserved. 4235537Sgber# 5235537Sgber# Redistribution and use in source and binary forms, with or without 6235537Sgber# modification, are permitted provided that the following conditions 7235537Sgber# are met: 8235537Sgber# 1. Redistributions of source code must retain the above copyright 9235537Sgber# notice, this list of conditions and the following disclaimer. 10235537Sgber# 2. Redistributions in binary form must reproduce the above copyright 11235537Sgber# notice, this list of conditions and the following disclaimer in the 12235537Sgber# documentation and/or other materials provided with the distribution. 13235537Sgber# 14235537Sgber# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 15235537Sgber# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16235537Sgber# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17235537Sgber# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 18235537Sgber# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19235537Sgber# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20235537Sgber# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21235537Sgber# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22235537Sgber# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23235537Sgber# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24235537Sgber# SUCH DAMAGE. 25235537Sgber# 26235537Sgber# $FreeBSD$ 27235537Sgber 28235537Sgber# NAND chip interface description 29235537Sgber# 30235537Sgber 31235537Sgber#include <sys/bus.h> 32235537Sgber#include <dev/nand/nand.h> 33235537Sgber 34235537SgberINTERFACE nand; 35235537Sgber 36235537SgberCODE { 37235537Sgber static int nand_method_not_supported(device_t dev) 38235537Sgber { 39235537Sgber return (ENOENT); 40235537Sgber } 41235537Sgber}; 42235537Sgber 43235537Sgber# Read NAND page 44235537Sgber# 45235537Sgber# Return values: 46235537Sgber# 0: Success 47235537Sgber# 48235537SgberMETHOD int read_page { 49235537Sgber device_t dev; 50235537Sgber uint32_t page; 51235537Sgber void* buf; 52235537Sgber uint32_t len; 53235537Sgber uint32_t offset; 54235537Sgber}; 55235537Sgber 56235537Sgber# Program NAND page 57235537Sgber# 58235537Sgber# Return values: 59235537Sgber# 0: Success 60235537Sgber# 61235537SgberMETHOD int program_page { 62235537Sgber device_t dev; 63235537Sgber uint32_t page; 64235537Sgber void* buf; 65235537Sgber uint32_t len; 66235537Sgber uint32_t offset; 67235537Sgber}; 68235537Sgber 69235537Sgber# Program NAND page interleaved 70235537Sgber# 71235537Sgber# Return values: 72235537Sgber# 0: Success 73235537Sgber# 74235537SgberMETHOD int program_page_intlv { 75235537Sgber device_t dev; 76235537Sgber uint32_t page; 77235537Sgber void* buf; 78235537Sgber uint32_t len; 79235537Sgber uint32_t offset; 80235537Sgber} DEFAULT nand_method_not_supported; 81235537Sgber 82235537Sgber# Read NAND oob 83235537Sgber# 84235537Sgber# Return values: 85235537Sgber# 0: Success 86235537Sgber# 87235537SgberMETHOD int read_oob { 88235537Sgber device_t dev; 89235537Sgber uint32_t page; 90235537Sgber void* buf; 91235537Sgber uint32_t len; 92235537Sgber uint32_t offset; 93235537Sgber}; 94235537Sgber 95235537Sgber# Program NAND oob 96235537Sgber# 97235537Sgber# Return values: 98235537Sgber# 0: Success 99235537Sgber# 100235537SgberMETHOD int program_oob { 101235537Sgber device_t dev; 102235537Sgber uint32_t page; 103235537Sgber void* buf; 104235537Sgber uint32_t len; 105235537Sgber uint32_t offset; 106235537Sgber}; 107235537Sgber 108235537Sgber# Erase NAND block 109235537Sgber# 110235537Sgber# Return values: 111235537Sgber# 0: Success 112235537Sgber# 113235537SgberMETHOD int erase_block { 114235537Sgber device_t dev; 115235537Sgber uint32_t block; 116235537Sgber}; 117235537Sgber 118235537Sgber# Erase NAND block interleaved 119235537Sgber# 120235537Sgber# Return values: 121235537Sgber# 0: Success 122235537Sgber# 123235537SgberMETHOD int erase_block_intlv { 124235537Sgber device_t dev; 125235537Sgber uint32_t block; 126235537Sgber} DEFAULT nand_method_not_supported; 127235537Sgber 128235537Sgber# NAND get status 129235537Sgber# 130235537Sgber# Return values: 131235537Sgber# 0: Success 132235537Sgber# 133235537SgberMETHOD int get_status { 134235537Sgber device_t dev; 135235537Sgber uint8_t *status; 136235537Sgber}; 137235537Sgber 138235537Sgber# NAND check if block is bad 139235537Sgber# 140235537Sgber# Return values: 141235537Sgber# 0: Success 142235537Sgber# 143235537SgberMETHOD int is_blk_bad { 144235537Sgber device_t dev; 145235537Sgber uint32_t block_number; 146235537Sgber uint8_t *bad; 147235537Sgber}; 148235537Sgber 149235537Sgber# NAND get ECC 150235537Sgber# 151235537Sgber# 152235537SgberMETHOD int get_ecc { 153235537Sgber device_t dev; 154235537Sgber void *buf; 155235537Sgber void *ecc; 156235537Sgber int *needwrite; 157235537Sgber}; 158235537Sgber 159235537Sgber# NAND correct ECC 160235537Sgber# 161235537Sgber# 162235537SgberMETHOD int correct_ecc { 163235537Sgber device_t dev; 164235537Sgber void *buf; 165235537Sgber void *readecc; 166235537Sgber void *calcecc; 167235537Sgber}; 168235537Sgber 169