core_eeprom.c
来自「6440linuxDriver的源代码」· C语言 代码 · 共 196 行
C
196 行
#include "core_spi.h"#include "spi_hal.h"#include "core_eeprom.h"#define TWSI_RDY MV_BIT(7)#define TWSI_RD MV_BIT(4)#define TWSI_WR MV_BIT(3)#define TWSI_SLV_ADRS (0)intOdin_PollTWSICtrlReg(AdapterInfo * pAI, MV_U32 mask, MV_U32 bit, MV_U32 timeout){ MV_PVOID BarAdr = pAI->bar[2]; MV_U32 i; MV_U32 sr;// MV_U32 timer; for (i = 0; i < timeout; i++)// timer = Timer_GetTime();// while( !Timer_CheckTime( timer, 3 ) ) { sr = MV_IOR32 (BarAdr, ODIN_SPI_CTRL_REG);// printf( "sr:%8.8lX ", sr );// EEPROM_DBG( ( "sr:%2.2X\n", sr ) ); if ((sr & mask) == bit) return 0; DelayUSec(10); } EEPROM_DBG(("%s %s %d\n", __FILE__, __FUNCTION__, __LINE__)); return -1;}int Odin_EEPRomW32(AdapterInfo * pAI, MV_U32 Addr, MV_U32 Data){ MV_PVOID BarAdr = pAI->bar[2];// printf( " Odin_EEPRomW32 [%8.8lX] [%8.8lX]\n", Addr & ( MV_BIT( 18 ) - 1 ), Data ); MV_IOW32 (BarAdr, ODIN_SPI_DATA_REG, Data); MV_IOW32 (BarAdr, ODIN_SPI_CMD_REG, Addr & (MV_BIT (18) - 1)); MV_IOW32 (BarAdr, ODIN_SPI_CTRL_REG, TWSI_WR); if (0 == Odin_PollTWSICtrlReg (pAI, TWSI_WR, 0, 100000))// if( 0==Odin_PollTWSICtrlReg( pAI, TWSI_RDY, TWSI_RDY, 100000 ) ) { DelayMSec (5); return 0; } return -1;}int Odin_EEPRomR32(AdapterInfo * pAI, MV_U32 Addr, MV_U32 * Data){ MV_PVOID BarAdr = pAI->bar[2]; MV_U32 tmpData; MV_IOW32 (BarAdr, ODIN_SPI_CMD_REG, Addr & (MV_BIT (18) - 1)); MV_IOW32 (BarAdr, ODIN_SPI_CTRL_REG, TWSI_RD); if (0 == Odin_PollTWSICtrlReg (pAI, TWSI_RD, 0, 100000))// if(0==Odin_PollTWSICtrlReg(pAI, TWSI_RDY, TWSI_RDY, 100000 ) ) { tmpData = MV_IOR32 (BarAdr, ODIN_SPI_DATA_REG); *Data = tmpData;// printf(" Odin_EEPRomR32 [%8.8lX] [%8.8lX]\n", Addr & (MV_BIT(18 ) - 1 ), *Data ); return 0; } return -1;}intOdin_EEPRomWriteBuf (AdapterInfo * pAI, MV_U32 Addr, void *Data, MV_U32 Len){ MV_U32 i, j; MV_U32 tmpAddr, tmpData, AddrEnd; MV_U8 *u8 = (MV_U8 *) Data; AddrEnd = Addr + Len; tmpAddr = ALIGN (Addr, 4); if (Addr > 0xFF) return -2; j = (Addr & (MV_BIT (2) - 1)); if (j > 0) { Odin_EEPRomR32 (pAI, tmpAddr, &tmpData); for (i = j; i < 4; i++) { ((MV_U8 *) & tmpData)[i] = *u8++; } Odin_EEPRomW32 (pAI, tmpAddr, tmpData); tmpAddr += 4; } j = ALIGN (AddrEnd, 4); for (; tmpAddr < j; tmpAddr += 4) { Odin_EEPRomW32 (pAI, tmpAddr, *((MV_U32 *) u8)); u8 += 4; } if (tmpAddr < AddrEnd) { Odin_EEPRomR32 (pAI, tmpAddr, &tmpData); Len = AddrEnd - tmpAddr; for (i = 0; i < Len; i++) { ((MV_U8 *) & tmpData)[i] = *u8++; } Odin_EEPRomW32 (pAI, tmpAddr, tmpData); } return 0;}intOdin_EEPRomReadBuf(AdapterInfo * pAI, MV_U32 Addr, void *Data, MV_U32 Len){ MV_U32 i, j; MV_U32 tmpAddr, tmpData, AddrEnd; MV_U8 *u8 = (MV_U8 *) Data; AddrEnd = Addr + Len; tmpAddr = ALIGN (Addr, 4); if (Addr > 0xFF) return -2; j = (Addr & (MV_BIT (2) - 1)); if (j > 0) { Odin_EEPRomR32 (pAI, tmpAddr, &tmpData); for (i = j; i < 4; i++) { *u8++ = ((MV_U8 *) & tmpData)[i]; } tmpAddr += 4; } j = ALIGN (AddrEnd, 4); for (; tmpAddr < j; tmpAddr += 4) { Odin_EEPRomR32 (pAI, tmpAddr, &tmpData); *((MV_U32 *) u8) = tmpData; u8 += 4; } if (tmpAddr < AddrEnd) { Odin_EEPRomR32 (pAI, tmpAddr, &tmpData); Len = AddrEnd - tmpAddr; for (i = 0; i < Len; i++) { *u8++ = ((MV_U8 *) & tmpData)[i]; } } return 0;}int Odin_NVRamWrite(AdapterInfo * pAI, MV_U8 ItemPos, void *Data, MV_U16 Len){ MV_U32 i; MV_U8 Hdr[2]; MV_U8 *u8 = (MV_U8 *) Data, cs; cs = NVRAM_ENTRY_ID; for (i = 0; i < Len; i++) cs += u8[i]; Hdr[0] = NVRAM_ENTRY_ID; Hdr[1] = 0 - cs; Odin_EEPRomWriteBuf (pAI, ItemPos, Hdr, 2); Odin_EEPRomWriteBuf (pAI, ItemPos + 2, Data, Len); return 0;}int Odin_NVRamRead(AdapterInfo * pAI, MV_U8 ItemPos, void *Data, MV_U16 Len){ MV_U32 i; MV_U8 Hdr[2]; MV_U8 *u8 = (MV_U8 *) Data, cs; Odin_EEPRomReadBuf (pAI, ItemPos, Hdr, 2); Odin_EEPRomReadBuf (pAI, ItemPos + 2, Data, Len); if (Hdr[0] != NVRAM_ENTRY_ID) return -1; cs = Hdr[0] + Hdr[1]; for (i = 0; i < Len; i++) cs += u8[i]; if (cs) return -2; return 0;}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?