#ifndef _IOKIT_CORE99NVRAM_H
#define _IOKIT_CORE99NVRAM_H
#include <IOKit/nvram/IONVRAMController.h>
#define kCore99NVRAMIdentifyCmd (0x90)
#define kCore99NVRAMManufactureIDAddr (0x00)
#define kCore99NVRAMDeviceIDAddr (0x01)
#define kCore99NVRAMResetDeviceCmd (0xFF)
#define kCore99NVRAMEraseSetupCmd (0x20)
#define kCore99NVRAMEraseConfirmCmd (0xD0)
#define kCore99NVRAMWriteSetupCmd (0x40)
#define kCore99NVRAMWriteConfirmCmd (0x70)
#define kCore99NVRAMStatusRegErrorMask (0x38)
#define kCore99NVRAMStatusRegVoltageErrorMask (0x08)
#define kCore99NVRAMStatusRegWriteErrorMask (0x10)
#define kCore99NVRAMStatusRegEraseErrorMask (0x20)
#define kCore99NVRAMStatusRegSequenceErrorMask (0x30)
#define kCore99NVRAMStatusRegCompletionMask (0x80)
#define kCore99NVRAMMicronManufactureID (0x89)
#define kCore99NVRAMMicronTopBootDeviceID (0x98)
#define kCore99NVRAMMicronBottomBootDeviceID (0x99)
#define kCore99NVRAMSharpManufactureID (0xB0)
#define kCore99NVRAMSharpDeviceID (0x4B)
#define kCore99NVRAMSize (0x2000)
#define kCore99NVRAMMapSize (kCore99NVRAMSize * 4)
#define kCore99NVRAMAreaAOffset (kCore99NVRAMSize * 0)
#define kCore99NVRAMAreaBOffset (kCore99NVRAMSize * 1)
#define kCore99NVRAMAdlerStart (20)
#define kCore99NVRAMAdlerSize (kCore99NVRAMSize - kCore99NVRAMAdlerStart)
#define kCore99NVRAMSignature (0x5A)
struct Core99NVRAMHeader {
unsigned char signature;
unsigned char checksum;
unsigned short length;
char name[12];
unsigned long adler32;
unsigned long generation;
unsigned long reserved1;
unsigned long reserved2;
};
typedef struct Core99NVRAMHeader Core99NVRAMHeader;
class Core99NVRAM : public IONVRAMController
{
OSDeclareDefaultStructors(Core99NVRAM);
private:
unsigned char *nvramBaseAddress;
volatile unsigned char *nvramCurrent;
volatile unsigned char *nvramNext;
unsigned char *nvramShadow;
unsigned long generation;
virtual IOReturn eraseBlock(void);
virtual IOReturn verifyEraseBlock(void);
virtual IOReturn writeBlock(unsigned char *sourceAddress);
virtual IOReturn verifyWriteBlock(unsigned char *sourceAddress);
virtual IOReturn waitForCommandDone(void);
virtual unsigned long validateGeneration(unsigned char *nvramBuffer);
virtual unsigned char chrpCheckSum(unsigned char *buffer);
virtual unsigned long adler32(unsigned char *buffer, long length);
public:
virtual bool start(IOService *provider);
virtual void sync(void);
virtual IOReturn read(IOByteCount offset, UInt8 *buffer,
IOByteCount length);
virtual IOReturn write(IOByteCount offset, UInt8 *buffer,
IOByteCount length);
};
#endif