瑞芯微Rockchip开发者社区
登录
直播中
刘英
7年用户
1054经验值
私信
关注
[问答]
RK3288 android7.1.2内核是怎样更改uboot环境变量的
开启该帖子的消息推送
RK3288 android7.1.2内核是怎样更改uboot环境变量的?有哪些步骤呢?
回帖
(1)
李杨
2022-3-3 11:14:10
准备
工作: 1.目标
环境/adb无线
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 offset Env. size Flash 扇区大小 扇区数#/dev/mtd1 0x0000 0x4000
0x4000
#/dev/mtd2 0x0000 0x4000 0x4000
# MTD SPI-dataflash example
# MTD device name Device offset Env. size 闪存扇区大小 扇区数
#/dev/mtd5 0x4200 0x4200
#/dev/mtd6 0x4200 0x4200
# NAND示例
#/dev/mtd0 0x4000 0x4000 0x20000 2
#块设备示例
/dev/block/mmcblk0 0xc0000 0x20000通过目标版终端
查询:使用是 /dev/block/mmcblk0 ,因此在fw_env .config文件中将开启Block device
该文件的设备一定要修改对,否则会出现:Cannot access MTD device /dev/mtd1: No such file or directory
3)通过adbwireless将文件fw_printenv下载到目标板目录/system /bin 中
adb push /system/bin fw_printenv 中
通过adbwire 将文件fw_env.config 下载到目标目录板 /etc
adb push /etc fw_env中
出现:无权限或者之前出现类似的问题请使用命令修改
adb root 。
mount -o rw,remount -t auto /
chmod 777 系统
chmod 777 etc
chmod 777 fw_printenv
chmod 777 fe_env.config
在目录/system/bin/建立软连接:ln -s /system/bin/fw_printenv /system/bin/fw_setenv
3.重新开机会发现目标板目录创建的lib (问题板在fw_printenv引入依赖库中
删除
)引导都不会消除,除了根目录下创建的。因此j将f_printenv依赖的库目录修改系统/lib下,在文件init.rc中添加创建符号链接:
根目录下的链接:out/target/ product/rk3288/root/init.rc
symlink /system/lib /lib
2)目录改写保存,make snod 将的重新编译到.img ,烧录SD卡,重新启动目标板,发现根目录下已存在修改lib,且每次下引导都存在。
3)再次更改system/lib 依赖库 ld-linux-armhf.so.3 和 libc.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 /lib
2)/system/bin/sh: 。/fw_printenv: Permission拒绝
解决方法:目标板/lib 下:chomd 777 ld-linux-armhf.so.3
3)在)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 env部分屏蔽掉,重新make CROSS_COMPILE=arm-linux-gnueabihf-产生新的 fw_printenv ,代码如下:
/*
* (C) 版权所有 2000-2008
* Wolfgang Denk, DENX Software Engineering,
*
* SPDX-License-Identifier:GPL-2.0+
*/
/*
* 固件(=U-Boot)环境的命令行用户界面。
*
* 实现:
* fw_printenv [ -a key ] [[ -n name ] | [ name 。。. ]]
* - 打印单个环境变量的值
* “name”,一个或多个 * 环境变量 “name” 的 ``name=value‘’ 对,或者如果没有名称,则打印
整个* 环境
被指定。
* fw_setenv [ -a key ] name [ value 。。. ]
* - 如果给定的名称没有任何值,
则从环境中删除具有此名称的变量 *;
* 否则,所有“值”参数被连接,
* 由单个空白字符分隔,并且
* 结果字符串分配给环境
* 变量“名称”
*
* 如果指定了“-a key”,则 env 块使用加密AES 128 CBC。
* ‘key’ 参数的格式为 32 个十六进制数字(16 字节
* 的 AES 密钥),例如。‘-aabbccddeeff00112233445566778899’。
*/
#include 《fcntl.h》
#include 《getopt.h》
#include 《stdio.h》
#include 《string.h》
#include 《stdlib.h》
#include 《sys/file.h》
#include 《unistd .h》
#define CMD_PRINTENV “fw_printenv”
#define CMD_SETENV “fw_setenv”
静态结构选项 long_options[] = {
{“script”, required_argument, NULL, ‘s’},
{“help”, no_argument, NULL, ‘h’},
{NULL , 0, 空值, 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”
“
”作为参数传递的文件只包含对 “
”name / valuen“
”Example: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;
}
while ((c = getopt_long (argc, argv, ”a:ns:h“,
long_options, NULL)) != EOF) {
switch (c) {
case ‘a’:
/* AES 密钥,稍后处理 */
break ;
案例“n”:
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;
} else {
if (fw_parse_script(script_file) != 0)
retval = EXIT_FAILURE;
}
} else {
fprintf(stderr,
”身份危机 - 可以称为 `“ CMD_PRINTENV
”’ 或 `“ CMD_SETENV ”‘ 但不能称为 `%s’n“,
cmdname);
retval = EXIT_FAILURE;
退出
:
//flock(lockfd, LOCK_UN);
//关闭(lockfd);
返回 retval;再次执行:
。/fw_printenv自动环境变量信息。/fw_setenv bootdelay 9 即更改环境变量信息
准备
工作: 1.目标
环境/adb无线
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 offset Env. size Flash 扇区大小 扇区数#/dev/mtd1 0x0000 0x4000
0x4000
#/dev/mtd2 0x0000 0x4000 0x4000
# MTD SPI-dataflash example
# MTD device name Device offset Env. size 闪存扇区大小 扇区数
#/dev/mtd5 0x4200 0x4200
#/dev/mtd6 0x4200 0x4200
# NAND示例
#/dev/mtd0 0x4000 0x4000 0x20000 2
#块设备示例
/dev/block/mmcblk0 0xc0000 0x20000通过目标版终端
查询:使用是 /dev/block/mmcblk0 ,因此在fw_env .config文件中将开启Block device
该文件的设备一定要修改对,否则会出现:Cannot access MTD device /dev/mtd1: No such file or directory
3)通过adbwireless将文件fw_printenv下载到目标板目录/system /bin 中
adb push /system/bin fw_printenv 中
通过adbwire 将文件fw_env.config 下载到目标目录板 /etc
adb push /etc fw_env中
出现:无权限或者之前出现类似的问题请使用命令修改
adb root 。
mount -o rw,remount -t auto /
chmod 777 系统
chmod 777 etc
chmod 777 fw_printenv
chmod 777 fe_env.config
在目录/system/bin/建立软连接:ln -s /system/bin/fw_printenv /system/bin/fw_setenv
3.重新开机会发现目标板目录创建的lib (问题板在fw_printenv引入依赖库中
删除
)引导都不会消除,除了根目录下创建的。因此j将f_printenv依赖的库目录修改系统/lib下,在文件init.rc中添加创建符号链接:
根目录下的链接:out/target/ product/rk3288/root/init.rc
symlink /system/lib /lib
2)目录改写保存,make snod 将的重新编译到.img ,烧录SD卡,重新启动目标板,发现根目录下已存在修改lib,且每次下引导都存在。
3)再次更改system/lib 依赖库 ld-linux-armhf.so.3 和 libc.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 /lib
2)/system/bin/sh: 。/fw_printenv: Permission拒绝
解决方法:目标板/lib 下:chomd 777 ld-linux-armhf.so.3
3)在)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 env部分屏蔽掉,重新make CROSS_COMPILE=arm-linux-gnueabihf-产生新的 fw_printenv ,代码如下:
/*
* (C) 版权所有 2000-2008
* Wolfgang Denk, DENX Software Engineering,
*
* SPDX-License-Identifier:GPL-2.0+
*/
/*
* 固件(=U-Boot)环境的命令行用户界面。
*
* 实现:
* fw_printenv [ -a key ] [[ -n name ] | [ name 。。. ]]
* - 打印单个环境变量的值
* “name”,一个或多个 * 环境变量 “name” 的 ``name=value‘’ 对,或者如果没有名称,则打印
整个* 环境
被指定。
* fw_setenv [ -a key ] name [ value 。。. ]
* - 如果给定的名称没有任何值,
则从环境中删除具有此名称的变量 *;
* 否则,所有“值”参数被连接,
* 由单个空白字符分隔,并且
* 结果字符串分配给环境
* 变量“名称”
*
* 如果指定了“-a key”,则 env 块使用加密AES 128 CBC。
* ‘key’ 参数的格式为 32 个十六进制数字(16 字节
* 的 AES 密钥),例如。‘-aabbccddeeff00112233445566778899’。
*/
#include 《fcntl.h》
#include 《getopt.h》
#include 《stdio.h》
#include 《string.h》
#include 《stdlib.h》
#include 《sys/file.h》
#include 《unistd .h》
#define CMD_PRINTENV “fw_printenv”
#define CMD_SETENV “fw_setenv”
静态结构选项 long_options[] = {
{“script”, required_argument, NULL, ‘s’},
{“help”, no_argument, NULL, ‘h’},
{NULL , 0, 空值, 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”
“
”作为参数传递的文件只包含对 “
”name / valuen“
”Example: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;
}
while ((c = getopt_long (argc, argv, ”a:ns:h“,
long_options, NULL)) != EOF) {
switch (c) {
case ‘a’:
/* AES 密钥,稍后处理 */
break ;
案例“n”:
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;
} else {
if (fw_parse_script(script_file) != 0)
retval = EXIT_FAILURE;
}
} else {
fprintf(stderr,
”身份危机 - 可以称为 `“ CMD_PRINTENV
”’ 或 `“ CMD_SETENV ”‘ 但不能称为 `%s’n“,
cmdname);
retval = EXIT_FAILURE;
退出
:
//flock(lockfd, LOCK_UN);
//关闭(lockfd);
返回 retval;再次执行:
。/fw_printenv自动环境变量信息。/fw_setenv bootdelay 9 即更改环境变量信息
举报
更多回帖
rotate(-90deg);
回复
相关问答
RK3288
android7.1.2
kernel如何
更改
uboot
环境变量
?
2022-03-03
631
请问
RK3288
android7.1.2
如何在
uboot
源码中添加、获取
环境变量
?
2022-03-03
663
RK3288
android7.1.2
内核
极其源码编译过程是
怎样
的步骤?
2022-03-03
816
RK3288
android7.1.2
HAL层添加I2C Service怎么实现?
2022-03-02
876
怎样
去更换
RK3288
android7.1.2
默认的引导壁纸呢
2022-03-04
1451
怎样
去搭建基于
rk3288
的
android
(和linux)平台软件运行
环境
呢
2022-03-09
1668
如何去解决
RK3288
Android
uboot
logo显示色差的问题呢
2022-03-03
1258
RK3288
Android
5.1系统编译需要注意哪些问题
2022-04-13
3317
怎样
去搭建一种
rk3288
android
编译
环境
2022-03-03
1505
RK3288
下载
android
6.0.1
内核
极其源码步骤是
怎样
的?
2022-03-03
714
发帖
登录/注册
20万+
工程师都在用,
免费
PCB检查工具
无需安装、支持浏览器和手机在线查看、实时共享
查看
点击登录
登录更多精彩功能!
首页
论坛版块
小组
免费开发板试用
ebook
直播
搜索
登录
×
20
完善资料,
赚取积分