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. |