本文转载自: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 <common.h>
#include <command.h> 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数组中。此代码结构很好进行扩展,如要加入新的选项,仿照目前的结构添加即可。

在U-Boot中添加自定义命令以实现自动下载程序【转】的更多相关文章

  1. u-boot中添加自定义命令

    1.u-boot命令机制u-boot中,每个命令都使用一个struct cmd_tbl_s结构体定义,该定义在include/command.h中实现:struct cmd_tbl_s{ char * ...

  2. uboot中添加自定义命令

    uboot中可以通过修改源程序来添加自定义命令,进一步扩展uboot的功能. 我想在uboot下添加一条新的命令(名为varcpy),用来拷贝uboot中的环境变量. 修改方式如下: 创建新文件com ...

  3. linux中添加自定义命令

    centos下设置alias别名,比较简单,例如: vim /root/.bashrc addalias rm='rm -i' Linux alias设置指令的别名命令详解 功能说明:设置指令的别名. ...

  4. Spring boot 梳理 - 在bean中使用命令行参数-自动装配ApplicationArguments

    If you need to access the application arguments that were passed to SpringApplication.run(…​), you c ...

  5. 009 spring boot中文件的上传与下载

    一:任务 1.任务 文件的上传 文件的下载 二:文件的上传 1.新建一个对象 FileInfo.java package com.cao.dto; public class FileInfo { pr ...

  6. uboot中的命令体系

    一.uboot的命令体系介绍以及实例分析: U-Boot 的命令实现大多在 common 目录下.在该目录下命令的代码文件都是以“ cmd_”开头的,如下图所示: 其中每一个文件都是一个命令实现的代码 ...

  7. Thymeleaf 模板 在spring boot 中的引用和应用

    Thymeleaf是一个java类库,他是一个xml/xhtml/html5的模板引擎和Struts框架的freemarker模板类似,可以作为mvc的web应用的view层. Thymeleaf还提 ...

  8. 在Spring Boot中配置web app

    文章目录 添加依赖 配置端口 配置Context Path 配置错误页面 在程序中停止Spring Boot 配置日志级别 注册Servlet 切换嵌套服务器 在Spring Boot中配置web a ...

  9. linux运维中的命令梳理(四)

    ----------管理命令---------- ps命令:查看进程 要对系统中进程进行监测控制,查看状态,内存,CPU的使用情况,使用命令:/bin/ps (1) ps :是显示瞬间进程的状态,并不 ...

随机推荐

  1. hdu4035 Maze (树上dp求期望)

    dp求期望的题. 题意: 有n个房间,由n-1条隧道连通起来,实际上就形成了一棵树, 从结点1出发,开始走,在每个结点i都有3种可能: 1.被杀死,回到结点1处(概率为ki) 2.找到出口,走出迷宫 ...

  2. hdu 4587 2013南京邀请赛B题/ / 求割点后连通分量数变形。

    题意:求一个无向图的,去掉两个不同的点后最多有几个连通分量. 思路:枚举每个点,假设去掉该点,然后对图求割点后连通分量数,更新最大的即可.算法相对简单,但是注意几个细节: 1:原图可能不连通. 2:有 ...

  3. 更改bootstrap的默认样式

    很久没用bootstrap,对与按自己的需求修改样式都忘了. 一上来就添加了新的class类,重写css样式让其覆盖原有的样式,实际上不起作用.因为没考虑的选择器的优先级.面试的时候会问到一些这个问题 ...

  4. hdu 4975 A simple Gaussian elimination problem 最大流+找环

    原题链接 http://acm.hdu.edu.cn/showproblem.php?pid=4975 这是一道很裸的最大流,将每个点(i,j)看作是从Ri向Cj的一条容量为9的边,从源点除法连接每个 ...

  5. Java代码规范和质量检查插件-Checkstyle(官方资源)

    其实Checkstyle是一个JAR包,然后第三方开发者开发了Eclipse/IDEA的插件. 官网: https://github.com/checkstyle/checkstyle Eclipse ...

  6. Systemtap examples, Network - 4 Monitoring TCP Packets

    http://blog.163.com/digoal@126/blog/static/16387704020131014104256627/   例子来自tcpdumplike.stp脚本, 当tcp ...

  7. MySQL 索引及其用法

    一.索引的作用 一般的应用系统,读写比例在10:1左右,而且插入操作和一般的更新操作很少出现性能问题,遇到最多的,也是最容易出问题的,还是一些复杂的查询操作,所以查询语句的优化显然是重中之重. 在数据 ...

  8. js long类型的日期转成Date,字符串StringBuilder拼接

    longToDate.js //扩展Date的format方法 Date.prototype.format = function (format) { var o = { "M+" ...

  9. Material Theme

    Material Theme提供了一下功能: 1.系统widgets可以设置调色板 2.系统widgets的触摸反馈 3.Activity过渡动画 你可以根据你品牌的色彩来定义Material The ...

  10. POJ 题目3450 Corporate Identity(KMP 暴力)

    Corporate Identity Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 5493   Accepted: 201 ...