2440lib.c
上传用户:zbk8730
上传日期:2017-08-10
资源大小:12168k
文件大小:24k
源码类别:

uCOS

开发平台:

C/C++

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