/************************************************************************************************** * 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
时间: 2024-10-26 12:09:47