www.pudn.com > s3c2443_test_code.zip > 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"); 
}