移植uboot之裁剪和修改参数
所谓uboot裁剪就是在某个单板的配置文件中删除一写宏定义,因为在makefile中是根据配置文件中的宏定义去选择编译的,如果没有某一功能的宏定义,就不把这部分功能编译进uboot。
配置文件路径:u-boot-2012.04.01/include/configs
删除以下不必要的宏定义:
/************************************************************
* USB support (currently only works with D-cache off)
************************************************************/
//#define CONFIG_USB_OHCI
//#define CONFIG_USB_KEYBOARD
//#define CONFIG_USB_STORAGE
//#define CONFIG_DOS_PARTITION
/************************************************************
* RTC
************************************************************/
//#define CONFIG_RTC_S3C24X0
/*
* BOOTP options
*/
//#define CONFIG_BOOTP_BOOTFILESIZE
//#define CONFIG_BOOTP_BOOTPATH
//#define CONFIG_BOOTP_GATEWAY
//#define CONFIG_BOOTP_HOSTNAME
//#define CONFIG_CMD_DATE
//#define CONFIG_CMD_DHCP
//#define CONFIG_CMD_USB
/*
* File system
*/
// #define CONFIG_CMD_FAT
// #define CONFIG_CMD_EXT2
// #define CONFIG_CMD_UBI
// #define CONFIG_CMD_UBIFS
// #define CONFIG_CMD_MTDPARTS
// #define CONFIG_MTD_DEVICE
// #define CONFIG_MTD_PARTITIONS
// #define CONFIG_YAFFS2
// #define CONFIG_RBTREE
uboot启动后可以手动设置参数:
set ipaddr 192.168.1.17
set ethaddr 00:0c:29:4d:e4:f4
set serverip 192.168.1.3
如果不想手动设置这些参数,可以在uboot源码中设置默认参数。
在uboot里搜索“default environment”,找到default_environment数组,如下:
1 const uchar default_environment[] = { 2 #ifdef CONFIG_BOOTARGS 3 "bootargs=" CONFIG_BOOTARGS "\0" 4 #endif 5 #ifdef CONFIG_BOOTCOMMAND 6 "bootcmd=" CONFIG_BOOTCOMMAND "\0" 7 #endif 8 #ifdef CONFIG_RAMBOOTCOMMAND 9 "ramboot=" CONFIG_RAMBOOTCOMMAND "\0" 10 #endif 11 #ifdef CONFIG_NFSBOOTCOMMAND 12 "nfsboot=" CONFIG_NFSBOOTCOMMAND "\0" 13 #endif 14 #if defined(CONFIG_BOOTDELAY) && (CONFIG_BOOTDELAY >= 0) 15 "bootdelay=" MK_STR(CONFIG_BOOTDELAY) "\0" 16 #endif 17 #if defined(CONFIG_BAUDRATE) && (CONFIG_BAUDRATE >= 0) 18 "baudrate=" MK_STR(CONFIG_BAUDRATE) "\0" 19 #endif 20 #ifdef CONFIG_LOADS_ECHO 21 "loads_echo=" MK_STR(CONFIG_LOADS_ECHO) "\0" 22 #endif 23 #ifdef CONFIG_ETHADDR 24 "ethaddr=" MK_STR(CONFIG_ETHADDR) "\0" 25 #endif 26 #ifdef CONFIG_ETH1ADDR 27 "eth1addr=" MK_STR(CONFIG_ETH1ADDR) "\0" 28 #endif 29 #ifdef CONFIG_ETH2ADDR 30 "eth2addr=" MK_STR(CONFIG_ETH2ADDR) "\0" 31 #endif 32 #ifdef CONFIG_ETH3ADDR 33 "eth3addr=" MK_STR(CONFIG_ETH3ADDR) "\0" 34 #endif 35 #ifdef CONFIG_ETH4ADDR 36 "eth4addr=" MK_STR(CONFIG_ETH4ADDR) "\0" 37 #endif 38 #ifdef CONFIG_ETH5ADDR 39 "eth5addr=" MK_STR(CONFIG_ETH5ADDR) "\0" 40 #endif 41 #ifdef CONFIG_IPADDR 42 "ipaddr=" MK_STR(CONFIG_IPADDR) "\0" 43 #endif 44 #ifdef CONFIG_SERVERIP 45 "serverip=" MK_STR(CONFIG_SERVERIP) "\0" 46 #endif 47 #ifdef CONFIG_SYS_AUTOLOAD 48 "autoload=" CONFIG_SYS_AUTOLOAD "\0" 49 #endif 50 #ifdef CONFIG_PREBOOT 51 "preboot=" CONFIG_PREBOOT "\0" 52 #endif 53 #ifdef CONFIG_ROOTPATH 54 "rootpath=" CONFIG_ROOTPATH "\0" 55 #endif 56 #ifdef CONFIG_GATEWAYIP 57 "gatewayip=" MK_STR(CONFIG_GATEWAYIP) "\0" 58 #endif 59 #ifdef CONFIG_NETMASK 60 "netmask=" MK_STR(CONFIG_NETMASK) "\0" 61 #endif 62 #ifdef CONFIG_HOSTNAME 63 "hostname=" MK_STR(CONFIG_HOSTNAME) "\0" 64 #endif 65 #ifdef CONFIG_BOOTFILE 66 "bootfile=" CONFIG_BOOTFILE "\0" 67 #endif 68 #ifdef CONFIG_LOADADDR 69 "loadaddr=" MK_STR(CONFIG_LOADADDR) "\0" 70 #endif 71 #ifdef CONFIG_CLOCKS_IN_MHZ 72 "clocks_in_mhz=1\0" 73 #endif 74 #if defined(CONFIG_PCI_BOOTDELAY) && (CONFIG_PCI_BOOTDELAY > 0) 75 "pcidelay=" MK_STR(CONFIG_PCI_BOOTDELAY) "\0" 76 #endif 77 #ifdef CONFIG_EXTRA_ENV_SETTINGS 78 CONFIG_EXTRA_ENV_SETTINGS 79 #endif 80 "\0" 81 };
可以看出,可以在smdk2440.h配置文件中增加或删除宏定义,来选择这个数组里的默认参数有哪些。
修改下面几个宏定义:
#define CONFIG_NETMASK 255.255.255.0
#define CONFIG_IPADDR 192.168.2.4
#define CONFIG_SERVERIP 192.168.2.3
#define CONFIG_ETHADDR 00:0c:29:4d:e4:f4
增加下面几个宏定义:
#define CONFIG_BOOTARGS "console=ttySAC0 root=/dev/mtdblock3"
#define CONFIG_BOOTCOMMAND "nand read 30000000 0x00040000 0x2000000;bootm 30000000"
/*******************************************************************************************************************/
上面设置的是默认的环境参数,每次uboot启动时,会从flash中存着环境参数的地方读出数据,如果没有数据或数据格式不对,就会使用默认的环境参数,也就是上面设置的环境参数。
如果想认为设置环境参数并保存到flash中,还需要使用save命令,而save命令需要知道环境参数要保存在flash的哪个分区上,具体的分区也是人为划分的,这还是用宏定义指示的。
韦老师分区如下:
0x00000000-0x00040000 : "bootloader"
0x00040000-0x00060000 : "params"
0x00060000-0x00260000 : "kernel"
0x00260000-0x10000000 : "root"
先注释掉原先用的宏定义:
// #define CONFIG_ENV_ADDR (CONFIG_SYS_FLASH_BASE + 0x070000)
// #define CONFIG_ENV_IS_IN_FLASH
// #define CONFIG_ENV_SIZE 0x10000
// /* allow to overwrite serial and ethaddr */
// #define CONFIG_ENV_OVERWRITE
增加如下宏定义:
#define CONFIG_ENV_IS_IN_NAND
#define CONFIG_ENV_OFFSET 0x00040000
#define CONFIG_ENV_SIZE 0x20000
根据源码中需要的宏定义来增加宏定义,如u-boot-2012.04.01/common/env_nand.c文件中的saveenv函数如下:
1 int saveenv(void) 2 { 3 ... 4 ... 5 memset(&nand_erase_options, 0, sizeof(nand_erase_options)); 6 nand_erase_options.length = CONFIG_ENV_RANGE; 7 nand_erase_options.offset = CONFIG_ENV_OFFSET; 8 9 if (CONFIG_ENV_RANGE < CONFIG_ENV_SIZE) 10 return 1; 11 12 res = (char *)&env_new.data; 13 ... 14 ... 15 puts("Writing to Nand... "); 16 if (writeenv(CONFIG_ENV_OFFSET, (u_char *)&env_new)) { 17 puts("FAILED!\n"); 18 return 1; 19 } 20 ... 21 }
其中就用到上面的三个宏定义。