启动过程参考: http://bbs.chinaunix.net/thread-2039668-1-1.html
参考: http://processors.wiki.ti.com/index.php/Setting_up_AM37x_SDRC_registers
omap3_evm_init_irq 函数配置 sdrc_cs0和sdrc_cs1各种速率所对应的参数.
最后通过 omap3_configure_core_dpll 设置下去!
omap3_core_dpll_m2_set_rate 比较内存速率并设置新的参数, 实际生效的只有SDRC_RFR_CTRL_1.
所以只需修改RFR参数, 其他的参数在x-loader中修改为200MHz的参数即可.
之前问题: CS0和CS1参数不一致, 内核只配置cs0, 导致RFR参数不一致.
内核未定义: CONFIG_OMAP3_SDRC_AC_TIMING 所以内存时序配置参数无效, 只生效了RFR参数!
内存配置参数的代码拷贝到sram里面运行, 配置内存时序参数前先让内存处于自刷新模式!
omap_detect_sram 初始化sram起始地址和大小
=================================================
2. kenerl sdrc.c 中 omap2_sdrc_init 函数会更改SDRC_POWER_REG为0x01, 原先是0x81的.
SDRC_REVISION : 00000050
SDRC_SYSCONFIG : 00000010
SDRC_CS_CFG : 00000002
SDRC_MCFG_0 : 03588099
SDRC_MCFG_1 : 03588099
SDRC_MR_0 : 00000032
SDRC_MR_1 : 00000032
SDRC_EMR2_0 : 00000000
SDRC_EMR2_1 : 00000000
SDRC_ACTIM_CTRLA_0: 7ae1b4c6
SDRC_ACTIM_CTRLA_1: 7ae1b4c6
SDRC_ACTIM_CTRLB_0: 00021217
SDRC_ACTIM_CTRLB_1: 00021217
SDRC_RFR_CTRL_0 : 0004dc01
SDRC_RFR_CTRL_1 : 0005e601
SDRC_MANUAL_0 : 00000002
SDRC_MANUAL_1 : 00000002
clock: SDRC CS0 timing params used: RFR 0004dc01 CTRLA 92e1c4c6 CTRLB 0002111c MR 00000032
clock: SDRC CS1 timing params used: RFR 0004dc01 CTRLA 92e1c4c6 CTRLB 0002111c MR 00000032
x-loader 中 config_3430sdram_ddr 配置内存参数, u-boot 不配置内存参数, 内核只配置了RFR参数!
===================================================================================
内核只使用CS1的内存启动
cpu外接两片32bit 256M的内存.默认从CS0开始的起始地址启动, 现在更改为CS1的起始地址启动.
主要的修改就是PHYS_OFFSET的地址, uboot传递给内核参数的地址以及bootargs中的mem参数.
CS0起始地址为 0x80000000, 大小为 256MB.
CS1起始地址为 0x90000000, 大小为 256MB.
1. 修改 arch/arm/mach-omap2/Makefile.boot文件, 修改后如下
zreladdr-y := 0x90008000
params_phys-y := 0x90000100
initrd_phys-y := 0x90800000
2. 修改 arch/arm/plat-omap/include/plat/memory.h文件, 对比结果如下:
--- arch/arm/plat-omap/include/plat/memory.h
+++ arch/arm/plat-omap/include/plat/memory.h
@@ -40,7 +40,7 @@
#define PHYS_OFFSET UL(0x10000000)
#elif defined(CONFIG_ARCH_OMAP2) || defined(CONFIG_ARCH_OMAP3) || \
defined(CONFIG_ARCH_OMAP4)
-#define PHYS_OFFSET UL(0x80000000)
+#define PHYS_OFFSET UL(0x90000000)
#endif
/*
3. 修改MACHINE_START中定义的内核参数起始地址:
--- arch/arm/mach-omap2/board-omap3evm.c
+++ arch/arm/mach-omap2/board-omap3evm.c
@@ -1581,7 +1581,7 @@
/* Maintainer: Syed Mohammed Khasim - Texas Instruments */
.phys_io = 0x48000000,
.io_pg_offst = ((0xfa000000) >> 18) & 0xfffc,
- .boot_params = 0x80000100,
+ .boot_params = 0x90000100,
.map_io = omap3_evm_map_io,
.init_irq = omap3_evm_init_irq,
.init_machine = omap3_evm_init,
4. 修改uboot中的 board/ti/evm/evm.c文件, 对比的结果如下:
--- board/ti/evm/evm.c
+++ board/ti/evm/evm.c
@@ -133,7 +133,7 @@
/* board id for Linux */
gd->bd->bi_arch_number = MACH_TYPE_OMAP3EVM;
/* boot param addr */
- gd->bd->bi_boot_params = (OMAP34XX_SDRC_CS0 + 0x100);
+ gd->bd->bi_boot_params = (OMAP34XX_SDRC_CS0 + 0x100 + 0x10000000);
#ifdef CONFIG_CMD_FASTBOOT
#ifdef FASTBOOT_PORT_OMAPZOOM_NAND_FLASHING
5. 重新编译uboot和kernel, 并修改bootargs参数中的: mem=256M@0x90000000.
uboot中使用bd_info命令内核参数地址查看是否修改成功:
OMAP3_EVM # bdinfo
arch_number = 0x000005FF
env_t = 0x00000000
boot_params = 0x90000100
DRAM bank = 0x00000000
-> start = 0x80000000
-> size = 0x10000000
DRAM bank = 0x00000001
-> start = 0x90000000
-> size = 0x10000000
ethaddr = 00:E0:1C:00:95:01
ip_addr = 192.168.99.120
baudrate = 115200 bps