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

📄 2440lib.c

📁 对SAMSUNG 2440所有外部端口的全功能测试,包括SD卡,USB,CAMERA,LCD,IIS,TIMER,RS232等等,是你理想的调试软件.
💻 C
📖 第 1 页 / 共 2 页
字号:
    rWTDAT = 0xffff;  //Watch-dog timer data register
    rWTCNT = 0xffff;  //Watch-dog count register

      // Watch-dog timer enable & interrupt  disable
    rWTCON = (rWTCON & ~(1<<5) & ~(1<<2)) |(1<<5);
}

//=================================================================
int Timer_Stop(void)
{
    rWTCON = ((PCLK/1000000-1)<<8);
    return (0xffff - rWTCNT);
}


//*************************[ MPLL ]*******************************
void ChangeMPllValue(int mdiv,int pdiv,int sdiv)
{
	//Led_Display(0x8);

    rMPLLCON = (mdiv<<12) | (pdiv<<4) | sdiv;
	//Led_Display(0x0);
}


//************************[ HCLK, PCLK ]***************************
/*
// for 2410.
void ChangeClockDivider(int hdivn,int pdivn)
{
     // hdivn,pdivn FCLK:HCLK:PCLK
     //     0,0         1:1:1 
     //     0,1         1:1:2 
     //     1,0         1:2:2
     //     1,1         1:2:4
    rCLKDIVN = (hdivn<<1) | pdivn;    

    if(hdivn)
        MMU_SetAsyncBusMode();
    else 
        MMU_SetFastBusMode();
}
*/
// Modified for 2440.
void ChangeClockDivider(int hdivn_val,int pdivn_val)
{
	int hdivn=2, pdivn=0;
	
     // hdivn_val (FCLK:HCLK)ratio hdivn
     // 11           1:1       (0)
     // 12           1:2       (1)
     // 13           1:3       (3) 
     // 14           1:4       (2)
     // pdivn_val (HCLK:PCLK)ratio pdivn
     // 11           1:1       (0)
     // 12           1:2       (1)
	switch(hdivn_val) {
		case 11: hdivn=0; break;
		case 12: hdivn=1; break;
		case 13:
		case 16: hdivn=3; break;
		case 14: 
		case 18: hdivn=2; break;
	}
	
	switch(pdivn_val) {
		case 11: pdivn=0; break;
		case 12: pdivn=1; break;
	}
	
	//Uart_Printf("Clock division change [hdiv:%x, pdiv:%x]\n", hdivn, pdivn);
	rCLKDIVN = (hdivn<<1) | pdivn;
	//Uart_Printf("rCLKDIVN:%x]\n", rCLKDIVN);

	switch(hdivn_val) {
		case 16:		// when 1, HCLK=FCLK/6.
			rCAMDIVN = (rCAMDIVN & ~(3<<8)) | (1<<8); 
		break; 
		case 18: 	// when 1, HCLK=FCLK/8.
			rCAMDIVN = (rCAMDIVN & ~(3<<8)) | (1<<9); 
		break;
	}
	//Uart_Printf("rCAMDIVN:%x]\n", rCAMDIVN);
	
    if(hdivn!=0)
        MMU_SetAsyncBusMode();
    else 
        MMU_SetFastBusMode();
}



//**************************[ UPLL ]*******************************
void ChangeUPllValue(int mdiv,int pdiv,int sdiv)
{
    rUPLLCON = (mdiv<<12) | (pdiv<<4) | sdiv;
}


//*************************[ General Library ]**********************
#if !USE_MAIN
void * malloc(unsigned nbyte) 
//Very simple; Use malloc() & free() like Stack
//void *mallocPt=Image$$RW$$Limit;
{
    void *returnPt = mallocPt;

    mallocPt = (int *)mallocPt+nbyte/4+((nbyte%4)>0); //To align 4byte

    if( (int)mallocPt > HEAPEND )
    {
        mallocPt = returnPt;
        return NULL;
    }
    return returnPt;
}

//-------------------------------------------------------------------
void free(void *pt)
{
    mallocPt = pt;
}
#endif


 void ChangeSromParameter(char bank, char minacc)  // only for Tacc
{
    int acc;

    //1000000/(hclk/1000000.)=Unit Period(ns)*1000
    acc = (int)(minacc*(HCLK/1000000.)/1000+0.5);	

    if(acc<=1)
		acc=0;    	
    else if(acc==2)
	 	acc=1;
    else if(acc==3)
	 	acc=2;
    else if(acc==4)
	 	acc=3;
    else if((5<acc)&&(acc<=6))
   		acc=4;
    else if((7<acc)&&(acc<=8))
	 	acc=5;
    else if((9<acc)&&(acc<=10))
   		acc=6;	
    else if(11<acc)
	 	acc=7;
	
    switch(bank)
    {
	  case 0 : rBANKCON0 |= (acc<<8); break;
	  case 1 : rBANKCON1 |= (acc<<8); break;
	  case 2 : rBANKCON2 |= (acc<<8); break;
	  case 3 : rBANKCON3 |= (acc<<8); break;
	  case 4 : rBANKCON4 |= (acc<<8); break;
	  case 5 : rBANKCON5 |= (acc<<8); break;
    }	
}


// each timing parameter's unit is nano second..
void ChangeSdramParameter(char bank_num, int minrc, int minrcd, int minrp, int refresh, int col_addr, int cl, char banksize)
{
    int rc, rcd, rp, rcnt, scan;

    //1000000/(hclk/1000000.)=Unit Period(ns)*1000
    rc = (int)(minrc*(HCLK/1000000.)/1000+0.5)-4;
    rcd = (int)(minrcd*(HCLK/1000000.)/1000+0.5)-2;
    rp = (int)(minrp*(HCLK/1000000.)/1000+0.5)-2;
	rcnt = (int)(2048+1-(HCLK/1000000.)*(refresh/1000.)+0.5);
	scan = col_addr-8;

	if (rc<0) rc=0; if (rc>3) rc = 3;
	if (rcd<0) rcd=0; if (rcd>2) rcd = 2;
	if (rp<0) rp=0; if (rp>2) rp = 2;
	if (cl==1) cl = 0;	
	switch(banksize)
	{
	case 2 : banksize = 4; break;
	case 4 : banksize = 5; break;
	case 8 : banksize = 6; break;
	case 16 : banksize = 7; break;
	case 32 : banksize = 0; break;
	case 64 : banksize = 1; break;
	default : banksize = 2; break; // 128MB/128MB
	}

//	Uart_Printf("rc=%d, rcd=%d, rp=%d, rcnt=%d, scan=%d, cl=%d, banksize=%d\n", rc, rcd, rp, rcnt, scan, cl, banksize);
	
    switch(bank_num)
    {
    case 0:
    case 6:
	default:
		rBANKCON6 = ( rBANKCON6 & ~((3<<15)|(0xf<<0)) ) | (3<<15)|(rcd<<2)|(scan); // SDRAM, Trcd, column address number
		rMRSRB6 = (rMRSRB6 & ~(3<<4)) | (cl<<4);
	break;
	case 1:
    case 7: // bank 7
		rBANKCON7 = ( rBANKCON7 & ~((3<<15)|(0xf<<0)) ) | (3<<15)|(rcd<<2)|(scan); // SDRAM, Trcd, column address number
		rMRSRB7 = (rMRSRB7 & ~(3<<4)) | (cl<<4);
	break;
    }	
	rREFRESH = (rREFRESH & ~(0x3f<<18)) | (1<<23)|(0<<22)|(rp<<20)|(rc<<18)|(rcnt); // refresh enable, auto refresh, Trp, Trc, Refresh counter
	rBANKSIZE = (rBANKSIZE & ~(7<<0)) | (banksize); // SCLK power save mode, 128/128 bank
	
}

void Max1718_Set(int voltage)
{

     int vtg;
	//////////////////////////////////////////////
	//   D4    D3  D2   D1     D0
	//	0	 1	0 	0	 0		// 1.35V
	//	0	 1	0 	0	 1		// 1.30V
	//	0	 1	0 	1	 0		// 1.25V
	//	0	 1	0 	1	 1		// 1.20V
	//	0	 1	1 	0	 0		// 1.15V
	//	0	 1	1 	0	 1		// 1.10V
	//	0	 1	1 	1	 0		// 1.05V
	//	0	 1	1 	1	 1		// 1.00V
	//	1	 0	0 	0	 1		// 0.95V
	//	1	 0	0 	1	 1		// 0.90V
	//	1	 0	1 	0	 1		// 0.85V
	//	1	 0	1 	1	 1		// 0.80V
	
    vtg=voltage;
	rGPBCON = (rGPBCON&~((3<<20) |(3<<16) |(3<<14))) | (1<<20) | (1<<16) | (1<<14);
	// GPB7, 8, 10 : Output
	rGPFCON=(rGPFCON&~(0xff<<8))|(0x55<<8);  // GPF4~7: Output , shared with LED4~7

     switch (vtg)
	{
	case 135:
		 rGPBDAT=(rGPBDAT&~(1<<7)) |(0<<7);	//D4
	      rGPFDAT=(rGPFDAT&~(0xf<<4))|(1<<7)|(0<<6)|(0<<5)|(0<<4);	//D3~0
	      break;

	
	case 130:
		 rGPBDAT=(rGPBDAT&~(1<<7)) |(0<<7);	//D4
		 rGPFDAT=(rGPFDAT&~(0xf<<4))|(1<<7)|(0<<6)|(0<<5)|(1<<4); //D3~0
		 break;
       
	case 125:
		 rGPBDAT=(rGPBDAT&~(1<<7)) |(0<<7);	//D4
		 rGPFDAT=(rGPFDAT&~(0xf<<4))|(1<<7)|(0<<6)|(1<<5)|(0<<4); //D3~0
		break;

	case 120:
		 rGPBDAT=(rGPBDAT&~(1<<7)) |(0<<7);	//D4
		 rGPFDAT=(rGPFDAT&~(0xf<<4))|(1<<7)|(0<<6)|(1<<5)|(1<<4); //D3~0
		 break;

	case 115:
		 rGPBDAT=(rGPBDAT&~(1<<7)) |(0<<7);	//D4
		 rGPFDAT=(rGPFDAT&~(0xf<<4))|(1<<7)|(1<<6)|(0<<5)|(0<<4); //D3~0
		 break;

	case 110:
		 rGPBDAT=(rGPBDAT&~(1<<7)) |(0<<7);	//D4
		 rGPFDAT=(rGPFDAT&~(0xf<<4))|(1<<7)|(1<<6)|(0<<5)|(1<<4); //D3~0
		 break;

	case 105:
		 rGPBDAT=(rGPBDAT&~(1<<7)) |(0<<7);	//D4
		 rGPFDAT=(rGPFDAT&~(0xf<<4))|(1<<7)|(1<<6)|(1<<5)|(0<<4); //D3~0
		 break;

	case 100:
		 rGPBDAT=(rGPBDAT&~(1<<7)) |(0<<7);	//D4
		 rGPFDAT=(rGPFDAT&~(0xf<<4))|(1<<7)|(1<<6)|(1<<5)|(1<<4); //D3~0
		break;

	case 95:
		 rGPBDAT=(rGPBDAT&~(1<<7)) |(1<<7);	//D4
		 rGPFDAT=(rGPFDAT&~(0xf<<4))|(0<<7)|(0<<6)|(0<<5)|(1<<4); //D3~0
		 break;

	case 90:
		 rGPBDAT=(rGPBDAT&~(1<<7)) |(1<<7);	//D4
		 rGPFDAT=(rGPFDAT&~(0xf<<4))|(0<<7)|(0<<6)|(1<<5)|(1<<4); //D3~0
		 break;

	case 85:
		 rGPBDAT=(rGPBDAT&~(1<<7)) |(1<<7);	//D4
		rGPFDAT=(rGPFDAT&~(0xf<<4))|(0<<7)|(1<<6)|(0<<5)|(1<<4); //D3~0
		 break;

      	case 80:
		 rGPBDAT=(rGPBDAT&~(1<<7)) |(1<<7);	//D4
	       rGPFDAT=(rGPFDAT&~(0xf<<4))|(0<<7)|(1<<6)|(1<<5)|(1<<4); //D3~0
		 break;

       default:	// 1.2V
		 rGPBDAT=(rGPBDAT&~(1<<7)) |(0<<7);	//D4
		 rGPFDAT=(rGPFDAT&~(0xf<<4))|(1<<7)|(0<<6)|(1<<5)|(1<<4); //D3~0
		 break;

		
	}
		 
	rGPBDAT&=~(1<<8);   //Latch enable
	rGPBDAT|=(1<<10);   //Output enable
	rGPBDAT|=(1<<8);	 //Latch disable

}

void LCD_CS(unsigned char ONOFF) //YOYO
{
	rGPBCON &=0xffc3ff;
	rGPBCON |=(1<<10)|(1<<12); //LCD_CS output mode
	rGPBUP &=~((1<<5)|(1<<6));  //LCD_CS pull up enable
	//rGPBUP |=(1<<5);
	if(ONOFF)
		{
			rGPBDAT |=(1<<5);   //GPB5=1 
			rGPBDAT |=(1<<6);   //GPB5=1 
		}
	else
		{
			rGPBDAT &=~(1<<5); //GPB5=0
			rGPBDAT &=~(1<<6); //GPB5=0
		}
}
void LCD_SPI_Init(void) //YOYO
{
	rGPECON=((rGPECON&0xf03fffff)|0xa800000); // using SPI 0
	rGPEUP = (rGPEUP & ~(7<<11)) | (1<<13); 
	//rGPGCON=((rGPGCON&0xffffffcf)|0x10); // Master(GPIO_Output)
       
	 rSPPRE0=0x0;	//if PCLK=50Mhz,SPICLK=25Mhz
//    rSPCON0=(2<<5)|(0<<4)|(0<<3)|(1<<2)|(0<<1)|(0<<0);//Polling,dis-SCK,slave,low,A,normal
    rSPCON0=(0<<5)|(1<<4)|(1<<3)|(1<<2)|(1<<1)|(0<<0);//Polling,en-SCK,master,low,B,normal
    rSPPIN0=(0<<2)|(1<<1)|(0<<0);//dis-ENMUL,SBO,release
}
void LCD_SPI_Send(void)
{
	int Len,i;
	char aa;
	
	Len=Comm_Len;
	SPITxOK=0;

	rGPECON=((rGPECON&0xf03fffff)|0xa800000); // using SPI 0
	rGPEUP = (rGPEUP & ~(7<<11));// | (1<<13); 
	//rGPGCON=((rGPGCON&0xffffffcf)|0x10); // Master(GPIO_Output)
    rSPPRE0=0x15;	//if PCLK=50Mhz,SPICLK=25Mhz
    rSPCON0=(0<<5)|(1<<4)|(1<<3)|(1<<2)|(1<<1)|0;//Poll,en-SCK,master,low,B,normal
    rSPPIN0=(0<<2)|(1<<1)|(0<<0);//dis-ENMUL,SBO,release(drive the previous level)
    aa=rSPRDAT0;
    while(SPITxOK==0)
    {
		if(rSPSTA0&0x1)   //Check Tx ready state    
		{
	    	 if(Comm_Len != 0) 
    		{
    			rSPTDAT0=Comm_Save[Comm_Loc];
    			Comm_Loc++;
    			Comm_Len--;
   			}
    		else
    		{
	    		SPITxOK=1;
    		} 
		}
    }

	rSPPIN0=(0<<2)|(1<<1)|(0<<0);//dis-ENMUL,SBO,release
    rSPCON0&=~(1<<4);//dis-SCK

	//for(i=0;i<Len;i++)
    //	Uart_Printf("Loc: %d Content: 0x%x ;",i,(unsigned int)Comm_Save[i]);
	//Uart_Printf("\n");
}

void LCD_WRITE_COMMAND(char LCD_Reg,unsigned int LCD_command )
{
	unsigned int data;
	char temp;

	//LCD_CS(0);
	//while(!(rSPSTA0&0x1)); // Tx is done
	//	rSPTDAT0=0x74;  //Set Index Register
	//while(!(rSPSTA0&0x1)); // Tx is done
	//	rSPTDAT0=0x0;    //Register upper 8 bit
	//while(!(rSPSTA0&0x1)); // Tx is done
	//	rSPTDAT0=LCD_Reg;    //Register Lower 8 bit	
	//LCD_CS(1);
	//Delay(20);
	
	//LCD_CS(0);
	//while(!(rSPSTA0&0x1)); // Tx is done
	//	rSPTDAT0=0x76;   //Write Instruction
	//data=LCD_command;
	//temp =(char)((data&0xff00)>>8);
	
	//while(!(rSPSTA0&0x1)); // Tx is done
	//	rSPTDAT0=temp;
	//data=LCD_command;
	//temp =(char)(data&0xff);	
	//while(!(rSPSTA0&0x1)); // Tx is done
	//	rSPTDAT0=temp;
	//LCD_CS(1);
	//Delay(20);
	Comm_Loc=0;
	Comm_Len=0;
	Comm_Save[Comm_Len]=0x74;
	Comm_Len++;
	Comm_Save[Comm_Len]=0x0;
	Comm_Len++;
	Comm_Save[Comm_Len]=LCD_Reg;
	Comm_Len++;

	LCD_CS(0);
	Delay(6);
	LCD_SPI_Send();
	LCD_CS(1);
	Delay(6);

	Comm_Loc=0;
	Comm_Len=0;
	Comm_Save[Comm_Len]=0x76;
	Comm_Len++;
	data=LCD_command;
	temp =(char)((data&0xff00)>>8);
	Comm_Save[Comm_Len]=temp;
	Comm_Len++;
	data=LCD_command;
	temp =(char)(data&0xff);
	Comm_Save[Comm_Len]=temp;
	Comm_Len++;
	LCD_CS(0);
	Delay(6);
	LCD_SPI_Send();
	LCD_CS(1);
	Delay(6);
}
void LCD_POWER_ON(unsigned int SYNC_DE)
{
	Comm_Len=0;
	//LCD_SPI_Init();
	Delay(100);  //5ms
	//Uart_Printf("Delay 5ms\n");

	
	LCD_WRITE_COMMAND(0x9,0x0); //R9<--0000
	Delay(300); //20ms
	//Uart_Printf("Delay 20ms\n");
	
	LCD_WRITE_COMMAND(0x9,0x4000); //R9<--4000h
	LCD_WRITE_COMMAND(0x0a,0x2000); //R0A<--2000h
	//Delay(300);
	//Uart_Printf("Delay 10ms\n");
	LCD_WRITE_COMMAND(0x9,0x4055); //R9<--4055h
	Delay(700); //70ms
	//Uart_Printf("Delay 70ms\n");
	if(SYNC_DE)
		LCD_WRITE_COMMAND(0x1,0x609d); //R1<--409dh  //SYNC Mode 409d ,DE 609d
	else
		LCD_WRITE_COMMAND(0x1,0x409d); //R1<--409dh  //SYNC Mode 409d ,DE 609d
	Delay(20);
	LCD_WRITE_COMMAND(0x2,0x0204); //R2<--0204h
	if(SYNC_DE)
		LCD_WRITE_COMMAND(0x3,0x0100); //R3<--0100h ;0000
	else
		LCD_WRITE_COMMAND(0x3,0x0100); //R3<--0100h ;0000
	LCD_WRITE_COMMAND(0x4,0x3000); //R4<--3000h
	LCD_WRITE_COMMAND(0x5,0x4003); //R5<--4003h
	if(SYNC_DE)
		{
			LCD_WRITE_COMMAND(0x6,0); //R6<--000ah //VBP
			LCD_WRITE_COMMAND(0x7,0x0000); //R7<--0021h
		}
	else
		{
			LCD_WRITE_COMMAND(0x6,0x0a); //R6<--000ah //VBP
			LCD_WRITE_COMMAND(0x7,0x21); //R7<--0021h
		}
	
	LCD_WRITE_COMMAND(0x8,0x0c00); //R8<--0c00h
	
	LCD_WRITE_COMMAND(0x10,0x0103); //R10<--0103h
	LCD_WRITE_COMMAND(0x11,0x0301); //R11<--0301h
	LCD_WRITE_COMMAND(0x12,0x1f0f); //R12<--1f0fh
	LCD_WRITE_COMMAND(0x13,0x1f0f); //R13<--1f0fh
	LCD_WRITE_COMMAND(0x14,0x0707); //R14<--0707h
	LCD_WRITE_COMMAND(0x15,0x0307); //R15<--0307h
	LCD_WRITE_COMMAND(0x16,0x0707); //R16<--0707h
	LCD_WRITE_COMMAND(0x17,0x0000); //R17<--0000h
	LCD_WRITE_COMMAND(0x18,0x0004); //R18<--0004h
	LCD_WRITE_COMMAND(0x19,0x0000); //R19<--0000h
	
	Delay(700); //>2 frames
	//Uart_Printf("Delay 300ms\n");
	
	LCD_WRITE_COMMAND(0x9,0x4a55); //R9<--4A55h
	Delay(100);
	LCD_WRITE_COMMAND(0x5,0x5003); //R5<--5003h
	Delay(100);
	//Uart_Printf("Delay 100ms\n");
	//LCD_CS(1);
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -