summaryrefslogtreecommitdiff
path: root/sys/dev/spi/spiflash.h
blob: ade373a3dd0c514b4b59a8a32e1c9d0a0e4601bf (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
/* $NetBSD: spiflash.h,v 1.4 2009/05/12 14:45:08 cegger Exp $ */

/*-
 * Copyright (c) 2006 Urbana-Champaign Independent Media Center.
 * Copyright (c) 2006 Garrett D'Amore.
 * All rights reserved.
 *
 * Portions of this code were written by Garrett D'Amore for the
 * Champaign-Urbana Community Wireless Network Project.
 *
 * Redistribution and use in source and binary forms, with or
 * without modification, are permitted provided that the following
 * conditions are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above
 *    copyright notice, this list of conditions and the following
 *    disclaimer in the documentation and/or other materials provided
 *    with the distribution.
 * 3. All advertising materials mentioning features or use of this
 *    software must display the following acknowledgements:
 *      This product includes software developed by the Urbana-Champaign
 *      Independent Media Center.
 *	This product includes software developed by Garrett D'Amore.
 * 4. Urbana-Champaign Independent Media Center's name and Garrett
 *    D'Amore's name may not be used to endorse or promote products
 *    derived from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE URBANA-CHAMPAIGN INDEPENDENT
 * MEDIA CENTER AND GARRETT D'AMORE ``AS IS'' AND ANY EXPRESS OR
 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE URBANA-CHAMPAIGN INDEPENDENT
 * MEDIA CENTER OR GARRETT D'AMORE BE LIABLE FOR ANY DIRECT, INDIRECT,
 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

#ifndef	_DEV_SPI_SPIFLASH_H_
#define	_DEV_SPI_SPIFLASH_H_

#define	SPIFLASH_CMD_RDSR		0x05	/* read status register */
#define	SPIFLASH_CMD_WRSR		0x01	/* write status register */
#define	SPIFLASH_CMD_WREN		0x06	/* enable WRSR */
#define	SPIFLASH_CMD_WRDI		0x04	/* disable WRSR */

/*
 * Different chips offer different ways to read a device ID, although
 * newer parts should all offer the standard JEDEC variant.
 * Additionally, many parts have a faster read, though how to make use
 * of this sometimes requires special hacks.  E.g. some parts use an
 * extra data pin, and some crank the clock rate up.
 */
#define	SPIFLASH_CMD_READ		0x03	/* read data (normal) */
#define	SPIFLASH_CMD_RDID		0xab	/* read id */
#define	SPIFLASH_CMD_RDID2		0x90	/* read id (alternate) */
#define	SPIFLASH_CMD_RDJI		0x9f	/* read JEDEC id */
#define	SPIFLASH_CMD_READFAST		0x0b	/* fast read */

/*
 * Different chips offer different variations on the sector erase.
 * E.g. SST parts offer 4k, 32k, and 64k erase sizes on the same part,
 * with just different cmds.  However, at least SST, AMD, and Winbond
 * all offer at least the main (0xd8) variant.
 */
#define	SPIFLASH_CMD_ERASE		0xd8	/* sector erase */
#define	SPIFLASH_CMD_ERASE2		0x52	/* sector erase (alternate) */
#define	SPIFLASH_CMD_ERASE3		0x20	/* sector erase (alternate) */
#define	SPIFLASH_CMD_ERASE4		0x81	/* page erase */
#define	SPIFLASH_CMD_CHIPERASE		0xc7	/* chip erase */

/*
 * Some parts can stream bytes with the program command, whereas others require
 * a separate command sequence for each byte.
 */
#define	SPIFLASH_CMD_PROGRAM		0x02	/* page or byte program */
#define	SPIFLASH_CMD_PROGRAM_AA		0xad	/* program (autoincrement) */

/*
 * Some additional commands.  Again, mostly device specific.
 */
#define	SPIFLASH_CMD_EBSY		0x70	/* output busy signal (SST) */
#define	SPIFLASH_CMD_DBSY		0x80	/* disable busy signal (SST) */

/*
 * Status register bits.  Not all devices implement all bits.  In
 * addition, the meanings of the BP bits seem to vary from device to
 * device.
 */
#define	SPIFLASH_SR_BUSY		0x01	/* program in progress */
#define	SPIFLASH_SR_WEL			0x02	/* write enable latch */
#define	SPIFLASH_SR_BP0			0x04	/* block protect bits */
#define	SPIFLASH_SR_BP1			0x08
#define	SPIFLASH_SR_BP2			0x10
#define	SPIFLASH_SR_BP3			0x20
#define	SPIFLASH_SR_AAI			0x40	/* auto-increment mode */
#define	SPIFLASH_SR_SRP			0x80	/* SR write protected */

/*
 * This needs to change to accommodate boot-sectored devices.
 */

typedef struct spiflash_softc *spiflash_handle_t;

struct spiflash_hw_if {
	/*
	 * Driver MUST provide these.
	 */
	const char *(*sf_getname)(void *);
	struct spi_handle *(*sf_gethandle)(void *);
	int	(*sf_getflags)(void *);
	int	(*sf_getsize)(void *, int);

	/*
	 * SPI framework will provide these if the driver does not.
	 */
	int	(*sf_erase)(spiflash_handle_t, size_t, size_t);
	int	(*sf_write)(spiflash_handle_t, size_t, size_t,
	    const uint8_t *);
	int	(*sf_read)(spiflash_handle_t, size_t, size_t, uint8_t *);
	/*
	 * Not implemented yet.
	 */
	int	(*sf_getstatus)(spiflash_handle_t, int, int);
	int	(*sf_setstatus)(spiflash_handle_t, int, int, int);
};

#define	SPIFLASH_SIZE_DEVICE		0
#define	SPIFLASH_SIZE_ERASE		1
#define	SPIFLASH_SIZE_WRITE		2	/* return -1 for unlimited */
#define	SPIFLASH_SIZE_READ		3	/* return -1 for unlimited */
#define	SPIFLASH_SIZE_COUNT		4

#define	SPIFLASH_FLAG_FAST_READ		0x0004	/* use fast read sequence */

spiflash_handle_t spiflash_attach_mi(const struct spiflash_hw_if *, void *,
    device_t);
void spiflash_set_private(spiflash_handle_t, void *);
void *spiflash_get_private(spiflash_handle_t);
int spiflash_read_status(spiflash_handle_t, uint8_t *);
int spiflash_write_disable(spiflash_handle_t);
int spiflash_write_enable(spiflash_handle_t);
int spiflash_cmd(spiflash_handle_t, uint8_t, size_t, uint32_t, size_t,
    const uint8_t *, uint8_t *);
int spiflash_wait(spiflash_handle_t, int);


#endif	/* _DEV_SPI_SPIFLASH_H_ */