📄 ceeprom.c
字号:
/*----------------------------------------------------------------------------* CEeprom.c : Implementation of EEPROM interface* REALmagic Quasar Hardware Library* Created by Aurelia Popa-Radu* Copyright Sigma Designs Inc* Sigma Designs Proprietary and confidential* Created on 8/27/99* Description:----------------------------------------------------------------------------*/#include "pch.h"#include "ci2c.h"#include "ceeprom.h"IEepromVtbl g_CEepromVtbl = { CEeprom__Delete, CEeprom__Init, CEeprom__InitPropertySet, CEeprom__SetProperty, CEeprom__GetProperty, CEeprom__Write, CEeprom__Read, CEeprom__CheckPresence, CEeprom__GetPresence, CEeprom__Program };///////////////////////////////////////////////////////////////////////////// CreateInstancevoid CEeprom__CreateInstance(void **pv, DWORD dwInstance){ CEeprom__New((CEeprom**)pv, TEXT("Eeprom"), TRUE, dwInstance);}// constructionvoid CEeprom__New ( CEeprom** ppCEeprom, TCHAR *pName, BOOL bAllocate, DWORD dwInstance){ CEeprom* this = *ppCEeprom; if (bAllocate) { // Allocate CEeprom *ppCEeprom = OSmalloc(sizeof(CEeprom)); this = (CEeprom*) *ppCEeprom; if(this == NULL) return; OSmemset(this, 0, sizeof(CEeprom)); } // Call CObject constructor with bAllocate = FALSE CObject__New ((CObject**)ppCEeprom, pName, FALSE, dwInstance); // Call CI2C constructor CI2C__New ( (CI2C**)(&this->m_pII2C), pName, TRUE, dwInstance ); if(this->m_pII2C == NULL) { if (bAllocate) OSfree(*ppCEeprom); *ppCEeprom = NULL; } // Initialize members this->lpVtbl = &g_CEepromVtbl ;}// destructionvoid CEeprom__Delete ( IEeprom* pIEeprom, BOOL bDeleteObject ){ CEeprom* this = (CEeprom*) pIEeprom ; if (this == NULL) return; // Release what we were using // Call CI2C Destructor II2C_Delete ( this->m_pII2C, bDeleteObject ); // Call CObject Destructor CObject__Delete ((IObject*)this, FALSE); if (bDeleteObject) { // Delete CEeprom OSfree(pIEeprom); }}void CEeprom__Init ( IEeprom* pIEeprom ){ CEeprom* this = (CEeprom*) pIEeprom ; II2C_SetI2CAddress( this->m_pII2C, EEPROM_WRITE_ADDR, EEPROM_READ_ADDR, 1); // WriteAddr=0xA0, ReadAddr=0xA1, it needs delay II2C_Init( this->m_pII2C ); // XXX vincent: initialize this to TRUE, because we will not call // CheckPresense for em85xx, we just assume the eeprom is always there this->m_bEEPROMPresent = TRUE;}void CEeprom__InitPropertySet(IEeprom* pIEeprom, void* pPropSet, DWORD dwSize){ CEeprom* this = (CEeprom*) pIEeprom; if(dwSize != sizeof(PROPERTY_SET_ITEM)) return; InitPropSet(pIEeprom, pPropSet, EEPROM_SET, eEepromMax,\ this->EepromPropertyList, CEeprom__SetProperty, CEeprom__GetProperty)}/****f* HwLib/IEeprom_SetProperty * USAGE * QRESULT IEeprom_SetProperty(IEeprom* pIEeprom, * DWORD PropSet, DWORD PropId, DWORD Flags, void* pData, DWORD dwSizeIn, DWORD* pdwSizeOut) * QRESULT CEeprom__SetProperty(IEeprom* pIEeprom, * DWORD PropSet, DWORD PropId, DWORD Flags, void* pData, DWORD dwSizeIn, DWORD* pdwSizeOut) * PARAMETERS * IN IEeprom* pIEeprom - pointer to the Eeprom object/********************************************************************************************/QRESULT CEeprom__SetProperty( IEeprom* pIEeprom, DWORD PropSet, DWORD PropId, DWORD Flags, void* pData, DWORD dwSizeIn, DWORD* pdwSizeOut){ CEeprom* this = (CEeprom*) pIEeprom; DWORD Value = *(DWORD*)pData; QDbgLog((QLOG_TRACE, QDebugLevelTrace, TEXT(" --> CEeprom__SetProperty: set=%x id=%x flags=%x sz=%x value=%x"), PropSet, PropId, Flags, dwSizeIn, Value)); switch(PropId) { case eEepromAccess: CHECK_SIZE(genericReg) IEeprom_Write(pIEeprom, ((genericReg_type*)pData)->Addr, (BYTE*)&((genericReg_type*)pData)->Data); break; case eEepromI2cInit: { I2cDeviceInit_type* pDevI2c = (I2cDeviceInit_type*)pData; CHECK_SIZE(I2cDeviceInit) II2C_SetI2CAddress( this->m_pII2C, (BYTE)pDevI2c->I2c_WriteAddress, (BYTE)pDevI2c->I2c_ReadAddress, (BYTE)pDevI2c->I2c_usDelay ); } break; default: return E_NOT_SUPPORTED; } return Q_OK;}/****f* HwLib/IEeprom_GetProperty * USAGE * QRESULT IEeprom_GetProperty(IEeprom* pIEeprom, * DWORD PropSet, DWORD PropId, DWORD Flags, void* pData, DWORD dwSizeIn, DWORD* pdwSizeOut) * QRESULT CEeprom__GetProperty(IEeprom* pIEeprom, * DWORD PropSet, DWORD PropId, DWORD Flags, void* pData, DWORD dwSizeIn, DWORD* pdwSizeOut) * PARAMETERS * IN IEeprom* pIEeprom - pointer to the Eeprom object/********************************************************************************************/QRESULT CEeprom__GetProperty( IEeprom* pIEeprom, DWORD PropSet, DWORD PropId, DWORD Flags, void* pData, DWORD dwSizeIn, DWORD* pdwSizeOut){ // CEeprom* this = (CEeprom*) pIEeprom; DWORD Value; QRESULT qr = Q_OK; switch(PropId) { case eEepromAccess: CHECK_SIZE(genericReg) IEeprom_Read(pIEeprom, ((genericReg_type*)pData)->Addr, (BYTE*)&((genericReg_type*)pData)->Data); return qr; default: return E_NOT_SUPPORTED; } *(DWORD*)pData = Value; QDbgLog((QLOG_TRACE, QDebugLevelTrace, TEXT(" <-- CEeprom__GetProperty: set=%x id=%x flags=%x sz=%x value=%x"), PropSet, PropId, Flags, dwSizeIn, Value)); return Q_OK;}////////////////////////////////////////////////////////////////////////////////////////////// Eeprom functionsBOOL CEeprom__CheckPresence( IEeprom* pIEeprom ){ CEeprom* this = (CEeprom*) pIEeprom; BYTE byte; byte = 0x55; II2C_Write(this->m_pII2C, 0x7f, &byte, 1); OSTimeDelay(20 * 1000); // necessary delay for writing the data in EEPROM byte = 0xAA; II2C_Read(this->m_pII2C, 0x7f, &byte, 1); if(byte == 0x55) { QDbgLog((QLOG_TRACE, QDebugLevelTrace, TEXT("OK"))); this->m_bEEPROMPresent = TRUE; } else { this->m_bEEPROMPresent = FALSE; } return this->m_bEEPROMPresent;}BOOL CEeprom__GetPresence( IEeprom* pIEeprom ){ CEeprom* this = (CEeprom*) pIEeprom; return this->m_bEEPROMPresent;}BOOL CEeprom__Write( IEeprom* pIEeprom, DWORD Address, BYTE* pData ){ CEeprom* this = (CEeprom*) pIEeprom; if (this->m_bEEPROMPresent == 0) return FALSE; II2C_Write(this->m_pII2C, (BYTE)Address, pData, 1); OSTimeDelay (20 * 1000); QDbgLog((QLOG_TRACE, QDebugLevelTrace, TEXT("WriteEEPROM at %x = %x"), Address, *pData)); return TRUE;}BOOL CEeprom__Read( IEeprom* pIEeprom, DWORD Address, BYTE* pData ){ CEeprom* this = (CEeprom*) pIEeprom; if (this->m_bEEPROMPresent == 0) return FALSE; II2C_Read(this->m_pII2C, (BYTE)Address, pData, 1); QDbgLog((QLOG_TRACE, QDebugLevelTrace, TEXT("ReadEEPROM at %x = %x"), Address, *pData)); return TRUE;}QRESULT CEeprom__Program( IEeprom* pIEeprom, BYTE* pData, DWORD nBytes){ CEeprom* this = (CEeprom*) pIEeprom; DWORD i; BYTE byte; if (this->m_bEEPROMPresent == 0) { QDbgLog((QLOG_TRACE, QDebugLevelWarning, TEXT("ProgramEEPROM - NO EEPROM "))); return E_EEPROM_NOT_PRESENT; } for(i=0;i<nBytes;i++) { byte = pData[i]; CEeprom__Write(pIEeprom, i, &byte); OSTimeDelay(20 * 1000); // necessary delay for writing the data in EEPROM } for(i=0;i<nBytes;i++) { CEeprom__Read(pIEeprom, i, &byte); if(byte != pData[i]) { QDbgLog((QLOG_TRACE, QDebugLevelWarning, TEXT("EEPROM ERROR: write %02x read %02x"), pData[i], byte)); OSsprintf(g_InfoError, TEXT("Program EEPROM ERROR: write %02x read %02x\n"), pData[i], byte); return E_PROGRAM_EEPROM_FAILED; } } QDbgLog((QLOG_TRACE, QDebugLevelWarning, TEXT("Program EEPROM END") )); return Q_OK;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -