标签:ddr配置修改
通过第一阶段的移植串口2打印了如下信息
SD checksum Error OK U-Boot 1.3.4 (Aug 5 2016 - 15:08:57) for SMDKV210 CPU: S5PV210@1000MHz(OK) APLL = 1000MHz, HclkMsys = 200MHz, PclkMsys = 100MHz MPLL = 667MHz, EPLL = 80MHz HclkDsys = 166MHz, PclkDsys = 83MHz HclkPsys = 133MHz, PclkPsys = 66MHz SCLKA2M = 200MHz Serial = CLKUART Board: SMDKV210 DRAM: 1 GB Flash: 8 MB SD/MMC: unrecognised EXT_CSD structure version 6 unrecognised EXT_CSD structure version 6 Card init fail! 0 MB NAND: 0 MB The input address don‘t need a virtual-to-physical translation : 23e9c008 *** Warning - using default environment In: serial Out: serial Err: serial checking mode for fastboot ... Hit any key to stop autoboot: 0 no devices available no devices available get_format -------- 0 -------- Wrong Image Format for bootm command ERROR: can‘t get kernel image! SMDKV210 #
串口打印信息可知uboot已经成功启动,只是uboot启动第二阶段的配置信息有错误,所以接下来要修改这里额配置信息。
(1)打印时钟信息位置是在cpu/s5pc11x/s5pc110/speed.c中的print_cpuinfo函数中,这个函数的最后打印Serial = CLKUART
(2)Board: =SMDKV210,在smdkv210single.h中有定义
2:根据dbinfo打印出来的信息,进行移植
arch_number = 0x00000998 //机器码,正确 env_t = 0x00000000 //环境变量,正确 boot_params = 0x20000100 //uboot给kernel传参的地址 DRAM bank = 0x00000000 //第一片DDR -> start = 0x20000000 //DDR起始地址,错误,改为0x30000000 -> size = 0x20000000 //DDR大小,错误 改为0x10000000 256M DRAM bank = 0x00000001 //第二片DDR -> start = 0x40000000 //DDR 起始地址,正确 -> size = 0x20000000 //DDR大小 错误,改为0x10000000 256M ethaddr = 00:40:5C:26:0A:5B //MAC地址 ip_addr = 192.168.0.20 //IP 地址 改为192.168.1.20 baudrate = 115200 bps //波特率 正确
2.1:DDR配置信息的更改
(1)从上面的打印信息可以发现,DDR bank 0和1的size值都设置错了,bank 0的起始地址也设置错了
(2)使用md和mw命令测试内存发现2000000和40000000开头的内存都是可以用的,说明代码中DDR初始化部分是正确的,只是size错了而已,更改smdkv210single.h中的配置信息即可
(大概位置在414行 更改DDR bank 0 的起始地址
476行 DDR的size )
(3)bank 0的起始地址,因为samsung的开发板配置的DDR是512M的,所以它的内存起始地址必须是从20000000开始,不然放不下,而我们使用的是九鼎的开发板,这里面配置的是256M的内存,所以我们可以选从20000000开头的内存,也可以选择从30000000开头的内存,具体选择哪种取决于自己的软件配置。九鼎移植的uboot配置的是30000000开头的,原因是为了使其和第二片DDR对应的空间连续(40000000开头的)
2.2:DDR地址的配置
目标:将DDR端口0地址配置为30000000开头
(1)DDR参数初始化参数的更改
DDR的初始化代码部分是在lowlevel_init.S中写的,是不用动的,代码部分就是对相应寄存器做相应值的初始化;要动的是配置的值,而uboot为了具有可移植性把配置的值都宏定义在include/configs/xxxx.h中,因此我们只需要去这个配置文件修改对应的值即可以下便是DDR0的初始化信息
#define DMC0_MEMCONFIG_0 0x30F01323 //changed by wbq #define DMC0_MEMCONFIG_1 0x40F01323 // MemConfig1 #define DMC0_TIMINGA_REF 0x00000618 // TimingAref 7.8us*133MHz=1038(0x40E), // 100MHz=780(0x30C), 20MHz=156(0x9C), // 10MHz=78(0x4E) #define DMC0_TIMING_ROW 0x28233287 // TimingRow for @200MHz #define DMC0_TIMING_DATA 0x23240304 // TimingData CL=3 #define DMC0_TIMING_PWR 0x09C80232 // TimingPower
以上是寄存器值的修改相当于是硬件配置部分做了更改,但是我们的软件配置还没有修改;
#define PHYS_SDRAM_1 MEMORY_BASE_ADDRESS /* SDRAM Bank #1 */
这个是我们bdinfo时打印出来的DDR0的起始地址,所以这个宏定义也要改为30000000
(2)虚拟地址映射表的修改
uboot中开启了MMU对内存进行了段式映射,得到一张内存映射表,这个映射只是将2000000开始的(lowlevel_init.S)下面是c0000000-d0000000这段虚拟地址的映射表设置,现在的设置是将这段内存映射到20000000-30000000这段物理地址
//.set __base,0x200 .set __base,0x300 //changed by wbq // 256MB for SDRAM with cacheable .rept 0xD00 - 0xC00 FL_SECTION_ENTRY __base,3,0,1,1 .set __base,__base+1 .endr
(3)虚拟地址映射函数的修改
#ifdef CONFIG_ENABLE_MMU #define virt_to_phys(x) virt_to_phy_smdkc110(x) #else #define virt_to_phys(x) (x) #endif
当我们开启MMU后,通过virt_to_phy_smdkc110(x)将虚拟地址映射到相应的物理地址
下面是virt_to_phy_smdkc110(x)这个函数
ulong virt_to_phy_smdkc110(ulong addr) { if ((0xc0000000 <= addr) && (addr < 0xd0000000)) //return (addr - 0xc0000000 + 0x20000000); return (addr - 0xc0000000 + 0x30000000); //chenged by wbq else printf("The input address don‘t need " "a virtual-to-physical translation : %08lx\n", addr); return addr; }
分析可知就是将c0000000-d0000000之间的地址addr减去一个基地址c0000000加上一个偏移量20000000,得到的就是我们的虚拟地址,我们的内存是从30000000开始的,所以要把20000000改为30000000
标签:ddr配置修改
原文地址:http://11674570.blog.51cto.com/11664570/1836664