How to Compile and Use fw_printenv in the OKMX6UL Series Linux 4.1.15 System
fw _ printenv is a tool for reading the U-boot environment variable. It provides the configuration information stored in the U-boot environment variable to the Linux system. These environment variables are typically used to configure and control the boot loading process, such as boot commands, kernel parameters, device tree file paths, and more.
This article shows how to use fw_printenv on OKMX6UL boards, mainly for Forlinx OKMX6UL with Linux 4.1.15. Other platforms can also reference this guide, but adjustments may be required.
1. Compile the fw_printenv Tool
Execute the following commands under the U-boot source code path, and then the tool will be generated under tools/env.
$ . /opt/fsl-imx-x11/4.1.15-2.0.0/environment-setup-cortexa7hf-neon-poky-linux-gnueabi $ make env
If you encounter the following error:
...... In file included from tools/env/aes.c:1:0: tools/env/../../lib/aes.c:28:20: fatal error: string.h: No such file or directory compilation terminated. scripts/Makefile.host:111: recipe for target 'tools/env/aes.o' failed make[1]: *** [tools/env/aes.o] Error 1 Makefile:1372: recipe for target 'env' failed make: *** [env] Error 2
Then modify the uboot top-level Makefile to comment out CC
#CC = $(CROSS_COMPILE)gcc
Then compile
$ make env
Compile to generate the following two files under the tools/env/ path:
- fw_printenv
- fw_env.config
fw_printenv used for reading and writing environment variables
fw_env.config used to describe the partition, address, etc. where the variable is located.
2. Configuration File
modify the fw_env.config file under tools/env in the uboot source directory according to the mtd partition, the location and size of the UBOOT environment variables, etc. See the instructions in the fw_env.config file and the /tools/env/README file for specific modifications.
Device offset, Env size, and Flash sector size should correspond to the three macro definitions in the include/configs/xxxx. H files in the uboot source directory.
- CONFIG_ENV_OFFSET
- CONFIG_ENV_SIZE
- CONFIG_ENV_SECT_SIZE
Note: The following is based on the 2024 image, and it is recommended to double-check the exact address in uboot.
(1) OKMX6ULL
The header file for the OKMX6ULL-S and OKMX6ULL-C series is include/configs/mx6ullevk.h, which is configured as follows:
#define CONFIG_ENV_SIZE SZ_8K #if defined(CONFIG_ENV_IS_IN_MMC) #define CONFIG_ENV_OFFSET (12 * SZ_64K) #elif defined(CONFIG_ENV_IS_IN_SPI_FLASH) #define CONFIG_ENV_OFFSET (768 * 1024) #define CONFIG_ENV_SECT_SIZE (64 * 1024) #define CONFIG_ENV_SPI_BUS CONFIG_SF_DEFAULT_BUS #define CONFIG_ENV_SPI_CS CONFIG_SF_DEFAULT_CS #define CONFIG_ENV_SPI_MODE CONFIG_SF_DEFAULT_MODE #define CONFIG_ENV_SPI_MAX_HZ CONFIG_SF_DEFAULT_SPEED #elif defined(CONFIG_SYS_BOOT_NAND) #undef CONFIG_ENV_SIZE #define CONFIG_ENV_OFFSET (0x6 << 20) /* 60 -> 06 */ #define CONFIG_ENV_SECT_SIZE (128 << 10) #define CONFIG_ENV_SIZE CONFIG_ENV_SECT_SIZE #elif defined(CONFIG_SYS_BOOT_NAND_1G) #undef CONFIG_ENV_SIZE #define CONFIG_ENV_OFFSET (0xa << 20) #define CONFIG_ENV_SECT_SIZE (256 << 10) #define CONFIG_ENV_SIZE CONFIG_ENV_SECT_SIZE #endif
Some of the macros used above can be found in the./include/Linux/sizes. h.
#define SZ_8K 0x00002000 #define SZ_16K 0x00004000 #define SZ_32K 0x00008000 #define SZ_64K 0x00010000 ......
It follows that:
CONFIG_ENV_OFFSET | CONFIG_ENV_SIZE | CONFIG_ENV_SECT_SIZE | |
EMMC | 0x80000 | 0x2000 | / |
256 Nand | 0x600000 | 0x20000 | 0x20000 |
1G Nand | 0xA00000 | 0x40000 | 0x40000 |
Therefore, the configuration files for each version of the SoM are as follows:
emmc
...... # Block device example /dev/mmcblk1 0x80000 0x2000 ......
256 nand
...... # NAND example /dev/mtd2 0x00000 0x20000 0x20000 1 ......
1G nand
...... # NAND example /dev/mtd2 0x00000 0x40000 0x40000 1 ......
(2) OKMX6UL
OKMX6UL-C Environment Variables
#define CONFIG_ENV_SIZE SZ_8K #if defined(CONFIG_ENV_IS_IN_MMC) #define CONFIG_ENV_OFFSET (8 * SZ_64K) #elif defined(CONFIG_ENV_IS_IN_SPI_FLASH) #define CONFIG_ENV_OFFSET (768 * 1024) #define CONFIG_ENV_SECT_SIZE (64 * 1024) #define CONFIG_ENV_SPI_BUS CONFIG_SF_DEFAULT_BUS #define CONFIG_ENV_SPI_CS CONFIG_SF_DEFAULT_CS #define CONFIG_ENV_SPI_MODE CONFIG_SF_DEFAULT_MODE #define CONFIG_ENV_SPI_MAX_HZ CONFIG_SF_DEFAULT_SPEED #elif defined(CONFIG_SYS_BOOT_NAND) #undef CONFIG_ENV_SIZE #if defined(CONFIG_ FCU1101 ) /*#define CONFIG_ENV_OFFSET (60 << 20)*/ #define CONFIG_ENV_OFFSET (0x4 << 20) #else #define CONFIG_ENV_OFFSET (0x6 << 20) #endif /*#define CONFIG_ENV_OFFSET (0x6 << 20) */ #define CONFIG_ENV_SECT_SIZE (128 << 10) #define CONFIG_ENV_SIZE CONFIG_ENV_SECT_SIZE #elif defined(CONFIG_SYS_BOOT_NAND_1G) #undef CONFIG_ENV_SIZE #define CONFIG_ENV_OFFSET (0xa << 20) #define CONFIG_ENV_SECT_SIZE (256 << 10) #define CONFIG_ENV_SIZE CONFIG_ENV_SECT_SIZE
Some of the macros used above can be found in the./include/Linux/sizes. h.
...... #define SZ_8K 0x00002000 #define SZ_16K 0x00004000 #define SZ_32K 0x00008000 #define SZ_64K 0x00010000 ......
We can get
CONFIG_ENV_OFFSET | CONFIG_ENV_SIZE | CONFIG_ENV_SECT_SIZE | |
EMMC | 0xc0000 | 0x2000 | / |
256 Nand | 0x600000 | 0x20000 | 0x20000 |
1G Nand | 0xA00000 | 0x40000 | 0x40000 |
Therefore, the configuration files for each version of the SoM are as follows:
emmc.
...... # Block device example /dev/mmcblk1 0xc0000 0x2000 ......
256nand
...... # NAND example /dev/mtd2 0x00000 0x20000 0x20000 1 ......
1G nand
...... # NAND example /dev/mtd2 0x00000 0x40000 0x40000 1 ......
Deploy to the Development Board
- Copy tools/env/fw_env.config to the /etc path of the development board;
- Copy tools/env/fw_printenv to the root file system of the development board under the path /usr/bin.
- Create a soft link so that fw_setenv links to /usr/bin/fw_printenv
Create a soft link method:
$ ln -s /usr/bin/fw_printenv /usr/bin/fw_setenv
3. Use & Method
Read Environment Variables
root@fl-imx6ull:~# fw_printenv baudrate=115200 board_name=EVK board_rev=14X14 bootcmd=if test ${bootdev} = sd1; then run erase_env;mmc dev 0;if fatload mmc 0:1 83200000 target/env.txt;then echo burn default env from sdcard......;setenv_sdcard mmc 0:1 83200000 target/env.txt;fi;echo update from sd ...;run update_from_sd;else echo boot from nand ...;run nandargs;run bootnand; fi; bootcmd_mfg=run erase_env;run setenv_mfgtool;run mfgtool_args;bootz ${loadaddr} ${initrd_addr} ${fdt_addr}; bootdelay=1 bootdev=mmc2 bootnand=nand read ${loadaddr} 0xa00000 0x800000;nand read ${fdt_addr} ${nand_addr} 0x40000;bootz ${loadaddr} - ${fdt_addr}; calibrate=y console=ttymxc0 env_addr=0x83200000 erase_env=nand erase 0x600000 0x100000; eth1addr=72:d9:26:cf:b7:42 ethaddr=ee:71:d9:26:cf:b7 ethprime=FEC fdt_addr=0x83000000 fdt_high=0xffffffff fl_menu1=1 initrd_addr=0x83800000 initrd_high=0xffffffff loadaddr=0x80800000 mfgtool_args=setenv bootargs console=${console},${baudrate} rdinit=/linuxrc g_mass_storage.stall=0 g_mass_storage.removable=1 g_mass_storage.file=/fat g_mass_storage.ro=1 g_mass_storage.idVendor=0x066F g_mass_storage.idProduct=0x37FF g_mass_storage.iSerialNumber="" clk_ignore_unused nand_addr=0x780000 nandargs=setenv bootargs console=ttymxc0,115200 cma=64M root=/dev/mtdblock5 rw rootfstype=yaffs2 panel=TFT70AB-1024x600 setenv_mfgtool=setenv_mfgtools ${env_addr} 2000 ; splashimage=0x83800000 splashpos=m,m update_from_sd=run update_nand; update_nand=mmc rescan;fatload mmc 0 ${loadaddr} /sdrun/zImage; fatload mmc 0 ${initrd_addr} /sdrun/ramdisk.img.u; fatload mmc 0 ${fdt_addr} /sdrun/imx6ull-14x14-evk.dtb; setenv bootargs console=${console},${baudrate} rdinit=/linuxrc; bootz ${loadaddr} ${initrd_addr} ${fdt_addr};
Write environment variable:
root@fl-imx6ull:~# fw_setenv panel TFT70AB-800x480 root@fl-imx6ull:~# fw_printenv baudrate=115200 board_name=EVK board_rev=14X14 ...... panel=TFT70AB-800x480
Reboot and check the environment variables in uboot.
=> print baudrate=115200 board_name=EVK board_rev=14X14 ...... panel=TFT70AB-800x480 ...... Environment size: 1779/131068 bytes =>
Dear friends, we have created an exclusive embedded technical exchange group on Facebook, where our experts share the latest technological trends and practical skills. Join us and grow together!