⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cs8900.c

📁 三星2413芯片的测试代码,对进行驱动开发很有帮助.
💻 C
字号:

#include <stdio.h>
#include <stdlib.h>
#include "Console.h"
#include "2413addr.h"
#include "def.h"
#include "cs8900.h"

#define V14

#define PUBLIC
#define PRIVATE						static

#ifdef V14
#define IOREAD(o)					((unsigned short)*((volatile unsigned short *)(dwEthernetIOBase + (o))))
#define IOWRITE(o, d)				*((volatile unsigned short*)(dwEthernetIOBase + (o))) = (unsigned short)(d)
#else
#define IOREAD(o)					((unsigned short)*((volatile unsigned short *)(dwEthernetIOBase + (o<<1))))
#define IOWRITE(o, d)				*((volatile unsigned short*)(dwEthernetIOBase + (o<<1))) = (unsigned short)(d)
#endif


#define MEMREAD(o)					((unsigned short)*((volatile unsigned short *)(dwEthernetMemBase + (o))))
#define MEMWRITE(o, d)				*((volatile unsigned short *)(dwEthernetMemBase + (o))) = (unsigned short)(d)


//#define DBGMSG						EdbgOutputDebugString
#define MAX_COUNT					0x100000

#define CS8900DBG_PROBE				(1 << 0)

PRIVATE unsigned int dwEthernetIOBase;
PRIVATE unsigned int dwEthernetMemBase;


#define CS8900_MEM_MODE

#ifdef	CS8900_MEM_MODE

#define READ_REG1					ReadReg
#define READ_REG2					MEMREAD

#define WRITE_REG1					WriteReg
#define WRITE_REG2					MEMWRITE

#else

#define READ_REG1					ReadReg
#define READ_REG2					ReadReg

#define WRITE_REG1					WriteReg
#define WRITE_REG2					WriteReg

#endif


PRIVATE	unsigned char bIsPacket;

void Detect_CS8900(void);



void * func_cs8900_test[][2]=
{	
    //        				"123456789012345678"
    //Clock test
    (void *)Detect_CS8900,			"Detect CS8900   ",
    0,0
};

void Ch34_CS8900_Test(void)
{
    int i;

	rBANK_CFG &= ~((1<<4)|(1<<5)); 		// ebi set for SROM
	
	
	rSMBIDCYR5 = 0;
	rSMBWSTWRR5= 14;
	rSMBWSTOENR5=2;
	rSMBWSTWENR5=2;
	
	rSMBWSTRDR5 = 14;  //14clk
	rSMBCR5 |= ((1<<2)|(1<<0));
	//rSMBCR5 |= ((1<<2));
	rSMBCR5 &= ~((3<<20)|(3<<20)|(3<<12));
	rSMBCR5 &= ~(3<<4);
	rSMBCR5 |= (1<<4);
	
	printf("rSMBCR=%x\n",rSMBCR5);


    printf("\nPower mode test.\n");

    while(1)
    {
	i=0;
	printf("\n\n");
	while(1)
	{   //display menu
	    printf("%2d:%s",i,func_cs8900_test[i][1]);
	    i++;
	    if((int)(func_cs8900_test[i][0])==0)
	    {
		printf("\n");
		break;
	    }
	    if((i%3)==0)
	    printf("\n");
	}

	printf("\nSelect (\"-1\" to exit) : ");
	i = GetIntNum();
	if(i==-1) 
	    break;		// return.
	if(i>=0 && (i<((sizeof(func_cs8900_test)-1)/8)) )	// select and execute...
	    ( (void (*)(void)) (func_cs8900_test[i][0]) )();
    }
    printf("\nCS8900_Test program end.\n");
}



PRIVATE unsigned short 
ReadReg(unsigned short offset)
{
	IOWRITE(IO_PACKET_PAGE_POINTER, offset);
	return IOREAD(IO_PACKET_PAGE_DATA_0);
}

PRIVATE void 
WriteReg(unsigned short offset, unsigned short data)
{
	IOWRITE(IO_PACKET_PAGE_POINTER, offset);
	IOWRITE(IO_PACKET_PAGE_DATA_0 , data);
}

void Detect_CS8900(void)
{
	unsigned int iobase = 0;
	unsigned int membase = 0;
	unsigned short signature;
	unsigned short eisa_number;
	unsigned short prod_id;

	unsigned char r = FALSE;

	////////////////////////////////////////////////////////
	// bank1 = 0x04000000
	// cs8900 cs base address 
	// ADDR24 - high -> ioread/write
	// ADDR24 - low --> mem read/write
	////////////////////////////////////////////////////////
	// io read/write base address 
	// = 0x04000000 + 0x01000000 (ADDR24 high) + 0x300 (cs8900 io base offset) = 0x05000300
	//------------------------------------------------------
	// memory read/write base address 
	// = 0x04000000 + 0x00000000 (ADDR24 low) = 0x04000000
	////////////////////////////////////////////////////////
	

#ifdef V14	
	iobase = 0x29000300;
	membase = 0x28000000;
#else
	iobase = 0x2a000600;
	membase = 0x28000000;
#endif	
	
	printf(" CS8900 Probe()\r\n");

	dwEthernetIOBase  = iobase;
	dwEthernetMemBase = membase;
	
	//*(unsigned char *)0x28000000 = 0;
/*
	printf(" CS2\n");
	signature = IOREAD(IO_PACKET_PAGE_POINTER);
    getchar();
	
	printf(" CS1\n");
*/
	do 
	{
		signature = IOREAD(IO_PACKET_PAGE_POINTER);
		printf("Signature = 0x%x\r\n", signature);
		
		//signature = *((volatile unsigned char *)0x29000301);
		//printf("Signature2 = 0x%x\r\n", signature);
		
		if (signature != CS8900_SIGNATURE)
				{
			printf("Signature Error = 0x%x\r\n", signature);
			//break;
		}
											/* Check the EISA registration number.	*/
		eisa_number = READ_REG1(PKTPG_EISA_NUMBER);
		printf("Eisa Number = 0x%x\r\n", eisa_number);
		if (eisa_number != CS8900_EISA_NUMBER)
		{
			printf("Eisa Number Error = 0x%x\r\n", eisa_number);
			break;
		}
											/* Check the Product ID.				*/
		prod_id = READ_REG1(PKTPG_PRDCT_ID_CODE);
		printf("Product ID = 0x%x\r\n", prod_id);
		if (( prod_id & CS8900_PRDCT_ID_MASK)!= CS8900_PRDCT_ID)
		{
			printf("Product ID Error = 0x%x\r\n", prod_id);
			break;
		}
	   
		printf("CS8900 is Detected..\n");
		r = TRUE;
	} while (0);

	//return r;
}





⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -