移植u-boot到GEC210

2019-07-12 17:12发布

将三星提供的 u-boot 移植到 GEC210开发板   一、编译u-boot 1、解压 $ tar jxvf android_uboot_smdkv210.tar.bz2   2、进入目录 $cd u-boot-samsung-dev   3、设置交叉编译器 $vi Makefile 147 行,使用 arm-2009q3 编译器: 143  ifeq ($(ARCH),arm) 144  #CROSS_COMPILE = arm-linux- 145  #CROSS_COMPILE = /usr/local/arm/4.4.1-eabi-cortex-a8/usr/bin/arm-linux- 146  #CROSS_COMPILE = /usr/local/arm/4.2.2-eabi/usr/bin/arm-linux- 147  CROSS_COMPILE = /usr/local/arm/arm-2009q3/bin/arm-none-linux-gnueabi- 148  endif   4、安装 arm-2009q3 编译器 $tar jxvf arm-2009q3.tar.bz2 -C /usr/local/arm/   5、修改串口设置文件 $vim include/configs/smdkv210single.h 将: #define CONFIG_SERIAL3 1 /* we use UART1 on SMDKC110 */ 修改为: #define CONFIG_SERIAL1 1 /* we use UART1 on SMDKC110 */   6、配置 uboot $make smdkv210single_config   7、编译 uboot $make   二、修改内存 GEC210 核心板有四块 DDR2 内存芯片,每块 128MB,总共 512MB S5PV210 的地址映射图,S5PV210 有两个 DRAM 区域:0x20000000-0x3FFFFFFF 0x40000000-0x7FFFFFFF GEC210 核心板的原理图可以看出,两块 DDR 芯片按高低 16 位数据线模式挂在 DRAM0 区域,另外两块 DDR 芯片按高低 16 位数据线模式挂在 DRAM1 区域。   1、修改 DDR 参数文件 $vim include/configs/smdkv210single.h 加入: #define MEMORY_BASE_ADDRESS1 0x40000000 #define DMC0_MEMCONTROL 0x00202400 修改: #define DMC0_MEMCONFIG_0 0x20F00313 #define DMC0_MEMCONFIG_1 0x00F00313 #define DMC1_MEMCONTROL 0x00202400 #define DMC1_MEMCONFIG_0 0x40F00313 #define DMC1_MEMCONFIG_1 0x00F00313 #define SDRAM_BANK_SIZE 0x10000000 /* 256 MB */ #define PHYS_SDRAM_2 (MEMORY_BASE_ADDRESS1) /* SDRAM Bank #2 */   2、修改 CPU 初始化文件 $vim cpu/s5pc11x/s5pc110/cpu_init.S 122 行: ldr r1, =0x00212400 修改为: ldr r1, =DMC0_MEMCONTROL   三、修改网卡 GEC210 使用 DM9000 芯片作为以太网芯片, GEC210开发板上 DM9000 芯片的片选线与 SMDKV210 评估板的不一样。 DM9000 的片选线 CS#接到了 S5PV210 CSn1,也就是 SROMC_BANK1,访问 DM9000的 基 址 是 0x88000000 DM9000 CMD 接 到了 地 址 线 ADDR2 , 访 问 DM9000 数 据 的 地 址0x88000000+0b1000x8) 。   1、修改配置参数 $vim include/configs/smdkv210single.h 将: #define CONFIG_DM9000_BASE (0xA8000000) 修改为: #define CONFIG_DM9000_BASE (0x88000000) 将: #define DM9000_DATA (CONFIG_DM9000_BASE+2) 修改为: #define DM9000_DATA (CONFIG_DM9000_BASE+8)   2、修改板级初始化文件 $vim board/samsung/smdkc110/smdkc110.c 修改 DM9000 预初始化函数 dm9000_pre_init static void dm9000_pre_init(void) { unsigned int tmp; /* DM9000 on SROM BANK1, 16 bit */ SROM_BW_REG &= ~(0xf << 4); SROM_BW_REG |= (0x1 << 4); SROM_BC1_REG = ((0<<28)|(0<<24)|(5<<16)|(0<<12)|(0<<8)|(0<<4)|(0<<0)); /* Set MP01_1 as SROM_CSn[1] */ tmp = MP01CON_REG; tmp &=~(0xf<<4); tmp |=(2<<4); MP01CON_REG = tmp; }   3、重新编译 $make   四、修改 DDR0 基地址 DDR ch0 由地址 0x20000000~0x30000000 映射到 0x30000000~0x40000000。这样 ch0 ch1 两个通道的 DDR 就可以连续,方便使用。   1、修改 DDR0 的基地址和配置寄存器 $vim include/configs/smdkv210single.h 将: #define MEMORY_BASE_ADDRESS 0x20000000 改为: #define MEMORY_BASE_ADDRESS 0x30000000 #define DMC0_MEMCONFIG_0 0x20F00313 // MemConfig0 改为 #define DMC0_MEMCONFIG_0 0x30F00313 // MemConfig0   2、修改虚拟地址转物理地址函数 $vim board/samsung/smdkc110/smdkc110.c #ifdef CONFIG_MCP_SINGLE ulong virt_to_phy_smdkc110(ulong addr) { if ((0xc0000000 <= addr) && (addr < 0xd0000000)) return (addr - 0xc0000000 + 0x20000000); else printf("The input address don't need " "a virtual-to-physical translation : %08lx ", addr); return addr; } 改为 #ifdef CONFIG_MCP_SINGLE ulong virt_to_phy_smdkc110(ulong addr) { if ((0xc0000000 <= addr) && (addr < 0xd0000000)) return (addr - 0xc0000000 + MEMORY_BASE_ADDRESS); else printf("The input address don't need " "a virtual-to-physical translation : %08lx ", addr); return addr; }   3、修改 MMU 转换表 $vim board/samsung/smdkc110/lowlevel_init.S 将: .set __base,0x200 // 256MB for SDRAM with cacheable .rept 0xD00 - 0xC00 FL_SECTION_ENTRY __base,3,0,1,1 .set __base,__base+1 .endr 改为: .set __base,0x300 // 256MB for SDRAM with cacheable .rept 0xD00 - 0xC00 FL_SECTION_ENTRY __base,3,0,1,1 .set __base,__base+1 .endr   五、修改 u-boot 其他设置 由于我们的开发板并不像 SMDKV210 那样拥有 16MB SRAM 和电源管理芯片,所以我们还要对代码进一步修改,修改底层初始化文件: $vim board/samsung/smdkc110/lowlevel_init.S 1、屏蔽 SRAM 初始化代码 使用条件编译屏蔽掉下面的代码: #if 0 /* SRAM(2MB) init for SMDKC110 */ /* GPJ1 SROM_ADDR_16to21 */ ldr r0, =ELFIN_GPIO_BASE ……省略部分代码…… /* PS_HOLD pin(GPH0_0) set to high */ ldr r0, =(ELFIN_CLOCK_POWER_BASE + PS_HOLD_CONTROL_OFFSET) ldr r1, [r0] orr r1, r1, #0x300 orr r1, r1, #0x1 str r1, [r0] #endif   2、屏蔽初始化 PMIC 代码 $vim board/samsung/smdkc110/lowlevel_init.S 使用条件编译屏蔽掉下面的代码: #if 0 /* init PMIC chip */ bl PMIC_InitIp #endif   3、屏蔽 nor flash 初始化代码 $vim lib_arm/board.c 将: #ifndef CFG_NO_FLASH /* configure available FLASH banks */ size = flash_init (); display_flash_config (size); #endif /* CFG_NO_FLASH */ 改为: #define CFG_NO_FLASH #ifndef CFG_NO_FLASH /* configure available FLASH banks */ size = flash_init (); display_flash_config (size); #endif /* CFG_NO_FLASH */   六、修改 uboot 环境参数 1、修改主机名称 $vim include/configs/smdkv210single.h 修改: #define CFG_PROMPT "GEC210 #" /* Monitor Command Prompt */ 修改: #define CONFIG_IDENT_STRING " for GEC210@2014"   2、默认网络参数配置 $vim include/configs/smdkv210single.h 修改: #define CONFIG_ETHADDR 00:40:5c:26:0a:5a #define CONFIG_NETMASK 255.255.255.0 #define CONFIG_IPADDR 192.168.1.3 #define CONFIG_SERVERIP 192.168.1.2 #define CONFIG_GATEWAYIP 192.168.1.1   3、修改驱动参数和命令 $vim include/configs/smdkv210single.h 修改为: #define CONFIG_BOOTARGS "console=ttySAC0,115200 root=/dev/mtdblock4 rootfstype=yaffs rw" 修改为: #define CONFIG_BOOTCOMMAND "nand read 0x30008000 0x600000 0x500000; bootm 0x30008000"   4、增加 uboot 命令补全功能 $vim include/configs/smdkv210single.h 增加: #define CONFIG_AUTO_COMPLETE 1   5、编译 $make   七、固化 u-boot 注意:当将新编译生成的 u-boot.bin 固化到 nand 中时,会破坏原 nand 中的 u-boot。所以最好是将新编译的u-boot.bin 固化到 SD 卡启动卡中,测试没有问题后,再固化到 nand 中。   以下操作在 uboot 的命令行中完成。 1、使用 tftp 下载新生成的 u-boot.bin # tftp 0x40000000 u-boot.bin 2、擦除 uboot 存放位置 # nand erase 0 0x100000 NAND erase: device 0 offset 0x0, size 0x100000 Erasing at 0x100000 -- 100% complete. OK 3、将 uboot 写入 nand # nand write 0x40000000 0 0x100000   u-boot.bin烧写到sd里去:    sd卡接上读卡器后, 接到pc, 接上后    pc的/dev/目录下会出现    sdb  sdb1 //此设备文件名不一定是这样的, 也可能是sdc sdc1    sdb表示整个sd卡, sdb1表示卡上一个分区      u-boot-smdkv210/sd_fusing下有个烧写的脚本sd_fusing.sh    sd_fushing目录下运行 ./sd_fusing.sh /dev/sdb    运行完后, u-boot.bin已烧到sd卡上了    sd卡接到开发板,从sd卡启动