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

📄 2440lib.c

📁 2440 开发板的测试程序。包括uart,iic,lcd
💻 C
📖 第 1 页 / 共 3 页
字号:
//===================================================================
// File Name : 2440lib.c
// Function  : S3C2410 PLL,Uart, LED, Port Init
// Date 	 : March 20, 2002
// Version   : 0.0
// History
//   0.0 : Programming start (February 20,2002) -> SOP
//===================================================================

#include "def.h"
#include "option.h"
#include "2440addr.h"
#include "2440lib.h"
#include "2440slib.h" 

#include <stdarg.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <ctype.h>

extern char Image$$RW$$Limit[];
void* mallocPt = Image$$RW$$Limit;

//***************************[ SYSTEM ]***************************************************
void Delay( int time )
{
	U32 val = ( PCLK >> 3 ) / 1000 - 1;

	rTCFG0 &= ~( 0xff << 8 );
	rTCFG0 |= 3 << 8;			//prescaler = 3+1
	rTCFG1 &= ~( 0xf << 12 );
	rTCFG1 |= 0 << 12;		//mux = 1/2

	rTCNTB3 = val;
	rTCMPB3 = val >> 1;		// 50%
	rTCON &= ~( 0xf << 16 );
	rTCON |= 0xb << 16;		//interval, inv-off, update TCNTB3&TCMPB3, start timer 3
	rTCON &= ~( 2 << 16 );		//clear manual update bit
	while ( time-- )
	{
		while ( rTCNTO3 >= val >> 1 );
		while ( rTCNTO3 < val >> 1 );
	};
}

//***************************[ PORTS ]****************************************************
void Port_Init0( void )
{
	//CAUTION:Follow the configuration order for setting the ports. 
	// 1) setting value(GPnDAT) 
	// 2) setting control register  (GPnCON)
	// 3) configure pull-up resistor(GPnUP)  

	//32bit data bus configuration  
	//*** PORT A GROUP
	//Ports  : GPA22 GPA21  GPA20 GPA19 GPA18 GPA17 GPA16 GPA15 GPA14 GPA13 GPA12  
	//Signal : nFCE nRSTOUT nFRE   nFWE  ALE   CLE  nGCS5 nGCS4 nGCS3 nGCS2 nGCS1 
	//Binary :  1     1 	 1  , 1   1   1    1   ,  1 	1     1 	1
	//Ports  : GPA11   GPA10  GPA9   GPA8   GPA7   GPA6   GPA5   GPA4   GPA3   GPA2   GPA1  GPA0
	//Signal : ADDR26 ADDR25 ADDR24 ADDR23 ADDR22 ADDR21 ADDR20 ADDR19 ADDR18 ADDR17 ADDR16 ADDR0 
	//Binary :  1   	1      1	  1   , 1   	1      1	  1   ,  1  	 1     1	  1 		
	rGPACON = 0x7fffff; 

	//**** PORT B GROUP
	//Ports  : GPB10	GPB9	GPB8	GPB7	GPB6	 GPB5    GPB4   GPB3   GPB2 	GPB1	  GPB0
	//Signal : nXDREQ0 nXDACK0 nXDREQ1 nXDACK1 nSS_KBD nDIS_OFF L3CLOCK L3DATA L3MODE nIrDATXDEN Keyboard
	//Setting: INPUT  OUTPUT   INPUT  OUTPUT   INPUT   OUTPUT   OUTPUT OUTPUT OUTPUT   OUTPUT    OUTPUT 
	//Binary :   00  ,  01  	 00  ,   01 	 00   ,  01 	  01  ,   01	 01   ,  01 	   01  
	rGPBCON = 0x044555;
	rGPBUP = 0x7ff; 	// The pull up function is disabled GPB[10:0]

	//*** PORT C GROUP
	//Ports  : GPC15 GPC14 GPC13 GPC12 GPC11 GPC10 GPC9 GPC8  GPC7   GPC6   GPC5 GPC4 GPC3  GPC2  GPC1 GPC0
	//Signal : VD7   VD6   VD5   VD4   VD3   VD2   VD1  VD0 LCDVF2 LCDVF1 LCDVF0 VM VFRAME VLINE VCLK LEND  
	//Binary :  10   10  , 10    10  , 10    10  , 10   10  , 10	 10  ,  10   10 , 10	 10 , 10   10
	rGPCCON = 0xaaaaaaaa;   	
	rGPCUP = 0xffff;	 // The pull up function is disabled GPC[15:0] 

	//*** PORT D GROUP
	//Ports  : GPD15 GPD14 GPD13 GPD12 GPD11 GPD10 GPD9 GPD8 GPD7 GPD6 GPD5 GPD4 GPD3 GPD2 GPD1 GPD0
	//Signal : VD23  VD22  VD21  VD20  VD19  VD18  VD17 VD16 VD15 VD14 VD13 VD12 VD11 VD10 VD9  VD8
	//Binary : 10    10  , 10    10  , 10    10  , 10   10 , 10   10 , 10   10 , 10   10 ,10   10
	rGPDCON = 0xaaaaaaaa;   	
	rGPDUP = 0xffff;	 // The pull up function is disabled GPD[15:0]

	//*** PORT E GROUP
	//Ports  : GPE15  GPE14 GPE13   GPE12   GPE11   GPE10   GPE9	GPE8	 GPE7  GPE6  GPE5   GPE4  
	//Signal : IICSDA IICSCL SPICLK SPIMOSI SPIMISO SDDATA3 SDDATA2 SDDATA1 SDDATA0 SDCMD SDCLK IN 
	//Binary :  10     10  ,  10	  10  ,  10 	 10   ,  10 	 10   ,   10	10  , 10	 00  ,     
	//-------------------------------------------------------------------------------------------------------
	//Ports  :  GPE3   GPE2  GPE1    GPE0    
	//Signal :  IN     IN    IN 	 IN  
	//Binary :  00     00  ,  00	  00 
	//rGPECON = 0xaaaaaaaa; 	  
	//rGPEUP  = 0xffff; 	// The pull up function is disabled GPE[15:0]
	rGPECON = 0xaaaaa800; // For added AC97 setting 	 
	rGPEUP = 0xffff;	 

	//*** PORT F GROUP
	//Ports  : GPF7   GPF6   GPF5   GPF4	  GPF3     GPF2  GPF1   GPF0
	//Signal : nLED_8 nLED_4 nLED_2 nLED_1 nIRQ_PCMCIA EINT2 KBDINT EINT0
	//Setting: Output Output Output Output    EINT3    EINT2 EINT1  EINT0
	//Binary :  01  	01 ,  01	 01  ,     10   	10  , 10	 10
	rGPFCON = 0x55aa;
	rGPFUP = 0xff;     // The pull up function is disabled GPF[7:0]

	//*** PORT G GROUP
	//Ports  : GPG15 GPG14 GPG13 GPG12 GPG11	GPG10    GPG9     GPG8     GPG7 	 GPG6    
	//Signal : nYPON  YMON nXPON XMON  EINT19 DMAMODE1 DMAMODE0 DMASTART KBDSPICLK KBDSPIMOSI
	//Setting: nYPON  YMON nXPON XMON  EINT19  Output   Output   Output   SPICLK1    SPIMOSI1
	//Binary :   11    11 , 11    11  , 10  	01    ,   01	   01   ,    11 		11
	//-----------------------------------------------------------------------------------------
	//Ports  :    GPG5  	 GPG4    GPG3    GPG2    GPG1    GPG0    
	//Signal : KBDSPIMISO LCD_PWREN EINT11 nSS_SPI IRQ_LAN IRQ_PCMCIA
	//Setting:  SPIMISO1  LCD_PWRDN EINT11   nSS0   EINT9    EINT8
	//Binary :     11   	  11   ,  10	  11  ,  10 	   10
	rGPGCON = 0xff95ffba;
	rGPGUP = 0xffff;	// The pull up function is disabled GPG[15:0]

	//*** PORT H GROUP
	//Ports  :  GPH10    GPH9  GPH8 GPH7  GPH6  GPH5 GPH4 GPH3 GPH2 GPH1  GPH0 
	//Signal : CLKOUT1 CLKOUT0 UCLK nCTS1 nRTS1 RXD1 TXD1 RXD0 TXD0 nRTS0 nCTS0
	//Binary :   10   ,  10 	10 , 11    11  , 10   10 , 10   10 , 10    10
	rGPHCON = 0x2afaaa;
	rGPHUP = 0x7ff;    // The pull up function is disabled GPH[10:0]

	// Added for S3C2440X, DonGo
	//*** PORT J GROUP
	//Ports  : GPJ12   GPJ11	   GPJ10	GPJ9	GPJ8	  GPJ7  	GPJ6	  GPJ5  	GPJ4	  GPJ3  	GPJ2	  GPJ1     GPJ0 
	//Signal : CAMRESET CAMPCLKOUT CAMHREF CAMVSYNC CAMPCLKIN CAMDAT[7] CAMDAT[6] CAMDAT[5] CAMDAT[4] CAMDAT[3] CAMDAT[2] CAMDAT[1] CAMDAT[0] 
	//Binary :   10 	 10 	  10		10  	 10 	   10   	 10 	   10   	10  	   10   	 10 	   10      10
	rGPJCON = 0x02aaaaaa;
	rGPJUP = 0x1fff;	// The pull up function is disabled GPH[10:0]

	//External interrupt will be falling edge triggered. 
	rEXTINT0 = 0x22222222;    // EINT[7:0]
	rEXTINT1 = 0x22222222;    // EINT[15:8]
	rEXTINT2 = 0x22222222;    // EINT[23:16]
}

void Port_Init( void )
{
	//CAUTION:Follow the configuration order for setting the ports. 
	// 1) setting value(GPnDAT) 
	// 2) setting control register  (GPnCON)
	// 3) configure pull-up resistor(GPnUP)  

	//32bit data bus configuration  
	//*** PORT A GROUP
	//Ports  : GPA22 GPA21  GPA20 GPA19 GPA18 GPA17 GPA16 GPA15 GPA14 GPA13 GPA12  
	//Signal : nFCE nRSTOUT nFRE   nFWE  ALE   CLE  nGCS5 nGCS4 nGCS3 nGCS2 nGCS1 
	//Binary :  1     1 	 1  , 1   1   1    1   ,  1 	1     1 	1
	//Ports  : GPA11   GPA10  GPA9   GPA8   GPA7   GPA6   GPA5   GPA4   GPA3   GPA2   GPA1  GPA0
	//Signal : ADDR26 ADDR25 ADDR24 ADDR23 ADDR22 ADDR21 ADDR20 ADDR19 ADDR18 ADDR17 ADDR16 ADDR0 
	//Binary :  1   	1      1	  1   , 1   	1      1	  1   ,  1  	 1     1	  1 		
	rGPACON = 0x7fffff; 

	//**** PORT B GROUP
	//Ports  : GPB10	GPB9	GPB8	GPB7	GPB6	 GPB5    GPB4   GPB3   GPB2 	GPB1	  GPB0
	//Signal : nXDREQ0 nXDACK0 nXDREQ1 nXDACK1 nSS_KBD nDIS_OFF L3CLOCK L3DATA L3MODE nIrDATXDEN Keyboard
	//Setting: INPUT  OUTPUT   INPUT  OUTPUT   INPUT   OUTPUT   OUTPUT OUTPUT OUTPUT   OUTPUT    OUTPUT 
	//Binary :   00  ,  01  	 00  ,   01 	 00   ,  01 	  01  ,   01	 01   ,  01 	   01  
	rGPBCON = 0x000150;
	rGPBUP = 0x7ff; 	// The pull up function is disabled GPB[10:0]

	//*** PORT C GROUP
	//Ports  : GPC15 GPC14 GPC13 GPC12 GPC11 GPC10 GPC9 GPC8  GPC7   GPC6   GPC5 GPC4 GPC3  GPC2  GPC1 GPC0
	//Signal : VD7   VD6   VD5   VD4   VD3   VD2   VD1  VD0 LCDVF2 LCDVF1 LCDVF0 VM VFRAME VLINE VCLK LEND  
	//Binary :  10   10  , 10    10  , 10    10  , 10   10  , 10	 10  ,  10   10 , 10	 10 , 10   10
	rGPCCON = 0xaaaaaaaa;   	
	rGPCUP = 0xffff;	 // The pull up function is disabled GPC[15:0] 

	//*** PORT D GROUP
	//Ports  : GPD15 GPD14 GPD13 GPD12 GPD11 GPD10 GPD9 GPD8 GPD7 GPD6 GPD5 GPD4 GPD3 GPD2 GPD1 GPD0
	//Signal : VD23  VD22  VD21  VD20  VD19  VD18  VD17 VD16 VD15 VD14 VD13 VD12 VD11 VD10 VD9  VD8
	//Binary : 10    10  , 10    10  , 10    10  , 10   10 , 10   10 , 10   10 , 10   10 ,10   10
	rGPDCON = 0xaaaaaaaa;   	
	rGPDUP = 0xffff;	 // The pull up function is disabled GPD[15:0]

	//*** PORT E GROUP
	//Ports  : GPE15  GPE14 GPE13   GPE12   GPE11   GPE10   GPE9	GPE8	 GPE7  GPE6  GPE5   GPE4  
	//Signal : IICSDA IICSCL SPICLK SPIMOSI SPIMISO SDDATA3 SDDATA2 SDDATA1 SDDATA0 SDCMD SDCLK IN 
	//Binary :  10     10  ,  10	  10  ,  10 	 10   ,  10 	 10   ,   10	10  , 10	 00  ,     
	//-------------------------------------------------------------------------------------------------------
	//Ports  :  GPE3   GPE2  GPE1    GPE0    
	//Signal :  IN     IN    IN 	 IN  
	//Binary :  00     00  ,  00	  00 
	//rGPECON = 0xaaaaaaaa; 	  
	//rGPEUP  = 0xffff; 	// The pull up function is disabled GPE[15:0]
	rGPECON = 0xa02aa800; // For added AC97 setting 	 
	rGPEUP = 0xffff;	 

	//*** PORT F GROUP
	//Ports  : GPF7   GPF6   GPF5   GPF4	  GPF3     GPF2  GPF1   GPF0
	//Signal : nLED_8 nLED_4 nLED_2 nLED_1 nIRQ_PCMCIA EINT2 KBDINT EINT0
	//Setting: Output Output Output Output    EINT3    EINT2 EINT1  EINT0
	//Binary :  01  	01 ,  01	 01  ,     10   	10  , 10	 10
	rGPFCON = 0x55aa;
	rGPFUP = 0xff;     // The pull up function is disabled GPF[7:0]

	//*** PORT G GROUP
	//Ports  : GPG15 GPG14 GPG13 GPG12 GPG11	GPG10    GPG9     GPG8     GPG7 	 GPG6    
	//Signal : nYPON  YMON nXPON XMON  EINT19 DMAMODE1 DMAMODE0 DMASTART KBDSPICLK KBDSPIMOSI
	//Setting: nYPON  YMON nXPON XMON  EINT19  Output   Output   Output   SPICLK1    SPIMOSI1
	//Binary :   11    11 , 11    11  , 10  	01    ,   01	   01   ,    11 		11
	//-----------------------------------------------------------------------------------------
	//Ports  :    GPG5  	 GPG4    GPG3    GPG2    GPG1    GPG0    
	//Signal : KBDSPIMISO LCD_PWREN EINT11 nSS_SPI IRQ_LAN IRQ_PCMCIA
	//Setting:  SPIMISO1  LCD_PWRDN EINT11   nSS0   EINT9    EINT8
	//Binary :     11   	  11   ,  10	  11  ,  10 	   10
	rGPGCON = 0x00a2aaaa;// GPG9 input without pull-up, hzh
	rGPGUP = 0xffff;	// The pull up function is disabled GPG[15:0]

	//*** PORT H GROUP
	//Ports  :  GPH10    GPH9  GPH8 GPH7  GPH6  GPH5 GPH4 GPH3 GPH2 GPH1  GPH0 
	//Signal : CLKOUT1 CLKOUT0 UCLK nRXD2 nTXD2 RXD1 TXD1 RXD0 TXD0 nRTS0 nCTS0
	//Binary :   10   ,  10 	10 , 10    10  , 10   10 , 10   10 , 10    10
	rGPHCON = 0x00aaaa;
	rGPHUP = 0x7ff;    // The pull up function is disabled GPH[10:0]

	// Added for S3C2440X, DonGo
	//*** PORT J GROUP
	//Ports  : GPJ12   GPJ11	   GPJ10	GPJ9	GPJ8	  GPJ7  	GPJ6	  GPJ5  	GPJ4	  GPJ3  	GPJ2	  GPJ1     GPJ0 
	//Signal : CAMRESET CAMPCLKOUT CAMHREF CAMVSYNC CAMPCLKIN CAMDAT[7] CAMDAT[6] CAMDAT[5] CAMDAT[4] CAMDAT[3] CAMDAT[2] CAMDAT[1] CAMDAT[0] 
	//Binary :   10 	 10 	  10		10  	 10 	   10   	 10 	   10   	10  	   10   	 10 	   10      10
	rGPJCON = 0x02aaaaaa;
	rGPJUP = 0x1fff;	// The pull up function is disabled GPH[10:0]

	//External interrupt will be falling edge triggered. 
	rEXTINT0 = 0x22222222;    // EINT[7:0]
	rEXTINT1 = 0x22222222;    // EINT[15:8]
	rEXTINT2 = 0x22222222;    // EINT[23:16]
}

/********************************************************************************************************************
【函数名称】void __inline RS485_1_Out_In( U8 TXRX )
【功能描述】TRUE表示为发送状态,FALSE表示为接收状态
********************************************************************************************************************/
void __inline RS485_1_Out_In( U8 TXRX )
{
	rGPBCON = ( rGPBCON & ~( 0x3 << 14 ) ) | ( 0x01 << 14 );

	if ( TXRX == TRUE )
	{
		rGPBDAT = ( rGPBDAT & ~( 0x1 << 7 ) ) | ( 0x01 << 7 );
	}
	else
	{
		rGPBDAT = ( rGPBDAT & ~( 0x1 << 7 ) ) | ( 0x00 << 7 );
	}
}

/********************************************************************************************************************
【函数名称】void __inline RS485_2_Out_In( U8 TXRX )
【功能描述】TRUE表示为发送状态,FALSE表示为接收状态
********************************************************************************************************************/
void __inline RS485_2_Out_In( U8 TXRX )
{
	rGPBCON = ( rGPBCON & ~( 0x3 << 16 ) ) | ( 0x01 << 16 );

	if ( TXRX == TRUE )
	{
		rGPBDAT = ( rGPBDAT & ~( 0x1 << 8 ) ) | ( 0x01 << 8 );
	}
	else
	{
		rGPBDAT = ( rGPBDAT & ~( 0x1 << 8 ) ) | ( 0x00 << 8 );
	}
}

//***************************[ UART ]******************************
static int whichUart = 0;

void Uart_Init( int pclk , int baud )
{
	int i;
	if ( pclk == 0 )
		pclk = PCLK;
	rUFCON0 = 0x0;   //UART channel 0 FIFO control register, FIFO disable
	rUFCON1 = 0x0;   //UART channel 1 FIFO control register, FIFO disable
	rUFCON2 = 0x0;   //UART channel 2 FIFO control register, FIFO disable
	rUMCON0 = 0x0;   //UART chaneel 0 MODEM control register, AFC disable
	rUMCON1 = 0x0;   //UART chaneel 1 MODEM control register, AFC disable
	//UART0
	rULCON0 = 0x3;   //Line control register : Normal,No parity,1 stop,8 bits
	//    [10]  	 [9]	 [8]		[7] 	   [6]  	[5] 		[4] 		  [3:2] 	   [1:0]
	// Clock Sel,  Tx Int,  Rx Int, Rx Time Out, Rx err, Loop-back, Send break,  Transmit Mode, Receive Mode
	//     0		  1 	  0    ,	 0  		1   	 0  		 0     ,	   01   	   01
	//   PCLK   	Level    Pulse    Disable    Generate  Normal      Normal   	 Interrupt or Polling
	rUCON0 = 0x245;   // Control register
	rUBRDIV0 = ( ( int ) ( pclk / 16. / baud + 0.5 ) - 1 );   //Baud rate divisior register 0
	//UART1
	rULCON1 = 0x3;
	rUCON1 = 0x245;
	rUBRDIV1 = ( ( int ) ( pclk / 16. / baud + 0.5 ) - 1 );
	//UART2
	rULCON2 = 0x3;
	rUCON2 = 0x245;
	rUBRDIV2 = ( ( int ) ( pclk / 16. / baud + 0.5 ) - 1 );    

	for ( i = 0; i < 100; i++ )
		;

	RS485_1_Out_In( FALSE );
	RS485_2_Out_In( FALSE );
}

//===================================================================
void Uart_Select( int ch )
{
	whichUart = ch;
	
	if( ch == 2 )
	{
		rGPECON = rGPECON & (~(3<<26)) | (1<<26) ;		//GPE13为IO口输出
		rGPEUP = rGPEUP & (~(1<<13)) ;		//GPE13上拉有效
		//rGPEDAT = rGPEDAT | (1<<13) ;		//RS485处于发送状态
		rGPEDAT = rGPEDAT & (~(1<<13)) ;		//RS485处于接收状态
	}
}

//===================================================================
void Uart_TxEmpty( int ch )
{
	if ( ch == 0 )
		while ( !( rUTRSTAT0 & 0x4 ) ); //Wait until tx shifter is empty.

	else if ( ch == 1 )
		while ( !( rUTRSTAT1 & 0x4 ) ); //Wait until tx shifter is empty.

	else if ( ch == 2 )
		while ( !( rUTRSTAT2 & 0x4 ) ); //Wait until tx shifter is empty.
}

//=====================================================================
char Uart_Getch( void )
{
	if ( whichUart == 0 )
	{
		while ( !( rUTRSTAT0 & 0x1 ) ); //Receive data ready
		return RdURXH0();
	}
	else if ( whichUart == 1 )
	{
		while ( !( rUTRSTAT1 & 0x1 ) ); //Receive data ready
		return RdURXH1();
	}
	else if ( whichUart == 2 )
	{
		while ( !( rUTRSTAT2 & 0x1 ) ); //Receive data ready
		return RdURXH2();
	}

	return 0 ;
}

//====================================================================
char Uart_GetKey( void )
{
	if ( whichUart == 0 )
	{
		if ( rUTRSTAT0 & 0x1 )    //Receive data ready
			return RdURXH0();
		else
			return 0;
	}
	else if ( whichUart == 1 )
	{
		if ( rUTRSTAT1 & 0x1 )    //Receive data ready
			return RdURXH1();
		else
			return 0;
	}
	else if ( whichUart == 2 )
	{
		if ( rUTRSTAT2 & 0x1 )    //Receive data ready
			return RdURXH2();
		else
			return 0;
	}    

⌨️ 快捷键说明

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