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

📄 cs8900.c

📁 Samsung S3C2443 Test program source code
💻 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 + -