initfuncs.c
上传用户:fy98168
上传日期:2015-06-26
资源大小:13771k
文件大小:54k
源码类别:

DVD

开发平台:

C/C++

  1. /****************************************************************************
  2. File Name   : initfuncs.c
  3. Description : Initialization functions, used incase of Boot from Flash.
  4. Copyright (C) 2004, ST Microelectronics
  5.  ****************************************************************************/
  6.  /* Includes ----------------------------------------------------------- */
  7. #include <initfuncs.h>
  8. #include "stsys.h"
  9. /*#include "reg.h"*/
  10. /* Private Types ------------------------------------------------------ */
  11. /* Private Constants -------------------------------------------------- */
  12. /* Private Variables -------------------------------------------------- */
  13. /* Private Macros ----------------------------------------------------- */
  14. /* --- TMTM needed to set options --->----------------------------------- */
  15. /*
  16. DDR = 133, CAS20
  17. = 166, CAS25
  18. SDR = 166, CAS30
  19. */
  20. #ifdef SELECT_DEVICE_STB5118
  21. #define SDRAM_CAS_3_0
  22. #define SDRAM_FREQ_CONFIG_166
  23. #define SDRAM_64MB
  24. #else
  25. #define DDR_SDRAM //undef means SDR_SDRAM
  26. #define SDRAM_CAS_2_0
  27. #define SDRAM_FREQ_CONFIG_133
  28. #define SDRAM_256MB
  29. #endif
  30. //TMTM choose ONLY 1
  31. //#define SDRAM_64MB
  32. //#define SDRAM_128MB
  33. //#define SDRAM_256MB
  34. //#define SDRAM_512MB
  35. /* <--- TMTM needed to set options --------------------------------------- */
  36. #define INPUT_CLOCK_FREQUENCY   27000   /* Input clock frequency in KHz */
  37. #define MIN_PLL_FREQUENCY       10000   /* Value minimum of PLL Frequency in KHz */
  38. #define MAX_PLL_FREQUENCY       6800000 /* Value maximum of PLL Frequency in KHz */
  39. #define PLL_A                   0
  40. #define PLL_B                   1 
  41. #define PLL_A_FREQUENCY 400000
  42. //TMTM for 133sdram #define PLL_B_FREQUENCY         533000 //TMTM 592000
  43. #ifdef SDRAM_FREQ_CONFIG_133
  44. #define PLL_B_FREQUENCY 533000
  45. #elif defined (SDRAM_FREQ_CONFIG_120)
  46. #define PLL_B_FREQUENCY 480000
  47. #elif defined (SDRAM_FREQ_CONFIG_166)
  48. #define PLL_B_FREQUENCY 664000 //TMTM 600000 
  49. #endif
  50. #define CPU_DIV                 2
  51. #define LMI_DIV                 4
  52. #ifdef SELECT_DEVICE_CUT3_0 //KCY 060823
  53. #define BLITTER_DIV             3 //Blitter clock change back to 133Mhz
  54. #else
  55. #define BLITTER_DIV             4 //KCY 060622 Blitter clock 100MHz To fix OSD garbage/white spot noise issue
  56. #endif
  57. #define FDMA_DIV                2
  58. #define SYSTEM_DIV              4
  59. #define AUDIO_VIDEO_DIV         8
  60. #define FLASH_DIV               4 /* FLASH source is the same as LS_INTERCONECT */
  61. #define CPU_SOURCE              PLL_A
  62. #define LMI_SOURCE              PLL_B
  63. #define BLITTER_SOURCE          PLL_A
  64. #define FDMA_SOURCE             PLL_A
  65. #define SYSTEM_SOURCE           PLL_A
  66. #define AUDIO_VIDEO_SOURCE      PLL_A
  67. #define SYS_SERVICES_BASE_ADDRESS   0x20F00000
  68. #define CKG_PLLA_CONFIG0            (SYS_SERVICES_BASE_ADDRESS + 0x00)
  69. #define CKG_PLLA_CONFIG1            (SYS_SERVICES_BASE_ADDRESS + 0x04)
  70. #define CKG_PLLB_CONFIG0            (SYS_SERVICES_BASE_ADDRESS + 0x08)
  71. #define CKG_PLLB_CONFIG1            (SYS_SERVICES_BASE_ADDRESS + 0x0C)
  72. #define CKG_FSA_SETUP               (SYS_SERVICES_BASE_ADDRESS + 0x10)
  73. #define CKG_PCM_CLK_SETUP0          (SYS_SERVICES_BASE_ADDRESS + 0x20)
  74. #define CKG_PCM_CLK_SETUP1          (SYS_SERVICES_BASE_ADDRESS + 0x24)
  75. #define CKG_SPDIF_CLK_SETUP0        (SYS_SERVICES_BASE_ADDRESS + 0x30)
  76. #define CKG_SPDIF_CLK_SETUP1        (SYS_SERVICES_BASE_ADDRESS + 0x34)
  77. #define CKG_SC_CLK_SETUP0           (SYS_SERVICES_BASE_ADDRESS + 0x40)
  78. #define CKG_SC_CLK_SETUP1           (SYS_SERVICES_BASE_ADDRESS + 0x44)
  79. #define CKG_PIX_CLK_SETUP0          (SYS_SERVICES_BASE_ADDRESS + 0x54)
  80. #define CKG_PIX_CLK_SETUP1          (SYS_SERVICES_BASE_ADDRESS + 0x58)
  81. #define CKG_FDMA_CLK_SETUP0         (SYS_SERVICES_BASE_ADDRESS + 0x70)
  82. #define CKG_FDMA_CLK_SETUP1         (SYS_SERVICES_BASE_ADDRESS + 0x74)
  83. #define CKG_AUX_CLK_SETUP0          (SYS_SERVICES_BASE_ADDRESS + 0x70)
  84. #define CKG_AUX_CLK_SETUP1          (SYS_SERVICES_BASE_ADDRESS + 0x74)
  85. #define CKG_MODE_CONTROL            (SYS_SERVICES_BASE_ADDRESS + 0x110)
  86. #define CKG_CLOCK_SELECT_CFG        (SYS_SERVICES_BASE_ADDRESS + 0x180)
  87. #define CKG_REGISTER_LOCK_CFG       (SYS_SERVICES_BASE_ADDRESS + 0x300)
  88. #define CKG_OBSERVATION_CFG_AUX     (SYS_SERVICES_BASE_ADDRESS + 0x188)
  89. #define CKG_FSB_SETUP (SYS_SERVICES_BASE_ADDRESS + 0x050)
  90. /* kc-060112am */
  91. #define REDUCED_POWER_CTRL (SYS_SERVICES_BASE_ADDRESS + 0x114)
  92. #define LP_MODE_DIS0 (SYS_SERVICES_BASE_ADDRESS + 0x118)
  93. #define LP_MODE_DIS1 (SYS_SERVICES_BASE_ADDRESS + 0x11C)
  94. #define LP_MODE_COUNTER_CFG0 (SYS_SERVICES_BASE_ADDRESS + 0x120)
  95. #define LP_MODE_COUNTER_CFG1 (SYS_SERVICES_BASE_ADDRESS + 0x124)
  96. #define WATCHDOG_COUNTER_CFG0 (SYS_SERVICES_BASE_ADDRESS + 0x130)
  97. #define WATCHDOG_COUNTER_CFG1 (SYS_SERVICES_BASE_ADDRESS + 0x134)
  98. #define CKG_RESET_STATUS                 (SYS_SERVICES_BASE_ADDRESS + 0x140)
  99. #define CPU                     1
  100. #define LMI                     2
  101. #define BLITTER                 3
  102. #define SYSTEM                  4
  103. #define FDMA                    5
  104. #define AUDIO_VIDEO             6
  105. #define FLASH                   8
  106. #define HALF_VALUE              1
  107. #define WHOLE_VALUE             0
  108. #define LMI_BASE_ADDRESS                0xC0000000
  109. #define LMICONFIG_BASE_ADDRESS          0xE0000000
  110. #define LMI_VCR0                        (LMICONFIG_BASE_ADDRESS + 0x00)
  111. #define LMI_VCR1                        (LMICONFIG_BASE_ADDRESS + 0x04)
  112. #define LMI_MIM                         (LMICONFIG_BASE_ADDRESS + 0x08)
  113. #define LMI_SCR                         (LMICONFIG_BASE_ADDRESS + 0x10)
  114. #define LMI_STR                         (LMICONFIG_BASE_ADDRESS + 0x18)
  115. #define LMI_PBS                         (LMICONFIG_BASE_ADDRESS + 0x20)
  116. #define LMI_COC_LOWER                   (LMICONFIG_BASE_ADDRESS + 0x28)
  117. #define LMI_COC_UPPER                   (LMICONFIG_BASE_ADDRESS + 0x2C)
  118. #define LMI_CIC                         (LMICONFIG_BASE_ADDRESS + 0x40)
  119. #define LMI_SDRA0                       (LMICONFIG_BASE_ADDRESS + 0x30)
  120. #define LMI_SDRA1                       (LMICONFIG_BASE_ADDRESS + 0x38)
  121. #define LMI_SDMR0                       (LMICONFIG_BASE_ADDRESS + 0x48)
  122. #define LMI_SDMR1                       (LMICONFIG_BASE_ADDRESS + 0x50)
  123. #define FMICONFIG_BASE_ADDRESS          (0x20200000)
  124. #define FMICONFIG_BUFFER_BASE_ADDRESS   (0x202FF800)
  125. #define FMICONFIGDATA0_BANK0            (FMICONFIG_BASE_ADDRESS + 0x100)
  126. #define FMICONFIGDATA1_BANK0            (FMICONFIG_BASE_ADDRESS + 0X108)
  127. #define FMICONFIGDATA2_BANK0            (FMICONFIG_BASE_ADDRESS + 0X110)
  128. #define FMICONFIGDATA3_BANK0            (FMICONFIG_BASE_ADDRESS + 0X118)
  129. #define FMICONFIGDATA0_BANK1            (FMICONFIG_BASE_ADDRESS + 0X140)
  130. #define FMICONFIGDATA1_BANK1            (FMICONFIG_BASE_ADDRESS + 0X148)
  131. #define FMICONFIGDATA2_BANK1            (FMICONFIG_BASE_ADDRESS + 0X150)
  132. #define FMICONFIGDATA3_BANK1            (FMICONFIG_BASE_ADDRESS + 0X158)
  133. #define FMICONFIGDATA0_BANK2            (FMICONFIG_BASE_ADDRESS + 0X180)
  134. #define FMICONFIGDATA1_BANK2            (FMICONFIG_BASE_ADDRESS + 0X188)
  135. #define FMICONFIGDATA2_BANK2            (FMICONFIG_BASE_ADDRESS + 0X190)
  136. #define FMICONFIGDATA3_BANK2            (FMICONFIG_BASE_ADDRESS + 0X198)
  137. #define FMICONFIGDATA0_BANK3            (FMICONFIG_BASE_ADDRESS + 0X1C0)
  138. #define FMICONFIGDATA1_BANK3            (FMICONFIG_BASE_ADDRESS + 0X1C8)
  139. #define FMICONFIGDATA2_BANK3            (FMICONFIG_BASE_ADDRESS + 0X1D0)
  140. #define FMICONFIGDATA3_BANK3            (FMICONFIG_BASE_ADDRESS + 0X1D8)
  141. #define FMI_STATUSCFG                   (FMICONFIG_BASE_ADDRESS + 0X010)
  142. #define FMI_STATUSLOCK                  (FMICONFIG_BASE_ADDRESS + 0X018)
  143. #define FMI_LOCK                        (FMICONFIG_BASE_ADDRESS + 0X020)
  144. #define FMI_GENCFG                      (FMICONFIG_BASE_ADDRESS + 0X028)
  145. #define FMI_FLASHCLKSEL                 (FMICONFIG_BASE_ADDRESS + 0X050)
  146. #define FMI_CLKENABLE                   (FMICONFIG_BASE_ADDRESS + 0X068)
  147. #define BANK_0_TOP_ADDRESS              (FMICONFIG_BUFFER_BASE_ADDRESS + 0x20)
  148. #define BANK_1_TOP_ADDRESS              (FMICONFIG_BUFFER_BASE_ADDRESS + 0x30)
  149. #define BANK_2_TOP_ADDRESS              (FMICONFIG_BUFFER_BASE_ADDRESS + 0x40)
  150. #define BANK_3_TOP_ADDRESS              (FMICONFIG_BUFFER_BASE_ADDRESS + 0x50)
  151. #define BANKS_ENABLED                   (FMICONFIG_BUFFER_BASE_ADDRESS + 0x60)
  152. #define FLASH_EPLD_FLASH                0x45200000
  153. #define CONFIG_CONTROL_BASEADDRESS      (0x20402000)
  154. #define CONFIG_CONTROL_C                (CONFIG_CONTROL_BASEADDRESS+0x0)
  155. #define CONFIG_CONTROL_D                (CONFIG_CONTROL_BASEADDRESS+0X4)
  156. #define CONFIG_CONTROL_E                (CONFIG_CONTROL_BASEADDRESS+0x8)
  157. #define CONFIG_CONTROL_F                (CONFIG_CONTROL_BASEADDRESS+0XC)
  158. #define CONFIG_CONTROL_G                (CONFIG_CONTROL_BASEADDRESS+0X10)
  159. #define CONFIG_CONTROL_H                (CONFIG_CONTROL_BASEADDRESS+0X14)
  160. /* Private Function prototypes ---------------------------------------- */
  161. /* Functions ---------------------------------------------------------- */
  162. static void Simudelay(int);
  163. #pragma ST_nolink(Simudelay)
  164. static void ST_5105_InitClocks(void);
  165. #pragma ST_nolink(ST_5105_InitClocks)
  166. static void ST_5105_InitPLLFrequency(U32 PLLFrequency, U32 PLLSource);
  167. #pragma ST_nolink(ST_5105_InitPLLFrequency)
  168. static void ST_5105_SetupDividers(void);
  169. #pragma ST_nolink(ST_5105_SetupDividers)
  170. static void ST_5105_SetupFrequencySynthesizer(void);
  171. #pragma ST_nolink(ST_5105_SetupFrequencySynthesizer)
  172. static void ST_5105_SetPLLClockDivider(U32 clock, U32 div, U32 half, U32 source, S32 phase);
  173. #pragma ST_nolink(ST_5105_SetPLLClockDivider)
  174. static void ST_5105_IniLMI_Cas20(void);
  175. #pragma ST_nolink(ST_5105_IniLMI_Cas20)
  176. static void ST_5105_IniLMI_Cas25(void);
  177. #pragma ST_nolink(ST_5105_IniLMI_Cas25)
  178. static void ST_5105_InitFMI(void);
  179. #pragma ST_nolink(ST_5105_InitFMI)
  180. /****leslie***/
  181. static void ST_5105_IniLMI_PC_SDRAM(void);
  182. #pragma ST_nolink(ST_5105_IniLMI_PC_SDRAM)
  183. static void ST_5105_IniLMI_Reg(void); #pragma ST_nolink(ST_5105_IniLMI_Reg)
  184. /*****************/
  185. /* Functions -------------------------------------------------------------- */
  186. /*-------------------------------------------------------------------------
  187.  * Function : PostPokeLoopCallback
  188.  * Input    : None
  189.  * Output   :
  190.  * Return   : None
  191.  * ----------------------------------------------------------------------*/
  192. void PostPokeLoopCallback(void)
  193. {
  194. }
  195. /*-------------------------------------------------------------------------
  196.  * Function : PrePokeLoopCallback
  197.  * Input    : None
  198.  * Output   :
  199.  * Return   : None
  200.  * Comment  : Function automatically called after the poke loop
  201.  * ----------------------------------------------------------------------*/
  202. void PrePokeLoopCallback(void)
  203. {
  204.     volatile U32    x;
  205.     /* Set up the PLL's */
  206.     ST_5105_InitClocks ();
  207.     #ifdef DDR_SDRAM
  208. #ifdef SDRAM_CAS_2_0
  209.     ST_5105_IniLMI_Cas20 ();
  210. #else //assume CAS25
  211.     ST_5105_IniLMI_Cas25 ();
  212. #endif
  213.     #else
  214.     ST_5105_IniLMI_PC_SDRAM ();
  215.     #endif
  216.     /* Configure FMI */
  217.     ST_5105_InitFMI ();
  218.     /* Default setup for configuration registers */
  219.     x = STSYS_ReadRegDev32LE(CONFIG_CONTROL_D);
  220. #if 1 /* KCY 060912 */
  221.     STSYS_WriteRegDev32LE(CONFIG_CONTROL_D, ((x) & 0xFCFFE1FF));
  222. #else
  223.     STSYS_WriteRegDev32LE(CONFIG_CONTROL_D, ((x) & 0xFFFFE1FF));
  224. #endif
  225.     x = STSYS_ReadRegDev32LE(CONFIG_CONTROL_H);
  226.     STSYS_WriteRegDev32LE(CONFIG_CONTROL_H, ((x) | 0x0C000000));
  227.     
  228. }
  229. /*-------------------------------------------------------------------------
  230.  * Function : Simudelay
  231.  * Input    : delay
  232.  * Output   :
  233.  * Return   : None
  234.  * ----------------------------------------------------------------------*/
  235. static void Simudelay(int delay)
  236. {
  237.     volatile int j,dummy;
  238.     for ( j = 0 ; j < delay ; j ++ )
  239.        dummy = STSYS_ReadRegDev32LE(0x007C);
  240. }
  241. /*-------------------------------------------------------------------------
  242.  * Function : ST_5105_InitClocks
  243.  * Input    : None
  244.  * Output   :
  245.  * Return   : None
  246.  * ----------------------------------------------------------------------*/
  247. static void ST_5105_InitClocks (void)
  248. {
  249.     volatile U32    Source,
  250.                     LockA,
  251.                     LockB,
  252.                     count = 0,
  253.                     x,y;
  254.     x = STSYS_ReadRegDev32LE(CKG_MODE_CONTROL);
  255.     x = STSYS_ReadRegDev32LE(CKG_PLLA_CONFIG0);
  256.     x = STSYS_ReadRegDev32LE(CKG_PLLB_CONFIG0);
  257.     /* Starting clock generator setup */
  258.     /* Unlock clockgen registers */
  259.     STSYS_WriteRegDev32LE(CKG_REGISTER_LOCK_CFG, 0x00F0);
  260.     STSYS_WriteRegDev32LE(CKG_REGISTER_LOCK_CFG, 0x000F);
  261.     /* Setup the PLL sources for clock */
  262.     Source = (AUDIO_VIDEO_SOURCE << 7) | (LMI_SOURCE << 6) | (FDMA_SOURCE << 5);
  263.     Source = (Source) | (SYSTEM_SOURCE << 4) | (BLITTER_SOURCE << 3) | (LMI_SOURCE << 2);
  264.     Source = (Source) | (CPU_SOURCE << 1);
  265.     STSYS_WriteRegDev32LE(CKG_CLOCK_SELECT_CFG, Source);
  266. #if 0
  267.     /* Setup PLL_A and PLL_B */
  268.     ST_5105_InitPLLFrequency(PLL_A_FREQUENCY, PLL_A);
  269.     ST_5105_InitPLLFrequency(PLL_B_FREQUENCY, PLL_B);
  270.     /* set FS post divider to further reduce pll op
  271.     ** poke  0x20013004  0x00002938
  272.     */
  273.     /* wait for PLL to settle and lock*/
  274.     Simudelay (100000);
  275. #else
  276.     /* GNBvd42626 Resolution : Booting time would be
  277.     reduced from 13-14 seconds to 5-6sec/133*/
  278.     #ifdef SDRAM_FREQ_CONFIG_133
  279.     STSYS_WriteRegDev32LE(CKG_PLLA_CONFIG0,0x02404);
  280.     STSYS_WriteRegDev32LE(CKG_PLLA_CONFIG1,0x04838);
  281.     Simudelay (1000);
  282.     STSYS_WriteRegDev32LE(CKG_PLLB_CONFIG0,0x04406);
  283.     STSYS_WriteRegDev32LE(CKG_PLLB_CONFIG1,0x04838);
  284.     Simudelay (200000);
  285.     #elif defined (SDRAM_FREQ_CONFIG_166) /*3-4sec*/
  286.     STSYS_WriteRegDev32LE(CKG_PLLA_CONFIG0,0x02404);
  287.     STSYS_WriteRegDev32LE(CKG_PLLA_CONFIG1,0x04838);
  288.     Simudelay (1000);
  289.     STSYS_WriteRegDev32LE(CKG_PLLB_CONFIG0,0x05506); //0x0AC07;0x0b80f
  290.     STSYS_WriteRegDev32LE(CKG_PLLB_CONFIG1,0x04838); //9
  291.    Simudelay (200000);
  292.     #endif
  293. #endif
  294.     ST_5105_SetupDividers();
  295.     ST_5105_SetupFrequencySynthesizer();
  296.     /* Check PLL_A and PLL_B has locked*/
  297.     LockA = 0;
  298.     LockB = 0;
  299.     count = 0;
  300.     if (count == 0)
  301.     {
  302.         while (count < 20 && ((LockA == 0) || (LockB == 0)))
  303.         {
  304.             x = STSYS_ReadRegDev32LE(CKG_PLLA_CONFIG1);
  305.             y = STSYS_ReadRegDev32LE(CKG_PLLB_CONFIG1);
  306.             if ((x & 0x4000) == 0x4000) LockA = 1; /* Check for PLL_A Lock */
  307.             if ((y & 0x4000) == 0x4000) LockB = 1; /* Check for PLL_B Lock */
  308.             count++;
  309.         }
  310.         if (LockA == 0)
  311.         {
  312.             /* write PLL_A failed to LOCK! */
  313.             return;
  314.         }
  315.         if (LockB == 0)
  316.         {
  317.             /* write PLL_B failed to LOCK! */
  318.             return;
  319.         }
  320.     }
  321.     Simudelay (1000);
  322.     /* Now Transistion to programmed mode */
  323.     STSYS_WriteRegDev32LE(CKG_MODE_CONTROL, 0x02);
  324.     Simudelay (1000);
  325.     /* Lock Clock Generator registers */
  326.     STSYS_WriteRegDev32LE(CKG_OBSERVATION_CFG_AUX, 0x20);
  327. }
  328. /*-------------------------------------------------------------------------
  329.  * Function : ST_5105_InitPLLFrequency
  330.  * Input    : PLLFrequency, PLLSource
  331.  * Output   :
  332.  * Return   : None
  333.  * ----------------------------------------------------------------------*/
  334. static void ST_5105_InitPLLFrequency ( U32 PLLFrequency, U32 PLLSource )
  335. {
  336.     volatile U32    Pfactor,
  337.                     Divider,
  338.                     Reminder,
  339.                     StoredReminder,
  340.                     Index,
  341.                     IndexMax,
  342.                     tmp,
  343.                     Nfactor,
  344.                     Mfactor,
  345.                     tmp1,
  346.                     tmp2;
  347.     if ((PLLFrequency < MIN_PLL_FREQUENCY) || (PLLFrequency > MAX_PLL_FREQUENCY))
  348.     {
  349.         /* -->  Invalid PLL Frequency : (PLLFrequency) Mhz */
  350.         return;
  351.     }
  352.     if ((MIN_PLL_FREQUENCY <= PLLFrequency) && (PLLFrequency <=300000))
  353.     {
  354.         /*
  355.         ** Pfactor = 1, Fvco = 2 * Fpll
  356.         ** in this case Fpll = (Nfactor/Mfactor) * Fclockin (Fclockin is 27 MHz)
  357.         ** so Nfactor = (Fpll * Mfactor) / Fclockin
  358.         */
  359.         Pfactor = 1;
  360.         Divider = 1;
  361.     }
  362.     if ((300000 <= PLLFrequency) && (PLLFrequency <= MAX_PLL_FREQUENCY))
  363.     {
  364.         /*
  365.         ** Pfactor = 0, Fvco = Fpll
  366.         ** in this case Fpll = (2*Nfactor/Mfactor) * Fclockin (Fclockin is 27 MHz)
  367.         ** so Nfactor = (Fpll * Mfactor) / (2*Fclockin)
  368.         */
  369.         Pfactor = 0;
  370.         Divider = 2;
  371.     }
  372.     StoredReminder = 100000;
  373.     IndexMax = 27;
  374.     for(Index = 5; Index <= IndexMax; Index++)
  375.     {
  376. #if 0
  377.         Reminder = (PLLFrequency*Index) % (INPUT_CLOCK_FREQUENCY*Divider);
  378.         tmp = (PLLFrequency*Index) / (INPUT_CLOCK_FREQUENCY*Divider);
  379. #else
  380.         tmp = 0;
  381.         Reminder = (PLLFrequency*Index);
  382.         while(Reminder > (INPUT_CLOCK_FREQUENCY*Divider))
  383.         {
  384.             Reminder = Reminder - (INPUT_CLOCK_FREQUENCY*Divider);
  385.             tmp = tmp + 1;
  386.         }
  387. #endif
  388.         if ((Reminder == 0) && (tmp < 126))
  389.         {
  390.             Mfactor = Index;
  391.             Nfactor = tmp;
  392.             Index = 100;
  393.         }
  394.         if (Reminder > Index)
  395.         {
  396.             if ((Reminder - Index < StoredReminder) && (tmp < 126) && (Reminder != 0))
  397.             {
  398.                 StoredReminder = Reminder;
  399.                 Mfactor = Index;
  400.                 Nfactor = tmp;
  401.             }
  402.         }
  403.         else
  404.         {
  405.             if ((Index - Reminder < StoredReminder) && (tmp < 126) && (Reminder != 0))
  406.             {
  407.                 StoredReminder = Reminder;
  408.                 Mfactor = Index;
  409.                 Nfactor = tmp;
  410.             }
  411.         }
  412.     }
  413. #if 0
  414.     PLLFrequency = (Divider*Nfactor*INPUT_CLOCK_FREQUENCY)/Mfactor;
  415. #else
  416.     tmp1 = 0;
  417.     tmp2 = (Divider*Nfactor*INPUT_CLOCK_FREQUENCY);
  418.     while (tmp2 > 1000000)
  419.     {
  420.         tmp2 = tmp2- Mfactor;
  421.         tmp1++;
  422.     }
  423.     PLLFrequency = tmp1;
  424. #endif
  425.     if (PLLSource == PLL_A)
  426.     {
  427.         STSYS_WriteRegDev32LE(CKG_PLLA_CONFIG0, (((Nfactor-1)<<8) | (Mfactor-1)));
  428.         STSYS_WriteRegDev32LE(CKG_PLLA_CONFIG1, (0x4838 | Pfactor));
  429.     }
  430.     if (PLLSource == PLL_B)
  431.     {
  432.         STSYS_WriteRegDev32LE(CKG_PLLB_CONFIG0, (((Nfactor-1)<<8) | (Mfactor-1)));
  433.         STSYS_WriteRegDev32LE(CKG_PLLB_CONFIG1, (0x4838 | Pfactor));
  434.     }
  435.     Simudelay (50);
  436. }
  437. /*-------------------------------------------------------------------------
  438.  * Function : ST_5105_SetupDividers
  439.  * Input    : None
  440.  * Output   :
  441.  * Return   : None
  442.  * ----------------------------------------------------------------------*/
  443. static void ST_5105_SetupDividers(void)
  444. {
  445.     /* Setup PLL dividers for STi5100 chip */
  446.     ST_5105_SetPLLClockDivider(CPU,               CPU_DIV,               WHOLE_VALUE,   CPU_SOURCE,               0);
  447.     ST_5105_SetPLLClockDivider(LMI,               LMI_DIV,               WHOLE_VALUE,   LMI_SOURCE,               0);
  448.     ST_5105_SetPLLClockDivider(BLITTER,           BLITTER_DIV,           WHOLE_VALUE,   BLITTER_SOURCE,           0);
  449.     ST_5105_SetPLLClockDivider(SYSTEM,            SYSTEM_DIV,            WHOLE_VALUE,   SYSTEM_SOURCE,            0);
  450.     ST_5105_SetPLLClockDivider(FDMA,              FDMA_DIV,              WHOLE_VALUE,   FDMA_SOURCE,              0);
  451.     ST_5105_SetPLLClockDivider(AUDIO_VIDEO,       AUDIO_VIDEO_DIV,       WHOLE_VALUE,   AUDIO_VIDEO_SOURCE,       0);
  452.     ST_5105_SetPLLClockDivider(FLASH,             FLASH_DIV,             WHOLE_VALUE,   SYSTEM_SOURCE,            0);
  453. }
  454. /*-------------------------------------------------------------------------
  455.  * Function : ST_5105_SetupFrequencySynthesizer
  456.  * Input    : None
  457.  * Output   :
  458.  * Return   : None
  459.  * ----------------------------------------------------------------------*/
  460. static void ST_5105_SetupFrequencySynthesizer(void)
  461. {
  462.     volatile U32    x,
  463.                     MD,SDIV,PE,EN_PRG;
  464.     /* Setup PLL Frequency Synthesizers for STi5100 chip */
  465.     STSYS_WriteRegDev32LE(CKG_FSA_SETUP, 0xc); /*For abnormal audio upon power up*/
  466.     STSYS_WriteRegDev32LE(CKG_FSA_SETUP, 0x4);
  467.     MD   = 0x1f;
  468.     SDIV = 0x2;
  469.     PE   = 0x0000;
  470.     EN_PRG = 0x1;
  471.     /* Pixel clock = 27 MHz */
  472.     STSYS_WriteRegDev32LE(CKG_PIX_CLK_SETUP0, (0xE00 | (SDIV)<<6 | (EN_PRG<<5) | (MD)));
  473.     STSYS_WriteRegDev32LE(CKG_PIX_CLK_SETUP1, (PE));
  474.     x = STSYS_ReadRegDev32LE (CKG_PIX_CLK_SETUP0);
  475.     /* PCM clock = 24.576 MHz */
  476.     STSYS_WriteRegDev32LE(CKG_PCM_CLK_SETUP0, 0x0ef1);
  477.     STSYS_WriteRegDev32LE(CKG_PCM_CLK_SETUP1, 0x3600);
  478.     /* SPDIF clock = 27 MHz */
  479.     STSYS_WriteRegDev32LE(CKG_SPDIF_CLK_SETUP0, 0x0EBF);
  480.     STSYS_WriteRegDev32LE(CKG_SPDIF_CLK_SETUP1, 0x0000);
  481.     /* Smart Card clock = 27 MHz */
  482.     STSYS_WriteRegDev32LE(CKG_SC_CLK_SETUP0, 0x0EBF);
  483.     STSYS_WriteRegDev32LE(CKG_SC_CLK_SETUP1, 0x0000);
  484.     /* AUX clock = 27 MHz */
  485.     STSYS_WriteRegDev32LE(CKG_AUX_CLK_SETUP0, 0x0EBF);
  486.     STSYS_WriteRegDev32LE(CKG_AUX_CLK_SETUP1, 0x0000);
  487. /*FSB setup to toggle the power up and power down on FSB PLL*/
  488. STSYS_WriteRegDev32LE(CKG_FSB_SETUP, 0xc);
  489. STSYS_WriteRegDev32LE(CKG_FSB_SETUP, 0x4);
  490. }
  491. /*-------------------------------------------------------------------------
  492.  * Function : ST_5105_SetPLLClockDivider
  493.  * Input    : None
  494.  * Output   :
  495.  * Return   : None
  496.  * ----------------------------------------------------------------------*/
  497. static void ST_5105_SetPLLClockDivider( U32 clock, U32 div, U32 half, U32 source, S32 phase )
  498. {
  499.     volatile U32    PLL,
  500.                     config_0,
  501.                     config_1,
  502.                     config_2,
  503.                     PLL_MHz_x10,
  504.                     div_x10,
  505.                     depth,
  506.                     pattern,
  507.                     bpat,
  508.                     temptoppat,
  509.                     newpat,
  510.                     offset,
  511.                     tmp1,
  512.                     tmp2;
  513.     /*
  514.      * If phase is not passed in Function Call it must be Zero
  515.      * phase=0; Handled in Fn Call itself
  516.      */
  517.     if (source == PLL_A)
  518.     {
  519.         PLL = PLL_A_FREQUENCY*1000;
  520.     }
  521.     else
  522.     {
  523.         PLL = PLL_B_FREQUENCY*1000;
  524.     }
  525.     offset = (clock * 0x10);
  526.     config_0 = 0;
  527.     config_1 = 0;
  528.     config_2 = 0;
  529.     switch ( div )
  530.     {
  531.         case 2:
  532.             if (half==WHOLE_VALUE) /* divide by 2 */
  533.             {
  534.                 config_0 = 0x0AAA;
  535.                 config_2 = 0x0071;
  536.             }
  537.             else if (half==HALF_VALUE) /* divide by 2.5 */
  538.             {
  539.                 config_0 = 0x5AD6;
  540.                 config_2 = 0x0054;
  541.             }
  542.             break;
  543.         case 3:
  544.             if (half==WHOLE_VALUE)    /* divide by 3 */
  545.             {
  546.                 config_0 = 0x0DB6;
  547.                 config_2 = 0x0011;
  548.             }
  549.             else if (half==HALF_VALUE) /* divide by 3.5 */
  550.             {
  551.                 config_0 = 0x366C;
  552.                 config_2 = 0x0053;
  553.             }
  554.             break;
  555.         case 4:
  556.             if (half==WHOLE_VALUE)    /* divide by 4 */
  557.             {
  558.                 config_0 = 0xCCCC;
  559.                 config_2 = 0x0075;
  560.             }
  561.             else if (half==HALF_VALUE)  /* divide by 4.5 */
  562.             {
  563.                 config_0 = 0x399C;
  564.                 config_1 = 0x0003;
  565.                 config_2 = 0x0057;
  566.             }
  567.             break;
  568.         case 5:
  569.             if (half==WHOLE_VALUE)  /* divide by 5 */
  570.             {
  571.                 config_0 = 0x739c;
  572.                 config_2 = 0x0014;
  573.             }
  574.             else if (half==HALF_VALUE)  /* divide by 5.5 */
  575.             {
  576.                 config_0 = 0x071C;
  577.                 config_2 = 0x0050;
  578.             }
  579.             break;
  580.         case 6:
  581.             if (half==WHOLE_VALUE)  /* divide by 6 */
  582.             {
  583.                 config_0 = 0x0E38;
  584.                 config_2 = 0x0071;
  585.             }
  586.             else if (half==HALF_VALUE)  /* divide by 6.5 */
  587.             {
  588.                 config_0 = 0x1C78;
  589.                 config_2 = 0x0052;
  590.             }
  591.             break;
  592.         case 7:
  593.             if (half==WHOLE_VALUE)  /* divide by 7 */
  594.             {
  595.                 config_0 = 0x3C78;
  596.                 config_2 = 0x0013;
  597.             }
  598.             else if (half==HALF_VALUE)  /* divide by 7.5 */
  599.             {
  600.                 config_0 = 0x7878;
  601.                 config_2 = 0x0054;
  602.             }
  603.             break;
  604.         case 8:
  605.             if (half==WHOLE_VALUE)  /* divide by 8 */
  606.             {
  607.                 config_0 = 0xF0F0;
  608.                 config_2 = 0x0075;
  609.             }
  610.             else if (half==HALF_VALUE)  /* divide by 8.5 */
  611.             {
  612.                 config_0 = 0xE1F0;
  613.                 config_1 = 0x0001;
  614.                 config_2 = 0x0056;
  615.             }
  616.             break;
  617.         case 9:
  618.             if (half==WHOLE_VALUE) /* divide by 9 */
  619.             {
  620.                 config_0 = 0xE1F0;
  621.                 config_1 = 0x0003;
  622.                 config_2 = 0x0017;
  623.             }
  624.             else if (half==HALF_VALUE)    /* divide by 9.5 */
  625.             {
  626.                 config_0 = 0xC1F0;
  627.                 config_1 = 0x0007;
  628.                 config_2 = 0x0058;
  629.             }
  630.             break;
  631.         case 10:
  632.             if (half==WHOLE_VALUE) /* divide by 10 */
  633.             {
  634.                 config_0 = 0x83e0;
  635.                 config_1 = 0x000f;
  636.                 config_2 = 0x0079;
  637.             }
  638.             break;
  639.         case 11:
  640.             if (half==WHOLE_VALUE)  /* divide by 11 */
  641.             {
  642.                 config_0 = 0x07e0;
  643.                 config_2 = 0x0010;
  644.             }
  645.             break;
  646.         case 12:
  647.             if (half==WHOLE_VALUE)  /* divide by 12 */
  648.             {
  649.                 config_0 = 0x0fc0;
  650.                 config_2 = 0x0071;
  651.             }
  652.             break;
  653.         case 13:
  654.             if (half==WHOLE_VALUE)  /* divide by 13 */
  655.             {
  656.                 config_0 = 0x1FC0;
  657.                 config_2 = 0x0012;
  658.             }
  659.             break;
  660.         case 14:
  661.             if (half==WHOLE_VALUE) /* divide by 14 */
  662.             {
  663.                 config_0 = 0x3F80;
  664.                 config_2 = 0x0073;
  665.             }
  666.             break;
  667.         case 15:
  668.             if (half==WHOLE_VALUE)  /* divide by 15 */
  669.             {
  670.                 config_0 = 0x7F80;
  671.                 config_2 = 0x0014;
  672.             }
  673.             break;
  674.         case 16:
  675.             if (half==WHOLE_VALUE)  /* divide by 16 */
  676.             {
  677.                 config_0 = 0xFF00;
  678.                 config_1 = 0x0000;
  679.                 config_2 = 0x0015;
  680.             }
  681.             break;
  682.         case 17:
  683.             if (half==WHOLE_VALUE)  /* divide by 17 */
  684.             {
  685.                 config_0 = 0xFF00;
  686.                 config_1 = 0x0001;
  687.                 config_2 = 0x0016;
  688.             }
  689.             break;
  690.         case 18:
  691.             if (half==WHOLE_VALUE)  /* divide by 18 */
  692.             {
  693.                 config_0 = 0xFE00;
  694.                 config_1 = 0x0003;
  695.                 config_2 = 0x0077;
  696.             }
  697.             break;
  698.         case 19:
  699.             if (half==WHOLE_VALUE)  /* divide by 19 */
  700.             {
  701.                 config_0 = 0xFE00;
  702.                 config_1 = 0x0007;
  703.                 config_2 = 0x0018;
  704.             }
  705.             break;
  706.         case 20:
  707.             if (half==WHOLE_VALUE)  /* divide by 20 */
  708.             {
  709.                 config_0 = 0xFC00;
  710.                 config_1 = 0x000F;
  711.                 config_2 = 0x0019;
  712.             }
  713.             break;
  714.     }
  715.     if (config_0 == 0)
  716.     {
  717.         /* Divider value (div) not supported for module (names[clock]) */
  718.         return;
  719.     }
  720.     /*write (names[clock]) = (PLL / ( div)) Hz*/
  721.     /* Re-adjust PLL and div to allow for half value division using integers. */
  722. #if 0
  723.     PLL_MHz_x10 = (PLL / 1000000) * 10;
  724. #else
  725.     tmp1 = 0;
  726.     tmp2 = PLL;
  727.     while (tmp2 > 1000000)
  728.     {
  729.         tmp2 = tmp2- 1000000;
  730.         tmp1++;
  731.     }
  732.     PLL_MHz_x10 = (tmp1) * 10;
  733. #endif
  734.     if (half==(WHOLE_VALUE))
  735.     {
  736.         div_x10 = div * 10;  /* whole value x10 */
  737.     }
  738.     else
  739.     {
  740.         div_x10 = (div * 10) + 5;  /* half value x10 */
  741.     }
  742.     if (phase > 0)
  743.     {
  744.         /* Calculate the depth of the pattern */
  745.         depth = (config_2 & 0x0f) + 11;
  746.         /* 32-bit field pattern */
  747.         pattern = config_0 | (config_1 << 16);
  748.         /* Shifted Pattern */
  749.         bpat = pattern >> phase;
  750.         /* Bits of the pattern needed to be rapped */
  751.         temptoppat = pattern & ((1 << phase)-1);
  752.         newpat = bpat | (temptoppat << (depth - phase));
  753.         config_0 = newpat & 0xffff;
  754.         config_1 = newpat >> 16;
  755.     }
  756.     else if (phase < 0)
  757.     {
  758.         phase = 0-phase;
  759.         /* Calculate the depth of the pattern */
  760.         depth = (config_2 & 0x0f) + 11;
  761.         /* 32-bit field pattern */
  762.         pattern = config_0 | (config_1 << 16);
  763.         /* Shifted Pattern */
  764.         bpat = (pattern << phase) & ((1 << depth)-1);
  765.         /* Bits of the pattern needed to be rapped */
  766.         temptoppat = pattern >> (depth - phase);
  767.         newpat = bpat | temptoppat;
  768.         config_0 = newpat & 0xffff;
  769.         config_1 = newpat >> 16;
  770.     }
  771.     STSYS_WriteRegDev32LE(SYS_SERVICES_BASE_ADDRESS + 0x80 + offset, config_0);
  772.     STSYS_WriteRegDev32LE(SYS_SERVICES_BASE_ADDRESS + 0x84 + offset, config_1);
  773.     STSYS_WriteRegDev32LE(SYS_SERVICES_BASE_ADDRESS + 0x88 + offset, config_2);
  774. }
  775. /*-------------------------------------------------------------------------
  776.  * Function : ST_5105_IniLMI_Cas20
  777.  * Input    : None
  778.  * Output   :
  779.  * Return   : None
  780.  * ----------------------------------------------------------------------*/
  781. static void ST_5105_IniLMI_Cas20(void)
  782. {
  783.     volatile U32    data;
  784.     /* "n Configuring LMI for 16-bit data CAS 2.0 @ 133MHz " */
  785.     /* Set LMI_COC_UPPER Register, bits [63:32]   (LMI Pad logic) */
  786.     STSYS_WriteRegDev32LE(LMI_COC_UPPER, 0x000C6750);
  787.     /* Even Though its a 64 bit register the upper 32 bits are reserved and therefore no need to fill*/
  788.     /* Set LMI_COC_LOWER Register, bits [31:0]  (LMI Pad logic)
  789.     ** Bits [19:18] Compensation mode DDR
  790.     ** Bits [17:16] Pad strenght         (0x0:5pF, 0x1:15pF, 0x2:25pF, Ox3:35pF)
  791.     ** Bits [15:14] output Impedance (0x0:25Ohm, 0x1:40Ohm, 0x2:55Ohm, Ox3:70Ohm)
  792.     ** Bit  [13]    DLL preset reset value enable
  793.     */
  794.     STSYS_WriteRegDev32LE(LMI_COC_LOWER, 0x00002000);
  795.     data = STSYS_ReadRegDev32LE(LMI_COC_LOWER);
  796.     data = (data | 0x0<<16 | 0x0<<14);
  797.     STSYS_WriteRegDev32LE(LMI_COC_LOWER, data);
  798.     /* SDRAM Mode Register
  799.     ** Set Refresh Interval, Enable Refresh, 16-bit bus,
  800.     ** Grouping Disabled, DDR-SDRAM, Enable.
  801.     ** Bits[27:16]: Refresh Interval = 7.8 microseconds (8K/64ms)
  802.     ** @  50MHz =  390 clk cycles -> 0x186
  803.     ** @  75MHz =  585 clk cycles -> 0x249
  804.     ** @ 100MHz =  780 clk cycles -> 0x30C
  805.     ** @ 125MHz =  975 clk cycles -> 0x3CF
  806.     ** @ 133MHz = 1040 clk cycles -> 0x410  <--
  807.     ** @ 166MHz = 1300 clk cycles -> 0x514
  808.     */
  809. #if defined( SDRAM_512MB ) || defined(SDRAM_256MB)
  810.     STSYS_WriteRegDev32LE(LMI_MIM, 0x04100203);
  811. #elif defined(SDRAM_128MB) || defined(SDRAM_64MB)
  812. STSYS_WriteRegDev32LE(LMI_MIM, 0x08200203);
  813. #endif
  814.     /* SDRAM Timing Register
  815.     ** For 133MHz (7.5ns) operation:
  816.     **  3 clks RAS_precharge, Trp;
  817.     **  3 clks RAS_to_CAS_delay, Trcd-r;
  818.     **  8 clks RAS cycle time, Trc;
  819.     **  6 clks RAS Active time, Tras;
  820.     **  2 clks RAS_to_RAS_Active_delay, Trrd;
  821.     **  2 clks Last write to PRE/PALL period SDRAM, Twr;
  822.     **  2 clks CAS Latency;
  823.     ** 10 clks Auto Refresh RAS cycle time, Trfc;
  824.     **  Enable Write to Read interruption;
  825.     **  1 clk  Write to Read interruption, Twtr;
  826.     **  3 clks RAS_to_CAS_delay, Trcd-w;
  827.     ** (200/16)=3 clks Exit self-refresh to next command, Tsxsr;
  828.     */
  829.     STSYS_WriteRegDev32LE(LMI_STR, 0x35085235);
  830.     /* SDRAM Row Attribute 0 & 1 Registers
  831.     ** UBA = 32MB + Base Adr, Quad-bank, Shape 13x9,
  832.     ** Bank Remapping Disabled
  833.     **
  834.     **  LMI base address    0xC0000000
  835.     **  Memory size 32MB    0x02000000
  836.     **  Row UBA value       0xC200
  837.     */
  838. #ifdef SDRAM_64MB
  839.     STSYS_WriteRegDev32LE(LMI_SDRA0, 0xC0801400);
  840. #elif defined (SDRAM_128MB)
  841.     STSYS_WriteRegDev32LE(LMI_SDRA0, 0xC1001500);
  842. #elif defined(SDRAM_256MB)
  843.     STSYS_WriteRegDev32LE(LMI_SDRA0, 0xC2001900);
  844. #elif defined(SDRAM_512MB)
  845.     STSYS_WriteRegDev32LE(LMI_SDRA0, 0xC4001a00);
  846. #endif
  847.     /*  We just have one Row connected to cs0, so we must program UBA0 = UBA1,
  848.     **  following LMI specification
  849.     */
  850. #ifdef SDRAM_64MB
  851.     STSYS_WriteRegDev32LE(LMI_SDRA1, 0xC0801400);
  852. #elif defined (SDRAM_128MB)
  853.     STSYS_WriteRegDev32LE(LMI_SDRA1, 0xC1001500);
  854. #elif defined(SDRAM_256MB)
  855.     STSYS_WriteRegDev32LE(LMI_SDRA1, 0xC2001900);
  856. #elif defined(SDRAM_512MB)
  857.     STSYS_WriteRegDev32LE(LMI_SDRA1, 0xC4001a00);
  858. #endif
  859.     /*---------------------------------------------------------------------------
  860.     ** Initialisation Sequence for LMI & DDR-SDRAM Device
  861.     **---------------------------------------------------------------------------
  862.     ** 200 microseconds to settle clocks
  863.     */
  864.     Simudelay (100);
  865.     /* SDRAM Control Register */
  866.     /* Clock enable */
  867.     STSYS_WriteRegDev32LE(LMI_SCR, 0x3);
  868.     /* NOP enable */
  869.     STSYS_WriteRegDev32LE(LMI_SCR, 0x1);
  870.     /* Precharge all banks */
  871.     STSYS_WriteRegDev32LE(LMI_SCR, 0x2);
  872.     /* LMI_SDRAM_ROW_MODE0 & LMI_SDRAM_ROW_MODE1 Registers */
  873.     /* EMRS Row 0 & 1: Weak Drive : Enable DLL */
  874.     STSYS_WriteRegDev32LE(LMI_SDMR0, 0x0402);
  875.     STSYS_WriteRegDev32LE(LMI_SDMR1, 0x0402);
  876.     Simudelay (100);
  877.     /* MRS Row 0 & 1 : Reset DLL - /CAS = 2.0, Mode Sequential, Burst Length 8 */
  878.     STSYS_WriteRegDev32LE(LMI_SDMR0, 0x0123);
  879.     STSYS_WriteRegDev32LE(LMI_SDMR1, 0x0123);
  880.     /* 200 clock cycles required to lock DLL */
  881.     Simudelay (100);
  882.     /* Precharge all banks */
  883.     STSYS_WriteRegDev32LE(LMI_SCR, 0x2);
  884.     /* CBR enable (auto-refresh) */
  885.     STSYS_WriteRegDev32LE(LMI_SCR, 0x4);
  886.     STSYS_WriteRegDev32LE(LMI_SCR, 0x4);
  887.     STSYS_WriteRegDev32LE(LMI_SCR, 0x4);
  888.     /* LMI_SDRAM_ROW_MODE0 & 1 Registers */
  889.     /* MRS Row 0 & 1 : Normal - /CAS = 2.0, Mode Sequential, Burst Length 8 */
  890.     STSYS_WriteRegDev32LE(LMI_SDMR0, 0x0023);
  891.     STSYS_WriteRegDev32LE(LMI_SDMR1, 0x0023);
  892.     /* Normal SDRAM operation, No burst Refresh after standby */
  893.     STSYS_WriteRegDev32LE(LMI_SCR, 0x0);
  894. }
  895. /*-------------------------------------------------------------------------
  896.  * Function : ST_5105_IniLMI_Cas25
  897.  * Input    : None
  898.  * Output   :
  899.  * Return   : None
  900.  * ----------------------------------------------------------------------*/
  901. static void ST_5105_IniLMI_Cas25(void)
  902. {
  903.     volatile U32    data;
  904.     /* "n Configuring LMI for 16-bit data CAS 2.5 @ 166MHz " */
  905.     /* Set LMI_COC_UPPER Register, bits [63:32]   (LMI Pad logic) */
  906.     STSYS_WriteRegDev32LE(LMI_COC_UPPER, 0x000C6750);
  907.     /* Even Though its a 64 bit register the upper 32 bits are reserved and therefore no need to fill*/
  908.     /* Set LMI_COC_LOWER Register, bits [31:0]  (LMI Pad logic)
  909.     ** Bits [19:18] Compensation mode DDR
  910.     ** Bits [17:16] Pad strenght         (0x0:5pF, 0x1:15pF, 0x2:25pF, Ox3:35pF)
  911.     ** Bits [15:14] output Impedance (0x0:25Ohm, 0x1:40Ohm, 0x2:55Ohm, Ox3:70Ohm)
  912.     ** Bit  [13]    DLL preset reset value enable
  913.     */
  914.     STSYS_WriteRegDev32LE(LMI_COC_LOWER, 0x00002000);
  915.     data = STSYS_ReadRegDev32LE(LMI_COC_LOWER);
  916.     data = (data | 0x0<<16 | 0x0<<14);
  917.     STSYS_WriteRegDev32LE(LMI_COC_LOWER, data);
  918.     /* SDRAM Mode Register
  919.     ** Set Refresh Interval, Enable Refresh, 16-bit bus,
  920.     ** Grouping Disabled, DDR-SDRAM, Enable.
  921.     ** Bits[27:16]: Refresh Interval = 7.8 microseconds (8K/64ms)
  922.     ** @  50MHz =  390 clk cycles -> 0x186
  923.     ** @  75MHz =  585 clk cycles -> 0x249
  924.     ** @ 100MHz =  780 clk cycles -> 0x30C
  925.     ** @ 125MHz =  975 clk cycles -> 0x3CF
  926.     ** @ 133MHz = 1040 clk cycles -> 0x410 
  927.     ** @ 166MHz = 1300 clk cycles -> 0x514 <--
  928.     */
  929. #if defined( SDRAM_512MB ) || defined(SDRAM_256MB)
  930.     STSYS_WriteRegDev32LE(LMI_MIM, 0x50F0203);
  931. #elif defined(SDRAM_128MB) || defined(SDRAM_64MB)
  932. STSYS_WriteRegDev32LE(LMI_MIM, 0x0A1E0203);
  933. #endif
  934.     /* SDRAM Timing Register
  935.     ** For 133MHz (7.5ns) operation:
  936.     **  3 clks RAS_precharge, Trp;
  937.     **  3 clks RAS_to_CAS_delay, Trcd-r;
  938.     **  8 clks RAS cycle time, Trc;
  939.     **  6 clks RAS Active time, Tras;
  940.     **  2 clks RAS_to_RAS_Active_delay, Trrd;
  941.     **  2 clks Last write to PRE/PALL period SDRAM, Twr;
  942.     **  2 clks CAS Latency;
  943.     ** 10 clks Auto Refresh RAS cycle time, Trfc;
  944.     **  Enable Write to Read interruption;
  945.     **  1 clk  Write to Read interruption, Twtr;
  946.     **  3 clks RAS_to_CAS_delay, Trcd-w;
  947.     ** (200/16)=3 clks Exit self-refresh to next command, Tsxsr;
  948.     */
  949.     STSYS_WriteRegDev32LE(LMI_STR, 0x352D4345);
  950.     /* SDRAM Row Attribute 0 & 1 Registers
  951.     ** UBA = 32MB + Base Adr, Quad-bank, Shape 13x9,
  952.     ** Bank Remapping Disabled
  953.     **
  954.     **  LMI base address    0xC0000000
  955.     **  Memory size 32MB    0x02000000
  956.     **  Row UBA value       0xC200
  957.     */
  958. #ifdef SDRAM_64MB
  959.     STSYS_WriteRegDev32LE(LMI_SDRA0, 0xC0801400);
  960. #elif defined (SDRAM_128MB)
  961.     STSYS_WriteRegDev32LE(LMI_SDRA0, 0xC1001500);
  962. #elif defined(SDRAM_256MB)
  963.     STSYS_WriteRegDev32LE(LMI_SDRA0, 0xC2001900);
  964. #elif defined(SDRAM_512MB)
  965.     STSYS_WriteRegDev32LE(LMI_SDRA0, 0xC4001a00);
  966. #endif
  967.     /*  We just have one Row connected to cs0, so we must program UBA0 = UBA1,
  968.     **  following LMI specification
  969.     */
  970. #ifdef SDRAM_64MB
  971.     STSYS_WriteRegDev32LE(LMI_SDRA1, 0xC0801400);
  972. #elif defined (SDRAM_128MB)
  973.     STSYS_WriteRegDev32LE(LMI_SDRA1, 0xC1001500);
  974. #elif defined(SDRAM_256MB)
  975.     STSYS_WriteRegDev32LE(LMI_SDRA1, 0xC2001900);
  976. #elif defined(SDRAM_512MB)
  977.     STSYS_WriteRegDev32LE(LMI_SDRA1, 0xC4001a00);
  978. #endif
  979.     /*---------------------------------------------------------------------------
  980.     ** Initialisation Sequence for LMI & DDR-SDRAM Device
  981.     **---------------------------------------------------------------------------
  982.     ** 200 microseconds to settle clocks
  983.     */
  984.     Simudelay (100);
  985.     /* SDRAM Control Register */
  986.     /* Clock enable */
  987.     STSYS_WriteRegDev32LE(LMI_SCR, 0x3);
  988.     /* NOP enable */
  989.     STSYS_WriteRegDev32LE(LMI_SCR, 0x1);
  990.     /* Precharge all banks */
  991.     STSYS_WriteRegDev32LE(LMI_SCR, 0x2);
  992.     /* LMI_SDRAM_ROW_MODE0 & LMI_SDRAM_ROW_MODE1 Registers */
  993.     /* EMRS Row 0 & 1: Weak Drive : Enable DLL */
  994.     STSYS_WriteRegDev32LE(LMI_SDMR0, 0x0402);
  995.     STSYS_WriteRegDev32LE(LMI_SDMR1, 0x0402);
  996.     //Simudelay (100);
  997.     /* MRS Row 0 & 1 : Reset DLL - /CAS = 2.5, Mode Sequential, Burst Length 8 */
  998.     STSYS_WriteRegDev32LE(LMI_SDMR0, 0x0163);
  999.     STSYS_WriteRegDev32LE(LMI_SDMR1, 0x0163);
  1000.     /* 200 clock cycles required to lock DLL */
  1001.     Simudelay (100);
  1002.     /* Precharge all banks */
  1003.     STSYS_WriteRegDev32LE(LMI_SCR, 0x2);
  1004.     /* CBR enable (auto-refresh) */
  1005.     STSYS_WriteRegDev32LE(LMI_SCR, 0x4);
  1006.     STSYS_WriteRegDev32LE(LMI_SCR, 0x4);
  1007.     STSYS_WriteRegDev32LE(LMI_SCR, 0x4);
  1008.     /* LMI_SDRAM_ROW_MODE0 & 1 Registers */
  1009.     /* MRS Row 0 & 1 : Normal - /CAS = 2.5, Mode Sequential, Burst Length 8 */
  1010.     STSYS_WriteRegDev32LE(LMI_SDMR0, 0x0063);
  1011.     STSYS_WriteRegDev32LE(LMI_SDMR1, 0x0063);
  1012.     /* Normal SDRAM operation, No burst Refresh after standby */
  1013.     STSYS_WriteRegDev32LE(LMI_SCR, 0x0);
  1014. }
  1015. /*-------------------------------------------------------------------------
  1016. * Function : ST_5105_InitFMI
  1017. * Input    : None
  1018. * Output   :
  1019. * Return   : None
  1020. * ----------------------------------------------------------------------*/
  1021. static void ST_5105_InitFMI(void)
  1022. {
  1023.     /* Ensure all FMI control registers are unlocked */
  1024.     /* at reset the state of these regs is 'undefined' */
  1025.     STSYS_WriteRegDev32LE(FMI_LOCK, 0x00000000);
  1026.     STSYS_WriteRegDev32LE(FMI_STATUSLOCK, 0x00000000); /*~!@#$%^&*()*/
  1027.     /* Number of FMI Banks : Enable all banks */
  1028.     STSYS_WriteRegDev32LE(BANKS_ENABLED, 0x00000004);
  1029.     /* FMI Bank base addresses
  1030.     ** NOTE: bits [0,7] define bottom address bits [22,29] of bank
  1031.     ** Bank 0 - 16MBytes Atapi Configured as 16-bit peripheral
  1032.     */
  1033.     STSYS_WriteRegDev32LE(BANK_0_TOP_ADDRESS, 0x00000003); /* 0x40000000 - 0x40FFFFFF */
  1034.     /* Bank 1 - 32MBytes Stem0/DVBCI/EPLD Configured as 16-bit peripheral */
  1035.     STSYS_WriteRegDev32LE(BANK_1_TOP_ADDRESS, 0x0000000B); /* 0x41000000 - 0x42FFFFFF */
  1036.     /* Bank 2 - 32MBytes Stem1 Configured as 16-bit peripheral */
  1037.     STSYS_WriteRegDev32LE(BANK_2_TOP_ADDRESS, 0x00000013); /* 0x43000000 - 0x44FFFFFF */
  1038.     /* Bank 3 - 8MBytes ST M58LW064D Flash */
  1039.     STSYS_WriteRegDev32LE(BANK_3_TOP_ADDRESS, 0x00000017); /* 0x45000000 - 0x45FFFFFF */
  1040.     /*------------------------------------------------------------------------------
  1041.     ## Program bank functions
  1042.     ##------------------------------------------------------------------------------
  1043.     ##------------------------------------------------------------------------------
  1044.     ## Bank 0 - 16MBytes Atapi Configured as 16-bit peripheral
  1045.     ##------------------------------------------------------------------------------
  1046.     ## Parameters: -weuseoeconfig 0 -waitpolarity 0 -latchpoint 16 -datadrivedelay 31
  1047.     ##             -busreleasetime 0 -csactive 3 -oeactive 3 -beactive 0 -portsize 16
  1048.     ##             -devicetype 1
  1049.     ##             -cyclenotphaseread 1 -accesstimeread 62 -cse1timeread 0
  1050.     ##             -cse2timeread 2 -oee1timeread 8 -oee2timeread 15 -bee1timeread 2
  1051.     ##             -bee2timeread 1
  1052.     ##             -cyclenotphasewrite 1 -accesstimewrite 62 -cse1timewrite 0
  1053.     ##             -cse2timewrite 2 -oee1timewrite 8 -oee2timewrite 15 -bee1timewrite 2
  1054.     ##             -bee2timewrite 2
  1055.     ##             -strobeonfalling 0 -burstsize 2 -datalatency 2 -dataholddelay 2
  1056.     ##             -burstmode 0
  1057.     */
  1058. #ifdef M29W320DB
  1059.     STSYS_WriteRegDev32LE(FMICONFIGDATA0_BANK0, 0x001016D1);
  1060. #else //TMTM 1MB type
  1061.     STSYS_WriteRegDev32LE(FMICONFIGDATA0_BANK0, 0x041016D1);  
  1062. #endif
  1063. //KCY 060921    STSYS_WriteRegDev32LE(FMICONFIGDATA1_BANK0, 0x9d200000);
  1064.     STSYS_WriteRegDev32LE(FMICONFIGDATA1_BANK0, 0x0c000000);
  1065.     STSYS_WriteRegDev32LE(FMICONFIGDATA2_BANK0, 0x9d220000);
  1066.     STSYS_WriteRegDev32LE(FMICONFIGDATA3_BANK0, 0x00000000);
  1067.     /*------------------------------------------------------------------------------
  1068.     ## Bank 1 - 32MBytes Stem0/DVBCI/EPLD Configured as 16-bit peripheral
  1069.     ##------------------------------------------------------------------------------
  1070.     ## Parameters: -weuseoeconfig 0 -waitpolarity 0 -latchpoint 1 -datadrivedelay 0
  1071.     ##             -busreleasetime 2 -csactive 3 -oeactive 1 -beactive 2 -portsize 16
  1072.     ##             -devicetype 1
  1073.     ##             -cyclenotphaseread 1 -accesstimeread 1d -cse1timeread 2
  1074.     ##             -cse2timeread 0 -oee1timeread 0 -oee2timeread 0 -bee1timeread 0
  1075.     ##             -bee2timeread 0
  1076.     ##             -cyclenotphasewrite 1 -accesstimewrite 1d -cse1timewrite 2
  1077.     ##             -cse2timewrite 2 -oee1timewrite 0 -oee2timewrite 0 -bee1timewrite 0
  1078.     ##             -bee2timewrite 0
  1079.     ##             -strobeonfalling 0 -burstsize 0 -datalatency 0 -dataholddelay 0
  1080.     ##             -burstmode 0
  1081.     */
  1082.     //STSYS_WriteRegDev32LE(FMICONFIGDATA0_BANK1, 0x00101699);  /*BE not active during rd */
  1083.     //STSYS_WriteRegDev32LE(FMICONFIGDATA1_BANK1, 0xBE426200);
  1084.     //STSYS_WriteRegDev32LE(FMICONFIGDATA2_BANK1, 0xBE426200);
  1085.     //STSYS_WriteRegDev32LE(FMICONFIGDATA3_BANK1, 0x00000000);
  1086.     STSYS_WriteRegDev32LE(FMICONFIGDATA0_BANK1, 0x05001ed1);  /*BE not active during rd */
  1087.     STSYS_WriteRegDev32LE(FMICONFIGDATA1_BANK1, 0xa0000000);
  1088.     STSYS_WriteRegDev32LE(FMICONFIGDATA2_BANK1, 0xa0000000);
  1089.     STSYS_WriteRegDev32LE(FMICONFIGDATA3_BANK1, 0x00000000);
  1090.     /*------------------------------------------------------------------------------
  1091.     ## Bank 2 - 32MBytes Stem1 Configured as 16-bit peripheral
  1092.     ##------------------------------------------------------------------------------
  1093.     ## Parameters: -weuseoeconfig 0 -waitpolarity 0 -latchpoint 1 -datadrivedelay 0
  1094.     ##             -busreleasetime 2 -csactive 3 -oeactive 1 -beactive 2 -portsize 16
  1095.     ##             -devicetype 1
  1096.     ##             -cyclenotphaseread 1 -accesstimeread 1d -cse1timeread 2
  1097.     ##             -cse2timeread 0 -oee1timeread 0 -oee2timeread 0 -bee1timeread 0
  1098.     ##             -bee2timeread 0
  1099.     ##             -cyclenotphasewrite 1 -accesstimewrite 1d -cse1timewrite 2
  1100.     ##             -cse2timewrite 2 -oee1timewrite 0 -oee2timewrite 0 -bee1timewrite 0
  1101.     ##             -bee2timewrite 0
  1102.     ##             -strobeonfalling 0 -burstsize 0 -datalatency 0 -dataholddelay 0
  1103.     ##             -burstmode 0
  1104.     */
  1105.     STSYS_WriteRegDev32LE(FMICONFIGDATA0_BANK2, 0x001016D1);  /* BE not active during rd */
  1106.     STSYS_WriteRegDev32LE(FMICONFIGDATA1_BANK2, 0x9d200000);
  1107.     STSYS_WriteRegDev32LE(FMICONFIGDATA2_BANK2, 0x9d220000);
  1108.     STSYS_WriteRegDev32LE(FMICONFIGDATA3_BANK2, 0x00000000);
  1109.     /* FMI Bank 3 8MBytes ST M58LW064D Flash - ONLY 8MBytes FLASH ON BOARD THIS MAY BE WRONG!
  1110.     ##------------------------------------------------------------------------------
  1111.     ## Bank 3 - 8MBytes ST M58LW064D Flash
  1112.     ##------------------------------------------------------------------------------
  1113.     ## Parameters: -weuseoeconfig 0 -waitpolarity 0 -latchpoint 1 -datadrivedelay 0
  1114.     ##             -busreleasetime 2 -csactive 3 -oeactive 1 -beactive 2 -portsize 16
  1115.     ##             -devicetype 1
  1116.     ##             -cyclenotphaseread 1 -accesstimeread 1d -cse1timeread 2
  1117.     ##             -cse2timeread 0 -oee1timeread 0 -oee2timeread 0 -bee1timeread 0
  1118.     ##             -bee2timeread 0
  1119.     ##             -cyclenotphasewrite 1 -accesstimewrite 1d -cse1timewrite 2
  1120.     ##             -cse2timewrite 2 -oee1timewrite 0 -oee2timewrite 0 -bee1timewrite 0
  1121.     ##             -bee2timewrite 0
  1122.     ##             -strobeonfalling 0 -burstsize 0 -datalatency 0 -dataholddelay 0
  1123.     ##             -burstmode 0
  1124.     */
  1125.     STSYS_WriteRegDev32LE(FMICONFIGDATA0_BANK3, 0x01008791);
  1126.     STSYS_WriteRegDev32LE(FMICONFIGDATA1_BANK3, 0x44618f00);
  1127.     STSYS_WriteRegDev32LE(FMICONFIGDATA2_BANK3, 0x44618f00);
  1128.     STSYS_WriteRegDev32LE(FMICONFIGDATA3_BANK3, 0x0000000A);
  1129.     /*  ------- Program Other FMI Registers --------
  1130.     ** sdram refresh bank 5
  1131.     ** flash runs @ 1/3 bus clk
  1132.     ** sdram runs @ bus clk
  1133.     */
  1134.     STSYS_WriteRegDev32LE(FMI_GENCFG, 0x00000000);
  1135.     STSYS_WriteRegDev32LE(FMI_FLASHCLKSEL, 0x00000002);
  1136.     /*STSYS_WriteRegDev32LE(FMI_CLKENABLE, 0x00000000);*/
  1137. #if 0
  1138.     /* Reset flash Banks */
  1139.     STSYS_WriteRegMem32LE(FLASH_EPLD_FLASH, 0x00000000);
  1140.     STSYS_WriteRegMem32LE(FLASH_EPLD_FLASH, 0x03030303);
  1141. #endif
  1142. }
  1143. /***leslie---------------------------------------------------------------------------- ## Procedure Name : ST_5105_IniLMI_Reg ## Purpose  : Initialisation Registers of LMI ## Note  :  ## ##  (LMI Spec: ADCS 7483542) ##----------------------------------------------------------------------------   ***/ static void ST_5105_IniLMI_Reg(void)
  1144. {     volatile U32 data;
  1145.     volatile U8 tRP, tRCDR, tRC, tRAS, tRRD, tWR, tRFC, tWTR, tRCDW, tSXSR, sCL;
  1146.     STSYS_WriteRegDev32LE(LMI_COC_UPPER, 0x000C6750);
  1147.     STSYS_WriteRegDev32LE(LMI_COC_LOWER, 0x00002000);
  1148.     data = STSYS_ReadRegDev32LE(LMI_COC_LOWER);
  1149.     data = (data | 0x0<<16 | 0x0<<14);
  1150.     STSYS_WriteRegDev32LE(LMI_COC_LOWER, data);
  1151. #if 0 //TMTM original
  1152.     STSYS_WriteRegDev32LE(LMI_MIM, 0x8200201);  /* 64ms/4K cycle */    
  1153.     STSYS_WriteRegDev32LE(LMI_STR, 0x35085235); 
  1154. #ifdef SDARM_64MB    
  1155. STSYS_WriteRegDev32LE(LMI_SDRA0, 0xC0801400); /* 64MB */
  1156.   STSYS_WriteRegDev32LE(LMI_SDRA1, 0xC0801400); /* 64MB */
  1157.   #else
  1158.   STSYS_WriteRegDev32LE(LMI_SDRA0, 0xC1001500); /* 128MB */
  1159. STSYS_WriteRegDev32LE(LMI_SDRA1, 0xC1001500); /*128MBDDR */
  1160. #endif
  1161. #else
  1162. #ifdef DDR_SDRAM //TMTM
  1163. data = 2;
  1164. #else
  1165. data = 0;
  1166. #endif
  1167. #ifdef SDRAM_FREQ_CONFIG_133
  1168. STSYS_WriteRegDev32LE(LMI_MIM, 0x08200201 |data);  /* 64ms/4K cycle */
  1169. tRP = 1; //0b01; // 3 clocks, 18ns -- ,             RAS_precharge
  1170. tRCDR = 1; //0b01; // 3 clocks, 18ns -- ,             RAS_to_CAS_delay
  1171. tRC = 3; //0b0011;  // 9 cloks,  60ns -- ,             RAS cycle time
  1172. tRAS = 2; //0b010;  // 6 clocks, 42ns -- 120000ns ,    RAS Active time
  1173. tRRD = 0; // 2 clocks, 12ns -- ,             RAS_to_RAS_Active_delay
  1174. tWR = 1; //0b01; // 2 clocks, 15ns -- ,             Last write to PRE/PALL period SDRAM
  1175. tRFC = 4; //0b100; // 10 clocks,72ns -- ,             Auto Refresh RAS cycle time
  1176. tWTR = 0; // 1 clock,  1ns  -- ,             Write to Read interruption, Twtr
  1177. tRCDW = 1; //0b01; // 3 clocks, 18ns -- ,             RAS_to_CAS_delay
  1178. tSXSR = 13;     // 200ns/16 ,                      Exit self-refresh to next command
  1179. #elif defined (SDRAM_FREQ_CONFIG_120)
  1180. STSYS_WriteRegDev32LE(LMI_MIM, 0x07A10201 |data);  /* 64ms/4K cycle */
  1181. tRP = 1; //0b01; // 3 clocks, 18ns -- ,             RAS_precharge
  1182. tRCDR = 1; //0b01; // 3 clocks, 18ns -- ,             RAS_to_CAS_delay
  1183. tRC = 2; //0b0010; // 8 cloks,  60ns -- ,             RAS cycle time
  1184. tRAS = 3; //0b011; // 7 clocks, 42ns -- 120000ns ,    RAS Active time
  1185. tRRD = 0; // 2 clocks, 12ns -- ,             RAS_to_RAS_Active_delay
  1186. tWR = 1; //0b01; // 2 clocks, 15ns -- ,             Last write to PRE/PALL period SDRAM
  1187. tRFC = 4; //0b100; // 10 clocks,72ns -- ,             Auto Refresh RAS cycle time
  1188. tWTR = 0; // 1 clock,  1ns  -- ,             Write to Read interruption, Twtr
  1189. tRCDW = 1; //0b01; // 2 clocks, 18ns -- ,             RAS_to_CAS_delay
  1190. tSXSR = 13; // 200ns/16 ,                      Exit self-refresh to next command
  1191. #elif defined (SDRAM_FREQ_CONFIG_166)
  1192. #if defined( SDRAM_512MB ) || defined(SDRAM_256MB)
  1193.      STSYS_WriteRegDev32LE(LMI_MIM, 0x50F0201 | data);
  1194. #elif defined(SDRAM_128MB) || defined(SDRAM_64MB)
  1195. STSYS_WriteRegDev32LE(LMI_MIM, 0x0A220201 | data);
  1196. /*STSYS_WriteRegDev32LE(LMI_MIM, 0x0A1E0201 | data);*/
  1197. #endif
  1198. #if 0
  1199. tRP = 1; //0b01; // 3 clocks, 18ns -- ,             RAS_precharge
  1200. tRCDR = 1; //0b01; // 3 clocks, 18ns -- ,             RAS_to_CAS_delay
  1201. tRC = 3; //0b0011; // 9 cloks,  60ns -- ,             RAS cycle time
  1202. tRAS = 3; //0b011; // 7 clocks, 42ns -- 120000ns ,    RAS Active time
  1203. tRRD = 0; // 2 clocks, 12ns -- ,             RAS_to_RAS_Active_delay
  1204. tWR = 2; //0b10; // 3 clocks, 15ns -- ,             Last write to PRE/PALL period SDRAM
  1205. tRFC = 6; //0b110; // 12 clocks,72ns -- ,             Auto Refresh RAS cycle time
  1206. tWTR = 0; // 1 clock,  1ns  -- ,             Write to Read interruption, Twtr
  1207. tRCDW = 1; //0b01; // 3 clocks, 18ns -- ,             RAS_to_CAS_delay
  1208. tSXSR = 13; // 200ns/16 ,                      Exit self-refresh to next command
  1209. #endif
  1210. #ifdef SDRAM_CAS_2_0
  1211. sCL = 2;  //0b0010;  // 2 clocks,                       CAS Latency
  1212. #elif defined (SDRAM_CAS_2_5)
  1213. sCL = 0xA; //0b1010; // 2.5 clocks,                     CAS Latency
  1214. #elif defined (SDRAM_CAS_3_0)
  1215. sCL = 0x3; //0b0011; // 3 clocks,                       CAS Latency
  1216. #endif
  1217. data = (tRP<<0) | (tRCDR<<2) | (tRC<<4) | (tRAS<<8) | (tRRD<<11) | ( (tWR&1) <<12) | (sCL<<13) | (tRFC<<17) | ( ((tWR&2)>>1) <<21) | (tWTR<<23) | (tRCDW<<24) | (tSXSR<<26) ;
  1218. data = data | (1 << 22) ; // Enable Write to Read interruption
  1219. STSYS_WriteRegDev32LE(LMI_STR, data); 
  1220. #endif
  1221. //STSYS_WriteRegDev32LE(LMI_STR, 0x30087345); 
  1222. STSYS_WriteRegDev32LE(LMI_STR, 0x35087345); 
  1223. #ifdef SDRAM_64MB    
  1224. STSYS_WriteRegDev32LE(LMI_SDRA0, 0xC0801400); /* 64MB */
  1225. STSYS_WriteRegDev32LE(LMI_SDRA1, 0xC0801400); /* 64MB */
  1226. #elif defined (SDRAM_128MB)
  1227. STSYS_WriteRegDev32LE(LMI_SDRA0, 0xC1001500); /* 128MB */
  1228. STSYS_WriteRegDev32LE(LMI_SDRA1, 0xC1001500); /* 128MB */
  1229. #elif defined (SDRAM_256MB)
  1230. STSYS_WriteRegDev32LE(LMI_SDRA0, 0xC2001900); /* 256Mb */
  1231. STSYS_WriteRegDev32LE(LMI_SDRA1, 0xC2001900); /* 256Mb */
  1232. #elif defined (SDRAM_256MB)
  1233. STSYS_WriteRegDev32LE(LMI_SDRA0, 0xC4001a00); /* 512Mb */
  1234. STSYS_WriteRegDev32LE(LMI_SDRA1, 0xC4001a00); /* 512Mb */
  1235. #endif
  1236. #endif
  1237. }
  1238. /*##---------------------------------------------------------------------------- ## Procedure Name : ST_5105_IniLMI_PC_SDRAM ## Purpose  : Initialisation of LMI for the PC SDRAM on MB400 board ## Note  :  ## ##  (LMI Spec: ADCS 7483542) ##----------------------------------------------------------------------------*/ static void ST_5105_IniLMI_PC_SDRAM(void)
  1239. {     /*** Initialisation Registers of LMI***/     ST_5105_IniLMI_Reg();     /*---------------------------------------------------------------------------
  1240.     ** Initialisation Sequence for LMI & DDR-SDRAM Device
  1241.     **---------------------------------------------------------------------------
  1242.     ** 200 microseconds to settle clocks
  1243.     */
  1244.     Simudelay (100);
  1245.     /* SDRAM Control Register */
  1246.     /* Clock enable */
  1247.     STSYS_WriteRegDev32LE(LMI_SCR, 0x3);
  1248.     
  1249.     Simudelay (100);
  1250.     
  1251.     STSYS_WriteRegDev32LE(LMI_SCR, 0x2);
  1252.     
  1253.     STSYS_WriteRegDev32LE(LMI_SCR, 0x4);
  1254.     STSYS_WriteRegDev32LE(LMI_SCR, 0x4);
  1255.     STSYS_WriteRegDev32LE(LMI_SCR, 0x4);
  1256.     STSYS_WriteRegDev32LE(LMI_SCR, 0x4);
  1257.     STSYS_WriteRegDev32LE(LMI_SCR, 0x4);
  1258.     STSYS_WriteRegDev32LE(LMI_SCR, 0x4);
  1259.     STSYS_WriteRegDev32LE(LMI_SCR, 0x4);
  1260.     STSYS_WriteRegDev32LE(LMI_SCR, 0x4);
  1261.     
  1262. #ifdef SDRAM_CAS_2_0
  1263. // MRS Row 0 & 1 : Reset DLL - /CAS = 2.0, Mode Sequential, Burst Length 8
  1264.     STSYS_WriteRegDev32LE(LMI_SDMR0, 0x0023);
  1265.     STSYS_WriteRegDev32LE(LMI_SDMR1, 0x0023);
  1266. #elif defined (SDRAM_CAS_2_5)
  1267. //MRS Row 0 & 1 : Reset DLL - /CAS = 2.5, Mode Sequential, Burst Length 8
  1268.     STSYS_WriteRegDev32LE(LMI_SDMR0, 0x0063);
  1269.     STSYS_WriteRegDev32LE(LMI_SDMR1, 0x0063);
  1270. #else //SDRAM_CAS_3_0
  1271. //MRS Row 0 & 1 : Reset DLL - /CAS = 3.0, Mode Sequential, Burst Length 8
  1272.     STSYS_WriteRegDev32LE(LMI_SDMR0, 0x0033);
  1273.     STSYS_WriteRegDev32LE(LMI_SDMR1, 0x0033);
  1274. #endif
  1275. } /**##################leslie################**/
  1276. /* EOF --------------------------------------------------------------------- */