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

📄 cs8900.c

📁 三星2443芯片
💻 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 + -