• 移植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 }    

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

     
  • 相关阅读:
    common daemon
    java和 javaw 以及 javaws的区别
    Windows 64位环境的Java 服务配置
    Java Service Wrapper
    使用exe4j把java程序生成可执行的.exe文件
    Oracle安装
    Oracle 排序问题(null带来的)
    剖析简易计算器带你入门微信小程序开发
    实战SpringMVC+Mybatis搭建高性能安全站点
    SpringMVC利用拦截器防止SQL注入
  • 原文地址:https://www.cnblogs.com/physworld/p/15037172.html
Copyright © 2020-2023  润新知