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 controller interface description 29235537Sgber# 30235537Sgber 31235537Sgber#include <sys/bus.h> 32235537Sgber#include <dev/nand/nand.h> 33235537Sgber 34235537SgberINTERFACE nfc; 35235537Sgber 36235537SgberCODE { 37235537Sgber static int nfc_default_method(device_t dev) 38235537Sgber { 39235537Sgber return (0); 40235537Sgber } 41235537Sgber 42235537Sgber static int nfc_softecc_get(device_t dev, void *buf, int pagesize, 43235537Sgber void *ecc, int *needwrite) 44235537Sgber { 45235537Sgber *needwrite = 1; 46235537Sgber return (nand_softecc_get(dev, buf, pagesize, ecc)); 47235537Sgber } 48235537Sgber 49235537Sgber static int nfc_softecc_correct(device_t dev, void *buf, int pagesize, 50235537Sgber void *readecc, void *calcecc) 51235537Sgber { 52235537Sgber return (nand_softecc_correct(dev, buf, pagesize, readecc, 53235537Sgber calcecc)); 54235537Sgber } 55235537Sgber}; 56235537Sgber 57235537Sgber# Send command to a NAND chip 58235537Sgber# 59235537Sgber# Return values: 60235537Sgber# 0: Success 61235537Sgber# 62235537SgberMETHOD int send_command { 63235537Sgber device_t dev; 64235537Sgber uint8_t command; 65235537Sgber}; 66235537Sgber 67235537Sgber# Send address to a NAND chip 68235537Sgber# 69235537Sgber# Return values: 70235537Sgber# 0: Success 71235537Sgber# 72235537SgberMETHOD int send_address { 73235537Sgber device_t dev; 74235537Sgber uint8_t address; 75235537Sgber}; 76235537Sgber 77235537Sgber# Read byte 78235537Sgber# 79235537Sgber# Return values: 80235537Sgber# byte read 81235537Sgber# 82235537SgberMETHOD uint8_t read_byte { 83235537Sgber device_t dev; 84235537Sgber}; 85235537Sgber 86235537Sgber# Write byte 87235537Sgber# 88235537SgberMETHOD void write_byte { 89235537Sgber device_t dev; 90235537Sgber uint8_t byte; 91235537Sgber}; 92235537Sgber 93235537Sgber# Read word 94235537Sgber# 95235537Sgber# Return values: 96235537Sgber# word read 97235537Sgber# 98235537SgberMETHOD uint16_t read_word { 99235537Sgber device_t dev; 100235537Sgber}; 101235537Sgber 102235537Sgber# Write word 103235537Sgber# 104235537SgberMETHOD void write_word { 105235537Sgber device_t dev; 106235537Sgber uint16_t word; 107235537Sgber}; 108235537Sgber 109235537Sgber# Read buf 110235537Sgber# 111235537SgberMETHOD void read_buf { 112235537Sgber device_t dev; 113235537Sgber void *buf; 114235537Sgber uint32_t len; 115235537Sgber}; 116235537Sgber 117235537Sgber# Write buf 118235537Sgber# 119235537SgberMETHOD void write_buf { 120235537Sgber device_t dev; 121235537Sgber void *buf; 122235537Sgber uint32_t len; 123235537Sgber}; 124235537Sgber 125235537Sgber# Select CS 126235537Sgber# 127235537SgberMETHOD int select_cs { 128235537Sgber device_t dev; 129235537Sgber uint8_t cs; 130235537Sgber}; 131235537Sgber 132235537Sgber# Read ready/busy signal 133235537Sgber# 134235537SgberMETHOD int read_rnb { 135235537Sgber device_t dev; 136235537Sgber}; 137235537Sgber 138235537Sgber# Start command 139235537Sgber# 140235537Sgber# Return values: 141235537Sgber# 0: Success 142235537Sgber# 143235537SgberMETHOD int start_command { 144235537Sgber device_t dev; 145235537Sgber} DEFAULT nfc_default_method; 146235537Sgber 147235537Sgber# Generate ECC or get it from H/W 148235537Sgber# 149235537SgberMETHOD int get_ecc { 150235537Sgber device_t dev; 151235537Sgber void *buf; 152235537Sgber int pagesize; 153235537Sgber void *ecc; 154235537Sgber int *needwrite; 155235537Sgber} DEFAULT nfc_softecc_get; 156235537Sgber 157235537Sgber# Correct ECC 158235537Sgber# 159235537SgberMETHOD int correct_ecc { 160235537Sgber device_t dev; 161235537Sgber void *buf; 162235537Sgber int pagesize; 163235537Sgber void *readecc; 164235537Sgber void *calcecc; 165235537Sgber} DEFAULT nfc_softecc_correct; 166