| #ifndef _GPXE_SPI_BIT_H |
| #define _GPXE_SPI_BIT_H |
| |
| /** @file |
| * |
| * SPI bit-bashing interface |
| * |
| */ |
| |
| FILE_LICENCE ( GPL2_OR_LATER ); |
| |
| #include <gpxe/spi.h> |
| #include <gpxe/bitbash.h> |
| |
| /** A bit-bashing SPI bus */ |
| struct spi_bit_basher { |
| /** SPI bus */ |
| struct spi_bus bus; |
| /** Bit-bashing interface */ |
| struct bit_basher basher; |
| /** Endianness of data |
| * |
| * SPI commands and addresses are always big-endian (i.e. MSB |
| * transmitted first on the wire), but some cards |
| * (e.g. natsemi) choose to regard the data stored in the |
| * EEPROM as little-endian (i.e. LSB transmitted first on the |
| * wire). |
| */ |
| int endianness; |
| }; |
| |
| /** Bit indices used for SPI bit-bashing interface */ |
| enum { |
| /** Serial clock */ |
| SPI_BIT_SCLK = 0, |
| /** Master Out Slave In */ |
| SPI_BIT_MOSI, |
| /** Master In Slave Out */ |
| SPI_BIT_MISO, |
| /** Slave 0 select */ |
| SPI_BIT_SS0, |
| }; |
| |
| /** |
| * Determine bit index for a particular slave |
| * |
| * @v slave Slave number |
| * @ret index Bit index (i.e. SPI_BIT_SSN, where N=slave) |
| */ |
| #define SPI_BIT_SS( slave ) ( SPI_BIT_SS0 + (slave) ) |
| |
| /** Delay between SCLK transitions */ |
| #define SPI_BIT_UDELAY 1 |
| |
| /** SPI bit basher treats data as big-endian */ |
| #define SPI_BIT_BIG_ENDIAN 0 |
| |
| /** SPI bit basher treats data as little-endian */ |
| #define SPI_BIT_LITTLE_ENDIAN 1 |
| |
| extern void init_spi_bit_basher ( struct spi_bit_basher *spibit ); |
| |
| #endif /* _GPXE_SPI_BIT_H */ |