打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
s5pv210 uboot-2012-10移植(三) 之支持SPL

上次的uboot的BL1是自己实现的,今天就来让uboot-2012-10支持SPL功能,但不是完全用的uboot本身的代码,也不知道这样是好还是坏。

1.分析顶层目录的Makefile可以知道,需要添加CONFIG_SPL配置,这在前面的已经说过了,跟踪start.S代码,得知编译需要arch/arm/lib/spl.c文件,查看arch/arm/lib/Makefile得知,需要添加CONFIG_SPL_FRAMEWORK配置,所以include/configs/smdkv210.h +70添加

  1. /* SPL */  
  2. #define CONFIG_SPL   
  3. #define CONFIG_SPL_FRAMEWORK  
2.因为SPL不需要BSS清零,所以修改arch/arm/cpu/armv7/start.S +128

  1. #ifndef CONFIG_SPL_BUILD   
  2.     //by ZheGao clear bss   
  3.     ldr r0, =__bss_start  
  4.     ldr r1, =__bss_end__  
  5.     mov r2, #0x0  
  6. 1:  
  7.     str r2, [r0], #4  
  8.     cmp r0, r1  
  9.     bne 1b  
  10.     //end of clear bss   
  11.   
  12.     bl  save_boot_params  
  13. #endif  

3.因为BL1需要初始化memory,所以在lowlevel_init中添加,board/samsung/smdkv210/lowlevel_init.S +43

  1. #ifdef CONFIG_SPL_BUILD   
  2.     bl mem_ctrl_asm_init  
  3. #endif  

4.mem_ctrl_asm_init在同目录下的mem_setup.S文件中,修改board/samsung/smdkv210/mem_setup.S 添加memory的配置

  1. #define ELFIN_GPIO_BASE         0xE0200000   
  2. #define MP1_0DRV_SR_OFFSET      0x3CC   
  3. #define MP1_1DRV_SR_OFFSET      0x3EC   
  4. #define MP1_2DRV_SR_OFFSET      0x40C   
  5. #define MP1_3DRV_SR_OFFSET      0x42C   
  6. #define MP1_4DRV_SR_OFFSET      0x44C   
  7. #define MP1_5DRV_SR_OFFSET      0x46C   
  8. #define MP1_6DRV_SR_OFFSET      0x48C   
  9. #define MP1_7DRV_SR_OFFSET      0x4AC   
  10. #define MP1_8DRV_SR_OFFSET      0x4CC   
  11. #define MP2_0DRV_SR_OFFSET      0x4EC   
  12. #define MP2_1DRV_SR_OFFSET      0x50C   
  13. #define MP2_2DRV_SR_OFFSET      0x52C   
  14. #define MP2_3DRV_SR_OFFSET      0x54C   
  15. #define MP2_4DRV_SR_OFFSET      0x56C   
  16. #define MP2_5DRV_SR_OFFSET      0x58C   
  17. #define MP2_6DRV_SR_OFFSET      0x5AC   
  18. #define MP2_7DRV_SR_OFFSET      0x5CC   
  19. #define MP2_8DRV_SR_OFFSET      0x5EC   
  20. #define APB_DMC_0_BASE          0xF0000000   
  21. #define APB_DMC_1_BASE          0xF1400000   
  22. #define ASYNC_MSYS_DMC0_BASE        0xF1E00000   
  23.       
  24. #define DMC_CONCONTROL          0x00   
  25. #define DMC_MEMCONTROL          0x04   
  26. #define DMC_MEMCONFIG0          0x08   
  27. #define DMC_MEMCONFIG1          0x0C   
  28. #define DMC_DIRECTCMD           0x10   
  29. #define DMC_PRECHCONFIG         0x14   
  30. #define DMC_PHYCONTROL0         0x18   
  31. #define DMC_PHYCONTROL1         0x1C   
  32. #define DMC_RESERVED            0x20   
  33. #define DMC_PWRDNCONFIG         0x28   
  34. #define DMC_TIMINGAREF          0x30   
  35. #define DMC_TIMINGROW           0x34   
  36. #define DMC_TIMINGDATA          0x38   
  37. #define DMC_TIMINGPOWER         0x3C   
  38. #define DMC_PHYSTATUS           0x40   
  39. #define DMC_CHIP0STATUS         0x48   
  40. #define DMC_CHIP1STATUS         0x4C   
  41. #define DMC_AREFSTATUS          0x50   
  42. #define DMC_MRSTATUS            0x54   
  43. #define DMC_PHYTEST0            0x58   
  44. #define DMC_PHYTEST1            0x5C   
  45. #define DMC_QOSCONTROL0         0x60   
  46. #define DMC_QOSCONFIG0          0x64   
  47. #define DMC_QOSCONTROL1         0x68   
  48. #define DMC_QOSCONFIG1          0x6C   
  49. #define DMC_QOSCONTROL2         0x70   
  50. #define DMC_QOSCONFIG2          0x74   
  51. #define DMC_QOSCONTROL3         0x78   
  52. #define DMC_QOSCONFIG3          0x7C   
  53. #define DMC_QOSCONTROL4         0x80   
  54. #define DMC_QOSCONFIG4          0x84   
  55. #define DMC_QOSCONTROL5         0x88   
  56. #define DMC_QOSCONFIG5          0x8C   
  57. #define DMC_QOSCONTROL6         0x90   
  58. #define DMC_QOSCONFIG6          0x94   
  59. #define DMC_QOSCONTROL7         0x98   
  60. #define DMC_QOSCONFIG7          0x9C   
  61. #define DMC_QOSCONTROL8         0xA0   
  62. #define DMC_QOSCONFIG8          0xA4   
  63. #define DMC_QOSCONTROL9         0xA8   
  64. #define DMC_QOSCONFIG9          0xAC   
  65. #define DMC_QOSCONTROL10        0xB0   
  66. #define DMC_QOSCONFIG10         0xB4   
  67. #define DMC_QOSCONTROL11        0xB8   
  68. #define DMC_QOSCONFIG11         0xBC   
  69. #define DMC_QOSCONTROL12        0xC0   
  70. #define DMC_QOSCONFIG12         0xC4   
  71. #define DMC_QOSCONTROL13        0xC8   
  72. #define DMC_QOSCONFIG13         0xCC   
  73. #define DMC_QOSCONTROL14        0xD0   
  74. #define DMC_QOSCONFIG14         0xD4   
  75. #define DMC_QOSCONTROL15        0xD8   
  76. #define DMC_QOSCONFIG15         0xDC   
  77.       
  78. #define DMC0_MEMCONFIG_0    0x20E01323  // MemConfig0   256MB config, 8 banks,Mapping Method[12:15]0:linear, 1:linterleaved, 2:Mixed   
  79. #define DMC0_MEMCONFIG_1    0x40F01323  // MemConfig1   
  80. #define DMC0_TIMINGA_REF    0x00000618  // TimingAref   7.8us*133MHz=1038(0x40E), 100MHz=780(0x30C), 20MHz=156(0x9C), 10MHz=78(0x4E)   
  81. #define DMC0_TIMING_ROW     0x28233287  // TimingRow    for @200MHz   
  82. #define DMC0_TIMING_DATA    0x23240304  // TimingData   CL=3   
  83. #define DMC0_TIMING_PWR     0x09C80232  // TimingPower   
  84.           
  85. #define DMC1_MEMCONTROL     0x00202400  // MemControl   BL=4, 2 chip, DDR2 type, dynamic self refresh, force precharge, dynamic power down off   
  86. #define DMC1_MEMCONFIG_0    0x40C01323  // MemConfig0   512MB config, 8 banks,Mapping Method[12:15]0:linear, 1:linterleaved, 2:Mixed   
  87. #define DMC1_MEMCONFIG_1    0x00E01323  // MemConfig1   
  88. #define DMC1_TIMINGA_REF    0x00000618  // TimingAref   7.8us*133MHz=1038(0x40E), 100MHz=780(0x30C), 20MHz=156(0x9C), 10MHz=78(0x4   
  89. #define DMC1_TIMING_ROW     0x28233289  // TimingRow    for @200MHz   
  90. #define DMC1_TIMING_DATA    0x23240304  // TimingData   CL=3   
  91. #define DMC1_TIMING_PWR     0x08280232  // TimingPower   
  92.   
  93.   
  94.     .globl mem_ctrl_asm_init  
  95. mem_ctrl_asm_init:  
  96. #if 0   
  97.     ldr r6, =S5PC100_DMC_BASE           @ 0xE6000000  
  98.   
  99.     /* DLL parameter setting */  
  100.     ldr r1, =0x50101000  
  101.     str r1, [r6, #0x018]            @ PHYCONTROL0  
  102.     ldr r1, =0xf4  
  103.     str r1, [r6, #0x01C]            @ PHYCONTROL1  
  104.     ldr r1, =0x0  
  105.     str r1, [r6, #0x020]            @ PHYCONTROL2  
  106.   
  107.     /* DLL on */  
  108.     ldr r1, =0x50101002  
  109.     str r1, [r6, #0x018]            @ PHYCONTROL0  
  110.   
  111.     /* DLL start */  
  112.     ldr r1, =0x50101003  
  113.     str r1, [r6, #0x018]            @ PHYCONTROL0  
  114.   
  115.     /* Force value locking for DLL off */  
  116.     str r1, [r6, #0x018]            @ PHYCONTROL0  
  117.   
  118.     /* DLL off */  
  119.     ldr r1, =0x50101001  
  120.     str r1, [r6, #0x018]            @ PHYCONTROL0  
  121.   
  122.     /* auto refresh off */  
  123.     ldr r1, =0xff001010  
  124.     str r1, [r6, #0x000]            @ CONCONTROL  
  125.   
  126.     /* 
  127.      * Burst Length 4, 2 chips, 32-bit, LPDDR 
  128.      * OFF: dynamic self refresh, force precharge, dynamic power down off 
  129.      */  
  130.     ldr r1, =0x00212100  
  131.     str r1, [r6, #0x004]            @ MEMCONTROL  
  132.   
  133.     /* 
  134.      * Note: 
  135.      * If Bank0 has OneDRAM we place it at 0x2800'0000 
  136.      * So finally Bank1 should address start at at 0x2000'0000 
  137.      */  
  138.     mov r4, #0x0  
  139.   
  140. swap_memory:  
  141.     /* 
  142.      * Bank0 
  143.      * 0x30 -> 0x30000000 
  144.      * 0xf8 -> 0x37FFFFFF 
  145.      * [15:12] 0: Linear 
  146.      * [11:8 ] 2: 9 bits 
  147.      * [ 7:4 ] 2: 14 bits 
  148.      * [ 3:0 ] 2: 4 banks 
  149.      */  
  150.     ldr r1, =0x30f80222  
  151.     /* if r4 is 1, swap the bank */  
  152.     cmp r4, #0x1  
  153.     orreq   r1, r1, #0x08000000  
  154.     str r1, [r6, #0x008]            @ MEMCONFIG0  
  155.   
  156.     /* 
  157.      * Bank1 
  158.      * 0x38 -> 0x38000000 
  159.      * 0xf8 -> 0x3fFFFFFF 
  160.      * [15:12] 0: Linear 
  161.      * [11:8 ] 2: 9 bits 
  162.      * [ 7:4 ] 2: 14 bits 
  163.      * [ 3:0 ] 2: 4 banks 
  164.      */  
  165.     ldr r1, =0x38f80222  
  166.     /* if r4 is 1, swap the bank */  
  167.     cmp r4, #0x1  
  168.     biceq   r1, r1, #0x08000000  
  169.     str r1, [r6, #0x00c]            @ MEMCONFIG1  
  170.   
  171.     ldr r1, =0x20000000  
  172.     str r1, [r6, #0x014]            @ PRECHCONFIG  
  173.   
  174.     /* 
  175.      * FIXME: Please verify these values 
  176.      * 7.8us * 166MHz %LE %LONG1294(0x50E) 
  177.      * 7.8us * 133MHz %LE %LONG1038(0x40E), 
  178.      * 7.8us * 100MHz %LE %LONG780(0x30C), 
  179.      * 7.8us * 20MHz  %LE %LONG156(0x9C), 
  180.      * 7.8us * 10MHz  %LE %LONG78(0x4E) 
  181.      */  
  182.     ldr r1, =0x0000050e  
  183.     str r1, [r6, #0x030]            @ TIMINGAREF  
  184.   
  185.     /* 166 MHz */  
  186.     ldr r1, =0x0c233287  
  187.     str r1, [r6, #0x034]            @ TIMINGROW  
  188.   
  189.     /* twtr=3 twr=2 trtp=3 cl=3 wl=3 rl=3 */  
  190.     ldr r1, =0x32330303  
  191.     str r1, [r6, #0x038]            @ TIMINGDATA  
  192.   
  193.     /* tfaw=4 sxsr=0x14 txp=0x14 tcke=3 tmrd=3 */  
  194.     ldr r1, =0x04141433  
  195.     str r1, [r6, #0x03C]            @ TIMINGPOWER  
  196.   
  197.     /* chip0 Deselect */  
  198.     ldr r1, =0x07000000  
  199.     str r1, [r6, #0x010]            @ DIRECTCMD  
  200.   
  201.     /* chip0 PALL */  
  202.     ldr r1, =0x01000000  
  203.     str r1, [r6, #0x010]            @ DIRECTCMD  
  204.   
  205.     /* chip0 REFA */  
  206.     ldr r1, =0x05000000  
  207.     str r1, [r6, #0x010]            @ DIRECTCMD  
  208.     /* chip0 REFA */  
  209.     str r1, [r6, #0x010]            @ DIRECTCMD  
  210.   
  211.     /* chip0 MRS, CL%LE %LONG3, BL%LE %LONG4 */  
  212.     ldr r1, =0x00000032  
  213.     str r1, [r6, #0x010]            @ DIRECTCMD  
  214.   
  215.     /* chip1 Deselect */  
  216.     ldr r1, =0x07100000  
  217.     str r1, [r6, #0x010]            @ DIRECTCMD  
  218.   
  219.     /* chip1 PALL */  
  220.     ldr r1, =0x01100000  
  221.     str r1, [r6, #0x010]            @ DIRECTCMD  
  222.   
  223.     /* chip1 REFA */  
  224.     ldr r1, =0x05100000  
  225.     str r1, [r6, #0x010]            @ DIRECTCMD  
  226.     /* chip1 REFA */  
  227.     str r1, [r6, #0x010]            @ DIRECTCMD  
  228.   
  229.     /* chip1 MRS, CL%LE %LONG3, BL%LE %LONG4 */  
  230.     ldr r1, =0x00100032  
  231.     str r1, [r6, #0x010]            @ DIRECTCMD  
  232.   
  233.     /* auto refresh on */  
  234.     ldr r1, =0xff002030  
  235.     str r1, [r6, #0x000]            @ CONCONTROL  
  236.   
  237.     /* PwrdnConfig */  
  238.     ldr r1, =0x00100002  
  239.     str r1, [r6, #0x028]            @ PWRDNCONFIG  
  240.   
  241.     /* BL%LE %LONG */  
  242.     ldr r1, =0xff212100  
  243.     str r1, [r6, #0x004]            @ MEMCONTROL  
  244.   
  245.   
  246.     /* Try to test memory area */  
  247.     cmp r4, #0x1  
  248.     beq 1f  
  249.   
  250.     mov r4, #0x1  
  251.     ldr r1, =0x37ffff00  
  252.     str r4, [r1]  
  253.     str r4, [r1, #0x4]              @ dummy write  
  254.     ldr r0, [r1]  
  255.     cmp r0, r4  
  256.     bne swap_memory  
  257. #endif   
  258.   
  259.     /* DMC0 Drive Strength (Setting 2X) */  
  260.       
  261.     ldr r0, =ELFIN_GPIO_BASE  
  262.   
  263.     ldr r1, =0x0000AAAA  
  264.     str r1, [r0, #MP1_0DRV_SR_OFFSET]  
  265.   
  266.     ldr r1, =0x0000AAAA  
  267.     str r1, [r0, #MP1_1DRV_SR_OFFSET]  
  268.   
  269.     ldr r1, =0x0000AAAA  
  270.     str r1, [r0, #MP1_2DRV_SR_OFFSET]  
  271.   
  272.     ldr r1, =0x0000AAAA  
  273.     str r1, [r0, #MP1_3DRV_SR_OFFSET]  
  274.   
  275.     ldr r1, =0x0000AAAA  
  276.     str r1, [r0, #MP1_4DRV_SR_OFFSET]  
  277.   
  278.     ldr r1, =0x0000AAAA  
  279.     str r1, [r0, #MP1_5DRV_SR_OFFSET]  
  280.   
  281.     ldr r1, =0x0000AAAA  
  282.     str r1, [r0, #MP1_6DRV_SR_OFFSET]  
  283.   
  284.     ldr r1, =0x0000AAAA  
  285.     str r1, [r0, #MP1_7DRV_SR_OFFSET]  
  286.   
  287.     ldr r1, =0x00002AAA  
  288.     str r1, [r0, #MP1_8DRV_SR_OFFSET]  
  289.   
  290.   
  291.     /* DMC1 Drive Strength (Setting 2X) */  
  292.       
  293.     ldr r0, =ELFIN_GPIO_BASE  
  294.       
  295.     ldr r1, =0x0000AAAA  
  296.     str r1, [r0, #MP2_0DRV_SR_OFFSET]  
  297.   
  298.     ldr r1, =0x0000AAAA  
  299.     str r1, [r0, #MP2_1DRV_SR_OFFSET]  
  300.   
  301.     ldr r1, =0x0000AAAA  
  302.     str r1, [r0, #MP2_2DRV_SR_OFFSET]  
  303.   
  304.     ldr r1, =0x0000AAAA  
  305.     str r1, [r0, #MP2_3DRV_SR_OFFSET]  
  306.   
  307.     ldr r1, =0x0000AAAA  
  308.     str r1, [r0, #MP2_4DRV_SR_OFFSET]  
  309.   
  310.     ldr r1, =0x0000AAAA  
  311.     str r1, [r0, #MP2_5DRV_SR_OFFSET]  
  312.   
  313.     ldr r1, =0x0000AAAA  
  314.     str r1, [r0, #MP2_6DRV_SR_OFFSET]  
  315.   
  316.     ldr r1, =0x0000AAAA  
  317.     str r1, [r0, #MP2_7DRV_SR_OFFSET]  
  318.   
  319.     ldr r1, =0x00002AAA  
  320.     str r1, [r0, #MP2_8DRV_SR_OFFSET]  
  321.       
  322.     /* DMC0 initialization at single Type*/  
  323.     ldr r0, =APB_DMC_0_BASE  
  324.   
  325.     ldr r1, =0x00101000             @PhyControl0 DLL parameter setting, manual 0x00101000  
  326.     str r1, [r0, #DMC_PHYCONTROL0]  
  327.   
  328.     ldr r1, =0x00000086             @PhyControl1 DLL parameter setting, LPDDR/LPDDR2 Case  
  329.     str r1, [r0, #DMC_PHYCONTROL1]  
  330.   
  331.     ldr r1, =0x00101002             @PhyControl0 DLL on  
  332.     str r1, [r0, #DMC_PHYCONTROL0]  
  333.   
  334.     ldr r1, =0x00101003             @PhyControl0 DLL start  
  335.     str r1, [r0, #DMC_PHYCONTROL0]  
  336.   
  337. find_lock_val:  
  338.     ldr r1, [r0, #DMC_PHYSTATUS]        @Load Phystatus register value  
  339.     and r2, r1, #0x7  
  340.     cmp r2, #0x7                @Loop until DLL is locked  
  341.     bne find_lock_val  
  342.       
  343.     and r1, #0x3fc0   
  344.     mov r2, r1, LSL #18  
  345.     orr r2, r2, #0x100000  
  346.     orr r2 ,r2, #0x1000   
  347.           
  348.     orr r1, r2, #0x3                @Force Value locking  
  349.     str r1, [r0, #DMC_PHYCONTROL0]  
  350.   
  351. #if 0   /* Memory margin test 10.01.05 */   
  352.     orr r1, r2, #0x1                @DLL off  
  353.     str r1, [r0, #DMC_PHYCONTROL0]  
  354. #endif   
  355.     /* setting DDR2 */  
  356.     ldr r1, =0x0FFF2010             @ConControl auto refresh off  
  357.     str r1, [r0, #DMC_CONCONTROL]  
  358.   
  359.     ldr r1, =0x00212400             @MemControl BL=4, 2 chip, DDR2 type, dynamic self refresh, force precharge, dynamic power down off  
  360.     str r1, [r0, #DMC_MEMCONTROL]  
  361.       
  362.     ldr r1, =DMC0_MEMCONFIG_0           @MemConfig0 256MB config, 8 banks,Mapping Method[12:15]0:linear, 1:linterleaved, 2:Mixed  
  363.     str r1, [r0, #DMC_MEMCONFIG0]  
  364.   
  365.     ldr r1, =DMC0_MEMCONFIG_1           @MemConfig1  
  366.     str r1, [r0, #DMC_MEMCONFIG1]  
  367.   
  368.     ldr r1, =0xFF000000             @PrechConfig  
  369.     str r1, [r0, #DMC_PRECHCONFIG]  
  370.       
  371.     ldr r1, =DMC0_TIMINGA_REF           @TimingAref 7.8us*133MHz=1038(0x40E), 100MHz=780(0x30C), 20MHz=156(0x9C), 10MHz=78(0x4E)  
  372.     str r1, [r0, #DMC_TIMINGAREF]  
  373.       
  374.     ldr r1, =DMC0_TIMING_ROW            @TimingRow  for @200MHz  
  375.     str r1, [r0, #DMC_TIMINGROW]  
  376.   
  377.     ldr r1, =DMC0_TIMING_DATA           @TimingData CL=3  
  378.     str r1, [r0, #DMC_TIMINGDATA]  
  379.       
  380.     ldr r1, =DMC0_TIMING_PWR            @TimingPower  
  381.     str r1, [r0, #DMC_TIMINGPOWER]  
  382.   
  383.     ldr r1, =0x07000000             @DirectCmd  chip0 Deselect  
  384.     str r1, [r0, #DMC_DIRECTCMD]  
  385.       
  386.     ldr r1, =0x01000000             @DirectCmd  chip0 PALL  
  387.     str r1, [r0, #DMC_DIRECTCMD]  
  388.   
  389.     ldr r1, =0x00020000             @DirectCmd  chip0 EMRS2  
  390.     str r1, [r0, #DMC_DIRECTCMD]  
  391.   
  392.     ldr r1, =0x00030000             @DirectCmd  chip0 EMRS3  
  393.     str r1, [r0, #DMC_DIRECTCMD]  
  394.   
  395.     ldr r1, =0x00010400             @DirectCmd  chip0 EMRS1 (MEM DLL on, DQS# disable)  
  396.     str r1, [r0, #DMC_DIRECTCMD]  
  397.   
  398.     ldr r1, =0x00000542             @DirectCmd  chip0 MRS (MEM DLL reset) CL=4, BL=4  
  399.     str r1, [r0, #DMC_DIRECTCMD]  
  400.   
  401.     ldr r1, =0x01000000             @DirectCmd  chip0 PALL  
  402.     str r1, [r0, #DMC_DIRECTCMD]  
  403.   
  404.     ldr r1, =0x05000000             @DirectCmd  chip0 REFA  
  405.     str r1, [r0, #DMC_DIRECTCMD]  
  406.   
  407.     ldr r1, =0x05000000             @DirectCmd  chip0 REFA  
  408.     str r1, [r0, #DMC_DIRECTCMD]  
  409.   
  410.     ldr r1, =0x00000442             @DirectCmd  chip0 MRS (MEM DLL unreset)  
  411.     str r1, [r0, #DMC_DIRECTCMD]  
  412.   
  413.     ldr r1, =0x00010780             @DirectCmd  chip0 EMRS1 (OCD default)  
  414.     str r1, [r0, #DMC_DIRECTCMD]  
  415.   
  416.     ldr r1, =0x00010400             @DirectCmd  chip0 EMRS1 (OCD exit)  
  417.     str r1, [r0, #DMC_DIRECTCMD]  
  418.       
  419.     ldr r1, =0x07100000             @DirectCmd  chip1 Deselect  
  420.     str r1, [r0, #DMC_DIRECTCMD]  
  421.   
  422.     ldr r1, =0x01100000             @DirectCmd  chip1 PALL  
  423.     str r1, [r0, #DMC_DIRECTCMD]  
  424.       
  425.     ldr r1, =0x00120000             @DirectCmd  chip1 EMRS2  
  426.     str r1, [r0, #DMC_DIRECTCMD]  
  427.       
  428.     ldr r1, =0x00130000             @DirectCmd  chip1 EMRS3  
  429.     str r1, [r0, #DMC_DIRECTCMD]  
  430.       
  431.     ldr r1, =0x00110400             @DirectCmd  chip1 EMRS1 (MEM DLL on, DQS# disable)  
  432.     str r1, [r0, #DMC_DIRECTCMD]  
  433.       
  434.     ldr r1, =0x00100542             @DirectCmd  chip1 MRS (MEM DLL reset) CL=4, BL=4  
  435.     str r1, [r0, #DMC_DIRECTCMD]  
  436.       
  437.     ldr r1, =0x01100000             @DirectCmd  chip1 PALL  
  438.     str r1, [r0, #DMC_DIRECTCMD]  
  439.       
  440.     ldr r1, =0x05100000             @DirectCmd  chip1 REFA  
  441.     str r1, [r0, #DMC_DIRECTCMD]  
  442.       
  443.     ldr r1, =0x05100000             @DirectCmd  chip1 REFA  
  444.     str r1, [r0, #DMC_DIRECTCMD]  
  445.       
  446.     ldr r1, =0x00100442             @DirectCmd  chip1 MRS (MEM DLL unreset)  
  447.     str r1, [r0, #DMC_DIRECTCMD]  
  448.       
  449.     ldr r1, =0x00110780             @DirectCmd  chip1 EMRS1 (OCD default)  
  450.     str r1, [r0, #DMC_DIRECTCMD]  
  451.           
  452.     ldr r1, =0x00110400             @DirectCmd  chip1 EMRS1 (OCD exit)  
  453.     str r1, [r0, #DMC_DIRECTCMD]  
  454.           
  455.     ldr r1, =0x0FF02030             @ConControl auto refresh on  
  456.     str r1, [r0, #DMC_CONCONTROL]  
  457.           
  458.     ldr r1, =0xFFFF00FF             @PwrdnConfig  
  459.     str r1, [r0, #DMC_PWRDNCONFIG]  
  460.           
  461.     ldr r1, =0x00202400             @MemControl BL=4, 2 chip, DDR2 type, dynamic self refresh, force precharge, dynamic power down off  
  462.     str r1, [r0, #DMC_MEMCONTROL]  
  463.   
  464.     /* DMC1 initialization */  
  465.     ldr r0, =APB_DMC_1_BASE  
  466.   
  467.     ldr r1, =0x00101000             @Phycontrol0 DLL parameter setting  
  468.     str r1, [r0, #DMC_PHYCONTROL0]  
  469.   
  470.     ldr r1, =0x00000086             @Phycontrol1 DLL parameter setting  
  471.     str r1, [r0, #DMC_PHYCONTROL1]  
  472.   
  473.     ldr r1, =0x00101002             @PhyControl0 DLL on  
  474.     str r1, [r0, #DMC_PHYCONTROL0]  
  475.   
  476.     ldr r1, =0x00101003             @PhyControl0 DLL start  
  477.     str r1, [r0, #DMC_PHYCONTROL0]  
  478. find_lock_val1:  
  479.     ldr r1, [r0, #DMC_PHYSTATUS]        @Load Phystatus register value  
  480.     and r2, r1, #0x7  
  481.     cmp r2, #0x7                @Loop until DLL is locked  
  482.     bne find_lock_val1  
  483.       
  484.     and r1, #0x3fc0   
  485.     mov r2, r1, LSL #18  
  486.     orr r2, r2, #0x100000  
  487.     orr r2, r2, #0x1000  
  488.           
  489.     orr r1, r2, #0x3                @Force Value locking  
  490.     str r1, [r0, #DMC_PHYCONTROL0]  
  491.   
  492. #if 0   /* Memory margin test 10.01.05 */   
  493.     orr r1, r2, #0x1                @DLL off  
  494.     str r1, [r0, #DMC_PHYCONTROL0]  
  495. #endif   
  496.   
  497.     /* settinf fot DDR2 */  
  498.     ldr r0, =APB_DMC_1_BASE  
  499.   
  500.     ldr r1, =0x0FFF2010             @auto refresh off  
  501.     str r1, [r0, #DMC_CONCONTROL]  
  502.   
  503.     ldr r1, =DMC1_MEMCONTROL            @MemControl BL=4, 2 chip, DDR2 type, dynamic self refresh, force precharge, dynamic power down off  
  504.     str r1, [r0, #DMC_MEMCONTROL]  
  505.   
  506.     ldr r1, =DMC1_MEMCONFIG_0           @MemConfig0 512MB config, 8 banks,Mapping Method[12:15]0:linear, 1:linterleaved, 2:Mixed  
  507.     str r1, [r0, #DMC_MEMCONFIG0]  
  508.   
  509.     ldr r1, =DMC1_MEMCONFIG_1           @MemConfig1  
  510.     str r1, [r0, #DMC_MEMCONFIG1]  
  511.   
  512.     ldr r1, =0xFF000000  
  513.     str r1, [r0, #DMC_PRECHCONFIG]  
  514.   
  515.     ldr r1, =DMC1_TIMINGA_REF           @TimingAref 7.8us*133MHz=1038(0x40E), 100MHz=780(0x30C), 20MHz=156(0x9C), 10MHz=78(0x4  
  516.     str r1, [r0, #DMC_TIMINGAREF]  
  517.   
  518.     ldr r1, =DMC1_TIMING_ROW            @TimingRow  for @200MHz  
  519.     str r1, [r0, #DMC_TIMINGROW]  
  520.   
  521.     ldr r1, =DMC1_TIMING_DATA           @TimingData CL=3  
  522.     str r1, [r0, #DMC_TIMINGDATA]  
  523.   
  524.     ldr r1, =DMC1_TIMING_PWR            @TimingPower  
  525.     str r1, [r0, #DMC_TIMINGPOWER]  
  526.   
  527.   
  528.     ldr r1, =0x07000000             @DirectCmd  chip0 Deselect  
  529.     str r1, [r0, #DMC_DIRECTCMD]  
  530.   
  531.     ldr r1, =0x01000000             @DirectCmd  chip0 PALL  
  532.     str r1, [r0, #DMC_DIRECTCMD]  
  533.   
  534.     ldr r1, =0x00020000             @DirectCmd  chip0 EMRS2  
  535.     str r1, [r0, #DMC_DIRECTCMD]  
  536.   
  537.     ldr r1, =0x00030000             @DirectCmd  chip0 EMRS3  
  538.     str r1, [r0, #DMC_DIRECTCMD]  
  539.   
  540.     ldr r1, =0x00010400             @DirectCmd  chip0 EMRS1 (MEM DLL on, DQS# disable)  
  541.     str r1, [r0, #DMC_DIRECTCMD]  
  542.   
  543.     ldr r1, =0x00000542             @DirectCmd  chip0 MRS (MEM DLL reset) CL=4, BL=4  
  544.     str r1, [r0, #DMC_DIRECTCMD]  
  545.   
  546.     ldr r1, =0x01000000             @DirectCmd  chip0 PALL  
  547.     str r1, [r0, #DMC_DIRECTCMD]  
  548.   
  549.     ldr r1, =0x05000000             @DirectCmd  chip0 REFA  
  550.     str r1, [r0, #DMC_DIRECTCMD]  
  551.   
  552.     ldr r1, =0x05000000             @DirectCmd  chip0 REFA  
  553.     str r1, [r0, #DMC_DIRECTCMD]  
  554.   
  555.     ldr r1, =0x00000442             @DirectCmd  chip0 MRS (MEM DLL unreset)  
  556.     str r1, [r0, #DMC_DIRECTCMD]  
  557.   
  558.     ldr r1, =0x00010780             @DirectCmd  chip0 EMRS1 (OCD default)  
  559.     str r1, [r0, #DMC_DIRECTCMD]  
  560.   
  561.     ldr r1, =0x00010400             @DirectCmd  chip0 EMRS1 (OCD exit)  
  562.     str r1, [r0, #DMC_DIRECTCMD]  
  563.   
  564.     ldr r1, =0x07100000             @DirectCmd  chip1 Deselect  
  565.     str r1, [r0, #DMC_DIRECTCMD]  
  566.   
  567.     ldr r1, =0x01100000             @DirectCmd  chip1 PALL  
  568.     str r1, [r0, #DMC_DIRECTCMD]  
  569.   
  570.     ldr r1, =0x00120000             @DirectCmd  chip1 EMRS2  
  571.     str r1, [r0, #DMC_DIRECTCMD]  
  572.   
  573.     ldr r1, =0x00130000             @DirectCmd  chip1 EMRS3  
  574.     str r1, [r0, #DMC_DIRECTCMD]  
  575.   
  576.     ldr r1, =0x00110440             @DirectCmd  chip1 EMRS1 (MEM DLL on, DQS# disable)  
  577.     str r1, [r0, #DMC_DIRECTCMD]  
  578.   
  579.     ldr r1, =0x00100542             @DirectCmd  chip1 MRS (MEM DLL reset) CL=4, BL=4  
  580.     str r1, [r0, #DMC_DIRECTCMD]  
  581.   
  582.     ldr r1, =0x01100000             @DirectCmd  chip1 PALL  
  583.     str r1, [r0, #DMC_DIRECTCMD]  
  584.   
  585.     ldr r1, =0x05100000             @DirectCmd  chip1 REFA  
  586.     str r1, [r0, #DMC_DIRECTCMD]  
  587.   
  588.     ldr r1, =0x05100000             @DirectCmd  chip1 REFA  
  589.     str r1, [r0, #DMC_DIRECTCMD]  
  590.   
  591.     ldr r1, =0x00100442             @DirectCmd  chip1 MRS (MEM DLL unreset)  
  592.     str r1, [r0, #DMC_DIRECTCMD]  
  593.   
  594.     ldr r1, =0x00110780             @DirectCmd  chip1 EMRS1 (OCD default)  
  595.     str r1, [r0, #DMC_DIRECTCMD]  
  596.   
  597.     ldr r1, =0x00110400             @DirectCmd  chip1 EMRS1 (OCD exit)  
  598.     str r1, [r0, #DMC_DIRECTCMD]  
  599.   
  600.     ldr r1, =0x0FF02030             @ConControl auto refresh on  
  601.     str r1, [r0, #DMC_CONCONTROL]  
  602.   
  603.     ldr r1, =0xFFFF00FF             @PwrdnConfig      
  604.     str r1, [r0, #DMC_PWRDNCONFIG]  
  605.   
  606.     ldr r1, =DMC1_MEMCONTROL            @MemControl BL=4, 2 chip, DDR2 type, dynamic self refresh, force precharge, dynamic power down off  
  607.     str r1, [r0, #DMC_MEMCONTROL]  
  608.   
  609.     mov pc, lr  

5.修改board/samsung/smdkv210/Makefile 添加对mem_setup.S的选则编译,uboot里就不需要编译了,因为BL1已经初始化过了,在执行一次也没问题的

  1. ifndef CONFIG_SPL_BUILD  
  2. SOBJS   := lowlevel_init.o  
  3. endif  
  4.   
  5. ifdef CONFIG_SPL_BUILD  
  6. SOBJS   := lowlevel_init.o mem_setup.o  
  7. endif  
6.修改arch/arm/lib/spl.c 的 board_init_f 函数

  1. void __weak board_init_f(ulong dummy)  
  2. {  
  3.     __attribute__((noreturn)) void (*uboot)(void);  
  4. #if 0   
  5.     /* Set the stack pointer. */  
  6.     asm volatile("mov sp, %0\n" : : "r"(CONFIG_SPL_STACK));  
  7.   
  8.     /* Clear the BSS. */  
  9.     memset(__bss_start, 0, __bss_end__ - __bss_start);  
  10.   
  11.     /* Set global data pointer. */  
  12.     gd = &gdata;  
  13.   
  14.     board_init_r(NULL, 0);  
  15. #endif   
  16.   
  17.     /* 
  18.     // test  
  19.     #define GPH0CON (*(volatile unsigned int *)0xE0200C00) 
  20.     #define GPH0DAT (*(volatile unsigned int *)0xE0200C04) 
  21.  
  22.     GPH0CON = (1<<0) | (1<<4) | (1<<8) | (1<<12); 
  23.     GPH0DAT = 10; 
  24.     */  
  25.   
  26.     uart_init();  
  27.   
  28.     copy_uboot_to_ram();  
  29.   
  30.     //printf ("jump to u-boot image\r\n");   
  31.     /* Jump to U-Boot image */  
  32.     uboot = (void *)CONFIG_SYS_TEXT_BASE;  
  33.     (*uboot)();  
  34. }  
7.在arch/arm/lib/spl.c 中添加串口的初始化和从sd卡拷贝uboot到ddr2内存里的函数

  1. //UART   
  2. #define ULCON0      (*(volatile unsigned int *)0xE2900000)   
  3. #define UCON0       (*(volatile unsigned int *)0xE2900004)   
  4. #define UTRSTAT0    (*(volatile unsigned int *)0xE2900010)   
  5. #define UTXH0       (*(volatile unsigned char *)0xE2900020)   
  6. #define URXH0       (*(volatile unsigned char *)0xE2900024)   
  7. #define UBRDIV0     (*(volatile unsigned int *)0xE2900028)   
  8. #define UDIVSLOT0   (*(volatile unsigned int *)0xE290002C)   
  9. //GPA0   
  10. #define GPA0CON     (*(volatile unsigned int *)0xE0200000)   
  11.   
  12. typedef u32(*copy_sd_mmc_to_mem)  
  13. (u32 channel, u32 start_block, u16 block_size, u32 *trg, u32 init);  
  14.   
  15.   
  16. /* Pointer to as well as the global data structure for SPL */  
  17. DECLARE_GLOBAL_DATA_PTR;  
  18. gd_t gdata __attribute__ ((section(".data")));  
  19.   
  20. void uart_init (void)  
  21. {  
  22.     //配置GPA0_0 - GPA0_1管脚为串口0功能管脚   
  23.     GPA0CON = (2<<0) | (2<<4);  
  24.   
  25.     /** 
  26.     * 传送模式: 0:普通模式 
  27.     * 校验位: 0无校验 
  28.     * 停止位: 1 
  29.     * 数据位: 8 
  30.     */  
  31.     ULCON0 = (0<<6) | (0<<3) | (0<<2) | (3<<0);  
  32.   
  33.     /** 
  34.     * 时钟选则: 0 = PCLK = 66M: 
  35.     * 发送模式:01 = Interrupt request or polling mode 
  36.     */  
  37.     UCON0 = (0<<10) | (1<<2) | (1<<0);  
  38.   
  39.     /** 
  40.     * DIV_VAL = UBRDIVn + (num of 1's in UDIVSLOTn)/16 
  41.     * DIV_VAL = (PCLK / (bps x 16)) - 1 
  42.     * DIV_VAL = (66000000 / (115200 * 16)) - 1 = 34.8 
  43.     * UBRDIV0 = 34 
  44.     * (num of 1's in UDIVSLOTn)/16 = 0.8 
  45.     * (num of 1's in UDIVSLOTn) = 12 
  46.     * 查表得 UDIVSLOT0 = 0xDDDD 
  47.     */  
  48.     UBRDIV0 = 34;  
  49.     UDIVSLOT0 = 0xDDDD;  
  50. }  
  51.   
  52. void copy_uboot_to_ram(void)  
  53. {  
  54.     ulong ch;  
  55.   
  56.     ch = *(volatile u32 *)(0xD0037488);  
  57.     copy_sd_mmc_to_mem copy_bl2 =  
  58.         (copy_sd_mmc_to_mem) (*(u32 *) (0xD0037F98));  
  59.   
  60.     u32 ret;  
  61.   
  62.     //printf ("boot mmc chanel: %x\r\n", ch);   
  63.     if (ch == 0xEB000000) {  
  64.         ret = copy_bl2(0, 49, 1024, CONFIG_SYS_TEXT_BASE, 0);  
  65.     }  
  66.   
  67.     if (ret == 0) {  
  68.         //printf ("copy error\r\n");   
  69.         while (1);  
  70.     }  
  71.     else  
  72.         return;  
  73. }  
8.arch/arm/include/asm/spl.h +27

  1. //#include <asm/arch/spl.h>  

9.分析spl/Makefile得知,在tools/下没有mk$(BOARD)spl这个工具,我暂时对这个工具不熟悉,就用自己的吧,我的工具是mkv210_image,用来制作BL1头信息的

  1. ifdef CONFIG_SAMSUNG  
  2. $(obj)$(BOARD)-spl.bin: $(obj)u-boot-spl.bin  
  3.     $(OBJTREE)/tools/mk$(BOARD)spl \  
  4.         $(obj)u-boot-spl.bin $(obj)$(BOARD)-spl.bin  
  5. endif  
10.修改spl/Makefile,然后拷贝mkv210_image.c到tools/下

  1. ifdef CONFIG_SAMSUNG  
  2. $(obj)$(BOARD)-spl.bin: $(obj)u-boot-spl.bin  
  3.         $(HOSTCC) $(TOPDIR)/tools/mkv210_image.c -o $(TOPDIR)/tools/mkv210_image  
  4.         $(OBJTREE)/tools/mkv210_image \  
  5.                 $(obj)u-boot-spl.bin $(obj)$(BOARD)-spl.bin  
  6. endif  
11.make,插入SD卡,使用下面的命令烧写SPL和uboot.bin到SD卡上

  1. dd iflag=dsync oflag=dsync if=spl/smdkv210-spl.bin of=/dev/sdb seek=1  
  1. dd iflag=dsync oflag=dsync if=u-boot.bin of=/dev/sdb seek=49  


12.把SD卡插到开发板上,上电,就可以在控制台上打印出

这里UBOOT有个小BUG,在执行spl/Makefile的时候,include/configs/smdkv210.h中有下面这种带//注释代码的就不行,他会在spl/u-boot-spl.lds上生成出来,导致链接出错,解决方法就是把这种注释全给删了。或改成/* */这种方法
  1. //#define PHYS_SDRAM_1_SIZE (128 << 20)   /* 0x8000000, 128 MB Bank #1 */   
  2. #define PHYS_SDRAM_1_SIZE   (0x40000000)    /* 0x8000000, 128 MB Bank #1 */  

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
嵌入式Linux系列第3篇:uboot编译下载
u-boot UBIFS移植及文件系统烧写
arm-linux一句话备忘录
S3C2440移植uboot之新建单板_时钟_SDRAM_串口
tiny210(s5pv210)DDR2的初始化
初始化内存程序转化为JLINK脚本gdbinit | 学步园
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服