📄 cs8900.c
字号:
#include <stdio.h>
#include <stdlib.h>
#include "2443addr.h"
#include "System.h"
#include "Console.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 SROMC
#define SMC
#ifdef SMC
#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)
#else
#define IOREAD(o) ((unsigned short)*((volatile unsigned short *)((CS8900_MEM_BASE + ((CS8900_IO_OFFSET+o)>>1 & ~(1)) ))))
#define IOWRITE(o, d) *((volatile unsigned short*)(CS8900_MEM_BASE + ((CS8900_IO_OFFSET+o)>>1 & ~(1)))) = (unsigned short)(d)
#endif
#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 Test_SRAM(void);
void Mem_RW_test(unsigned int StartAddr, unsigned EndAddr, int Print_msg);
void * func_cs8900_test[][2]=
{
// "12345678901234567890"
//Clock test
(void *)Detect_CS8900, "Detect CS8900 ",
(void *)Test_SRAM, "SRAM R/W test ",
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);
}
static void WriteReg(unsigned short offset, unsigned short data)
{
IOWRITE(IO_PACKET_PAGE_POINTER, offset);
IOWRITE(IO_PACKET_PAGE_DATA_0 , data);
}
// chapter5-2 SROMC
#define rSROM_BW (*(volatile unsigned *)0x4F080000)
#define rSROM_BC1 (*(volatile unsigned *)0x4F080008)
#define rSROM_BC4 (*(volatile unsigned *)0x4F080014)
#define rROMSEL (*(volatile unsigned *)0x4E80000C)
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.
#ifdef SROMC
rSROM_BW |= (1<<19)|(1<<18)|(1<<16);
rSROM_BC4 |= (4<<28)|(4<<24)|(4<<16)|(4<<12)|(4<<8);
rROMSEL |= (1<<4);
#endif
/*
signature = IOREAD(0x4); // 0xff00.. why???
printf("0 Signature[org] = 0x%x\r\n", signature);
rSMBCR1 = rSMBCR1 & ~(3<<4) | (0<<4); // memory width 8bit, WaitEn, Read byte lane enable
signature = IOREAD(0x4); // 0xff00.. why???
printf("0 Signature[org] = 0x%x\r\n", signature);
rSMBCR1 = rSMBCR1 & ~(3<<4) | (2<<4); // memory width 32bit, WaitEn, Read byte lane enable
// signature = IOREAD(0x4); // 0xff00.. why???
// printf("1 Signature[org] = 0x%x\r\n", signature);
*/
// rSMBCR1 = rSMBCR1 & ~(3<<4) | (0<<4); // memory width 16bit, WaitEn, Read byte lane enable
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...
// printf("0x%x\r\n", signature);
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");
}
void Test_SRAM(void)
{
unsigned short signature = 0;
printf("\n Set CFG2 as SRAM!! - CS1\r\n");
printf("\n SRAM Probe!! \r\n");
rSMBCR1 = rSMBCR1 & ~(3<<4) | (1<<4)|(0<<2)|(1); // memory width 16bit, WaitDis, Read byte lane enable
#ifdef SROMC
rSROM_BW |= (1<<7)|(0<<6)|(1<<4); // Byte en, Wait en, BW
rSROM_BC1 |= (4<<28)|(4<<24)|(4<<16)|(4<<12)|(4<<8);
rROMSEL |= (1<<1); // SROM : 1, SSMC : 0
#endif
signature = ((unsigned short)*((volatile unsigned short *)(SRAM_BASE))); // correct...
rSMBCR1 = rSMBCR1 & ~(3<<4) | (1<<4); // memory width 16bit, WaitEn, Read byte lane enable
*((short *)0x8000008) = 0x0123;
*((short *)0x800000a) = 0x4567;
*((short *)0x8000004) = 0x89ab;
*((short *)0x8000006) = 0xcdef;
printf("rSMBCR1=%x\n",rSMBCR1);
rSMBCR1 = rSMBCR1 & ~(3<<4) | (0<<4); // memory width 16bit, WaitEn, Read byte lane enable
// signature = ((unsigned short)*((volatile unsigned short *)(SRAM_BASE + 0x4))); // correct...
// printf("1 Signature[org] = 0x%x\r\n", signature);
rSMBCR1 = rSMBCR1 & ~(3<<4) | (2<<4); // memory width 16bit, WaitEn, Read byte lane enable
// signature = ((unsigned short)*((volatile unsigned short *)(SRAM_BASE + 0x4))); // correct...
// printf("0 Signature[org] = 0x%x\r\n", signature);
rSMBCR1 = rSMBCR1 & ~(3<<4) | (1<<4); // memory width 16bit, WaitEn, Read byte lane enable
signature = ((unsigned short)*((volatile unsigned short *)(SRAM_BASE + 0x4))); // correct...
printf("2 Signature[org] = 0x%x\r\n", signature);
rSMBCR1 = rSMBCR1 & ~(3<<4) | (1<<4); // memory width 16bit, WaitEn, Read byte lane enable
signature = ((unsigned short)*((volatile unsigned short *)(SRAM_BASE + 0xa))); // correct...
printf("2 Signature[org] = 0x%x\r\n", signature);
printf("SRAM R/W test end..\n");
}
void Mem_RW_test(unsigned int StartAddr, unsigned EndAddr, int Print_msg)
{
unsigned int addr=0, indata, src_data, i;
unsigned int error;
static int offset=0;
unsigned short jump_offset=1;
//printf("Check: SRAM Area must be in non-cacheable area!\n");
//printf("SRAM W/R test[%xh-%xh], R/W offset[%d]\n", SRAM_SADDR, EndAddr-1, offset);
// for(i=0; i<3; i++) { // 8/16/32-bit.
for(i=2; i<3; i++) { // 8/16/32-bit.
if(i==0) jump_offset=1;
else if(i==1) jump_offset=2;
else if(i==2) jump_offset=4;
///////////////////// Clear Source/Target ////////////////////
//printf("Clear data.\n");
for(addr=0; (StartAddr+addr)<EndAddr; addr+=4) {
*(unsigned int *)(StartAddr+addr) = 0x0;
if(!(addr%(4*1024))) {
//printf("\b\b\b\b\b\b\b\b\b\b%10x", SRAM_SADDR+addr);
}
}
//printf("\b\b\b\b\b\b\b\b\b\b%10x\n", SRAM_SADDR+addr);
///////////////////// Write ////////////////////
//printf("Write data[%x-%x].\n", SRAM_SADDR, EndAddr);
if(Print_msg) printf("%d-bit data write.", jump_offset*8);
if(Print_msg) printf("ADDR:%8x", StartAddr);
Led_Display(0x1);
for(addr=0; (StartAddr+addr)<EndAddr; addr+=jump_offset) {
src_data = addr+offset;
switch(jump_offset) {
case 1:
*(unsigned char *)(StartAddr+addr) = src_data;
break;
case 2:
*(unsigned short *)(StartAddr+addr) = src_data;
break;
case 4:
*(unsigned int *)(StartAddr+addr) = src_data;
break;
}
if(!(addr%(4*1024))) {
if(Print_msg) printf("\b\b\b\b\b\b\b\b%8x", StartAddr+addr);
}
}
if(Print_msg) printf("\b\b\b\b\b\b\b\b%8x ", StartAddr+addr);
///////////////////// Verify //////////////////////
//printf("Verify[%x-%x].\n", SRAM_SADDR, EndAddr);
if(Print_msg) printf("Verify...");
if(Print_msg) printf("ADDR:%8x", StartAddr);
Led_Display(0x2);
for(error=0, addr=0; (StartAddr+addr)<EndAddr; addr+=jump_offset) {
switch(jump_offset) {
case 1:
src_data = (unsigned char)(addr+offset);
indata = *(unsigned char *)(StartAddr+addr);
break;
case 2:
src_data = (unsigned short)(addr+offset);
indata = *(unsigned short *)(StartAddr+addr);
break;
case 4:
src_data = (unsigned int)(addr+offset);
indata = *(unsigned int *)(StartAddr+addr);
break;
}
if(!(addr%(4*1024))) {
if(Print_msg) printf("\b\b\b\b\b\b\b\b%8x", StartAddr+addr);
}
if(indata != src_data) {
error++;
//printf("%xH[W:%x, R:%x]\n", addr, src_data, indata);
}
}
if(Print_msg) printf("\b\b\b\b\b\b\b\b%8x ", StartAddr+addr);
if(error!=0) {
if(Print_msg) printf("ERROR(%d)...\n\n", error);
} else {
if(Print_msg) printf("OK!\n");
//printf(".");
}
Led_Display(0xf);
}
offset++;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -