1 /* init PMIC chip */ 2 // bl PMIC_InitIp
uboot 开始进入启动第二阶段,通过串口输出信息可以看出,虽然 uboot 启动成功,但是很多配置信息是错误的
1 DRAM: 1 G
在 smdkv210single.h 文件中找到 ddr 的相关的配置(471)
1 #define CONFIG_NR_DRAM_BANKS 2 /* we have 2 bank of DRAM */ 2 //#define SDRAM_BANK_SIZE 0x20000000 /* 512 MB */ 3 #define SDRAM_BANK_SIZE 0x10000000 /* 256MB */ 4 #define PHYS_SDRAM_1 MEMORY_BASE_ADDRESS /* SDRAM Bank #1 */ 5 #define PHYS_SDRAM_1_SIZE SDRAM_BANK_SIZE 6 //#define PHYS_SDRAM_2 (MEMORY_BASE_ADDRESS + SDRAM_BANK_SIZE) /* SDRAM Bank #2 */ 7 #define PHYS_SDRAM_2 0x40000000 8 #define PHYS_SDRAM_2_SIZE SDRAM_BANK_SIZE
#define MEMORY_BASE_ADDRESS 0x30000000 (71)
然后是修改 ddr 的初始化参数(smdkv210single.h 411)
1 // #define DMC0_MEMCONFIG_0 0x20E01323 // MemConfig0 256MB config, 8 banks,Mapping Method[12:15]0:linear, 1:linterleaved, 2:Mixed 2 #define DMC0_MEMCONFIG_0 0x30F01323 // MemConfig0 256MB config, 8 banks,Mapping Method[12:15]0:linear, 1:linterleaved, 2:Mixed
[31:24] 控制 AXI 基地址,因为我们设置 ddr 的基地址为 0x30000000 ,所以这里设置为 0x30。
[23:16] 控制 AXI 基地址掩码,置1时有效,可以使基地址范围变为 0x3000_0000 ~ 0x37FF_FFFF,所以这里设置为 0xF0
1 ulong virt_to_phy_smdkc110(ulong addr) 2 { 3 if ((0xc0000000 <= addr) && (addr < 0xd0000000)) 4 // return (addr - 0xc0000000 + 0x20000000); 5 return (addr - 0xc0000000 + 0x30000000); 6 ... 7 }
(smdkv210single.h 522)
1 #ifdef CONFIG_ENABLE_MMU 2 #define CFG_UBOOT_BASE 0xc3e00000 3 #else 4 #define CFG_UBOOT_BASE 0x33e00000 5 #endif
1 unrecognised EXT_CSD structure version 7
通过报错信息的搜索,可以将问题定位到 drivers/mmc/mmc.c 中 (817)
1 if (ext_csd_struct > 8) { 2 printf("unrecognised EXT_CSD structure " 3 "version %d\n", ext_csd_struct); 4 err = -1; 5 goto out; 6 }
1 #define CONFIG_SERIAL3 1 /* we use UART2 on SMDKC110 */ 2 //#define CONFIG_SERIAL1 1 /* we use UART0 on SMDKC110 */
1 #define CONFIG_ETHADDR 00:40:5c:26:0a:5b 2 #define CONFIG_NETMASK 255.255.255.0 3 #define CONFIG_IPADDR 192.168.1.20 4 #define CONFIG_SERVERIP 192.168.1.141 5 #define CONFIG_GATEWAYIP 192.168.1.1
使用mmc write 0 30000000 11# 32
1 #define CFG_PROMPT "ZYJ210 # " /* Monitor Command Prompt */
1 static void dm9000_pre_init(void) 2 { 3 unsigned int tmp; 4 5 #if defined(DM9000_16BIT_DATA)//工作在16模式下 6 //SROM_BW_REG &= ~(0xf << 20);// 7 //SROM_BW_REG |= (0<<23) | (0<<22) | (0<<21) | (1<<20); 8 9 SROM_BW_REG &= ~(0xf << 4);//修改 10 SROM_BW_REG |= (1<<7) | (1<<6) | (1<<5) | (1<<4); 11 12 #else 13 SROM_BW_REG &= ~(0xf << 20); 14 SROM_BW_REG |= (0<<19) | (0<<18) | (0<<16); 15 #endif 16 //SROM_BC5_REG = ((0<<28)|(1<<24)|(5<<16)|(1<<12)|(4<<8)|(6<<4)|(0<<0)); 17 SROM_BC1_REG = ((0<<28)|(1<<24)|(5<<16)|(1<<12)|(4<<8)|(6<<4)|(0<<0)); 18 19 tmp = MP01CON_REG; 20 tmp &=~(0xf<<20); 21 tmp |=(2<<20); 22 MP01CON_REG = tmp; 23 }
1 #ifdef CONFIG_DRIVER_DM9000 2 //#define CONFIG_DM9000_BASE (0xA8000000) 3 #define CONFIG_DM9000_BASE (0x88000300) 4 #define DM9000_IO (CONFIG_DM9000_BASE) 5 #if defined(DM9000_16BIT_DATA) 6 //#define DM9000_DATA (CONFIG_DM9000_BASE+2) 7 #define DM9000_DATA (CONFIG_DM9000_BASE+4)//4代表0100,正好代表ADDR2 8 #else 9 #define DM9000_DATA (CONFIG_DM9000_BASE+1) 10 #endif
原文:https://www.cnblogs.com/zyj23/p/12340481.html