beda2bcd6e28e3dc6065ef132fb3af7a74800119
[people/xl0/gpxe.git] / src / include / gpxe / spi.h
1 #ifndef _GPXE_SPI_H
2 #define _GPXE_SPI_H
3
4 /** @file
5  *
6  * SPI interface
7  *
8  */
9
10 #include <gpxe/nvs.h>
11
12 /**
13  * @defgroup spicmds SPI commands
14  * @{
15  */
16
17 /** Write status register */
18 #define SPI_WRSR 0x01
19
20 /** Write data to memory array */
21 #define SPI_WRITE 0x02
22
23 /** Read data from memory array */
24 #define SPI_READ 0x03
25
26 /** Reset write enable latch */
27 #define SPI_WRDI 0x04
28
29 /** Read status register */
30 #define SPI_RDSR 0x05
31
32 /** Set write enable latch */
33 #define SPI_WREN 0x06
34
35 /**
36  * @defgroup atmelcmds Atmel-specific SPI commands
37  * @{
38  */
39
40 /** Erase one sector in memory array (Not supported on all devices) */
41 #define ATMEL_SECTOR_ERASE 0x52
42
43 /** Erase all sections in memory array (Not supported on all devices) */
44 #define ATMEL_CHIP_ERASE 0x62
45
46 /** Read manufacturer and product ID (Not supported on all devices) */
47 #define ATMEL_RDID 0x15
48
49 /** @} */
50
51 /** @} */
52
53 /**
54  * @defgroup spistatus SPI status register bits (not present on all devices)
55  * @{
56  */
57
58 /** Write-protect pin enabled */
59 #define SPI_STATUS_WPEN 0x80
60
61 /** Block protection bit 2 */
62 #define SPI_STATUS_BP2 0x10
63
64 /** Block protection bit 1 */
65 #define SPI_STATUS_BP1 0x08
66
67 /** Block protection bit 0 */
68 #define SPI_STATUS_BP0 0x04
69
70 /** State of the write enable latch */
71 #define SPI_STATUS_WEN 0x02
72
73 /** Device busy flag */
74 #define SPI_STATUS_NRDY 0x01
75
76 /** @} */
77
78 /**
79  * An SPI device
80  *
81  * This data structure represents a physical SPI device attached to an
82  * SPI bus.
83  */
84 struct spi_device {
85         /** NVS device */
86         struct nvs_device nvs;
87         /** SPI bus to which device is attached */
88         struct spi_bus *bus;
89         /** Slave number */
90         unsigned int slave;
91         /** Command length, in bits */
92         unsigned int command_len;
93         /** Address length, in bits */
94         unsigned int address_len;
95         /** Address is munged
96          *
97          * Some devices with 9-bit addresses (e.g. AT25040A EEPROM)
98          * use bit 3 of the command byte as address bit A8, rather
99          * than having a two-byte address.  If this flag is set, then
100          * commands should be munged in this way.
101          */
102         unsigned int munge_address : 1;
103 };
104
105 static inline __attribute__ (( always_inline )) struct spi_device *
106 nvs_to_spi ( struct nvs_device *nvs ) {
107         return container_of ( nvs, struct spi_device, nvs );
108 }
109
110 /**
111  * An SPI bus
112  *
113  * This data structure represents an SPI bus controller capable of
114  * issuing commands to attached SPI devices.
115  */
116 struct spi_bus {
117         /** SPI interface mode
118          *
119          * This is the bitwise OR of zero or more of @c SPI_MODE_CPHA
120          * and @c SPI_MODE_CPOL.  It is also the number conventionally
121          * used to describe the SPI interface mode.  For example, SPI
122          * mode 1 is the mode in which CPOL=0 and CPHA=1, which
123          * therefore corresponds to a mode value of (0|SPI_MODE_CPHA)
124          * which, happily, equals 1.
125          */
126         unsigned int mode;
127         /**
128          * Read/write data via SPI bus
129          *
130          * @v bus               SPI bus
131          * @v device            SPI device
132          * @v command           Command
133          * @v address           Address to read/write (<0 for no address)
134          * @v data_out          TX data buffer (or NULL)
135          * @v data_in           RX data buffer (or NULL)
136          * @v len               Length of data buffer(s)
137          *
138          * This issues the specified command and optional address to
139          * the SPI device, then reads and/or writes data to/from the
140          * data buffers.
141          */
142         int ( * rw ) ( struct spi_bus *bus, struct spi_device *device,
143                        unsigned int command, int address,
144                        const void *data_out, void *data_in, size_t len );
145 };
146
147 /** Clock phase (CPHA) mode bit
148  *
149  * Phase 0 is sample on rising edge, shift data on falling edge.
150  *
151  * Phase 1 is shift data on rising edge, sample data on falling edge.
152  */
153 #define SPI_MODE_CPHA 0x01
154
155 /** Clock polarity (CPOL) mode bit
156  *
157  * This bit reflects the idle state of the clock line (SCLK).
158  */
159 #define SPI_MODE_CPOL 0x02
160
161 /** Slave select polarity mode bit
162  *
163  * This bit reflects that active state of the slave select lines.  It
164  * is not part of the normal SPI mode number (which covers only @c
165  * SPI_MODE_CPOL and @c SPI_MODE_CPHA), but is included here for
166  * convenience.
167  */
168 #define SPI_MODE_SSPOL 0x10
169
170 /** Microwire-compatible mode
171  *
172  * This is SPI mode 1 (i.e. CPOL=0, CPHA=1), and is compatible with
173  * the original Microwire protocol.
174  */
175 #define SPI_MODE_MICROWIRE 1
176
177 /** Microwire/Plus-compatible mode
178  *
179  * This is SPI mode 0 (i.e. CPOL=0, CPHA=0), and is compatible with
180  * the Microwire/Plus protocol
181  */
182 #define SPI_MODE_MICROWIRE_PLUS 0
183
184 /** Threewire-compatible mode
185  *
186  * This mode is compatible with Atmel's series of "three-wire"
187  * interfaces.
188  */
189 #define SPI_MODE_THREEWIRE ( SPI_MODE_MICROWIRE_PLUS | SPI_MODE_SSPOL )
190
191 extern int spi_read ( struct nvs_device *nvs, unsigned int address,
192                       void *data, size_t len );
193 extern int spi_write ( struct nvs_device *nvs, unsigned int address,
194                        const void *data, size_t len );
195
196 #endif /* _GPXE_SPI_H */