OK335xS U-boot 环境变量解析

/**************************************************************************************************
* 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
上一篇:CentOS 6.4 32位系统 LAMP(Apache+MySQL+PHP)安装步骤


下一篇:在Linux里读取UBOOT环境变量