2410lib.c
上传用户:mhstny
上传日期:2022-08-05
资源大小:793k
文件大小:15k
源码类别:

微处理器开发

开发平台:

Unix_Linux

  1. //===================================================================
  2. // File Name : 2410lib.c
  3. // Function  : S3C2410 PLL,Uart, LED, Port Init
  4. // Program   : Shin, On Pil (SOP)
  5. // Date      : May 14, 2002
  6. // Version   : 0.0
  7. // History
  8. //   0.0 : Programming start (February 20,2002) -> SOP
  9. //===================================================================
  10. #include "def.h"
  11. #include "option.h"
  12. #include "2410addr.h"
  13. #include "2410lib.h"
  14. //#include "2410slib.h" 
  15. #include <stdarg.h>
  16. #include <string.h>
  17. #include <stdlib.h>
  18. #include <stdio.h>
  19. #include <ctype.h>
  20. //===========================[ SYSTEM ]===================================================
  21. //static int delayLoopCount = 400;
  22. static int delayLoopCount = FCLK/10000/10;
  23. void Delay(int time)
  24. {
  25.       // time=0: adjust the Delay function by WatchDog timer.
  26.       // time>0: the number of loop time
  27.       // resolution of time is 100us.
  28.     int i,adjust=0;
  29.     if(time==0)
  30.     {
  31.         time   = 100;
  32.         adjust = 1;
  33.         delayLoopCount = 400;
  34.             //PCLK/1M,Watch-dog disable,1/64,interrupt disable,reset disable
  35.         rWTCON = ((PCLK/1000000-1)<<8)|(2<<3); 
  36.         rWTDAT = 0xffff;                              //for first update
  37.         rWTCNT = 0xffff;                              //resolution=64us @any PCLK 
  38.         rWTCON = ((PCLK/1000000-1)<<8)|(2<<3)|(1<<5); //Watch-dog timer start
  39.     }
  40.     for(;time>0;time--)
  41.         for(i=0;i<delayLoopCount;i++);
  42.     if(adjust==1)
  43.     {
  44.         rWTCON = ((PCLK/1000000-1)<<8)|(2<<3);   //Watch-dog timer stop
  45.         i = 0xffff - rWTCNT;                     //1//count->64us, 200*400 cycle runtime = 64*i us
  46.         delayLoopCount = 8000000/(i*64);         //200*400:64*i=1*x:100 -> x=80000*100/(64*i)   
  47.     }
  48. }
  49. //===========================[ PORTS ]===================================================*
  50. void Port_Init(void)
  51. {
  52.     //CAUTION:Follow the configuration order for setting the ports. 
  53.     // 1) setting value(GPnDAT) 
  54.     // 2) setting control register  (GPnCON)
  55.     // 3) configure pull-up resistor(GPnUP)  
  56.     //32bit data bus configuration  
  57.     //=== PORT A GROUP
  58.     //Ports  : GPA22 GPA21  GPA20 GPA19 GPA18 GPA17 GPA16 GPA15 GPA14 GPA13 GPA12  
  59.     //Signal : nFCE nRSTOUT nFRE   nFWE  ALE   CLE  nGCS5 nGCS4 nGCS3 nGCS2 nGCS1 
  60.     //Binary :  1     1      1  , 1   1   1    1   ,  1     1     1     1
  61.     //Ports  : GPA11   GPA10  GPA9   GPA8   GPA7   GPA6   GPA5   GPA4   GPA3   GPA2   GPA1  GPA0
  62.     //Signal : ADDR26 ADDR25 ADDR24 ADDR23 ADDR22 ADDR21 ADDR20 ADDR19 ADDR18 ADDR17 ADDR16 ADDR0 
  63.     //Binary :  1       1      1      1   , 1       1      1      1   ,  1       1     1      1         
  64.     rGPACON = 0x7fffff; 
  65.     //===* PORT B GROUP
  66.     //Ports  : GPB10    GPB9    GPB8    GPB7    GPB6     GPB5    GPB4   GPB3   GPB2     GPB1      GPB0
  67.     //Signal : nXDREQ0 nXDACK0 nXDREQ1 nXDACK1 nSS_KBD nDIS_OFF L3CLOCK L3DATA L3MODE nIrDATXDEN Keyboard
  68.     //Setting: INPUT  OUTPUT   INPUT  OUTPUT   INPUT   OUTPUT   OUTPUT OUTPUT OUTPUT   OUTPUT    OUTPUT 
  69.     //Binary :   00  ,  01       00  ,   01      00   ,  01       01  ,   01     01   ,  01        01  
  70.     rGPBCON = 0x044555;
  71.     rGPBUP  = 0x7ff;     // The pull up function is disabled GPB[10:0]
  72.     //=== PORT C GROUP
  73.     //Ports  : GPC15 GPC14 GPC13 GPC12 GPC11 GPC10 GPC9 GPC8  GPC7   GPC6   GPC5 GPC4 GPC3  GPC2  GPC1 GPC0
  74.     //Signal : VD7   VD6   VD5   VD4   VD3   VD2   VD1  VD0 LCDVF2 LCDVF1 LCDVF0 VM VFRAME VLINE VCLK LEND  
  75.     //Binary :  10   10  , 10    10  , 10    10  , 10   10  , 10     10  ,  10   10 , 10     10 , 10   10
  76.     rGPCCON = 0xaaaaaaaa;       
  77.     rGPCUP  = 0xffff;     // The pull up function is disabled GPC[15:0] 
  78.     //=== PORT D GROUP
  79.     //Ports  : GPD15 GPD14 GPD13 GPD12 GPD11 GPD10 GPD9 GPD8 GPD7 GPD6 GPD5 GPD4 GPD3 GPD2 GPD1 GPD0
  80.     //Signal : VD23  VD22  VD21  VD20  VD19  VD18  VD17 VD16 VD15 VD14 VD13 VD12 VD11 VD10 VD9  VD8
  81.     //Binary : 10    10  , 10    10  , 10    10  , 10   10 , 10   10 , 10   10 , 10   10 ,10   10
  82.     rGPDCON = 0xaaaaaaaa;       
  83.     rGPDUP  = 0xffff;     // The pull up function is disabled GPD[15:0]
  84.     //=== PORT E GROUP
  85.     //Ports  : GPE15  GPE14 GPE13   GPE12   GPE11   GPE10   GPE9    GPE8     GPE7  GPE6  GPE5   GPE4  
  86.     //Signal : IICSDA IICSCL SPICLK SPIMOSI SPIMISO SDDATA3 SDDATA2 SDDATA1 SDDATA0 SDCMD SDCLK I2SSDO 
  87.     //Binary :  10     10  ,  10      10  ,  10      10   ,  10      10   ,   10    10  , 10     10  ,     
  88.     //-------------------------------------------------------------------------------------------------------
  89.     //Ports  :  GPE3   GPE2  GPE1    GPE0    
  90.     //Signal : I2SSDI CDCLK I2SSCLK I2SLRCK     
  91.     //Binary :  10     10  ,  10      10 
  92.     rGPECON = 0xaaaaaaaa;       
  93.     rGPEUP  = 0xffff;     // The pull up function is disabled GPE[15:0]
  94.     //=== PORT F GROUP
  95.     //Ports  : GPF7   GPF6   GPF5   GPF4      GPF3     GPF2  GPF1   GPF0
  96.     //Signal : nLED_8 nLED_4 nLED_2 nLED_1 nIRQ_PCMCIA EINT2 KBDINT EINT0
  97.     //Setting: Output Output Output Output    EINT3    EINT2 EINT1  EINT0
  98.     //Binary :  01      01 ,  01     01  ,     10       10  , 10     10
  99.     rGPFCON = 0x55aa;
  100.     rGPFUP  = 0xff;     // The pull up function is disabled GPF[7:0]
  101.     //=== PORT G GROUP
  102.     //Ports  : GPG15 GPG14 GPG13 GPG12 GPG11    GPG10    GPG9     GPG8     GPG7      GPG6    
  103.     //Signal : nYPON  YMON nXPON XMON  EINT19 DMAMODE1 DMAMODE0 DMASTART KBDSPICLK KBDSPIMOSI
  104.     //Setting: nYPON  YMON nXPON XMON  EINT19  Output   Output   Output   SPICLK1    SPIMOSI1
  105.     //Binary :   11    11 , 11    11  , 10      01    ,   01       01   ,    11         11
  106.     //-----------------------------------------------------------------------------------------
  107.     //Ports  :    GPG5       GPG4    GPG3    GPG2    GPG1    GPG0    
  108.     //Signal : KBDSPIMISO LCD_PWREN EINT11 nSS_SPI IRQ_LAN IRQ_PCMCIA
  109.     //Setting:  SPIMISO1  LCD_PWRDN EINT11   nSS0   EINT9    EINT8
  110.     //Binary :     11         11   ,  10      11  ,  10        10
  111.     rGPGCON = 0xff95ffba;
  112.     rGPGUP  = 0xffff;    // The pull up function is disabled GPG[15:0]
  113. /*    
  114.     //GPG4 Output Port [9:8] 01      -> LCD_PWREN Enable
  115.     rGPGCON = (rGPGCON & 0xfffffcff) | (1<<8);
  116.     rGPGDAT = (rGPGDAT & 0xffef) | (1<<4);
  117. */
  118.     //=== PORT H GROUP
  119.     //Ports  :  GPH10    GPH9  GPH8 GPH7  GPH6  GPH5 GPH4 GPH3 GPH2 GPH1  GPH0 
  120.     //Signal : CLKOUT1 CLKOUT0 UCLK nCTS1 nRTS1 RXD1 TXD1 RXD0 TXD0 nRTS0 nCTS0
  121.     //Binary :   10   ,  10     10 , 11    11  , 10   10 , 10   10 , 10    10
  122.     rGPHCON = 0x2afaaa;
  123.     rGPHUP  = 0x7ff;    // The pull up function is disabled GPH[10:0]
  124.     
  125.     //External interrupt will be falling edge triggered. 
  126.     rEXTINT0 = 0x22222222;    // EINT[7:0]
  127.     rEXTINT1 = 0x22222222;    // EINT[15:8]
  128.     rEXTINT2 = 0x22222222;    // EINT[23:16]
  129. }
  130. //===========================[ UART ]==============================
  131. static int whichUart=0;
  132. void Uart_Init(int pclk,int baud)
  133. {
  134.     int i;
  135.     
  136.     if(pclk == 0)
  137.     pclk    = PCLK;
  138.    
  139.     rUFCON0 = 0x0;   //UART channel 0 FIFO control register, FIFO disable
  140.     rUFCON1 = 0x0;   //UART channel 1 FIFO control register, FIFO disable
  141.     rUFCON2 = 0x0;   //UART channel 2 FIFO control register, FIFO disable
  142.     rUMCON0 = 0x0;   //UART chaneel 0 MODEM control register, AFC disable
  143.     rUMCON1 = 0x0;   //UART chaneel 1 MODEM control register, AFC disable
  144.     
  145. //UART0
  146.     rULCON0 = 0x3;   //Line control register : Normal,No parity,1 stop,8 bits
  147.      //    [10]       [9]     [8]        [7]        [6]      [5]         [4]           [3:2]        [1:0]
  148.      // Clock Sel,  Tx Int,  Rx Int, Rx Time Out, Rx err, Loop-back, Send break,  Transmit Mode, Receive Mode
  149.      //     0          1       0    ,     0          1        0           0     ,       01          01
  150.      //   PCLK       Level    Pulse    Disable    Generate  Normal      Normal        Interrupt or Polling
  151.     rUCON0  = 0x245;                        // Control register
  152.     rUBRDIV0=( (int)(pclk/16./baud) -1 );   //Baud rate divisior register 0
  153. //    rUBRDIV0=( (int)(pclk/16./baud+0.5) -1 );   //Baud rate divisior register 0    
  154.     
  155. //UART1
  156.     rULCON1 = 0x3;
  157.     rUCON1  = 0x245;
  158.     rUBRDIV1=( (int)(pclk/16./baud) -1 );
  159.     
  160. //UART2
  161.     rULCON2 = 0x3;
  162.     rUCON2  = 0x245;
  163.     rUBRDIV2=( (int)(pclk/16./baud) -1 );    
  164.     for(i=0;i<100;i++);
  165. }
  166. //===================================================================
  167. void Uart_Select(int ch)
  168. {
  169.     whichUart = ch;
  170. }
  171. //===================================================================
  172. void Uart_TxEmpty(int ch)
  173. {
  174.     if(ch==0)
  175.         while(!(rUTRSTAT0 & 0x4)); //Wait until tx shifter is empty.
  176.           
  177.     else if(ch==1)
  178.         while(!(rUTRSTAT1 & 0x4)); //Wait until tx shifter is empty.
  179.         
  180.     else if(ch==2)
  181.         while(!(rUTRSTAT2 & 0x4)); //Wait until tx shifter is empty.
  182. }
  183. //=====================================================================
  184. char Uart_Getch(void)
  185. {
  186.     if(whichUart==0)
  187.     {       
  188.         while(!(rUTRSTAT0 & 0x1)); //Receive data ready
  189.         return RdURXH0();
  190.     }
  191.     else if(whichUart==1)
  192.     {       
  193.         while(!(rUTRSTAT1 & 0x1)); //Receive data ready
  194.         return RdURXH1();
  195.     }
  196.     else if(whichUart==2)
  197.     {
  198.         while(!(rUTRSTAT2 & 0x1)); //Receive data ready
  199.         return RdURXH2();
  200.     }
  201. }
  202. //====================================================================
  203. char Uart_GetKey(void)
  204. {
  205.     if(whichUart==0)
  206.     {       
  207.         if(rUTRSTAT0 & 0x1)    //Receive data ready
  208.             return RdURXH0();
  209.         else
  210.             return 0;
  211.     }
  212.     else if(whichUart==1)
  213.     {
  214.         if(rUTRSTAT1 & 0x1)    //Receive data ready
  215.             return RdURXH1();
  216.         else
  217.             return 0;
  218.     }
  219.     else if(whichUart==2)
  220.     {       
  221.         if(rUTRSTAT2 & 0x1)    //Receive data ready
  222.             return RdURXH2();
  223.         else
  224.             return 0;
  225.     }    
  226. }
  227. //====================================================================
  228. void Uart_GetString(char *string)
  229. {
  230.     char *string2 = string;
  231.     char c;
  232.     while((c = Uart_Getch())!='r')
  233.     {
  234.         if(c=='b')
  235.         {
  236.             if( (int)string2 < (int)string )
  237.             {
  238.                 Uart_Printf("b b");
  239.                 string--;
  240.             }
  241.         }
  242.         else 
  243.         {
  244.             *string++ = c;
  245.             Uart_SendByte(c);
  246.         }
  247.     }
  248.     *string='';
  249.     Uart_SendByte('n');
  250. }
  251. //=====================================================================
  252. int Uart_GetIntNum(void)
  253. {
  254.     char str[30];
  255.     char *string = str;
  256.     int base     = 10;
  257.     int minus    = 0;
  258.     int result   = 0;
  259.     int lastIndex;    
  260.     int i;
  261.     
  262.     Uart_GetString(string);
  263.     
  264.     if(string[0]=='-')
  265.     {
  266.         minus = 1;
  267.         string++;
  268.     }
  269.     
  270.     if(string[0]=='0' && (string[1]=='x' || string[1]=='X'))
  271.     {
  272.         base    = 16;
  273.         string += 2;
  274.     }
  275.     
  276.     lastIndex = strlen(string) - 1;
  277.     
  278.     if(lastIndex<0)
  279.         return -1;
  280.     
  281.     if(string[lastIndex]=='h' || string[lastIndex]=='H' )
  282.     {
  283.         base = 16;
  284.         string[lastIndex] = 0;
  285.         lastIndex--;
  286.     }
  287.     if(base==10)
  288.     {
  289.         result = atoi(string);
  290.         result = minus ? (-1*result):result;
  291.     }
  292.     else
  293.     {
  294.         for(i=0;i<=lastIndex;i++)
  295.         {
  296.             if(isalpha(string[i]))
  297.             {
  298.                 if(isupper(string[i]))
  299.                     result = (result<<4) + string[i] - 'A' + 10;
  300.                 else
  301.                     result = (result<<4) + string[i] - 'a' + 10;
  302.             }
  303.             else
  304.                 result = (result<<4) + string[i] - '0';
  305.         }
  306.         result = minus ? (-1*result):result;
  307.     }
  308.     return result;
  309. }
  310. //=====================================================================
  311. void Uart_SendByte(int data)
  312. {
  313.     if(whichUart==0)
  314.     {
  315.         if(data=='n')
  316.         {
  317.             while(!(rUTRSTAT0 & 0x2));
  318.             Delay(10);                 //because the slow response of hyper_terminal 
  319.             WrUTXH0('r');
  320.         }
  321.         while(!(rUTRSTAT0 & 0x2));   //Wait until THR is empty.
  322.         Delay(10);
  323.         WrUTXH0(data);
  324.     }
  325.     else if(whichUart==1)
  326.     {
  327.         if(data=='n')
  328.         {
  329.             while(!(rUTRSTAT1 & 0x2));
  330.             Delay(10);                 //because the slow response of hyper_terminal 
  331.             rUTXH1 = 'r';
  332.         }
  333.         while(!(rUTRSTAT1 & 0x2));   //Wait until THR is empty.
  334.         Delay(10);
  335.         rUTXH1 = data;
  336.     }   
  337.     else if(whichUart==2)
  338.     {
  339.         if(data=='n')
  340.         {
  341.             while(!(rUTRSTAT2 & 0x2));
  342.             Delay(10);                 //because the slow response of hyper_terminal 
  343.             rUTXH2 = 'r';
  344.         }
  345.         while(!(rUTRSTAT2 & 0x2));   //Wait until THR is empty.
  346.         Delay(10);
  347.         rUTXH2 = data;
  348.     }       
  349. }               
  350. //====================================================================
  351. void Uart_SendString(char *pt)
  352. {
  353.     while(*pt)
  354.         Uart_SendByte(*pt++);
  355. }
  356. //=====================================================================
  357. //If you don't use vsprintf(), the code size is reduced very much.
  358. void Uart_Printf(char *fmt,...)
  359. {
  360.     va_list ap;
  361.     char string[256];
  362.     va_start(ap,fmt);
  363.     vsprintf(string,fmt,ap);
  364.     Uart_SendString(string);
  365.     va_end(ap);
  366. }
  367. //========================**[ BOARD LED ]=================================
  368. void Led_Display(int data)
  369. {
  370.           //Active is low.(LED On)
  371.           // GPF7  GPF6   GPF5   GPF4
  372.           //nLED_8 nLED4 nLED_2 nLED_1
  373. //    rGPFDAT = (rGPFDAT & 0xf) | !((data & 0xf)<<4);
  374.     rGPFDAT = (rGPFDAT & ~(0xf<<4)) | ((~data & 0xf)<<4);    
  375. }
  376. //========================*[ Timer ]==============================**
  377. void Timer_Start(int divider)  //0:16us,1:32us 2:64us 3:128us
  378. {
  379.     rWTCON = ((PCLK/1000000-1)<<8)|(divider<<3);  //Watch-dog timer control register
  380.     rWTDAT = 0xffff;  //Watch-dog timer data register
  381.     rWTCNT = 0xffff;  //Watch-dog count register
  382.       //Watch-dog timer enable & interrupt  disable
  383. //    rWTCON = rWTCON |(1<<5) & !(1<<2);  //?
  384.     rWTCON = rWTCON | (1<<5) | ~(1<<2);  //May 06, 2002 SOP
  385. }
  386. //=================================================================
  387. int Timer_Stop(void)
  388. {
  389.     rWTCON = ((PCLK/1000000-1)<<8);
  390.     return (0xffff - rWTCNT);
  391. }
  392. //========================*[ MPLL ]==============================*
  393. void ChangeMPllValue(int mdiv,int pdiv,int sdiv)
  394. {
  395.     rMPLLCON = (mdiv<<12) | (pdiv<<4) | sdiv;
  396. }
  397. //========================[ HCLK, PCLK ]===========================
  398. void ChangeClockDivider(int hdivn,int pdivn)
  399. {
  400.      // hdivn,pdivn FCLK:HCLK:PCLK
  401.      //     0,0         1:1:1 
  402.      //     0,1         1:1:2 
  403.      //     1,0         1:2:2
  404.      //     1,1         1:2:4
  405.     rCLKDIVN = (hdivn<<1) | pdivn;    
  406. }
  407. //========================**[ UPLL ]==============================*
  408. void ChangeUPllValue(int mdiv,int pdiv,int sdiv)
  409. {
  410.     rUPLLCON = (mdiv<<12) | (pdiv<<4) | sdiv;
  411. }
  412. //========================*[ General Library ]=====================*