iPXE
Data Structures | Defines | Functions
spi.h File Reference

SPI interface. More...

#include <ipxe/nvs.h>

Go to the source code of this file.

Data Structures

struct  spi_device
 An SPI device. More...
struct  spi_bus
 An SPI bus. More...

Defines

#define SPI_WRSR   0x01
 Write status register.
#define SPI_WRITE   0x02
 Write data to memory array.
#define SPI_READ   0x03
 Read data from memory array.
#define SPI_WRDI   0x04
 Reset write enable latch.
#define SPI_RDSR   0x05
 Read status register.
#define SPI_WREN   0x06
 Set write enable latch.
#define ATMEL_SECTOR_ERASE   0x52
 Erase one sector in memory array (Not supported on all devices)
#define ATMEL_CHIP_ERASE   0x62
 Erase all sections in memory array (Not supported on all devices)
#define ATMEL_RDID   0x15
 Read manufacturer and product ID (Not supported on all devices)
#define SPI_STATUS_WPEN   0x80
 Write-protect pin enabled.
#define SPI_STATUS_BP2   0x10
 Block protection bit 2.
#define SPI_STATUS_BP1   0x08
 Block protection bit 1.
#define SPI_STATUS_BP0   0x04
 Block protection bit 0.
#define SPI_STATUS_WEN   0x02
 State of the write enable latch.
#define SPI_STATUS_NRDY   0x01
 Device busy flag.
#define SPI_AUTODETECT_ADDRESS_LEN   0
 SPI magic autodetection address length.
#define SPI_MODE_CPHA   0x01
 Clock phase (CPHA) mode bit.
#define SPI_MODE_CPOL   0x02
 Clock polarity (CPOL) mode bit.
#define SPI_MODE_SSPOL   0x10
 Slave select polarity mode bit.
#define SPI_MODE_MICROWIRE   1
 Microwire-compatible mode.
#define SPI_MODE_MICROWIRE_PLUS   0
 Microwire/Plus-compatible mode.
#define SPI_MODE_THREEWIRE   ( SPI_MODE_MICROWIRE_PLUS | SPI_MODE_SSPOL )
 Threewire-compatible mode.

Functions

 FILE_LICENCE (GPL2_OR_LATER_OR_UBDL)
static __attribute__ ((always_inline)) void init_at25f1024(struct spi_device *device)
 Atmel AT25F1024 serial flash.
int spi_read (struct nvs_device *nvs, unsigned int address, void *data, size_t len)
 Read data from SPI device.
int spi_write (struct nvs_device *nvs, unsigned int address, const void *data, size_t len)
 Write data to SPI device.

Detailed Description

SPI interface.

Definition in file spi.h.


Define Documentation

SPI magic autodetection address length.

Set spi_device::address_len to SPI_AUTODETECT_ADDRESS_LEN if the address length should be autodetected.

Definition at line 113 of file spi.h.

Referenced by spi_bit_rw(), and threewire_detect_address_len().

#define SPI_MODE_CPHA   0x01

Clock phase (CPHA) mode bit.

Phase 0 is sample on rising edge, shift data on falling edge.

Phase 1 is shift data on rising edge, sample data on falling edge.

Definition at line 163 of file spi.h.

Referenced by spi_bit_transfer().

#define SPI_MODE_CPOL   0x02

Clock polarity (CPOL) mode bit.

This bit reflects the idle state of the clock line (SCLK).

Definition at line 169 of file spi.h.

Referenced by spi_bit_rw(), and spi_bit_transfer().

#define SPI_MODE_SSPOL   0x10

Slave select polarity mode bit.

This bit reflects that active state of the slave select lines. It is not part of the normal SPI mode number (which covers only SPI_MODE_CPOL and SPI_MODE_CPHA), but is included here for convenience.

Definition at line 178 of file spi.h.

Referenced by spi_bit_set_slave_select().

#define SPI_MODE_MICROWIRE   1

Microwire-compatible mode.

This is SPI mode 1 (i.e. CPOL=0, CPHA=1), and is compatible with the original Microwire protocol.

Definition at line 185 of file spi.h.

#define SPI_MODE_MICROWIRE_PLUS   0

Microwire/Plus-compatible mode.

This is SPI mode 0 (i.e. CPOL=0, CPHA=0), and is compatible with the Microwire/Plus protocol

Definition at line 192 of file spi.h.

Threewire-compatible mode.

This mode is compatible with Atmel's series of "three-wire" interfaces.

Definition at line 199 of file spi.h.

Referenced by ifec_init_eeprom(), natsemi_init_eeprom(), realtek_init_eeprom(), rtl818x_probe(), threewire_read(), and threewire_write().


Function Documentation

FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL  )
int spi_read ( struct nvs_device nvs,
unsigned int  address,
void *  data,
size_t  len 
)

Read data from SPI device.

Parameters:
nvsNVS device
addressAddress from which to read
dataData buffer
lenLength of data buffer
Return values:
rcReturn status code

Definition at line 89 of file spi.c.

References spi_device::bus, bus, DBG, spi_device::munge_address, NULL, rc, spi_bus::rw, spi_command(), and SPI_READ.

                                        {
        struct spi_device *device = nvs_to_spi ( nvs );
        struct spi_bus *bus = device->bus;
        unsigned int command = spi_command ( SPI_READ, address,
                                             device->munge_address );
        int rc;

        DBG ( "SPI %p reading %zd bytes from %#04x\n", device, len, address );
        if ( ( rc = bus->rw ( bus, device, command, address,
                              NULL, data, len ) ) != 0 ) {
                DBG ( "SPI %p failed to read data from device\n", device );
                return rc;
        }

        return 0;
}
int spi_write ( struct nvs_device nvs,
unsigned int  address,
const void *  data,
size_t  len 
)

Write data to SPI device.

Parameters:
nvsNVS device
addressAddress from which to read
dataData buffer
lenLength of data buffer
Return values:
rcReturn status code

Definition at line 116 of file spi.c.

References spi_device::bus, bus, DBG, spi_device::munge_address, NULL, rc, spi_bus::rw, spi_command(), spi_wait(), SPI_WREN, and SPI_WRITE.

                                               {
        struct spi_device *device = nvs_to_spi ( nvs );
        struct spi_bus *bus = device->bus;
        unsigned int command = spi_command ( SPI_WRITE, address,
                                             device->munge_address );
        int rc;

        DBG ( "SPI %p writing %zd bytes to %#04x\n", device, len, address );

        if ( ( rc = bus->rw ( bus, device, SPI_WREN, -1,
                              NULL, NULL, 0 ) ) != 0 ) {
                DBG ( "SPI %p failed to write-enable device\n", device );
                return rc;
        }

        if ( ( rc = bus->rw ( bus, device, command, address,
                              data, NULL, len ) ) != 0 ) {
                DBG ( "SPI %p failed to write data to device\n", device );
                return rc;
        }
        
        if ( ( rc = spi_wait ( device ) ) != 0 ) {
                DBG ( "SPI %p failed to complete write operation\n", device );
                return rc;
        }

        return 0;
}