移植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            ""
 4 #endif
 5 #ifdef    CONFIG_BOOTCOMMAND
 6     "bootcmd="    CONFIG_BOOTCOMMAND        ""
 7 #endif
 8 #ifdef    CONFIG_RAMBOOTCOMMAND
 9     "ramboot="    CONFIG_RAMBOOTCOMMAND        ""
10 #endif
11 #ifdef    CONFIG_NFSBOOTCOMMAND
12     "nfsboot="    CONFIG_NFSBOOTCOMMAND        ""
13 #endif
14 #if defined(CONFIG_BOOTDELAY) && (CONFIG_BOOTDELAY >= 0)
15     "bootdelay="    MK_STR(CONFIG_BOOTDELAY)    ""
16 #endif
17 #if defined(CONFIG_BAUDRATE) && (CONFIG_BAUDRATE >= 0)
18     "baudrate="    MK_STR(CONFIG_BAUDRATE)        ""
19 #endif
20 #ifdef    CONFIG_LOADS_ECHO
21     "loads_echo="    MK_STR(CONFIG_LOADS_ECHO)    ""
22 #endif
23 #ifdef    CONFIG_ETHADDR
24     "ethaddr="    MK_STR(CONFIG_ETHADDR)        ""
25 #endif
26 #ifdef    CONFIG_ETH1ADDR
27     "eth1addr="    MK_STR(CONFIG_ETH1ADDR)        ""
28 #endif
29 #ifdef    CONFIG_ETH2ADDR
30     "eth2addr="    MK_STR(CONFIG_ETH2ADDR)        ""
31 #endif
32 #ifdef    CONFIG_ETH3ADDR
33     "eth3addr="    MK_STR(CONFIG_ETH3ADDR)        ""
34 #endif
35 #ifdef    CONFIG_ETH4ADDR
36     "eth4addr="    MK_STR(CONFIG_ETH4ADDR)        ""
37 #endif
38 #ifdef    CONFIG_ETH5ADDR
39     "eth5addr="    MK_STR(CONFIG_ETH5ADDR)        ""
40 #endif
41 #ifdef    CONFIG_IPADDR
42     "ipaddr="    MK_STR(CONFIG_IPADDR)        ""
43 #endif
44 #ifdef    CONFIG_SERVERIP
45     "serverip="    MK_STR(CONFIG_SERVERIP)        ""
46 #endif
47 #ifdef    CONFIG_SYS_AUTOLOAD
48     "autoload="    CONFIG_SYS_AUTOLOAD        ""
49 #endif
50 #ifdef    CONFIG_PREBOOT
51     "preboot="    CONFIG_PREBOOT            ""
52 #endif
53 #ifdef    CONFIG_ROOTPATH
54     "rootpath="    CONFIG_ROOTPATH            ""
55 #endif
56 #ifdef    CONFIG_GATEWAYIP
57     "gatewayip="    MK_STR(CONFIG_GATEWAYIP)    ""
58 #endif
59 #ifdef    CONFIG_NETMASK
60     "netmask="    MK_STR(CONFIG_NETMASK)        ""
61 #endif
62 #ifdef    CONFIG_HOSTNAME
63     "hostname="    MK_STR(CONFIG_HOSTNAME)        ""
64 #endif
65 #ifdef    CONFIG_BOOTFILE
66     "bootfile="    CONFIG_BOOTFILE            ""
67 #endif
68 #ifdef    CONFIG_LOADADDR
69     "loadaddr="    MK_STR(CONFIG_LOADADDR)        ""
70 #endif
71 #ifdef    CONFIG_CLOCKS_IN_MHZ
72     "clocks_in_mhz=1"
73 #endif
74 #if defined(CONFIG_PCI_BOOTDELAY) && (CONFIG_PCI_BOOTDELAY > 0)
75     "pcidelay="    MK_STR(CONFIG_PCI_BOOTDELAY)    ""
76 #endif
77 #ifdef    CONFIG_EXTRA_ENV_SETTINGS
78     CONFIG_EXTRA_ENV_SETTINGS
79 #endif
80     ""
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!
");
18         return 1;
19     }
20         ...
21 }    

其中就用到上面的三个宏定义。

 
原文地址:https://www.cnblogs.com/physworld/p/15037172.html