完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>
扫一扫,分享给好友
准备
工作: 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 即更改环境变量信息 |
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
rk1126实现BT601输入,输入不带IIC接口的驱动程序
1773 浏览0 评论
1501 浏览1 评论
2704 浏览3 评论
RK3568 Android11让系统ntp校准时间生效,需要设置些什么
3329 浏览1 评论
5374 浏览2 评论
小黑屋|手机版|Archiver|德赢Vwin官网(湘ICP备2023018690号)
GMT+8, 2024-8-26 07:48, Processed in 0.592497 second(s), Total 70, Slave 54 queries .
Powered by德赢Vwin官网 网
© 2015bbs.elecfans.com
关注我们的微信
下载发烧友APP
德赢Vwin官网 观察
版权所有 © 湖南华秋数字科技有限公司
德赢Vwin官网 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号