2440lib.c
上传用户:jankzhpno
上传日期:2022-08-03
资源大小:4763k
文件大小:27k
源码类别:

Windows CE

开发平台:

Visual C++

  1. //===================================================================
  2. // File Name : 2440lib.c
  3. // Function  : S3C2410 PLL,Uart, LED, Port Init
  4. // Date      : March 20, 2002
  5. // Version   : 0.0
  6. // History
  7. //   0.0 : Programming start (February 20,2002) -> SOP
  8. //===================================================================
  9. #include "def.h"
  10. #include "option.h"
  11. #include "2440addr.h"
  12. #include "2440lib.h"
  13. #include "2440slib.h" 
  14. #include <stdarg.h>
  15. #include <string.h>
  16. #include <stdlib.h>
  17. #include <stdio.h>
  18. #include <ctype.h>
  19. extern char Image$$RW$$Limit[];
  20. void *mallocPt=Image$$RW$$Limit;
  21. //***************************[ SYSTEM ]***************************************************
  22. void Delay(int time)
  23. {
  24. U32 val = (PCLK>>3)/1000-1;
  25. rTCFG0 &= ~(0xff<<8);
  26. rTCFG0 |= 3<<8; //prescaler = 3+1
  27. rTCFG1 &= ~(0xf<<12);
  28. rTCFG1 |= 0<<12; //mux = 1/2
  29. rTCNTB3 = val;
  30. rTCMPB3 = val>>1; // 50%
  31. rTCON &= ~(0xf<<16);
  32. rTCON |= 0xb<<16; //interval, inv-off, update TCNTB3&TCMPB3, start timer 3
  33. rTCON &= ~(2<<16); //clear manual update bit
  34. while(time--) {
  35. while(rTCNTO3>=val>>1);
  36. while(rTCNTO3<val>>1);
  37. };
  38. }
  39. //***************************[ PORTS ]****************************************************
  40. void Port_Init0(void)
  41. {
  42.     //CAUTION:Follow the configuration order for setting the ports. 
  43.     // 1) setting value(GPnDAT) 
  44.     // 2) setting control register  (GPnCON)
  45.     // 3) configure pull-up resistor(GPnUP)  
  46.     //32bit data bus configuration  
  47.     //*** PORT A GROUP
  48.     //Ports  : GPA22 GPA21  GPA20 GPA19 GPA18 GPA17 GPA16 GPA15 GPA14 GPA13 GPA12  
  49.     //Signal : nFCE nRSTOUT nFRE   nFWE  ALE   CLE  nGCS5 nGCS4 nGCS3 nGCS2 nGCS1 
  50.     //Binary :  1     1      1  , 1   1   1    1   ,  1     1     1     1
  51.     //Ports  : GPA11   GPA10  GPA9   GPA8   GPA7   GPA6   GPA5   GPA4   GPA3   GPA2   GPA1  GPA0
  52.     //Signal : ADDR26 ADDR25 ADDR24 ADDR23 ADDR22 ADDR21 ADDR20 ADDR19 ADDR18 ADDR17 ADDR16 ADDR0 
  53.     //Binary :  1       1      1      1   , 1       1      1      1   ,  1       1     1      1         
  54.     rGPACON = 0x7fffff; 
  55.     //**** PORT B GROUP
  56.     //Ports  : GPB10    GPB9    GPB8    GPB7    GPB6     GPB5    GPB4   GPB3   GPB2     GPB1      GPB0
  57.     //Signal : nXDREQ0 nXDACK0 nXDREQ1 nXDACK1 nSS_KBD nDIS_OFF L3CLOCK L3DATA L3MODE nIrDATXDEN Keyboard
  58.     //Setting: INPUT  OUTPUT   INPUT  OUTPUT   INPUT   OUTPUT   OUTPUT OUTPUT OUTPUT   OUTPUT    OUTPUT 
  59.     //Binary :   00  ,  01       00  ,   01      00   ,  01       01  ,   01     01   ,  01        01  
  60.     rGPBCON = 0x044555;
  61.     rGPBUP  = 0x7ff;     // The pull up function is disabled GPB[10:0]
  62.     //*** PORT C GROUP for youlong
  63.     //Ports  : GPC15 GPC14 GPC13 GPC12 GPC11 GPC10 GPC9 GPC8  GPC7   GPC6   GPC5 GPC4 GPC3  GPC2  GPC1 GPC0
  64.     //Signal : VD7   VD6   VD5   VD4   VD3   VD2   VD1  VD0 LCDVF2 LCDVF1 LCDVF0 VM VFRAME VLINE VCLK LEND  
  65.     //Binary :  10   10  , 10    10  , 10    10  , 10   10  , 10     10  ,  10   10 , 10     10 , 10   10
  66.     rGPCCON = 0xaaaaaaaa;       
  67.     rGPCUP  = 0xffff;     // The pull up function is disabled GPC[15:0] 
  68.     
  69.     //*** PORT D GROUP
  70.     //Ports  : GPD15 GPD14 GPD13 GPD12 GPD11 GPD10 GPD9 GPD8 GPD7 GPD6 GPD5 GPD4 GPD3 GPD2 GPD1 GPD0
  71.     //Signal : VD23  VD22  VD21  VD20  VD19  VD18  VD17 VD16 VD15 VD14 VD13 VD12 VD11 VD10 VD9  VD8
  72.     //Binary : 10    10  , 10    10  , 10    10  , 10   10 , 10   10 , 10   10 , 10   10 ,10   10
  73.     rGPDCON = 0xaaaaaaaa;       
  74.     rGPDUP  = 0xffff;     // The pull up function is disabled GPD[15:0]
  75.     //*** PORT E GROUP
  76.     //Ports  : GPE15  GPE14 GPE13   GPE12   GPE11   GPE10   GPE9    GPE8     GPE7  GPE6  GPE5   GPE4  
  77.     //Signal : IICSDA IICSCL SPICLK SPIMOSI SPIMISO SDDATA3 SDDATA2 SDDATA1 SDDATA0 SDCMD SDCLK IN 
  78.     //Binary :  10     10  ,  10      10  ,  10      10   ,  10      10   ,   10    10  , 10     00  ,     
  79.     //-------------------------------------------------------------------------------------------------------
  80.     //Ports  :  GPE3   GPE2  GPE1    GPE0    
  81.     //Signal :  IN     IN    IN      IN  
  82.     //Binary :  00     00  ,  00      00 
  83.     //rGPECON = 0xaaaaaaaa;       
  84.     //rGPEUP  = 0xffff;     // The pull up function is disabled GPE[15:0]
  85. rGPECON = 0xaaaaa800; // For added AC97 setting      
  86.     rGPEUP  = 0xffff;     
  87.      //*** PORT F GROUP
  88.     //Ports  : GPF7   GPF6   GPF5   GPF4      GPF3     GPF2  GPF1   GPF0
  89.     //Signal : nLED_8 nLED_4 nLED_2 nLED_1 nIRQ_PCMCIA EINT2 KBDINT EINT0
  90.     //Setting: Output Output Output Output    EINT3    EINT2 EINT1  EINT0
  91.     //Binary :  01      01 ,  01     01  ,     10       10  , 10     10
  92.     rGPFCON = 0x55aa;
  93.     rGPFUP  = 0xff;     // The pull up function is disabled GPF[7:0]
  94.     //*** PORT G GROUP
  95.     //Ports  : GPG15 GPG14 GPG13 GPG12 GPG11    GPG10    GPG9     GPG8     GPG7      GPG6    
  96.     //Signal : nYPON  YMON nXPON XMON  EINT19 DMAMODE1 DMAMODE0 DMASTART KBDSPICLK KBDSPIMOSI
  97.     //Setting: nYPON  YMON nXPON XMON  EINT19  Output   Output   Output   SPICLK1    SPIMOSI1
  98.     //Binary :   11    11 , 11    11  , 10      01    ,   01       01   ,    11         11
  99.     //-----------------------------------------------------------------------------------------
  100.     //Ports  :    GPG5       GPG4    GPG3    GPG2    GPG1    GPG0    
  101.     //Signal : KBDSPIMISO LCD_PWREN EINT11 nSS_SPI IRQ_LAN IRQ_PCMCIA
  102.     //Setting:  SPIMISO1  LCD_PWRDN EINT11   nSS0   EINT9    EINT8
  103.     //Binary :     11         11   ,  10      11  ,  10        10
  104.     rGPGCON = 0xff95ffba;
  105.     rGPGUP  = 0xffff;    // The pull up function is disabled GPG[15:0]
  106.     //*** PORT H GROUP
  107.     //Ports  :  GPH10    GPH9  GPH8 GPH7  GPH6  GPH5 GPH4 GPH3 GPH2 GPH1  GPH0 
  108.     //Signal : CLKOUT1 CLKOUT0 UCLK nCTS1 nRTS1 RXD1 TXD1 RXD0 TXD0 nRTS0 nCTS0
  109.     //Binary :   10   ,  10     10 , 11    11  , 10   10 , 10   10 , 10    10
  110.     rGPHCON = 0x2afaaa;
  111.     rGPHUP  = 0x7ff;    // The pull up function is disabled GPH[10:0]
  112. // Added for S3C2440X, DonGo
  113. //*** PORT J GROUP
  114.     //Ports  : GPJ12   GPJ11       GPJ10    GPJ9    GPJ8      GPJ7      GPJ6      GPJ5      GPJ4      GPJ3      GPJ2      GPJ1     GPJ0 
  115.     //Signal : CAMRESET CAMPCLKOUT CAMHREF CAMVSYNC CAMPCLKIN CAMDAT[7] CAMDAT[6] CAMDAT[5] CAMDAT[4] CAMDAT[3] CAMDAT[2] CAMDAT[1] CAMDAT[0] 
  116.     //Binary :   10      10       10        10       10        10        10        10       10         10        10        10      10
  117.     rGPJCON = 0x02aaaaaa;
  118.     rGPJUP  = 0x1fff;    // The pull up function is disabled GPH[10:0]
  119.     
  120.     //External interrupt will be falling edge triggered. 
  121.     rEXTINT0 = 0x22222222;    // EINT[7:0]
  122.     rEXTINT1 = 0x22222222;    // EINT[15:8]
  123.     rEXTINT2 = 0x22222222;    // EINT[23:16]
  124. }
  125. void Port_Init(void)
  126. {
  127.     //CAUTION:Follow the configuration order for setting the ports. 
  128.     // 1) setting value(GPnDAT) 
  129.     // 2) setting control register  (GPnCON)
  130.     // 3) configure pull-up resistor(GPnUP)  
  131.     //32bit data bus configuration  
  132.     //*** PORT A GROUP
  133.     //Ports  : GPA22 GPA21  GPA20 GPA19 GPA18 GPA17 GPA16 GPA15 GPA14 GPA13 GPA12  
  134.     //Signal : nFCE nRSTOUT nFRE   nFWE  ALE   CLE  nGCS5 nGCS4 nGCS3 nGCS2 nGCS1 
  135.     //Binary :  1     1      1  , 1   1   1    1   ,  1     1     1     1
  136.     //Ports  : GPA11   GPA10  GPA9   GPA8   GPA7   GPA6   GPA5   GPA4   GPA3   GPA2   GPA1  GPA0
  137.     //Signal : ADDR26 ADDR25 ADDR24 ADDR23 ADDR22 ADDR21 ADDR20 ADDR19 ADDR18 ADDR17 ADDR16 ADDR0 
  138.     //Binary :  1       1      1      1   , 1       1      1      1   ,  1       1     1      1         
  139.     rGPACON = 0x7fffff; 
  140.     //**** PORT B GROUP
  141.     //Ports  : GPB10    GPB9    GPB8    GPB7    GPB6     GPB5    GPB4   GPB3   GPB2     GPB1      GPB0
  142.     //Signal : nXDREQ0 nXDACK0 nXDREQ1 nXDACK1 nSS_KBD nDIS_OFF L3CLOCK L3DATA L3MODE nIrDATXDEN Keyboard
  143.     //Setting: INPUT  OUTPUT   INPUT  OUTPUT   INPUT   OUTPUT   OUTPUT OUTPUT OUTPUT   OUTPUT    OUTPUT 
  144.     //Binary :   00  ,  01       00  ,   01      00   ,  01       01  ,   01     01   ,  01        01  
  145.     //rGPBCON = 0x000150;(youlong)
  146.     rGPBCON = 0x015550;
  147.     rGPBUP  = 0x7ff;     // The pull up function is disabled GPB[10:0]
  148.     //*** PORT C GROUP for youlong
  149.     //Ports  : GPC15 GPC14 GPC13 GPC12 GPC11 GPC10 GPC9 GPC8  GPC7   GPC6   GPC5 GPC4 GPC3  GPC2  GPC1 GPC0
  150.     //Signal : VD7   VD6   VD5   VD4   VD3   VD2   VD1  VD0 LCDVF2 LCDVF1 LCDVF0 VM VFRAME VLINE VCLK LEND  
  151.     //Binary :  10   10  , 10    10  , 10    10  , 10   10  , 10     10  ,  10   10 , 10     10 , 10   10
  152.     //rGPCCON = 0xaaaaaaaa;       
  153.     //rGPCUP  = 0xffff;     // The pull up function is disabled GPC[15:0] 
  154.     
  155.     //*** PORT C GROUP
  156.     //Ports  : GPC15 GPC14 GPC13 GPC12 GPC11 GPC10 GPC9 GPC8  GPC7   GPC6   GPC5 GPC4 GPC3  GPC2  GPC1 GPC0
  157.     //Signal : VD7   VD6   VD5   VD4   VD3   VD2   VD1  VD0 LCDVF2 LCDVF1 LCDVF0 VM VFRAME VLINE VCLK LEND  
  158.     //Binary :  10   10  , 10    10  , 10    10  , 10   01  , 01     01  ,  01   10 , 10     10 , 10   10
  159.     rGPCCON = 0xaaa956aa;       
  160.     rGPCUP  = 0xffff;     // The pull up function is disabled GPC[15:0]     
  161.     //*** PORT D GROUP
  162.     //Ports  : GPD15 GPD14 GPD13 GPD12 GPD11 GPD10 GPD9 GPD8 GPD7 GPD6 GPD5 GPD4 GPD3 GPD2 GPD1 GPD0
  163.     //Signal : VD23  VD22  VD21  VD20  VD19  VD18  VD17 VD16 VD15 VD14 VD13 VD12 VD11 VD10 VD9  VD8
  164.     //Binary : 10    10  , 10    10  , 10    10  , 10   10 , 10   10 , 10   10 , 10   10 ,10   10
  165.     rGPDCON = 0xaaaaaaaa;       
  166.     rGPDUP  = 0xffff;     // The pull up function is disabled GPD[15:0]
  167.     //*** PORT E GROUP
  168.     //Ports  : GPE15  GPE14 GPE13   GPE12   GPE11   GPE10   GPE9    GPE8     GPE7  GPE6  GPE5   GPE4  
  169.     //Signal : IICSDA IICSCL SPICLK SPIMOSI SPIMISO SDDATA3 SDDATA2 SDDATA1 SDDATA0 SDCMD SDCLK IN 
  170.     //Binary :  10     10  ,  10      10  ,  10      10   ,  10      10   ,   10    10  , 10     00  ,     
  171.     //-------------------------------------------------------------------------------------------------------
  172.     //Ports  :  GPE3   GPE2  GPE1    GPE0    
  173.     //Signal :  IN     IN    IN      IN  
  174.     //Binary :  00     00  ,  00      00 
  175.     //rGPECON = 0xaaaaaaaa;       
  176.     //rGPEUP  = 0xffff;     // The pull up function is disabled GPE[15:0]
  177. rGPECON = 0xa02aa800; // For added AC97 setting      
  178.     rGPEUP  = 0xffff;     
  179.      //*** PORT F GROUP
  180.     //Ports  : GPF7   GPF6   GPF5   GPF4      GPF3     GPF2  GPF1   GPF0
  181.     //Signal : nLED_8 nLED_4 nLED_2 nLED_1 nIRQ_PCMCIA EINT2 KBDINT EINT0
  182.     //Setting: Output Output Output Output    EINT3    EINT2 EINT1  EINT0
  183.     //Binary :  01      01 ,  01     01  ,     10       10  , 10     10
  184.     rGPFCON = 0x55aa;
  185.     rGPFUP  = 0xff;     // The pull up function is disabled GPF[7:0]
  186.     //*** PORT G GROUP
  187.     //Ports  : GPG15 GPG14 GPG13 GPG12 GPG11    GPG10    GPG9     GPG8     GPG7      GPG6    
  188.     //Signal : nYPON  YMON nXPON XMON  EINT19 DMAMODE1 DMAMODE0 DMASTART KBDSPICLK KBDSPIMOSI
  189.     //Setting: nYPON  YMON nXPON XMON  EINT19  Output   Output   Output   SPICLK1    SPIMOSI1
  190.     //Binary :   11    11 , 11    11  , 10      01    ,   01       01   ,    11         11
  191.     //-----------------------------------------------------------------------------------------
  192.     //Ports  :    GPG5       GPG4    GPG3    GPG2    GPG1    GPG0    
  193.     //Signal : KBDSPIMISO LCD_PWREN EINT11 nSS_SPI IRQ_LAN IRQ_PCMCIA
  194.     //Setting:  SPIMISO1  LCD_PWRDN EINT11   nSS0   EINT9    EINT8
  195.     //Binary :     11         11   ,  10      11  ,  10        10
  196.     rGPGCON = 0x00a2aaaa;// GPG9 input without pull-up
  197.     rGPGUP  = 0xffff;    // The pull up function is disabled GPG[15:0]
  198.     //*** PORT H GROUP
  199.     //Ports  :  GPH10    GPH9  GPH8 GPH7  GPH6  GPH5 GPH4 GPH3 GPH2 GPH1  GPH0 
  200.     //Signal : CLKOUT1 CLKOUT0 UCLK nCTS1 nRTS1 RXD1 TXD1 RXD0 TXD0 nRTS0 nCTS0
  201.     //Binary :   10   ,  10     10 , 11    11  , 10   10 , 10   10 , 10    10
  202.     rGPHCON = 0x00faaa;
  203.     rGPHUP  = 0x7ff;    // The pull up function is disabled GPH[10:0]
  204. // Added for S3C2440X, DonGo
  205. //*** PORT J GROUP
  206.     //Ports  : GPJ12   GPJ11       GPJ10    GPJ9    GPJ8      GPJ7      GPJ6      GPJ5      GPJ4      GPJ3      GPJ2      GPJ1     GPJ0 
  207.     //Signal : CAMRESET CAMPCLKOUT CAMHREF CAMVSYNC CAMPCLKIN CAMDAT[7] CAMDAT[6] CAMDAT[5] CAMDAT[4] CAMDAT[3] CAMDAT[2] CAMDAT[1] CAMDAT[0] 
  208.     //Binary :   10      10       10        10       10        10        10        10       10         10        10        10      10
  209.     rGPJCON = 0x02aaaaaa;
  210.     rGPJUP  = 0x1fff;    // The pull up function is disabled GPH[10:0]
  211.     
  212.     //External interrupt will be falling edge triggered. 
  213.     rEXTINT0 = 0x22222222;    // EINT[7:0]
  214.     rEXTINT1 = 0x22222222;    // EINT[15:8]
  215.     rEXTINT2 = 0x22222222;    // EINT[23:16]
  216. }
  217. //***************************[ UART ]******************************
  218. static int whichUart=0;
  219. void Uart_Init(int pclk,int baud)
  220. {
  221.     int i;
  222.     if(pclk == 0)
  223.     pclk    = PCLK;
  224.     rUFCON0 = 0x0;   //UART channel 0 FIFO control register, FIFO disable
  225.     rUFCON1 = 0x0;   //UART channel 1 FIFO control register, FIFO disable
  226.     rUFCON2 = 0x0;   //UART channel 2 FIFO control register, FIFO disable
  227.     rUMCON0 = 0x0;   //UART chaneel 0 MODEM control register, AFC disable
  228.     rUMCON1 = 0x0;   //UART chaneel 1 MODEM control register, AFC disable
  229. //UART0
  230.     rULCON0 = 0x3;   //Line control register : Normal,No parity,1 stop,8 bits
  231.      //    [10]       [9]     [8]        [7]        [6]      [5]         [4]           [3:2]        [1:0]
  232.      // Clock Sel,  Tx Int,  Rx Int, Rx Time Out, Rx err, Loop-back, Send break,  Transmit Mode, Receive Mode
  233.      //     0          1       0    ,     0          1        0           0     ,       01          01
  234.      //   PCLK       Level    Pulse    Disable    Generate  Normal      Normal        Interrupt or Polling
  235.     rUCON0  = 0x245;   // Control register
  236.     rUBRDIV0=( (int)(pclk/16./baud+0.5) -1 );   //Baud rate divisior register 0
  237. //UART1
  238.     rULCON1 = 0x3;
  239.     rUCON1  = 0x245;
  240.     rUBRDIV1=( (int)(pclk/16./baud+0.5) -1 );
  241. //UART2
  242.     rULCON2 = 0x3;
  243.     rUCON2  = 0x245;
  244.     rUBRDIV2=( (int)(pclk/16./baud+0.5) -1 );    
  245.     for(i=0;i<100;i++);
  246. }
  247. //===================================================================
  248. void Uart_Select(int ch)
  249. {
  250.     whichUart = ch;
  251. }
  252. //===================================================================
  253. void Uart_TxEmpty(int ch)
  254. {
  255.     if(ch==0)
  256.         while(!(rUTRSTAT0 & 0x4)); //Wait until tx shifter is empty.
  257.           
  258.     else if(ch==1)
  259.         while(!(rUTRSTAT1 & 0x4)); //Wait until tx shifter is empty.
  260.         
  261.     else if(ch==2)
  262.         while(!(rUTRSTAT2 & 0x4)); //Wait until tx shifter is empty.
  263. }
  264. //=====================================================================
  265. char Uart_Getch(void)
  266. {
  267.     if(whichUart==0)
  268.     {       
  269.         while(!(rUTRSTAT0 & 0x1)); //Receive data ready
  270.         return RdURXH0();
  271.     }
  272.     else if(whichUart==1)
  273.     {       
  274.         while(!(rUTRSTAT1 & 0x1)); //Receive data ready
  275.         return RdURXH1();
  276.     }
  277.     else if(whichUart==2)
  278.     {
  279.         while(!(rUTRSTAT2 & 0x1)); //Receive data ready
  280.         return RdURXH2();
  281.     }
  282.     
  283.     return 0 ;
  284. }
  285. //====================================================================
  286. char Uart_GetKey(void)
  287. {
  288.     if(whichUart==0)
  289.     {       
  290.         if(rUTRSTAT0 & 0x1)    //Receive data ready
  291.             return RdURXH0();
  292.         else
  293.             return 0;
  294.     }
  295.     else if(whichUart==1)
  296.     {
  297.         if(rUTRSTAT1 & 0x1)    //Receive data ready
  298.             return RdURXH1();
  299.         else
  300.             return 0;
  301.     }
  302.     else if(whichUart==2)
  303.     {       
  304.         if(rUTRSTAT2 & 0x1)    //Receive data ready
  305.             return RdURXH2();
  306.         else
  307.             return 0;
  308.     }    
  309. return 0 ;
  310. }
  311. //====================================================================
  312. void Uart_GetString(char *string)
  313. {
  314.     char *string2 = string;
  315.     char c;
  316.     while((c = Uart_Getch())!='r')
  317.     {
  318.         if(c=='b')
  319.         {
  320.             if( (int)string2 < (int)string )
  321.             {
  322.                 Uart_Printf("b b");
  323.                 string--;
  324.             }
  325.         }
  326.         else 
  327.         {
  328.             *string++ = c;
  329.             Uart_SendByte(c);
  330.         }
  331.     }
  332.     *string='';
  333.     Uart_SendByte('n');
  334. }
  335. //=====================================================================
  336. int Uart_GetIntNum(void)
  337. {
  338.     char str[30];
  339.     char *string = str;
  340.     int base     = 10;
  341.     int minus    = 0;
  342.     int result   = 0;
  343.     int lastIndex;    
  344.     int i;
  345.     
  346.     Uart_GetString(string);
  347.     
  348.     if(string[0]=='-')
  349.     {
  350.         minus = 1;
  351.         string++;
  352.     }
  353.     
  354.     if(string[0]=='0' && (string[1]=='x' || string[1]=='X'))
  355.     {
  356.         base    = 16;
  357.         string += 2;
  358.     }
  359.     
  360.     lastIndex = strlen(string) - 1;
  361.     
  362.     if(lastIndex<0)
  363.         return -1;
  364.     
  365.     if(string[lastIndex]=='h' || string[lastIndex]=='H' )
  366.     {
  367.         base = 16;
  368.         string[lastIndex] = 0;
  369.         lastIndex--;
  370.     }
  371.     if(base==10)
  372.     {
  373.         result = atoi(string);
  374.         result = minus ? (-1*result):result;
  375.     }
  376.     else
  377.     {
  378.         for(i=0;i<=lastIndex;i++)
  379.         {
  380.             if(isalpha(string[i]))
  381.             {
  382.                 if(isupper(string[i]))
  383.                     result = (result<<4) + string[i] - 'A' + 10;
  384.                 else
  385.                     result = (result<<4) + string[i] - 'a' + 10;
  386.             }
  387.             else
  388.                 result = (result<<4) + string[i] - '0';
  389.         }
  390.         result = minus ? (-1*result):result;
  391.     }
  392.     return result;
  393. }
  394. //*****************************************************************************
  395. //get a number for the uart
  396. //*****************************************************************************
  397. int Uart_GetIntNum_GJ(void)
  398. {
  399.     char string[16] ;
  400.     char *p_string = string ;
  401.     char c;
  402.     int i = 0 ;
  403.     int data = 0 ;
  404.     while(   ( c = Uart_Getch()) != 'r'  )
  405.     {
  406. if(c=='b') p_string--;
  407. else *p_string++=c;
  408. Uart_SendByte( c ) ;
  409.     }
  410.     *p_string = '';
  411. i = 0 ;
  412. while( string[i] != '' )
  413. {
  414. data = data * 10 ;
  415. if( string[i]<'0'||string[i]>'9' )
  416. return -1 ;
  417. data = data + ( string[i]-'0' ) ;
  418. i++ ;
  419. }
  420. return data ;
  421. }
  422. //*****************************************************************************
  423. //=====================================================================
  424. void Uart_SendByte(int data)
  425. {
  426.     if(whichUart==0)
  427.     {
  428.         if(data=='n')
  429.         {
  430.             while(!(rUTRSTAT0 & 0x2));
  431.            // Delay(1);                 //because the slow response of hyper_terminal 
  432.             WrUTXH0('r');
  433.         }
  434.         while(!(rUTRSTAT0 & 0x2));   //Wait until THR is empty.
  435.       //  Delay(1);
  436.         WrUTXH0(data);
  437.     }
  438.     else if(whichUart==1)
  439.     {
  440.         if(data=='n')
  441.         {
  442.             while(!(rUTRSTAT1 & 0x2));
  443.             //Delay(1);                 //because the slow response of hyper_terminal 
  444.             rUTXH1 = 'r';
  445.         }
  446.         while(!(rUTRSTAT1 & 0x2));   //Wait until THR is empty.
  447.         //Delay(1);
  448.         rUTXH1 = data;
  449.     }   
  450.     else if(whichUart==2)
  451.     {
  452.         if(data=='n')
  453.         {
  454.             while(!(rUTRSTAT2 & 0x2));
  455.             //Delay(1);                 //because the slow response of hyper_terminal 
  456.             rUTXH2 = 'r';
  457.         }
  458.         while(!(rUTRSTAT2 & 0x2));   //Wait until THR is empty.
  459.         //Delay(1);
  460.         rUTXH2 = data;
  461.     }       
  462. }               
  463. //====================================================================
  464. void Uart_SendString(char *pt)
  465. {
  466.     while(*pt)
  467.         Uart_SendByte(*pt++);
  468. }
  469. //=====================================================================
  470. //If you don't use vsprintf(), the code size is reduced very much.
  471. void Uart_Printf(char *fmt,...)
  472. {
  473.     va_list ap;
  474.     char string[256];
  475.     va_start(ap,fmt);
  476.     vsprintf(string,fmt,ap);
  477.     Uart_SendString(string);
  478.     va_end(ap);
  479. }
  480. //**************************[ BOARD LED ]*********************************
  481. void Led_Display(int data)
  482. {
  483.           //Active is low.(LED On)
  484.           // GPF7  GPF6   GPF5   GPF4
  485.           //nLED_8 nLED4 nLED_2 nLED_1
  486. //    rGPFDAT = (rGPFDAT & 0xf) | !((data & 0xf)<<4);
  487. //    rGPFDAT = (rGPFDAT & ~(0xf<<4)) | ((~data & 0xf)<<4);    
  488.           //Active is low.(LED On)
  489.           // GPF7  GPF6   GPF5   GPF4
  490.           //nLED_8 nLED4 nLED_2 nLED_1
  491. //    rGPFDAT = (rGPFDAT & 0xf) | !((data & 0xf)<<4);
  492. rGPBDAT = (rGPBDAT & ~(0xf<<5)) | ((~data & 0xf)<<5);  
  493. //rGPCDAT = (rGPBDAT & ~(0xf<<5)) | ((~data & 0xf0)<<5);    
  494. }
  495. //***************************[ BOARD BEEP ]*******************************
  496. /*
  497. void Beep(U32 freq, U32 ms)
  498. {
  499. rGPBCON &= ~3; //set GPB0 as tout0, pwm output
  500. rGPBCON |= 2;
  501. rTCFG0 &= ~0xff;
  502. rTCFG0 |= 15; //prescaler = 15+1
  503. rTCFG1 &= ~0xf;
  504. rTCFG1 |= 2; //mux = 1/8
  505. rTCNTB0 = (PCLK>>7)/freq;
  506. rTCMPB0 = rTCNTB0>>1; // 50%
  507. rTCON &= ~0x1f;
  508. rTCON |= 0xb; //disable deadzone, auto-reload, inv-off, update TCNTB0&TCMPB0, start timer 0
  509. rTCON &= ~2; //clear manual update bit
  510. Delay(ms);
  511. rGPBCON &= ~3; //set GPB0 as output
  512. rGPBCON |= 1;
  513. rGPBDAT &= ~1;
  514. }*/
  515. void Buzzer_Freq_Set( U32 freq )
  516. {
  517. rGPBCON &= ~3; //set GPB0 as tout0, pwm output
  518. rGPBCON |= 2;
  519. rTCFG0 &= ~0xff;
  520. rTCFG0 |= 15; //prescaler = 15+1
  521. rTCFG1 &= ~0xf;
  522. rTCFG1 |= 2; //mux = 1/8
  523. rTCNTB0 = (PCLK>>7)/freq;
  524. rTCMPB0 = rTCNTB0>>1; // 50%
  525. rTCON &= ~0x1f;
  526. rTCON |= 0xb; //disable deadzone, auto-reload, inv-off, update TCNTB0&TCMPB0, start timer 0
  527. rTCON &= ~2; //clear manual update bit
  528. }
  529. void Buzzer_Stop( void )
  530. {
  531. rGPBCON &= ~3; //set GPB0 as output
  532. rGPBCON |= 1;
  533. rGPBDAT &= ~1;
  534. }
  535. //***************************[ BOARD BEEP ]*******************************
  536. void Beep(U32 freq, U32 ms)
  537. {
  538. Buzzer_Freq_Set( freq ) ;
  539. Delay( ms ) ;
  540. Buzzer_Stop() ;
  541. }
  542. /****************************************************************************
  543. 【功能说明】蜂鸣器PWM测试
  544. ****************************************************************************/
  545. void BUZZER_PWM_Test( void )
  546. {
  547. U16 freq = 1000 ;
  548. Uart_Printf( "nBUZZER TEST ( PWM Control )n" );
  549.     Uart_Printf( "Press +/- to increase/reduce the frequency of BUZZER !n" ) ;
  550. Uart_Printf( "Press 'ESC' key to Exit this program !nn" );
  551. Buzzer_Freq_Set( freq ) ;
  552.     while( 1 )
  553.     {
  554. U8 key = Uart_Getch();
  555. if( key == '+' )
  556. {
  557. if( freq < 20000 )
  558. freq += 10 ;
  559. Buzzer_Freq_Set( freq ) ;
  560. }
  561. if( key == '-' )
  562. {
  563. if( freq > 11 )
  564. freq -= 10 ;
  565. Buzzer_Freq_Set( freq ) ;
  566. }
  567. Uart_Printf( "tFreq = %dn", freq ) ;
  568. if( key == ESC_KEY )
  569. {
  570. Buzzer_Stop() ;
  571. return ;
  572. }
  573. }
  574. }
  575. //********************** BOARD LCD backlight ]****************************
  576. void LcdBkLtSet(U32 HiRatio)
  577. {
  578. #define FREQ_PWM1 1000
  579. if(!HiRatio)
  580. {
  581. rGPBCON  = rGPBCON & (~(3<<2)) | (1<<2) ; //GPB1设置为output
  582. rGPBDAT &= ~(1<<1);
  583. return;
  584. }
  585. rGPBCON = rGPBCON & (~(3<<2)) | (2<<2) ; //GPB1设置为TOUT1
  586. if( HiRatio > 100 )
  587. HiRatio = 100 ;
  588. rTCON = rTCON & (~(0xf<<8)) ; // clear manual update bit, stop Timer1
  589. rTCFG0  &= 0xffffff00; // set Timer 0&1 prescaler 0
  590. rTCFG0 |= 15; //prescaler = 15+1
  591. rTCFG1  &= 0xffffff0f; // set Timer 1 MUX 1/16
  592. rTCFG1  |= 0x00000030; // set Timer 1 MUX 1/16
  593. rTCNTB1  = ( 100000000>>8 )/FREQ_PWM1; //if set inverter off, when TCNT2<=TCMP2, TOUT is high, TCNT2>TCMP2, TOUT is low
  594. rTCMPB1  = ( rTCNTB1*(100-HiRatio))/100 ; //if set inverter on,  when TCNT2<=TCMP2, TOUT is low,  TCNT2>TCMP2, TOUT is high
  595. rTCON = rTCON & (~(0xf<<8)) | (0x0e<<8) ;
  596. //自动重装,输出取反关闭,更新TCNTBn、TCMPBn,死区控制器关闭
  597. rTCON = rTCON & (~(0xf<<8)) | (0x0d<<8) ; //开启背光控制
  598. }
  599. /****************************************************************************
  600. 【功能说明】LCD背光亮度控制,PWM控制占空比
  601. ****************************************************************************/
  602. void LCD_BackLight_Control( void )
  603. {
  604. U8 HiRatio = 50 ;
  605.     Uart_Printf( "nNOTE : ONLY SOME type LCD kit  SUPPORT backlight adjust!!!n" ) ;
  606.     Uart_Printf( "Press +/- to increase/reduce the light of LCD !n" ) ;
  607. Uart_Printf( "Press 'ESC' to Exit this test program !nn" );
  608. LcdBkLtSet( HiRatio ) ;
  609.     while( 1 )
  610.     {
  611. U8 key = Uart_Getch();
  612. if( key == '+' )
  613. {
  614. if( HiRatio < 100 )
  615. HiRatio += 1 ;
  616. }
  617. if( key == '-' )
  618. {
  619. if( HiRatio > 1 )
  620. HiRatio -= 1 ;
  621. }
  622. if( key == ESC_KEY ) break ;
  623. LcdBkLtSet( HiRatio ) ;
  624. Uart_Printf( "LCD backlight HiRatio %dn", HiRatio ) ;
  625. }
  626. }
  627. //*************************[ Timer ]********************************
  628. void Timer_Start(int divider)  //0:16us,1:32us 2:64us 3:128us
  629. {
  630.     rWTCON = ((PCLK/1000000-1)<<8)|(divider<<3);  //Watch-dog timer control register
  631.     rWTDAT = 0xffff;  //Watch-dog timer data register
  632.     rWTCNT = 0xffff;  //Watch-dog count register
  633.       // Watch-dog timer enable & interrupt  disable
  634.     rWTCON = (rWTCON & ~(1<<5) & ~(1<<2)) |(1<<5);
  635. }
  636. //=================================================================
  637. int Timer_Stop(void)
  638. {
  639.     rWTCON = ((PCLK/1000000-1)<<8);
  640.     return (0xffff - rWTCNT);
  641. }
  642. //*************************[ MPLL ]*******************************
  643. void ChangeMPllValue(int mdiv,int pdiv,int sdiv)
  644. {
  645.     rMPLLCON = (mdiv<<12) | (pdiv<<4) | sdiv;
  646. }
  647. //************************[ HCLK, PCLK ]***************************
  648. /*
  649. // for 2410.
  650. void ChangeClockDivider(int hdivn,int pdivn)
  651. {
  652.      // hdivn,pdivn FCLK:HCLK:PCLK
  653.      //     0,0         1:1:1 
  654.      //     0,1         1:1:2 
  655.      //     1,0         1:2:2
  656.      //     1,1         1:2:4
  657.     rCLKDIVN = (hdivn<<1) | pdivn;    
  658.     if(hdivn)
  659.         MMU_SetAsyncBusMode();
  660.     else 
  661.         MMU_SetFastBusMode();
  662. }
  663. */
  664. // Modified for 2440.
  665. void ChangeClockDivider(int hdivn_val,int pdivn_val)
  666. {
  667. int hdivn=2, pdivn=0;
  668.      // hdivn_val (FCLK:HCLK)ratio hdivn
  669.      // 11           1:1       (0)
  670.      // 12           1:2       (1)
  671.      // 13           1:3       (3) 
  672.      // 14           1:4       (2)
  673.      // pdivn_val (HCLK:PCLK)ratio pdivn
  674.      // 11           1:1       (0)
  675.      // 12           1:2       (1)
  676. switch(hdivn_val) {
  677. case 11: hdivn=0; break;
  678. case 12: hdivn=1; break;
  679. case 13:
  680. case 16: hdivn=3; break;
  681. case 14: 
  682. case 18: hdivn=2; break;
  683. }
  684. switch(pdivn_val) {
  685. case 11: pdivn=0; break;
  686. case 12: pdivn=1; break;
  687. }
  688. //Uart_Printf("Clock division change [hdiv:%x, pdiv:%x]n", hdivn, pdivn);
  689. rCLKDIVN = (hdivn<<1) | pdivn;
  690. switch(hdivn_val) {
  691. case 16: // when 1, HCLK=FCLK/8.
  692. rCAMDIVN = (rCAMDIVN & ~(3<<8)) | (1<<8); 
  693. break; 
  694. case 18:  // when 1, HCLK=FCLK/6.
  695. rCAMDIVN = (rCAMDIVN & ~(3<<8)) | (1<<9); 
  696. break;
  697. }
  698.     if(hdivn!=0)
  699.         MMU_SetAsyncBusMode();
  700.     else 
  701.         MMU_SetFastBusMode();
  702. }
  703. //**************************[ UPLL ]*******************************
  704. void ChangeUPllValue(int mdiv,int pdiv,int sdiv)
  705. {
  706.     rUPLLCON = (mdiv<<12) | (pdiv<<4) | sdiv;
  707. }
  708. //*************************[ General Library ]**********************
  709. void * malloc(unsigned nbyte) 
  710. //Very simple; Use malloc() & free() like Stack
  711. //void *mallocPt=Image$$RW$$Limit;
  712. {
  713.     void *returnPt = mallocPt;
  714.     mallocPt = (int *)mallocPt+nbyte/4+((nbyte%4)>0); //To align 4byte
  715.     if( (int)mallocPt > HEAPEND )
  716.     {
  717.         mallocPt = returnPt;
  718.         return NULL;
  719.     }
  720.     return returnPt;
  721. }
  722. //-------------------------------------------------------------------
  723. void free(void *pt)
  724. {
  725.     mallocPt = pt;
  726. }