/* --------------------------------------------------------------------------------------------------------- ********************************************************************************************************* ** 文件名称 :2410lib.c ** 功能说明 :s3c2410功能函数库 ********************************************************************************************************* --------------------------------------------------------------------------------------------------------- */ #include #include #include #include #include #include "..\inc\2410lib.h" #include "..\inc\2410slib.h" /* 定义全局变量 */ static int delayLoopCount = FCLK/10000/10; /* delay 延时函数的默认延时值 */ unsigned int f_nWhichUart=0; /* UARTx */ char Image$$RW_ZI$$ZI$$Limit[]; /* ********************************************************************************************************** ** 函数名称:port_init() ** 函数功能:初始化端口。 ** 入口参数:无 ** 出口参数:无 ********************************************************************************************************* */ void port_init(void) { /* 注意:设置端口时应遵从以下步骤 */ /* 1) 设置控制寄存器 (GPnCON) */ /* * (bitn) -- 表示在电路中不存在该引脚,设置为默认值 */ /* 2) 配置配置GPnUP寄存器 */ /* 3) 设置GPnDAT */ /* 32位数据总线配置 */ /*=== PORT A GROUP */ /*Ports : GPA22 GPA21 GPA20 GPA19 GPA18 GPA17 GPA16 GPA15 GPA14 GPA13 GPA12 */ /*Signal : nFCE GPA21 nFRE nFWE ALE CLE GPA16 nGCS4 nGCS3 nGCS2 nGCS1 */ /*Setting: nFCE Output nFRE nFWE ALE CLE Output nGCS4 nGCS3 nGCS2 nGCS1 */ /*Binary : 1 *0 1, 1 1 1 *0, 1 1 1 1 */ /*----------------------------------------------------------------------------------------*/ /*Ports : GPA11 GPA10 GPA9 GPA8 GPA7 GPA6 GPA5 GPA4 GPA3 GPA2 GPA1 GPA0 */ /*Signal : GPA11 ADDR25 ADDR24 ADDR23 ADDR22 ADDR21 ADDR20 ADDR19 ADDR18 ADDR17 ADDR16 ADDR0 */ /*Binary : *0 1 1 1, 1 1 1 1, 1 1 1 1 */ rGPACON = 0x5ef7ff; /*===* PORT B GROUP */ /*Ports : GPB10 GPB9 GPB8 GPB7 GPB6 GPB5 GPB4 GPB3 GPB2 GPB1 GPB0 */ /*Signal : GPB10 GPB9 GPB8 GPB7 GPB6 DIS_OFF L3CLOCK L3DATA L3MODE PWM2 PWM1 */ /*Setting: Output Output Output Output Output Output Output Output Output TOUT1 TOUT0 */ /*Binary : 01, 01 *01, *01 *01, 01 01, 01 01, 10 10 */ rGPBCON = 0x155559; 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 Output Output Output OUT VFRAME VLINE VCLK LEND */ /*Binary : 10 10, 10 10, 10 10, 10 10, *01 *01, *01 01, 10 10, 10 10 */ rGPCCON = 0xaaaa55aa; 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 I2SSDO */ /*Binary : 10 10, 10 10, 10 10, 10 10, 10 10, 10 10, */ /*---------------------------------------------------------------------------------------- */ /*Ports : GPE3 GPE2 GPE1 GPE0 */ /*Signal : I2SSDI CDCLK I2SSCLK I2SLRCK */ /*Binary : 10 10, 10 10 */ rGPECON = 0xaaaaaaaa; rGPEUP = 0xffff; /* The pull up function is disabled GPE[15:0]*/ /*=== PORT F GROUP */ /*Ports : GPF7 GPF6 GPF5 GPF4 GPF3 GPF2 GPF1 GPF0 */ /*Signal : LED_4 LED_3 LED_2 LED_1 PS2_INT CPLD_INT1 KEY_INT BUT_INT1 */ /*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 GPG11 SD_CD CPLD_INT3 CPLD_INT2 SPICLK1 SPIMOSI */ /*Setting: nYPON YMON nXPON XMON Output Iutput EINT17 EINT17 SPICLK1 SPIMOSI1 */ /*Binary : 11 11, 11 11, 01 00, 10 10, 11 11 */ /*--------------------------------------------------------------------------------------- */ /*Ports : GPG5 GPG4 GPG3 GPG2 GPG1 GPG0 */ /*Signal : SPIMISO1 LCD_PWREN BUT_INT2 nSS0 NET_INT GPG0 */ /*Setting: SPIMISO1 LCD_PWRDN EINT11 nSS0 EINT9 Output */ /*Binary : 11 11, 10 11, 10 *01 */ rGPGCON = 0xff4affb9; rGPGUP = 0xffff; /* The pull up function is disabled GPG[15:0] */ rGPGDAT = rGPGDAT & 0xffef; /* 关闭LCD */ /*=== PORT H GROUP */ /*Ports : GPH10 GPH9 GPH8 GPH7 GPH6 GPH5 GPH4 GPH3 GPH2 GPH1 GPH0 */ /*Signal : GPH10 CLKOUT0 SD_WP CTS1 RTS1 RXD1 TXD1 RXD0 TXD0 nRTS0 nCTS0 */ /*Setting: Output CLKOUT0 GPH8 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] */ } /* ********************************************************************************************************** ** 函数名称:uart_change_baud() ** 函数功能:设置uart波特率 ** 入口参数:nChannel UART号,如UART0,UART1 nBaud 波特率 ** 出口参数:无 ********************************************************************************************************* */ void uart_change_baud(int nChannel, int nBaud) { if (nChannel == UART0) rUBRDIV0=( (int)(PCLK/16./nBaud + 0.5) -1 ); if (nChannel == UART1) rUBRDIV1=( (int)(PCLK/16./nBaud) -1 ); if (nChannel == UART2) rUBRDIV2=( (int)(PCLK/16./nBaud) -1 ); } /* ********************************************************************************************************** ** 函数名称:uart_init() ** 函数功能:初始化UART通道 ** 入口参数:nMainClk nBaud nChannel ** 出口参数:无 ********************************************************************************************************* */ void uart_init(int nMainClk, int nBaud, int nChannel) { int i; if(nMainClk == 0) nMainClk = PCLK; switch (nChannel) { case UART0: rUFCON0 = 0x0; //UART channel 0 FIFO control register, FIFO disable rUMCON0 = 0x0; //UART chaneel 0 MODEM control register, AFC disable 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)(nMainClk/16./nBaud) -1 ); // Baud rate divisior register 0 rUBRDIV0=( (int)(nMainClk/16./nBaud+0.5) -1 ); // Baud rate divisior register 0 break; case UART1: rUFCON1 = 0x0; //UART channel 1 FIFO control register, FIFO disable rUMCON1 = 0x0; //UART chaneel 1 MODEM control register, AFC disable rULCON1 = 0x3; rUCON1 = 0x245; rUBRDIV1=( (int)(nMainClk/16./nBaud) -1 ); break; case UART2: rULCON2 = 0x3; rUCON2 = 0x245; rUBRDIV2=( (int)(nMainClk/16./nBaud) -1 ); rUFCON2 = 0x0; //UART channel 2 FIFO control register, FIFO disable break; default: break; } for(i=0;i<100;i++); delay(400); } /* ********************************************************************************************************** ** 函数名称:uart_select() ** 函数功能:设置UART通道号 ** 入口参数:nChannel 选择的通道号 ** 出口参数:无 ********************************************************************************************************* */ void uart_select(int nChannel) { f_nWhichUart=nChannel; } /* ********************************************************************************************************** ** 函数名称:uart_txempty() ** 函数功能:清空 ** 入口参数:nChannel 通道号 ** 出口参数:无 ********************************************************************************************************* */ void uart_txempty(int nChannel) { if(nChannel==0) while(!(rUTRSTAT0 & 0x4)); /* 等待发送移位寄存器为空 */ else if(nChannel==1) while(!(rUTRSTAT1 & 0x4)); /* 等待发送移位寄存器为空 */ else if(nChannel==2) while(!(rUTRSTAT2 & 0x4)); /* 等待发送移位寄存器为空 */ } /* ********************************************************************************************************** ** 函数名称:uart_getch() ** 函数功能:串口接收一字符 ** 入口参数:无 ** 出口参数:返回接收到的字符 ********************************************************************************************************* */ char uart_getch(void) { if(f_nWhichUart==0) { while(!(rUTRSTAT0 & 0x1)); /* 等待接收数据 */ return RdURXH0(); } else if(f_nWhichUart==1) { while(!(rUTRSTAT1 & 0x1)); /* 等待接收数据 */ return RdURXH1(); } else if(f_nWhichUart==2) { while(!(rUTRSTAT2 & 0x1)); /* 等待接收数据 */ return RdURXH2(); } return NULL; } //==================================================================== char uart_getkey(void) { if(f_nWhichUart==0) { if(rUTRSTAT0 & 0x1) //Receive data ready return RdURXH0(); else return 0; } else if(f_nWhichUart==1) { if(rUTRSTAT1 & 0x1) //Receive data ready return RdURXH1(); else return 0; } else if(f_nWhichUart==2) { if(rUTRSTAT2 & 0x1) //Receive data ready return RdURXH2(); else return 0; } return NULL; } /* ********************************************************************************************************** ** 函数名称:uart_getstring() ** 函数功能:串口接收一字符串并保存到*pString ** 入口参数:pString 接收到的字符串 ** 出口参数:无 ********************************************************************************************************* */ void uart_getstring(char *pString) { char *string2 = pString; char c; while((c = uart_getch())!='\r') { if(c=='\b') { if( (int)string2 < (int)pString ) { uart_printf("\b \b"); pString--; } } else { *pString++ = c; uart_sendbyte(c); } } *pString='\0'; uart_sendbyte('\n'); } /* ********************************************************************************************************** ** 函数名称:uart_getintnum() ** 函数功能:从串口中接收一数值 ** 入口参数:无 ** 出口参数:接收到的数值,默认为10进制,开头为“H/h”或“0x”为16进制 ********************************************************************************************************* */ int uart_getintnum(void) { char str[30]; char *pString = str; int base = 10; int minus = 0; int nResult = 0; int lastIndex; int i; uart_getstring(pString); if(pString[0]=='-') { minus = 1; pString++; } if(pString[0]=='0' && (pString[1]=='x' || pString[1]=='X')) { base = 16; pString += 2; } lastIndex = strlen(pString) - 1; if(lastIndex<0) return -1; if(pString[lastIndex]=='h' || pString[lastIndex]=='H' ) { base = 16; pString[lastIndex] = 0; lastIndex--; } if(base==10) { nResult = atoi(pString); nResult = minus ? (-1*nResult):nResult; } else { for(i=0;i<=lastIndex;i++) { if(isalpha(pString[i])) { if(isupper(pString[i])) nResult = (nResult<<4) + pString[i] - 'A' + 10; else nResult = (nResult<<4) + pString[i] - 'a' + 10; } else nResult = (nResult<<4) + pString[i] - '0'; } nResult = minus ? (-1*nResult):nResult; } return nResult; } /* ********************************************************************************************************** ** 函数名称:uart_sendbyte() ** 函数功能:串口发送一字节数据 ** 入口参数:nData 要发送的数据 ** 出口参数:无 ********************************************************************************************************* */ void uart_sendbyte(int nData) { if(f_nWhichUart==0) { if(nData=='\n') { while(!(rUTRSTAT0 & 0x2)); delay(10); /* because the slow response of hyper_terminal */ WrUTXH0('\r'); } while(!(rUTRSTAT0 & 0x2)); /* Wait until THR is empty. */ delay(10); WrUTXH0(nData); } else if(f_nWhichUart==1) { if(nData=='\n') { while(!(rUTRSTAT1 & 0x2)); delay(10); /* because the slow response of hyper_terminal */ rUTXH1 = '\r'; } while(!(rUTRSTAT1 & 0x2)); /* Wait until THR is empty. */ delay(10); rUTXH1 = nData; } else if(f_nWhichUart==2) { if(nData=='\n') { while(!(rUTRSTAT2 & 0x2)); delay(10); /* because the slow response of hyper_terminal */ rUTXH2 = '\r'; } while(!(rUTRSTAT2 & 0x2)); /*Wait until THR is empty. */ delay(10); rUTXH2 = nData; } } /* ********************************************************************************************************** ** 函数名称:uart_sendstring() ** 函数功能:串口发送一字符串 ** 入口参数:pString 要发送的字符串 ** 出口参数:无 ********************************************************************************************************* */ void uart_sendstring(char *pString) { while(*pString) uart_sendbyte(*pString++); } /* ********************************************************************************************************** ** 函数名称:uart_printf() ** 函数功能:向串口输出格式化字符串 ** 入口参数:fmt 格式化字符串 ** 出口参数:无 ********************************************************************************************************* */ void uart_printf(char *fmt,...) { // va_list ap; // char pString[256]; // va_start(ap,fmt); // vsprintf(pString,fmt,ap); // uart_sendstring(pString); // va_end(ap); } void beep(int nBeepStatus) { if (nBeepStatus==0) rGPBDAT |= 0x1; else rGPBDAT &= 0x7fe; } /* ********************************************************************************************************** ** 函数名称:timer_start() ** 函数功能:启动定看门狗定时器 ** 入口参数:divider 0: 16us 1: 32us 2: 64us 3: 128us ** 出口参数:无 ********************************************************************************************************* */ void timer_start(int divider) /* 0:16us,1:32us 2:64us 3:128us */ { rWTCON = ((PCLK/1000000-1)<<8)|(divider<<3); /* 看门狗定时器控制寄存器 */ rWTDAT = 0xffff; /* 看门狗定时器数据寄存器 */ rWTCNT = 0xffff; /* 看门狗计数寄存器 */ rWTCON = rWTCON | (1<<5) | ~(1<<2); } /* ********************************************************************************************************** ** 函数名称:timer_stop() ** 函数功能:停止定时器 ** 入口参数:无 ** 出口参数:定时器计数值 ********************************************************************************************************* */ int timer_stop(void) { rWTCON = ((PCLK/1000000-1)<<8); return (0xffff - rWTCNT); } //========================[ MPLL ]================================= void change_value_MPLL(int nMdiv,int nPdiv,int nSdiv) { rMPLLCON = (nMdiv<<12) | (nPdiv<<4) | nSdiv; } //========================[ HCLK, PCLK ]=========================== void change_clock_divider(int nHdiv,int nPdiv) { /* nHdiv,nPdiv FCLK:HCLK:PCLK */ /* 0,0 1:1:1 */ /* 0,1 1:1:2 */ /* 1,0 1:2:2 */ /* 1,1 1:2:4 */ rCLKDIVN = (nHdiv<<1) | nPdiv; } //========================**[ UPLL ]==============================* void ChangeUPllValue(int nMdiv,int nPdiv,int nSdiv) { rUPLLCON = (nMdiv<<12) | (nPdiv<<4) | nSdiv; } /* ********************************************************************************************************** ** 函数名称:delay() ** 函数功能:延时 ** 入口参数:nTime 延时值 ** 出口参数:无 ** 说明: nTime = 0 时,通过看门狗调整延迟时间 nTime > 0 时,通过循环来实现时间延迟 时间单位为:100us ********************************************************************************************************* */ void delay(int nTime) { int i,adjust=0; if(nTime==0) { nTime = 200; adjust = 1; delayLoopCount = 400; /* PCLK/1M,Watch-dog disable,1/64,interrupt disable,reset disable */ rWTCON = ((PCLK/1000000-1)<<8)|(2<<3); rWTDAT = 0xffff; /* for first update */ rWTCNT = 0xffff; /* resolution=64us @any PCLK */ rWTCON = ((PCLK/1000000-1)<<8)|(2<<3)|(1<<5); /* 启动看门狗定时器 */ } for(;nTime>0;nTime--) for(i=0;i64us, 200*400 cycle runtime = 64*i us */ delayLoopCount = 8000000/(i*64); /* 200*400:64*i=1*x:100 -> x=80000*100/(64*i) */ } } /* ********************************************************************************************************** ** 函数名称:__gccmain() ** 函数功能:GCC库入口 ** 入口参数:无 ** 出口参数:无 ********************************************************************************************************* */ void __gccmain(void) { }