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 + -
显示快捷键?