1. Introduction
|
---------------
|
**SpiDxe** driver implements MARVELL_SPI_MASTER_PROTOCOL in order to manage SPI
|
controller on Marvell A8k boards. It exposes below functionalities:
|
- create and setup SPI slaves
|
- raw transfer over SPI bus
|
|
2. SpiDxe driver design
|
-----------------------
|
|
2.1 MARVELL_SPI_MASTER_PROTOCOL
|
-----------------------
|
First member of SPI_MASTER protocol is Init function, implemented for SPI
|
master controller initialization.
|
|
->Init()
|
|
//
|
//Initializes the host controller to execute SPI commands.
|
//
|
|
param[IN] This Pointer to the MARVELL_SPI_MASTER_PROTOCOL instance
|
|
return EFI_SUCCESS Opcode initialization on the SPI host
|
controller completed.
|
return EFI_ACCESS_DENIED The SPI configuration interface is
|
locked.
|
return EFI_OUT_OF_RESOURCES Not enough resource available to
|
initialize the device.
|
return EFI_DEVICE_ERROR Device error, operation failed.
|
|
********
|
|
SPI devices (slaves) do not support any kind of automatic discovery or
|
enumaration, so every device needs manual configuration, which may be done
|
with SetupDevice function.
|
|
->SetupDevice()
|
|
//
|
//Allocate and zero all fields in the SPI_DEVICE struct. Set the chip
|
//select, max frequency and transfer mode supported by slave device.
|
//
|
|
param[IN] Cs Chip select ID of the slave chip.
|
param[IN] MaxFreq Maximum SCK rate in Hz.
|
param[IN] Mode Clock polarity and clock phase.
|
|
return *SPI_DEVICE Pointer to new allocated struct SPI_DEVICE.
|
return NULL NULL pointer if any eroor occured.
|
|
********
|
|
Developers have to destroy all created SPI device structs (with FreeDevice
|
function) in order to prevent from memory leak.
|
|
->FreeDevice()
|
|
//
|
//Free any memory associated with a SPI device.
|
//
|
|
param[in] SpiDev Pointer to the SPI_DEVICE struct.
|
|
return EFI_SUCCESS Memory fried succesfully.
|
return EFI_DEVICE_ERROR Device error, operation failed.
|
|
********
|
|
Transfer function allows write/read raw bytes over SPI bus.
|
|
->Transfer()
|
|
//
|
//Perform transfer over SPI bus
|
//
|
param[in] This Pointer to the MARVELL_SPI_MASTER_PROTOCOL
|
instance.
|
param[in] Slave Pointer to the SPI_DEVICE struct.
|
param[in] DataByteCount Number of bytes in the data portion of
|
the SPI cycle.
|
param[in] DataOut Pointer to caller-allocated buffer
|
containing the data to send.
|
param[out] DataIn Pointer to caller-allocated buffer
|
where received data will be placed.
|
param[in] Flag Flags which indicate state of CS line
|
during/after transfer (see file
|
Drivers/Spi/Devices/A8kSpiFlash.h)
|
|
return EFI_SUCCESS Memory fried succesfully.
|
return EFI_DEVICE_ERROR Device error, operation failed.
|
|
*********
|
|
When working with SPI devices it is often necessary to perform "command and
|
address" transactions. It may be done via ReadWrite function.
|
|
->ReadWrite()
|
|
//
|
//Perform two steps transactions. First write Command, then read/write
|
//buffer
|
//
|
|
param[in] This Pointer to the MARVELL_SPI_MASTER_PROTOCOL
|
instance.
|
param[in] Slave Pointer to the SPI_DEVICE struct.
|
param[in] Cmd Pointer to caller-allocated buffer
|
containing the command to send.
|
param[in] CmdSize Size of command (in bytes).
|
param[in] DataOut Pointer to caller-allocated buffer
|
containing the data to send.
|
param[out] DataIn Pointer to caller-allocated buffer
|
where received data will be placed.
|
param[in] DataSize Number of bytes in the data portion of
|
the SPI cycle.
|