可以看到,现在make编译出来的u-boot.bin有512kb大小,造成u-boot这么巨大的原因是新版本的u-boot默认情况下支持非常多的命令,以至于很多不必要的.o文件都被链接进u-boot.bin文件中了。今天就来把u-boot中我用不到的命令都裁剪掉并设置默认的参数,如ipaddr、serverip等。
大家移植到这里肯定是明白很多移植u-boot的套路技巧了,比如想要添加某个命令xxx的支持,那么就先在u-boot源码中看看有没有一个叫cmd_xxx.c的文件,有那就代表在源码上是支持的,那么接下来就是通过修改cmd_xxx.c对应的Makefile文件以支持生成cmd_xxx.o文件。一般地,在Makefile中想要生成某个.o文件都会有一个相对应的宏来决定是否生成某个.o文件,而这个宏都是在smdk2440.h这个头文件中定义的。
反过来,我们想要取消某个命令也是通过删除smdk2440.h中的宏来完成的,在裁剪的过程中,原则上是先注释能确定的宏,不太敢肯定的宏先保留。在进一步裁剪时就可以跟着感觉来了,但是每裁剪一次都要对u-boot中需要的功能进行完整性测试,就这样一点一点的裁,直到裁剪的大小你满意为止。另外呢,在早期1.1.x的u-boot中,这些老版本的u-boot编译出来也就200k左右的样子,我们可以下载一个老版本的u-boot参考它的smdk2410.h进行裁剪。
u-boot裁剪后smdk2440.h在本节末尾会全部贴出。
在之前的移植中,我们一直没有移植环境变量相关的内容,而现在的u-boot使用环境变量保存命令saveenv后会直接重启u-boot,说明现在的saveenv命令是不可用的,猜测saveenv命令对应的有个cmd_saveenv.c文件,但是你搜索却搜索不到。那么猜测saveenv命令有一个saveenv()函数来实现,所以搜索saveenv:
|
根据上面搜索的结果,可以猜测这个命令在env_nand.c和env_flash.c中都有支持,而事实上也是如此。环境参数既可以保存在NorFlash(env_flash.c)中,也可以保存在NandFlash(env_nand.c)中,而到底是保存在什么上面这就要看哪个文件被编译成了.o文件,所以查看相应的Makefile:
|
明显的,可以在smdk2440.h中找到CONFIG_ENV_IS_IN_FLASH,而找不到CONFIG_ENV_IS_IN_NAND。而我们肯定是想要把环境变量保存在NandFlash中的,所以在smdk2440.h中添加宏CONFIG_ENV_IS_IN_NAND,关掉宏CONFIG_ENV_IS_IN_FLASH。
|
make编译,这时编译出错:
|
看来是需要定义其他的宏,那么我们进入common/env_nand.c中的saveenv()函数去分析一下代码,根据代码可以确定saveenv()函数的实现还需要使用到其他三个宏:CONFIG_ENV_RANGE、CONFIG_ENV_OFFSET、CONFIG_ENV_SIZE,并对这三个宏的定义如下:
|
对smdk2440.h修改完成后,make编译、下载、nor启动:
在控制台输入:
|
同样的,上面我我设置CONFIG_ENV_OFFSET时是以nor启动的mtdparts分区来设置的,如果是spl方式启动的mtdparts应该把CONFIG_ENV_OFFSET的值设置为0x00120000,其他两个宏不变。
接下来完成今天最后的一道工作,修改u-boot默认参数。
在没有使用saveenv命令前我们一直看到这句警告:
*** Warning - bad CRC, using defaultenvironment
在使用saveenv命令后这句警告就消失了。因为在uboot上电后,首先会去读环境参数,然后判断参数是否有效,如果有效的话就使用,无效就使用默认参数并打印警告信息。
现在来搜索一下这句警告信息:
|
打开common/env_common.c文件,可以看到警告信息出现在set_default_env函数中,追踪default_environment可以看到所有默认的环境参数都定义在这个default_environment数组中,并且很多数组中的元素都是由宏开关限制的,其中的有些默认参数是我们必须设置的:
CONFIG_BOOTARGS:传给内核的启动参数,需要定义。
CONFIG_BOOTCOMMAND:uboot启动后根据这个命令来启动内核,需要设置。
所以在smdk2440.h中添加这两个宏:
|
编译下载,nor启动。定义CONFIG_BOOTDELAY后u-boot会自动延时,超过延时后根据CONFIG_BOOTCOMMAND宏启动Linux kernel,但是现在NandFlash中并没有kernel,所以现在我们下载一个kernel到NandFlash,测试u-boot是否能正常引导kernel。
|
现在的u-boot已经能正常引导kernel了。
最后,在smdk2440.h中做进一步修改:
|
make编译,下载,nor启动。完美引导kernel。
明天进行u-boot移植的最后一个主题,yaffs文件系统烧写支持。
完整smdk2440.h文件:
/* * (C) Copyright 2002 * Sysgo Real-Time Solutions, GmbH <www.elinos.com> * Marius Groeger <mgroeger@sysgo.de> * Gary Jennejohn <garyj@denx.de> * David Mueller <d.mueller@elsoft.ch> * * Configuation settings for the SAMSUNG SMDK2410 board. * * SPDX-License-Identifier: GPL-2.0+ */ #ifndef __CONFIG_H #define __CONFIG_H /* * High Level Configuration Options * (easy to change) */ #define CONFIG_S3C24X0 /* This is a SAMSUNG S3C24x0-type SoC */ /*#define CONFIG_S3C2410*/ /* specifically a SAMSUNG S3C2410 SoC */ /*#define CONFIG_SMDK2410*/ /* on a SAMSUNG SMDK2410 Board */ #define CONFIG_S3C2440 #define CONFIG_SMDK2440 #define CONFIG_SYS_TEXT_BASE 0x33f00000 /* 34000000-33f00000 = 1M*/ #define CONFIG_UBOOT_LENGTH 0x80000 /*512k*/ #define CONFIG_UBOOT_NAND_ADDR 0x0 /*start of u-boot.bin in NAND*/ /*#define CONFIG_SYS_GENERIC_BOARD*/ #define CONFIG_SYS_ARM_CACHE_WRITETHROUGH /* input clock of PLL (the SMDK2410 has 12MHz input clock) */ #define CONFIG_SYS_CLK_FREQ 12000000 #define CONFIG_CMDLINE_TAG /* enable passing of ATAGs */ #define CONFIG_SETUP_MEMORY_TAGS #define CONFIG_INITRD_TAG /* * Hardware drivers */ #define CONFIG_DRIVER_DM9000 #define CONFIG_DM9000_BASE 0x20000000 #define DM9000_IO CONFIG_DM9000_BASE #define DM9000_DATA (CONFIG_DM9000_BASE+4) /* * select serial console configuration */ #define CONFIG_S3C24X0_SERIAL #define CONFIG_SERIAL1 1 /* we use SERIAL 1 on SMDK2410 */ /************************************************************ * USB support (currently only works with D-cache off) ************************************************************/ #if 0 #define CONFIG_USB_OHCI #define CONFIG_USB_OHCI_S3C24XX #define CONFIG_USB_KEYBOARD #define CONFIG_USB_STORAGE #define CONFIG_DOS_PARTITION #endif /************************************************************ * RTC ************************************************************/ #if 0 #define CONFIG_RTC_S3C24X0 #endif #define CONFIG_BAUDRATE 115200 /* * BOOTP options */ #if 0 #define CONFIG_BOOTP_BOOTFILESIZE #define CONFIG_BOOTP_BOOTPATH #define CONFIG_BOOTP_GATEWAY #define CONFIG_BOOTP_HOSTNAME #endif /* * Command line configuration. */ #define CONFIG_CMD_BSP #define CONFIG_CMD_CACHE #if 0 #define CONFIG_CMD_DATE #define CONFIG_CMD_DHCP #endif #define CONFIG_CMD_ELF #define CONFIG_CMD_NAND #define CONFIG_CMD_PING #define CONFIG_CMD_REGINFO #if 0 #define CONFIG_CMD_USB #endif #define CONFIG_SYS_HUSH_PARSER #define CONFIG_CMDLINE_EDITING /* autoboot */ #define CONFIG_BOOTDELAY 2 #define CONFIG_BOOTARGS "console=ttySAC0,115200 root=/dev/mtdblock3 rootfstype=jffs2" #define CONFIG_BOOTCOMMAND "nand read 30000000 kernel;bootm 30000000" #define CONFIG_BOOT_RETRY_TIME -1 #define CONFIG_RESET_TO_RETRY #define CONFIG_ZERO_BOOTDELAY_CHECK #define CONFIG_NETMASK 255.255.255.0 #define CONFIG_IPADDR 192.168.1.110 #define CONFIG_SERVERIP 192.168.1.100 #if defined(CONFIG_CMD_KGDB) #define CONFIG_KGDB_BAUDRATE 115200 /* speed to run kgdb serial port */ #endif /* * Miscellaneous configurable options */ #define CONFIG_SYS_LONGHELP /* undef to save memory */ #define CONFIG_SYS_PROMPT "XT_MINI2440 # " #define CONFIG_SYS_CBSIZE 256 /* Print Buffer Size */ #define CONFIG_SYS_PBSIZE (CONFIG_SYS_CBSIZE + \ sizeof(CONFIG_SYS_PROMPT)+16) #define CONFIG_SYS_MAXARGS 16 #define CONFIG_SYS_BARGSIZE CONFIG_SYS_CBSIZE #define CONFIG_DISPLAY_CPUINFO /* Display cpu info */ #define CONFIG_SYS_MEMTEST_START 0x30000000 /* memtest works on */ #define CONFIG_SYS_MEMTEST_END 0x33F00000 /* 63 MB in DRAM */ #define CONFIG_SYS_LOAD_ADDR 0x30800000 /* support additional compression methods */ #if 1 #define CONFIG_BZIP2 #define CONFIG_LZO #define CONFIG_LZMA #endif /*----------------------------------------------------------------------- * Physical Memory Map */ #define CONFIG_NR_DRAM_BANKS 1 /* we have 1 bank of DRAM */ #define PHYS_SDRAM_1 0x30000000 /* SDRAM Bank #1 */ #define PHYS_SDRAM_1_SIZE 0x04000000 /* 64 MB */ #define PHYS_FLASH_1 0x00000000 /* Flash Bank #0 */ #define CONFIG_SYS_FLASH_BASE PHYS_FLASH_1 /*----------------------------------------------------------------------- * FLASH and environment organization */ #define CONFIG_SYS_FLASH_CFI #define CONFIG_FLASH_CFI_DRIVER #define CONFIG_FLASH_CFI_LEGACY #define CONFIG_SYS_FLASH_LEGACY_512Kx16 #define CONFIG_FLASH_SHOW_PROGRESS 45 #define CONFIG_SYS_MAX_FLASH_BANKS 1 #define CONFIG_SYS_FLASH_BANKS_LIST { CONFIG_SYS_FLASH_BASE } #define CONFIG_SYS_MAX_FLASH_SECT (128) #define CONFIG_ENV_ADDR (CONFIG_SYS_FLASH_BASE + 0x070000) #if 0 #define CONFIG_ENV_IS_IN_FLASH #endif #define CONFIG_ENV_IS_IN_NAND #define CONFIG_ENV_SIZE 0x20000 /*128k*/ #define CONFIG_ENV_RANGE CONFIG_ENV_SIZE #define CONFIG_ENV_OFFSET 0x00100000 /* after 1M */ /* allow to overwrite serial and ethaddr */ #define CONFIG_ENV_OVERWRITE /* * Size of malloc() pool * BZIP2 / LZO / LZMA need a lot of RAM */ #define CONFIG_SYS_MALLOC_LEN (4 * 1024 * 1024) #define CONFIG_SYS_MONITOR_LEN (448 * 1024) #define CONFIG_SYS_MONITOR_BASE CONFIG_SYS_FLASH_BASE /* * NAND configuration */ #ifdef CONFIG_CMD_NAND #define CONFIG_CMD_NAND_YAFFS #if 0 #define CONFIG_NAND_S3C2410 #define CONFIG_SYS_S3C2410_NAND_HWECC #else #define CONFIG_NAND_S3C2440 #define CONFIG_SYS_S3C2440_NAND_HWECC #endif #define CONFIG_SYS_MAX_NAND_DEVICE 1 #define CONFIG_SYS_NAND_BASE 0x4E000000 #endif /* * File system */ #if 0 #define CONFIG_CMD_FAT #define CONFIG_CMD_EXT2 #define CONFIG_CMD_UBI #define CONFIG_CMD_UBIFS #endif #define CONFIG_CMD_MTDPARTS #define CONFIG_MTD_DEVICE #define CONFIG_MTD_PARTITIONS #define MTDIDS_DEFAULT "nand0=MINI2440_XT" #define MTDPARTS_DEFAULT "mtdparts=MINI2440_XT:1m(u-boot)," \ "128k(params)," \ "4m(kernel)," \ "-(rootfs)" #if 0 #define CONFIG_YAFFS2 #define CONFIG_RBTREE #endif /* additions for new relocation code, must be added to all boards */ #define CONFIG_SYS_SDRAM_BASE PHYS_SDRAM_1 #define CONFIG_SYS_INIT_SP_ADDR (CONFIG_SYS_SDRAM_BASE + 0x1000 - \ GENERATED_GBL_DATA_SIZE) #define CONFIG_BOARD_EARLY_INIT_F #endif /* __CONFIG_H */