Unit PL18X
Return to Unit Reference
Description
ARM PrimeCell PL180/181 Multimedia Card Interface Driver unit
The PL180/181 Multimedia Card is an ARM peripheral that is compatible with MMC multimedia cards and SD secure digital cards in memory mapped I/O format compatible with the ARM advanced peripheral bus (APB).
The design of the Pl180/181 allows for multiple cards per controller however this driver currently only supports attaching one card.
Constants
To be documented
Type definitions
PL18X version Id
PPL18XVersionID = ^TPL18XVersionID;
TPL18XVersionID = record
PeripheralID:LongWord;
|
|
PeripheralMask:LongWord;
|
|
VersionData:PPL18XVersionData;
|
PL18X version data
PPL18XVersionData = ^TPL18XVersionData;
TPL18XVersionData = record
Name:String;
|
Name of the device |
ClockRegister:LongWord;
|
Default value for MCICLOCK register |
ClockEnable:LongWord;
|
Enable value for MMCICLOCK register |
Clock8BitEnable:LongWord;
|
Enable value for 8 bit bus |
ClockNegativeEdgeEnable:LongWord;
|
Enable value for inverted data/cmd output |
DataLengthBits:LongWord;
|
Number of bits in the MMCIDATALENGTH register |
FIFOSize:LongWord;
|
Number of bytes that can be written when MMCI_TXFIFOEMPTY is asserted (likewise for RX) |
FIFOHalfSize:LongWord;
|
Number of bytes that can be written when MCI_TXFIFOHALFEMPTY is asserted (likewise for RX) |
DataCommandEnable:LongWord;
|
Enable value for data commands |
DataControlMaskDDR:LongWord;
|
DDR mode mask in MMCIDATACTRL register |
DataControlMaskSDIO:LongWord;
|
SDIO enable mask in MMCIDATACTRL register |
STSDIO:LongBool;
|
Enable ST specific SDIO logic |
STClockDivider:LongBool;
|
True if using a ST-specific clock divider algorithm |
BlockSizeDataControl16:LongBool;
|
True if Block size is at b16..b30 position in MMCIDATACTRL register |
BlockSizeDataControl4:LongBool;
|
True if Block size is at b4..b16 position in MMCIDATACTRL register |
PowerPowerUp:LongWord;
|
Power up value for MMCIPOWER register |
ClockMaximum:LongWord;
|
Maximum clk frequency supported by the controller |
SignalDirection:LongBool;
|
Input/out direction of bus signals can be indicated |
PowerClockGate:LongBool;
|
MMCIPOWER register must be used to gate the clock |
BusyDetect:LongBool;
|
True if busy detection on dat0 is supported |
PowerNoPower:LongBool;
|
Bits in MMCIPOWER don't control external power supply |
ExplicitMClockControl:LongBool;
|
Enable explicit mclk control in driver |
QualcommFIFO:LongBool;
|
Enable Qualcomm specific FIFO PIO read logic |
QualcommDMA:LongBool;
|
Enable Qualcomm specific DMA glue for DMA transfers |
ReversedIRQ:LongBool;
|
Handle data irq before cmd irq |
PL18X MMCI registers
PPL18XMMCIRegisters = ^TPL18XMMCIRegisters;
TPL18XMMCIRegisters = record
Note: Layout of the PL18X registers (See: http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0172a/i1006458.html) | |
Power:LongWord;
|
Power control register |
Clock:LongWord;
|
Clock control register |
Argument:LongWord;
|
Argument register |
Command:LongWord;
|
Command register |
RespCmd:LongWord;
|
Response command register |
Response0:LongWord;
|
Response register |
Response1:LongWord;
|
Response register |
Response2:LongWord;
|
Response register |
Response3:LongWord;
|
Response register |
DataTimer:LongWord;
|
Data timer |
DataLength:LongWord;
|
Data length register |
DataCtrl:LongWord;
|
Data control register |
DataCnt:LongWord;
|
Data counter |
Status:LongWord;
|
Status register |
Clear:LongWord;
|
Clear register |
Mask0:LongWord;
|
Interrupt 0 mask register |
Mask1:LongWord;
|
Interrupt 1 mask register |
Select:LongWord;
|
Secure digital memory card select register |
FifoCnt:LongWord;
|
FIFO counter |
Reserved:array[$4C..$7C] of Byte;
|
Reserved |
FIFO:LongWord;
|
Data FIFO register (0x80 to 0xBC) |
PL18X SDHCI get RXFIFO count
TPL18XSDHCIGetRXFIFOCount = function(SDHCI:PPL18XSDHCIHost; Status,Remain:LongWord):LongWord;
|
PL18X SDHCI host
PPL18XSDHCIHost = ^TPL18XSDHCIHost;
TPL18XSDHCIHost = record
SDHCI Properties | |
SDHCI:TSDHCIHost;
|
|
PL18X Properties | |
IRQ0:LongWord;
|
|
IRQ1:LongWord;
|
|
Lock:TSpinHandle;
|
Host lock (Differs from lock in Host portion) Spin lock due to use by interrupt handler |
SingleIRQ:LongBool;
|
The host only has a single IRQ line instead of the standard 2 lines |
Registers:PPL18XMMCIRegisters;
|
Host registers |
Version:PPL18XVersionData;
|
Host version data |
ClockRegister:LongWord;
|
Current clock register value |
PowerRegister:LongWord;
|
Current power register value |
DataCtrlRegister:LongWord;
|
Current data control register value |
MaximumBlockSize:LongWord;
|
Host maximum block size |
MaximumRequestSize:LongWord;
|
Host maximum request size |
BusyStatus:LongWord;
|
Current Busy Status for ST Micro variants |
GetRXFIFOCount:TPL18XSDHCIGetRXFIFOCount;
|
Model specific GetRXFIFOCount function |
Public variables
PL18X specific variables
PL18X_MMCI_FIQ_ENABLED:LongBool;
|
The SDHCI uses Fast Interrupt Requests (FIQ) instead of IRQ |
PL18X_MMCI_MIN_FREQ:LongWord = 400000;
|
Minimum clock frequency for SDHCI (Default minimum of 400KHz) |
PL18X_MMCI_MAX_FREQ:LongWord = 400000;
|
Maximum clock frequency for SDHCI (Default maximum of 400KHz) |
Function declarations
Initialization functions
procedure PL18XInit;
Note | Called only during system startup |
---|
PL18X functions
function PL180SDHCICreate(Address:LongWord; const Name:String; IRQ0,IRQ1,ClockMinimum,ClockMaximum:LongWord; CardDetect:TMMCDeviceGetCardDetect; WriteProtect:TMMCDeviceGetWriteProtect):PSDHCIHost;
Address | The address of the PL180 registers |
---|---|
Name | The text description of this device which will show in the device list (Optional) |
IRQ0 | The interrupt 0 number for the PL180 |
IRQ1 | The interrupt 1 number for the PL180 |
ClockMinimum | The minimum frequency for the Pl180 clock |
ClockMaximum | The maximum frequency for the Pl180 clock |
Return | Pointer to the new SDHCI device or nil if the SDHCI device could not be created |
function PL181SDHCICreate(Address:LongWord; const Name:String; IRQ0,IRQ1,ClockMinimum,ClockMaximum:LongWord; CardDetect:TMMCDeviceGetCardDetect; WriteProtect:TMMCDeviceGetWriteProtect):PSDHCIHost;
Address | The address of the PL181 registers |
---|---|
Name | The text description of this device which will show in the device list (Optional) |
IRQ0 | The interrupt 0 number for the PL181 |
IRQ1 | The interrupt 1 number for the PL181 |
ClockMinimum | The minimum frequency for the Pl181 clock |
ClockMaximum | The maximum frequency for the Pl181 clock |
Return | Pointer to the new SDHCI device or nil if the SDHCI device could not be created |
function PL18XSDHCIDestroy(SDHCI:PSDHCIHost):LongWord;
SDHCI | The SDHCI device to destroy |
---|---|
Return | ERROR_SUCCESS if completed or another error code on failure |
PL18X MMC functions
function PL18XMMCDeviceInitialize(MMC:PMMCDevice):LongWord;
Note | Not intended to be called directly by applications, use MMCDeviceInitialize instead |
---|
function PL18XMMCDeviceGetCardDetect(MMC:PMMCDevice):LongWord;
Note | Not intended to be called directly by applications, use MMCDeviceGetCardDetect instead |
---|
function PL18XMMCDeviceGetWriteProtect(MMC:PMMCDevice):LongWord;
Note | Not intended to be called directly by applications, use MMCDeviceGetWriteProtect instead |
---|
function PL18XMMCDeviceSendCommand(MMC:PMMCDevice; Command:PMMCCommand):LongWord;
Note | Not intended to be called directly by applications, use MMCDeviceSendCommand instead |
---|
function PL18XMMCDeviceSetIOS(MMC:PMMCDevice):LongWord;
Note | Not intended to be called directly by applications, use MMCDeviceSetIOS instead |
---|
PL18X SDHCI functions
function PL18XSDHCIHostStart(SDHCI:PSDHCIHost):LongWord;
Note | Not intended to be called directly by applications, use SDHCIHostStart instead |
---|
function PL18XSDHCIHostStop(SDHCI:PSDHCIHost):LongWord;
Note | Not intended to be called directly by applications, use SDHCIHostStop instead |
---|
function PL18XSDHCIHostReadByte(SDHCI:PSDHCIHost; Reg:LongWord):Byte;
Note | Not intended to be called directly by applications, use SDHCIHostReadByte instead |
---|
function PL18XSDHCIHostReadWord(SDHCI:PSDHCIHost; Reg:LongWord):Word;
Note | Not intended to be called directly by applications, use SDHCIHostReadWord instead |
---|
function PL18XSDHCIHostReadLong(SDHCI:PSDHCIHost; Reg:LongWord):LongWord;
Note | Not intended to be called directly by applications, use SDHCIHostReadLong instead |
---|
procedure PL18XSDHCIHostWriteByte(SDHCI:PSDHCIHost; Reg:LongWord; Value:Byte);
Note | Not intended to be called directly by applications, use SDHCIHostWriteByte instead |
---|
procedure PL18XSDHCIHostWriteWord(SDHCI:PSDHCIHost; Reg:LongWord; Value:Word);
Note | Not intended to be called directly by applications, use SDHCIHostWriteWord instead |
---|
procedure PL18XSDHCIHostWriteLong(SDHCI:PSDHCIHost; Reg:LongWord; Value:LongWord);
Note | Not intended to be called directly by applications, use SDHCIHostWriteLong instead |
---|
procedure PL18XSDHCIInterruptHandler(SDHCI:PPL18XSDHCIHost);
Note | Not intended to be called directly by applications |
---|
procedure PL18XSDHCIDataInterrupt(SDHCI:PPL18XSDHCIHost; Status:LongWord);
Note | Not intended to be called directly by applications
Caller must hold the host lock |
---|
procedure PL18XSDHCICommandInterrupt(SDHCI:PPL18XSDHCIHost; Status:LongWord);
Note | Not intended to be called directly by applications
Caller must hold the host lock |
---|
procedure PL18XSDHCIStopData(SDHCI:PPL18XSDHCIHost);
Note | Not intended to be called directly by applications
Caller must hold the host lock |
---|
procedure PL18XSDHCIPIOInterruptHandler(SDHCI:PPL18XSDHCIHost);
Note | Not intended to be called directly by applications |
---|
function PL18XSHDCIReadPIO(SDHCI:PPL18XSDHCIHost ;Buffer:Pointer; Remain:LongWord):LongWord;
Note | Not intended to be called directly by applications
Caller must hold the host lock |
---|
function PL18XSDHCIWritePIO(SDHCI:PPL18XSDHCIHost; Buffer:Pointer; Remain,Status:LongWord):LongWord;
Note | Not intended to be called directly by applications
Caller must hold the host lock |
---|
PL18X helper functions
function PL18XGetPeripheralID(SDHCI:PPL18XSDHCIHost):LongWord;
Note | None documented |
---|
function PL18XGetVersionData(SDHCI:PPL18XSDHCIHost):PPL18XVersionData;
Note | None documented |
---|
function PL18XGetRXFIFOCount(SDHCI:PPL18XSDHCIHost; Status,Remain:LongWord):LongWord;
Note | None documented |
---|
function PL18XQualcommGetRXFIFOCount(SDHCI:PPL18XSDHCIHost; Status,Remain:LongWord):LongWord;
Note | None documented |
---|
procedure PL18XRegisterDelay(SDHCI:PPL18XSDHCIHost);
Note | None documented |
---|
procedure PL18XSetClockRegister(SDHCI:PPL18XSDHCIHost; MMC:PMMCDevice; Desired:LongWord);
Note | Caller must hold the host lock |
---|
procedure PL18XSetPowerRegister(SDHCI:PPL18XSDHCIHost; Value:LongWord);
Note | Caller must hold the host lock |
---|
procedure PL18XSetInterruptMask1(SDHCI:PPL18XSDHCIHost; Mask:LongWord);
Note | Caller must hold the host lock |
---|
procedure PL18XWriteClockRegister(SDHCI:PPL18XSDHCIHost; Clock:LongWord);
Note | Caller must hold the host lock |
---|
procedure PL18XWritePowerRegister(SDHCI:PPL18XSDHCIHost; Power:LongWord);
Note | Caller must hold the host lock |
---|
procedure PL18XWriteDataCtrlRegister(SDHCI:PPL18XSDHCIHost; DataCtrl:LongWord);
Note | Caller must hold the host lock |
---|
Return to Unit Reference