且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

OK335xS U-boot 环境变量解析

更新时间:2022-08-12 20:33:05

/**************************************************************************************************
 *                                      OK335xS U-boot 环境变量解析
 * 声明:
 *     本文主要是为了知道OK335xS U-boot环境变量设置、如何选择启动方式等等内容。
 *              
 *                                                2015-9-28 晴 深圳 南山平山村 曾剑锋
 *************************************************************************************************/
#ifdef CONFIG_ANDROID
#define CON     \
    /**
      * console: kernel终端输出设置为ttyO0、115200n8
      */
    "console=ttyO0,115200n8 earlyprintk androidboot.console=ttyO0\0" \
    /**
      * In all cases we make use of optargs to control passing in of additional arguments and ip_method to determine how the kernel will deal with networking PRIOR to userspace spawning init.
      */
    "optargs=init=/init\0" \
    /**
      * 文件系统存放的位置,文进系统存放在emmc中
      */
    "mmcroot=/dev/mmcblk0p2 rw\0" \
    /**
      * 文件系统的类型是ext4
      */
    "mmcrootfstype=ext4 rootwait\0" \
    /**
      * 文件系统存放的位置,文进系统存放在nand中
      */
    "nandroot=ubi0:rootfs rw ubi.mtd=7,2048\0" \
    /**
      * 文件系统的类型是ubifs
      */
    "nandrootfstype=ubifs rootwait=1\0" 
#else
    /*"console=ttyO0,115200n8\0" \ */
#define CON     \
    /**
      * console: kernel终端输出设置为ttyO0、115200n8
      */
    "console=ttyO0,115200n8\0" \
    "optargs=\0" \
    "mmcroot=/dev/mmcblk0p2 ro\0" \
    /**
      * 文件系统的类型是ext3
      */
    "mmcrootfstype=ext3 rootwait\0" \
    "nandroot=ubi0:rootfs rw ubi.mtd=7,2048\0" \
    "nandrootfstype=ubifs rootwait=1\0" 
#endif


#if 1
#define CONFIG_EXTRA_ENV_SETTINGS \
    CON \
    /**
      * printf("current screen type is `%s`\n",getenv("screentype"));
      * printf("R means Resistor screen,C means Capacitor screen\n");
      * printf("---------------------screen type----------------------\n");
      * printf("0 -- exit to upper menu\n");
      * printf("1 -- Resistor screen\n");
      * printf("2 -- Capacitor screen\n");
      * printf("------------------------------------------------------\n");
      * 
      */
    "screentype=R\0"\
    /**
      * printf("current screen size is `%s`\n",getenv("screensize"));
      * printf("AAAxAAA-B means Binch screen with AAAxAAA pixels\n");
      * printf("---------------------screen type----------------------\n");
      * printf("0 -- exit to upper menu\n");
      * printf("1 -- 480x272-4\n");
      * printf("2 -- 800x480-5\n");
      * printf("3 -- 800x480-7\n");
      * printf("4 -- 800x600-8\n");
      * printf("5 -- 800x600-10\n");
      * printf("------------------------------------------------------\n");
      */
    "screensize=800x600-10\0"\
    /**
      * load address
      */
    "loadaddr=0x80200000\0" \
    /**
      * kernel load address
      */
    "kloadaddr=0x80007fc0\0" \
    "fdtaddr=0x80F80000\0" \
    "fdt_high=0xffffffff\0" \
    /**
      * ramdisk address
      */
    "rdaddr=0x81000000\0" \
    /**
      * boot device
      */
    "bootdev=MMC\0"\
    /**
      * boot file name
      */
    "bootfile=uImage\0" \
    "fdtfile=\0" \
    /**
      * mmc设备可能有几个,选择第0个
      */
    "mmcdev=0\0" \
    /**
      * nand中内核保存的其实地址,这个需要看nand分区设置,kernel中有一个分区表,下面的update也有对应的值
      */
    "nandsrcaddr=0x280000\0" \
    /**
      * nand中的kernel的大小
      */
    "nandimgsize=0x500000\0" \
    /**
      * 网络文件系统所使用的挂在路径方式
      */
    "rootpath=/export/rootfs\0" \
    "nfsopts=nolock\0" \
    "static_ip=${ipaddr}:${serverip}:${gatewayip}:${netmask}:${hostname}" \
        "::off\0" \
    "ramroot=/dev/ram0 rw ramdisk_size=65536 initrd=${rdaddr},64M\0" \
    "ramrootfstype=ext2\0" \
    /**
      * ip_method to determine how the kernel will deal with networking PRIOR to userspace spawning init
      */
    "ip_method=none\0" \
    "bootargs_defaults=setenv bootargs " \
        "console=${console} " \
        "${optargs}\0" \
    "mmcargs=run bootargs_defaults;" \
        "setenv bootargs ${bootargs} " \
        "root=${mmcroot} " \
        "rootfstype=${mmcrootfstype} ip=${ip_method} screentype=${screentype} screensize=${screensize}\0" \
    "nandargs=setenv bootargs console=${console} " \
        "${optargs} " \
        "root=${nandroot} " \
        "rootfstype=${nandrootfstype} screentype=${screentype} screensize=${screensize}\0" \
    "spiroot=/dev/mtdblock4 rw\0" \
    "spirootfstype=jffs2\0" \
    "spisrcaddr=0xe0000\0" \
    "spiimgsize=0x362000\0" \
    "spibusno=0\0" \
    "spiargs=setenv bootargs console=${console} " \
        "${optargs} " \
        "root=${spiroot} " \
        "rootfstype=${spirootfstype}\0" \
    "netargs=setenv bootargs console=${console} " \
        "${optargs} " \
        "root=/dev/nfs " \
        "nfsroot=${serverip}:${rootpath},${nfsopts} rw " \
        "ip=dhcp\0" \
    "bootenv=uEnv.txt\0" \
    "loadbootenv=fatload mmc ${mmcdev} ${loadaddr} ${bootenv}\0" \
    "importbootenv=echo Importing environment from mmc ...; " \
        "env import -t $loadaddr $filesize\0" \
    "ramargs=setenv bootargs console=${console} " \
        "${optargs} " \
        "root=${ramroot} " \
        "rootfstype=${ramrootfstype}\0" \
    "loadramdisk=fatload mmc ${mmcdev} ${rdaddr} ramdisk.gz\0" \
    "loaduimagefat=fatload mmc ${mmcdev} ${kloadaddr} ${bootfile}\0" \
    "loaduimage=ext2load mmc ${mmcdev}:2 ${kloadaddr} /boot/${bootfile}\0" \
    "mmcboot=echo Booting from mmc ...; " \
        "run mmcargs; " \
        "bootm ${kloadaddr}\0" \
    "nandboot=echo Booting from nand ...; " \
        "run nandargs; " \
        "nandecc hw 2;"\
        "nand read ${loadaddr} ${nandsrcaddr} ${nandimgsize}; " \
        "bootm ${loadaddr}\0" \
    "spiboot=echo Booting from spi ...; " \
        "run spiargs; " \
        "sf probe ${spibusno}:0; " \
        "sf read ${loadaddr} ${spisrcaddr} ${spiimgsize}; " \
        "bootm ${loadaddr}\0" \
    "netboot=echo Booting from network ...; " \
        "setenv autoload no; " \
        "dhcp; " \
        "tftp ${loadaddr} ${bootfile}; " \
        "run netargs; " \
        "bootm ${loadaddr}\0" \
    "ramboot=echo Booting from ramdisk ...; " \
        "run ramargs; " \
        "bootm ${loadaddr}\0" \
    "findfdt="\
        "if test $board_name = A335BONE; then " \
            "setenv fdtfile am335x-bone.dtb; fi; " \
        "if test $board_name = A33515BB; then " \
            "setenv fdtfile am335x-evm.dtb; fi; " \
        "if test $board_name = A335X_SK; then " \
            "setenv fdtfile am335x-evmsk.dtb; fi\0" \
    /**
      * cat drivers/video/cfb_console.c
      * 
      * env = getenv("TYPE");
      * if(env)
      *     type = (*env)-'0';
      * else
      *     type = 9;
      * 
      * switch(type)
      * {
      * case 0:
      *     title = "Erasing nand chip............";
      *     break;
      * case 1:
      *     title = "Reading MLO from MMC.........";
      *     break;
      * case 2:
      *     title = "Burning MLO to nand..........";
      *     break;
      * case 3:
      *     title = "Reading u-boot.img from MMC..";
      *     break;
      * case 4:
      *     title = "Burning u-boot.img to nand...";
      *     break;
      * case 5:
      *     title = "Reading uImage from MMC......";
      *     break;
      * case 6:
      *     title = "Burning uImage to nand.......";
      *     break;
      * case 7:
      *     title = "Reading ubi.img from MMC.....";
      *     break;
      * case 8:
      *     title = "Burning ubi.img to nand......";
      *     break;
      * default:
      *     title = "env is null..................";
      *     break;
      * }
      */
    /**
      * 这一部分写到nand中的内容,需要和kernel对nand的分区进行对应,貌似这样就可以直接对u-boot、kernel进行更新了
      */
    "auto_update_nand=  echo ---------------Begin update system to Nand---------------;led all on;"\
                "setenv TYPE 0;nand erase.chip;mmc rescan; "\
                "setenv TYPE 1;fatload mmc 0 80A00000 nand_MLO;      setenv TYPE 2;nandecc hw 2;nand write.i 80A00000 0 ${filesize}; "\
                "setenv TYPE 3;fatload mmc 0 80A00000 nand_u-boot.img;setenv TYPE 4;nandecc hw 2;nand write.i 80A00000 80000 ${filesize}; "\
                "setenv TYPE 5;fatload mmc 0 80A00000 uImage;    setenv TYPE 6;nandecc hw 2;nand write.i 80A00000 280000 ${filesize}; "\
                "setenv TYPE 7;fatload mmc 0 80A00000 ubi.img;   setenv TYPE 8;nandecc sw;nand write.i 80A00000 780000 ${filesize};"\
                "echo ;"\
                "echo --------------Update system to Nand success--------------;led flash all;\0"\
    "update_nand=  echo ---------------Begin update system to Nand---------------;led all on;"\
                "setenv TYPE 0;nand erase.chip;mmc rescan; "\
                "setenv TYPE 1;fatload mmc 0 80A00000 MLO;       setenv TYPE 2;nandecc hw 2;nand write.i 80A00000 0 ${filesize}; "\
                "setenv TYPE 3;fatload mmc 0 80A00000 u-boot.img;setenv TYPE 4;nandecc hw 2;nand write.i 80A00000 80000 ${filesize}; "\
                "setenv TYPE 3;fatload mmc 0 80A00000 u-boot.img;setenv TYPE 4;nandecc hw 2;nand write.i 80A00000 80000 ${filesize}; "\
                "setenv TYPE 5;fatload mmc 0 80A00000 uImage;    setenv TYPE 6;nandecc hw 2;nand write.i 80A00000 280000 ${filesize}; "\
                "setenv TYPE 7;fatload mmc 0 80A00000 ubi.img;   setenv TYPE 8;nandecc sw;nand write.i 80A00000 780000 ${filesize};"\
                "echo ;"\
                "echo --------------Update system to Nand success--------------;led all off;"\

/**
  * 虽然这部分代码确认是可运行的,但是感觉真的不合理,后面的源代码貌似更为合理一点
  */
#define CONFIG_BOOTCOMMAND \
    " if test $bootdev = MMC; then " \                      // bootdev = MMC 
        "mmc dev ${mmcdev}; mmc rescan;"\                   // mmcdev = 0, 设置0为当前设备 
        "echo SD/MMC found on device ${mmcdev};" \
        /** 
          * loadaddr = 0x80200000
          * bootenv = uEnv.txt
          * loadbootenv = fatload mmc ${mmcdev} ${loadaddr} ${bootenv}
          * importbootenv = echo Importing environment from mmc ...;env import -t $loadaddr $filesize 
          */
        "if run loadbootenv; then " \                       
            "echo Loaded environment from ${bootenv};" \
            "run importbootenv;" \
        "fi;" \
        /**
          * test -n: 字符串的长度非零
          * uenvcmd: 不存在,不用解析
          */
        "if test -n $uenvcmd; then " \
            "echo Running uenvcmd ...;" \
            "run uenvcmd;" \
        "fi;" \
        /**
          * kloadaddr = 0x80007fc0
          * bootfile = uImage
          * loaduimagefat = fatload mmc ${mmcdev} ${kloadaddr} ${bootfile}
          *
          * mmcboot = echo Booting from mmc ...;run mmcargs;bootm ${kloadaddr}
          * mmcroot = /dev/mmcblk0p2 ro
          * mmcrootfstype = ext3 rootwait
          * ip_method = none
          * screentype = R
          * screensize = 800x600-10
          * mmcargs = run bootargs_defaults;setenv bootargs ${bootargs} root=${mmcroot} rootfstype=${mmcrootfstype} ip=${ip_method} screentype=${screentype} screensize=${screensize}
          */
        "if run loaduimagefat; then " \
            "run mmcboot;" \
        /**
          * kloadaddr = 0x80007fc0
          * bootfile = uImage
          * loaduimage = ext2load mmc ${mmcdev}:2 ${kloadaddr} /boot/${bootfile}
          */
        "elif run loaduimage; then " \
            "run mmcboot;" \
        "else " \
            "echo Could not find ${bootfile} ;" \
        "fi;" \
    "else " \
        "run nandboot;" \
    "fi;" \


/**
  * 个人认为更合理的bootcmd
  */
#define CONFIG_BOOTCOMMAND \
    /**
      * mmcdev = 0, 设置0为当前设备 
      */
    "mmc dev ${mmcdev}; " \
    /**
      * 重新搜索mmc设备,如果不存在mmc设备,自然就是nand启动了
      */
    "if mmc rescan; then " \
        "echo SD/MMC found on device ${mmcdev};" \
        "if run loadbootenv; then " \
            "echo Loaded environment from ${bootenv};" \
            "run importbootenv;" \
        "fi;" \
        "if test -n $uenvcmd; then " \
            "echo Running uenvcmd ...;" \
            "run uenvcmd;" \
        "fi;" \
        "if run loaduimagefat; then " \
            "run mmcboot;" \
        "elif run loaduimage; then " \
            "run mmcboot;" \
        "else " \
            "echo Could not find ${bootfile} ;" \
        "fi;" \
    "else " \
        "run nandboot;" \
    "fi;" \
#else