瑞芯微Rockchip开发者社区
直播中

无厘头

13年用户 546经验值
擅长:基础元器件
私信 关注
[问答]

RK3288 android7.1.2 kernel如何更改uboot环境变量?

RK3288 android7.1.2内核如何更改uboot环境变量?

回帖(1)

程傍纯

2022-3-3 10:49:25
android

编译环境:android7.1.2

编译路径:源码目录u-boot/以及/u-boot/tools/env



2.产生fw_printenv执行文件并下载到目标版中

1)u-boot/目录下make env 可能会错误如下:

解决办法:添加交叉编译工具:make CROSS_COMPILE=arm-linux-gnueabihf-env



编译通过后,生成fw_printenv以及fw_env.config文件。

2)根据目标版属性修改fw_env.config文件

fw_env.config文件如下:

# fw_(printenv/setenv) 实用程序的配置文件。

# 最多两个条目是有效的,在这种情况下,

假设存在冗余 # 环境扇区。

# 注意,NOR 和 SPI-dataflash 不需要“扇区数”。

# 此外,如果省略了 Flash 扇区大小,则假定该值

# 与 Environment 大小相同,对 NOR 和 SPI-dataflash 有效

# NOR 示例

# MTD 设备名称Device offsetEnv。sizeFlash 扇区大小扇区数

#/dev/mtd10x00000x40000x4000

#/dev/mtd20x00000x40000x4000

# MTD SPI-dataflash example

# MTD device nameDevice offsetEnv. sizeFlash 扇区大小扇区数

#/dev/mtd50x42000x4200

#/dev/mtd60x42000x4200

# NAND 示例

#/dev/mtd00x40000x40000x200002

# 块设备示例

/dev/block/mmcblk00xc00000x20000

通过目标版终端:使用的是 /dev/block/mmcblk0 ,因此在fw_env.config文件中将开启Block device



该文件的设备一定要修改对,否则会出现:无法访问MTD设备/dev/mtd1: 3)通过adbwireless

将文件fw_printenv下载到目标板目录/system/bin中

adb push /system/bin fw_printenv

通过adbwireless将文件fw_env.config下载到目标板/etc中

adb push /etc fw_env。 config

如果出现:无权限或者修改类似问题的请使用以前的命令

adb root

mount -o rw,remount -t auto /

chmod 777 system

chmod 777 etc

chmod 777 fw_printenv

chmod 777 fe_env.config

在目录/system/bin/建立软连接:-s -s /system/bin/fw_printenv /system/bin/fw_setenv

3.重启目录打开目标板根创建的lib(以存放在fw_printenv库中) 目录(以rk3288为例解决此问题)

消失,这里不做介绍,应该和根文件系统有关,请自查资料。

1) 目标板修改下创建的文件可以重新启动目录在很多都不会消失,根目录下的。因此j_printenv依赖创建的库初始化系统/lib下,除了源码包,在文件中添加创建符号链接:

源根目录:out/target/product/rk3288/root/init.rc

symlink /system/lib /lib



2) 改写,make snod 将重新编译保存到.img ,烧录SD卡,重新编译3)再次

system/lib下f_printenv依赖库ld-linux-armhf.so.3和lib.so.6的权限:

chmod 777 ld-linux-armhf.so.3

chmod 777 libc.so.6

4)再次更改system/bin下fw_printenv和fw_setenv的权限:

chmod 777 fw_printenv

chmod 777 fw_setenv

5)执行./fw_printenv 输出打印环境参数

4.在目录根下执行 ./fw_setenv 可能出现以下问题

1)/system/bin/sh: ./fw_printenv: No such file or directory

解决方法:在编译环境目录 u-boot/tools/env 执行:readelf -l fw_printenv发现需要依赖文件 ld-linux-armhf.so.3



在 ubuntu 根目录下搜索:find / -name ld-linux* 发现 /usr/arm-linux-gnueabihf/lib/ld-linux-armhf.so.3



原来 ld-linux-armhf.so.3 是指向 ld- 2.15.so ,将 ld-2.15.so 复制出来重命名为 ld-linux-armhf.so.3 将其下载到目标目录/lib如果下

没有lib 则:mkdir lib 创建一个。

adb push ld-linux-armhf.so.3 .so.3 /lib

2)/system/bin/sh: ./fw_printenv: Permission denied

解决方法:目标板/lib 下:chomd 777 ld-linux-armhf.so.3

3)在1)2)的基础上仍然发现错误:./fw_printenv: error while loading shared libraries: libc.so.6: cannot open shared object file: No such file or directory

解决方法:在ubuntu根目录下搜索:find / -name libc.so。 6 发现 /usr/arm-linux-gnueabihf/lib/libc.so.6



原来 libc.so.6 是指向 libc-2.15.so ,将 libc-2.15.so 复制出来重命名为 libc.so.6下载到目标目录/lib 下

adb push libc.so.6 /lib

并在目标板/lib 下:chomd 777 libc.so.6



4)在1)2)3)的基础上仍然发现错误:Error opening lock file /var/lock/fw_printenv.lock

解决方法:在目录u- boot/env/fw_env_main.c 下将lock 生成部分屏蔽,重新make CROSS_COMPILE=arm-linux-gnueabihf- env 新的fw_printenv ,代码如下

/*

* (C) Copyright 2000-2008

* Wolfgang Denk, DENX Software Engineering , wd@denx.de

*

* SPDX-License-Identifier:GPL-2.0+

*/

/*

* 固件(=U-Boot)环境的命令行用户界面。

*

* 实现:

*fw_printenv [ -a key ] [[ -n name ] | [ name ... ]]

* - 打印单个环境变量的值

* "name",一个或多个 ``name=value'' 对



* 环境变量“名称”,如果没有指定名称,则为整个环境。

*fw_setenv [ -a key ] name [ value ... ]

*- 如果给定的名称没有任何值,则

具有此名称的变量 * 将从环境中删除;

* 否则,所有“值”参数被连接,

* 由单个空白字符分隔,并且

* 生成的字符串分配给环境

* 变量“名称”

*

* 如果指定了“-a key”,则 env 块使用加密AES 128 CBC。

* 'key' 参数的格式为 32 个十六进制数字(16 字节

* 的 AES 密钥),例如。'-aabbccddeeff00112233445566778899'。

*/

#include #include #include #include #include #include #include "fw_env.h"

#defineCMD_PRINTENV"fw_printenv"

#define CMD_SETENV"fw_setenv"

静态结构选项 long_options[] = {

{"script", required_argument, NULL, ' s'},

{"帮助", no_argument, NULL, 'h'},

{NULL, 0, NULL, 0}

};

void usage(void)

{

fprintf(stderr, "fw_printenv/fw_setenv, "

"U-Boot 环境的命令行接口nn"

"usage:tfw_printenv [-a key] [-n] [variable name] n"

"tfw_setenv [-a 键] [变量名] [变量值]n"

"tfw_setenv -s [文件]n"

"tfw_setenv -s - <



"name / valuen"

"示例:n"

"# 任何以 # 开头的行都被视为注释n"

"n"

"t netdev eth0n"

"t kernel_addr 400000n"

"t var1n"

"t var2 快速棕色狐狸跳过"

"懒狗n"

"n"

"一个没有值的变量将被丢弃。可以n"

"在两者之间放置任意数量的空格字段,但任何n"

"值内的空格都被视为值"

"本身的一部分。nn"

);

}

int main(int argc, char *argv[])

{

char *p;

字符 *cmdname = *argv;

字符 *script_file = NULL;

诠释 c;

//const char *lockname = "/var/lock/" CMD_PRINTENV ".lock";

//int lockfd = -1;

int retval = EXIT_SUCCESS;

/*lockfd = open(lockname, O_WRONLY | O_CREAT | O_TRUNC, 0666);

if (-1 == lockfd) {

fprintf(stderr, "Error opening lock file %sn", lockname);

返回 EXIT_FAILURE;

}

if (-1 == flock(lockfd, LOCK_EX)) {

fprintf(stderr, "错误锁定文件 %sn", lockname);

关闭(lockfd);

返回 EXIT_FAILURE;

}

*/

if ((p = strrchr (cmdname, '/')) != NULL) {

cmdname = p + 1;

}

而 ((c = getopt_long (argc, argv, "a:ns:h",

long_options, NULL)) !





/* AES 密钥,稍后处理 */

break;

case 'n':

/* 在 fw_printenv 中处理 */

break;

case 's':

script_file = optarg;

休息;

案例“h”:

用法();

转到退出;

默认: /* '?' */

fprintf(stderr, "尝试 `%s --help' 获取更多信息。"

"n", cmdname);

retval = EXIT_FAILURE;

转到退出;

}

}

if (strcmp(cmdname, CMD_PRINTENV) == 0) {

if (fw_printenv(argc, argv) != 0)

retval = EXIT_FAILURE;

} else if (strcmp(cmdname, CMD_SETENV) == 0) {

if (!script_file) {

if (fw_setenv(argc, argv) != 0)

retval = EXIT_FAILURE;



if (fw_parse_script(script_file) != 0)

retval = EXIT_FAILURE;

}

} else {

fprintf(stderr,

"身份危机 - 可以称为 `" CMD_PRINTENV

"' 或 `" CMD_SETENV "' 但不能称为 `%s'n",

cmdname);

retval = EXIT_FAILURE;

}

exit:

//flock(lockfd, LOCK_UN);

//关闭(lockfd);

返回 retval;再次执行:

./fw_printenv自动环境变量信息./fw_setenv bootdelay 9 即更改环境变量信息







举报

更多回帖

发帖
×
20
完善资料,
赚取积分