热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

在U-Boot中添加自定义命令以实现自动下载程序【转】

本文转载自:https:gaomf.cn20160626%E5%9C%A8U-Boot%E4%B8%AD%E6%B7%BB%E5%8A%A0%E8%87%AA%E5%AE%9A%E4%B9

本文转载自:https://gaomf.cn/2016/06/26/%E5%9C%A8U-Boot%E4%B8%AD%E6%B7%BB%E5%8A%A0%E8%87%AA%E5%AE%9A%E4%B9%89%E5%91%BD%E4%BB%A4%E4%BB%A5%E5%AE%9E%E7%8E%B0%E8%87%AA%E5%8A%A8%E4%B8%8B%E8%BD%BD%E7%A8%8B%E5%BA%8F/

U-Boot中通过NFS下载程序是一种很普遍的方式,然而下载程序的过程并不能只用一条命令实现。以下载到NOR Flash中为例,一般需要以下几步:

  1. 通过NFS将文件下载到内存中;
  2. 解除NOR Flash写保护;
  3. 擦除NOR Flash;
  4. 写入NOR Flash。

每一步都需要手动输入命令,十分麻烦,所以我们可以在U-Boot中添加一个自定义命令download,以实现一键全自动下载的目的。下面就来介绍一下实现方法。

向U-Boot中添加命令

以U-Boot 2016.05为例,其绝大部分命令都位于cmd/文件夹中,可以选择一个简单点的文件打开看看,就可以看到命令接口的基本结构如下:

1
2
3
4
5
6
7
8
9
10
static int do_mycmd(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
{
// Do Something
}

U_BOOT_CMD(
mycmd, 1, 1, do_mycmd,
"short description",
"help"
);

其中do_mycmd()函数就是命令的执行函数,它的名字可以是任意的,只是按照U-Boot惯例一般就叫做这种形式。此函数的cmdfpflag两个参数是由U-Boot系统传入的和命令相关的一些信息,一般用不到,重点是后两个参数。argc是参数个数,至少为1,表示命令本身;argv就是具体传入的参数字符串数组。

这个一般的函数是如何和命令关联起来的呢?靠的就是U_BOOT_CMD这个宏。这里不详细分析此宏的实现机理,仅从应用的角度说明一下。U_BOOT_CMD的命令格式为:

1
U_BOOT_CMD(name,maxargs,rep,cmd,usage,help)

各参数的含义为:

参数 含义
name 命令的名称,此处直接输入即可,不要用字符串"xxx"的形式
maxargs 命令的最大参数个数,至少为1,表示命令本身
rep 是否自动重复(为1的话下次直接按Enter键会重复执行此命令)
cmd 命令对应的响应函数,即之前的do_mycmd()函数,直接使用函数名
usage 简短的使用说明(字符串)
help 输入help后显示的较详细的帮助文档(字符串)

按以上格式新建一个C源文件后,将其加入Makefile中编译即可。这个文件可以放在任何地方,不过cmd/文件夹中存放的是通用的命令,我们自己新加入的命令最好不要放在里面,而是放在board/中板子相关的文件夹里,比如board/samsung/smdk2440/

如果需要灵活控制是否添加此命令,可加入条件编译,仿照U-Boot本身的做法定义以下宏:

1
#define CONFIG_CMD_MYCMD

这个定义可以放在板子的头文件中,也可加入defconfig文件中。之后在Makefile文件中加入条件编译即可:

1
obj-$(CONFIG_CMD_MYCMD) += mycmd.o

运行特定命令

要实现自动下载,需要使用一个命令代替一系列命令,这就要求能够在程序中自动运行特定命令。U-Boot提供了一个方便的接口函数来实现这一目的:

1
2
3
4
5
6
7
8
/*
* Run a command using the selected parser.
*
* @param cmd Command to run
* @param flag Execution flags (CMD_FLAG_...)
* @return 0 on success, or != 0 on error.
*/
int run_command(const char *cmd, int flag);

只需调用此函数即可运行特定的命令。

自动下载程序

最后给出完整版的自动下载程序的实现代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
#include 
#include

static int do_download(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
{
int i;

if(argc == 1)
printf("param:\nu : U-Boot;\nl : Linux;\nf : File System.\n");

const char * const cmd_uboot[5] = {
"nfs 30000000 /home/gmf/nfs/u-boot.bin",
"protect off all",
"erase 0 +$filesize",
"cp.b 30000000 0 $filesize",
"reset",
};

const char * const cmd_linux[4] = {
"nfs 30008000 /home/gmf/nfs/uImage",
"nand erase 60000 300000",
"nand write.jffs2 30008000 60000 300000",
"bootm 30008000",
};

const char * const cmd_fs[4] = {
"nfs 32000000 /home/gmf/nfs/ramdisk.gz",
"nand erase 560000 $filesize",
"nand write.jffs2 32000000 560000 $filesize",
"bootd",
};

switch(*argv[1]) {
case 'u':
case 'U':
for(i = 0; i <5; i++)
{
printf("\n##########\n");
printf(cmd_uboot[i]);
printf("\n##########\n");
run_command(cmd_uboot[i], 0);
}
break;

case 'l':
case 'L':
for(i = 0; i <4; i++)
{
printf("\n##########\n");
printf(cmd_linux[i]);
printf("\n##########\n");
run_command(cmd_linux[i], 0);
}
break;

case 'f':
case 'F':
for(i = 0; i <4; i++)
{
printf("\n##########\n");
printf(cmd_fs[i]);
printf("\n##########\n");
run_command(cmd_fs[i], 0);
}
break;
}
return 0;
}


U_BOOT_CMD(
download, 2, 1, do_download,
"Download File (Uboot, Linux or FS)",
" - Download File:\nu : U-Boot;\nl : Linux;\nf : File System.\n"
);

此处实现了自动下载u-boot.bin文件、uImage文件和ramdisk.gz文件,分别输入download udownload ldownload f即可。命令执行序列位于cmd_ubootcmd_linuxcmd_fs数组中。此代码结构很好进行扩展,如要加入新的选项,仿照目前的结构添加即可。


推荐阅读
  • 在进行网络编程时,准确获取本地主机的IP地址是一项基本但重要的任务。Winsock作为20世纪90年代初由Microsoft与多家公司共同制定的Windows平台网络编程接口,为开发者提供了一套高效且易用的工具。通过Winsock,开发者可以轻松实现网络通信功能,并准确获取本地主机的IP地址,从而确保应用程序在网络环境中的稳定运行。此外,了解Winsock的工作原理及其API函数的使用方法,有助于提高开发效率和代码质量。 ... [详细]
  • 结语 | 《探索二进制世界:软件安全与逆向分析》读书笔记:深入理解二进制代码的逆向工程方法
    结语 | 《探索二进制世界:软件安全与逆向分析》读书笔记:深入理解二进制代码的逆向工程方法 ... [详细]
  • 本文深入探讨了 MXOTDLL.dll 在 C# 环境中的应用与优化策略。针对近期公司从某生物技术供应商采购的指纹识别设备,该设备提供的 DLL 文件是用 C 语言编写的。为了更好地集成到现有的 C# 系统中,我们对原生的 C 语言 DLL 进行了封装,并利用 C# 的互操作性功能实现了高效调用。此外,文章还详细分析了在实际应用中可能遇到的性能瓶颈,并提出了一系列优化措施,以确保系统的稳定性和高效运行。 ... [详细]
  • 在稀疏直接法视觉里程计中,通过优化特征点并采用基于光度误差最小化的灰度图像线性插值技术,提高了定位精度。该方法通过对空间点的非齐次和齐次表示进行处理,利用RGB-D传感器获取的3D坐标信息,在两帧图像之间实现精确匹配,有效减少了光度误差,提升了系统的鲁棒性和稳定性。 ... [详细]
  • 本文详细探讨了C语言中`extern`关键字的简易编译方法,并深入解析了预编译、`static`和`extern`的综合应用。通过具体的代码示例,介绍了如何在不同的文件之间共享变量和函数声明,以及这些关键字在编译过程中的作用和影响。文章还讨论了预编译过程中宏定义的使用,为开发者提供了实用的编程技巧和最佳实践。 ... [详细]
  • 题目描述:小K不幸被LL邪教洗脑,洗脑程度之深使他决定彻底脱离这个邪教。在最终离开前,他计划再进行一次亚瑟王游戏。作为最后一战,他希望这次游戏能够尽善尽美。众所周知,亚瑟王游戏的结果很大程度上取决于运气,但通过合理的策略和算法优化,可以提高获胜的概率。本文将详细解析洛谷P3239 [HNOI2015] 亚瑟王问题,并提供具体的算法实现方法,帮助读者更好地理解和应用相关技术。 ... [详细]
  • 本文提供了一种生成邀请码的专业指南和实践方法。通过介绍一个名为 `SerialCode` 的类,详细阐述了邀请码生成器的算法原理。具体步骤包括:首先获取唯一的用户ID(例如1127738),然后使用自定义的进制转换方法将其转化为特定格式的邀请码。该方法不仅确保了邀请码的唯一性和安全性,还提高了生成效率。此外,文章还讨论了如何在实际应用中优化和扩展这一算法,以满足不同场景的需求。 ... [详细]
  • 从零起步:使用IntelliJ IDEA搭建Spring Boot应用的详细指南
    从零起步:使用IntelliJ IDEA搭建Spring Boot应用的详细指南 ... [详细]
  • BZOJ4240 Gym 102082G:贪心算法与树状数组的综合应用
    BZOJ4240 Gym 102082G 题目 "有趣的家庭菜园" 结合了贪心算法和树状数组的应用,旨在解决在有限时间和内存限制下高效处理复杂数据结构的问题。通过巧妙地运用贪心策略和树状数组,该题目能够在 10 秒的时间限制和 256MB 的内存限制内,有效处理大量输入数据,实现高性能的解决方案。提交次数为 756 次,成功解决次数为 349 次,体现了该题目的挑战性和实际应用价值。 ... [详细]
  • 在Hive中合理配置Map和Reduce任务的数量对于优化不同场景下的性能至关重要。本文探讨了如何控制Hive任务中的Map数量,分析了当输入数据超过128MB时是否会自动拆分,以及Map数量是否越多越好的问题。通过实际案例和实验数据,本文提供了具体的配置建议,帮助用户在不同场景下实现最佳性能。 ... [详细]
  • 本文详细解析了 MySQL 5.7.20 版本中二进制日志(binlog)崩溃恢复机制的工作流程。假设使用 InnoDB 存储引擎,并且启用了 `sync_binlog=1` 配置,文章深入探讨了在系统崩溃后如何通过 binlog 进行数据恢复,确保数据的一致性和完整性。 ... [详细]
  • MySQL性能优化与调参指南【数据库管理】
    本文详细探讨了MySQL数据库的性能优化与参数调整技巧,旨在帮助数据库管理员和开发人员提升系统的运行效率。内容涵盖索引优化、查询优化、配置参数调整等方面,结合实际案例进行深入分析,提供实用的操作建议。此外,还介绍了常见的性能监控工具和方法,助力读者全面掌握MySQL性能优化的核心技能。 ... [详细]
  • 如何利用Apache与Nginx高效实现动静态内容分离
    如何利用Apache与Nginx高效实现动静态内容分离 ... [详细]
  • 掌握DSP必备的56个核心问题,我已经将其收藏以备不时之需! ... [详细]
  • Windows环境下详细教程:如何搭建Git服务
    Windows环境下详细教程:如何搭建Git服务 ... [详细]
author-avatar
蓝蓝__的夜夜
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有