📄 cs8900.c
字号:
#include "System.h"
#include "cs8900.h"
////////////////////////////////////////////////////////
// bank4 = 0x20000000
// cs8900 cs base address
// ADDR24 - high -> ioread/write
// ADDR24 - low --> mem read/write
////////////////////////////////////////////////////////
// io read/write base address
// = 0x20000000 + 0x01000000 (ADDR24 high) + 0x300 (cs8900 io base offset) = 0x21000300
//------------------------------------------------------
// memory read/write base address
// = 0x20000000 + 0x00000000 (ADDR24 low) = 0x20000000
////////////////////////////////////////////////////////
//#define CS8900_MEM_BASE 0x20000000 // CS4
#define CS8900_MEM_BASE 0x08000000 // CS1
#define CS8900_IO_OFFSET 0x1000300
#define CS8900_IO_BASE CS8900_MEM_BASE + CS8900_IO_OFFSET
#define SRAM_BASE 0x08000000 // CS1:0x0800_, CS5:0x2800_
#define IOREAD(o) ((unsigned short)*((volatile unsigned short *)(CS8900_IO_BASE + o)))
#define IOWRITE(o, d) *((volatile unsigned short*)(CS8900_IO_BASE + (o))) = (unsigned short)(d)
#define MEMREAD(o) ((unsigned short)*((volatile unsigned short *)(CS8900_MEM_BASE + (o))))
#define MEMWRITE(o, d) *((volatile unsigned short *)(CS8900_MEM_BASE + (o))) = (unsigned short)(d)
#define MAX_COUNT 0x100000
#define CS8900DBG_PROBE (1 << 0)
#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
//static unsigned char bIsPacket;
void Detect_CS8900(void);
void * func_cs8900_test[][2]=
{
// "12345678901234567890"
//Clock test
(void *)Detect_CS8900, "Detect CS8900 ",
0,0
};
void Test_CS8900(void)
{
int i;
// SMC configuration for CS8900. [CS4]
rSMBIDCYR1 = 0xf;
rSMBWSTRDR1 = 12; //14clk
rSMBWSTWRR1 = 12;
rSMBWSTOENR1 = 2;
rSMBWSTWENR1 = 2;
printf("rSMBCR=%x\n",rSMBCR1);
rSMBCR1 = rSMBCR1 & ~(3<<4) | (1<<15)|(1<<7)|(1<<4)|(1<<2)|(1);
// OE&WE delay 1,5&2 clk, CS delay 1clk, memory width 16bit, WaitEn, Read byte lane enable
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 (Press enter key 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");
}
static unsigned short ReadReg(unsigned short offset)
{
IOWRITE(IO_PACKET_PAGE_POINTER, offset);
return IOREAD(IO_PACKET_PAGE_DATA_0);
}
void Detect_CS8900(void)
{
unsigned short signature = 0;
unsigned short eisa_number = 0;
unsigned short prod_id = 0;
printf(" CS8900 Probe()\r\n");
rMISCCR &= ~(1<<16); // nRSTOUT is low
printf(" CS8900 reset low\n");
rMISCCR |= (1<<16); // nRSTOUT is high
printf(" CS8900 reset high\n");
TDelay(1000); // 1 sec.
rSMBCR1 = rSMBCR1 & ~(3<<4) | (1<<4); // memory width 16bit, WaitEn, Read byte lane enable
printf("rSMBCR1=%x\n",rSMBCR1);
signature = IOREAD(IO_PACKET_PAGE_POINTER); // correct...
signature = IOREAD(IO_PACKET_PAGE_POINTER); // correct...
READ_REG1(PKTPG_EISA_NUMBER);
READ_REG1(PKTPG_PRDCT_ID_CODE);
READ_REG1(PKTPG_DMA_CHANNEL_NUMBER);
READ_REG1(PKTPG_DMA_START_OF_FRAME);
signature = IOREAD(IO_PACKET_PAGE_POINTER); // correct...
printf("1 Signature[org] = 0x%x\r\n", signature);
if (signature != CS8900_SIGNATURE)
printf("Signature Error = 0x%x\r\n", signature); // 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); // 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);
printf("CS8900 is Detected..\n");
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -