📄 cs8900.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 + -