146 lines
2.8 KiB
C
146 lines
2.8 KiB
C
|
/*
|
||
|
* Copyright (c) 2009-2010 Apple Inc. All rights reserved.
|
||
|
*
|
||
|
* This document is the property of Apple Inc.
|
||
|
* It is considered confidential and proprietary.
|
||
|
*
|
||
|
* This document may not be reproduced or transmitted in any form,
|
||
|
* in whole or in part, without the express written permission of
|
||
|
* Apple Inc.
|
||
|
*/
|
||
|
|
||
|
|
||
|
#include "sdio_cmdfields.h"
|
||
|
|
||
|
|
||
|
#pragma mark -
|
||
|
#pragma mark Common
|
||
|
|
||
|
enum CommandOffset
|
||
|
{
|
||
|
kSDIOCmdAddressOffset = 9,
|
||
|
kSDIOCmdFunctionOffset = 28,
|
||
|
};
|
||
|
|
||
|
enum CommandMask
|
||
|
{
|
||
|
kSDIOCmdFunctionMask = 0x7,
|
||
|
kSDIOCmdAddressMask = 0x1FFFF,
|
||
|
};
|
||
|
|
||
|
enum SDIOCmdDirection
|
||
|
{
|
||
|
kSDIOCmdDirectionRead = (0 << 31),
|
||
|
kSDIOCmdDirectionWrite = (1 << 31),
|
||
|
};
|
||
|
|
||
|
|
||
|
static inline UInt32
|
||
|
convertFunctionToArg(UInt8 function)
|
||
|
{
|
||
|
return (function & kSDIOCmdFunctionMask) << kSDIOCmdFunctionOffset;
|
||
|
}
|
||
|
|
||
|
static inline UInt32
|
||
|
convertAddressToArg(UInt32 address)
|
||
|
{
|
||
|
return (address & kSDIOCmdAddressMask) << kSDIOCmdAddressOffset;
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
enum SDIODirection
|
||
|
sdio_getCommandDirection(enum SDIOCommandIndex index, UInt32 argument)
|
||
|
{
|
||
|
switch (index) {
|
||
|
case kSDIOCmd52_IORWDirect:
|
||
|
case kSDIOCmd53_IORWExtended:
|
||
|
return (argument & kSDIOCmdDirectionWrite) ? kSDIODirectionWrite : kSDIODirectionRead;
|
||
|
default:
|
||
|
return kSDIODirectionNone;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
#pragma mark -
|
||
|
#pragma mark Cmd5
|
||
|
|
||
|
UInt32
|
||
|
sdio_getOCR(const struct SDIOCommandResponse *cmd5Response)
|
||
|
{
|
||
|
return cmd5Response->response[0] & 0x00fffff;
|
||
|
}
|
||
|
|
||
|
bool
|
||
|
sdio_getNumIOFunctions(const struct SDIOCommandResponse *cmd5Response)
|
||
|
{
|
||
|
return (cmd5Response->response[0] & 0x70000000) >> 28;
|
||
|
}
|
||
|
|
||
|
bool
|
||
|
sdio_isMemoryPresent(const struct SDIOCommandResponse *cmd5Response)
|
||
|
{
|
||
|
return cmd5Response->response[0] & 0x08000000; // >> 27
|
||
|
}
|
||
|
|
||
|
bool
|
||
|
sdio_isIOReady(const struct SDIOCommandResponse *cmd5Response)
|
||
|
{
|
||
|
return cmd5Response->response[0] & 0x80000000; // >> 31
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
#pragma mark -
|
||
|
#pragma mark Cmd52
|
||
|
|
||
|
|
||
|
UInt32
|
||
|
sdio_generateCmd52Arg(enum SDIODirection direction,
|
||
|
UInt8 sdioFunction, UInt32 cardAddress, UInt8 data,
|
||
|
SDIOCmd52Flags flags)
|
||
|
{
|
||
|
UInt32 dir = (direction & kSDIODirectionWrite) ? kSDIOCmdDirectionWrite : kSDIOCmdDirectionRead;
|
||
|
|
||
|
return dir | convertFunctionToArg(sdioFunction) | flags
|
||
|
| convertAddressToArg(cardAddress) | data;
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
#pragma mark -
|
||
|
#pragma mark Cmd53
|
||
|
|
||
|
enum SDIOCmd53Mask
|
||
|
{
|
||
|
kSDIOCmd53CountMask = 0x1FF
|
||
|
};
|
||
|
|
||
|
|
||
|
static inline UInt32
|
||
|
convertCmd53CountToArg(UInt32 count)
|
||
|
{
|
||
|
return (count & kSDIOCmd53CountMask);
|
||
|
}
|
||
|
|
||
|
|
||
|
UInt32
|
||
|
sdio_generateCmd53Arg(enum SDIODirection direction,
|
||
|
UInt8 sdioFunction, UInt32 cardAddress, UInt16 count,
|
||
|
SDIOCmd53Flags flags)
|
||
|
{
|
||
|
UInt32 dir = (direction & kSDIODirectionWrite) ? kSDIOCmdDirectionWrite : kSDIOCmdDirectionRead;
|
||
|
|
||
|
return dir | convertFunctionToArg(sdioFunction) | flags
|
||
|
| convertAddressToArg(cardAddress) | convertCmd53CountToArg(count);
|
||
|
}
|
||
|
|
||
|
UInt16
|
||
|
sdio_getCmd53Count(UInt32 cmdArg)
|
||
|
{
|
||
|
return cmdArg & kSDIOCmd53CountMask;
|
||
|
}
|
||
|
|
||
|
|