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

本文转载自: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/文件夹中,可以选择一个简单点的文件打开看看,就可以看到命令接口的基本结构如下:

12345678910
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提供了一个方便的接口函数来实现这一目的:

12345678
/* * 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);

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

自动下载程序

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

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
#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数组中。此代码结构很好进行扩展,如要加入新的选项,仿照目前的结构添加即可。

时间: 2024-10-11 22:02:52

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

linux中添加自定义命令

centos下设置alias别名,比较简单,例如: vim /root/.bashrc addalias rm='rm -i' Linux alias设置指令的别名命令详解 功能说明:设置指令的别名.语 法:alias[别名]=[指令名称]补充说明:用户可利用alias,自定指令的别名.若仅输入alias,则可列出目前所有的别名设置. alias的效力仅及于该次登入的操作.若要每次登入是即自动设好别名,可在.profile或.cshrc中设定指令的别名.参 数:若不加任何参数,则列出目前所有的别

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

If you need to access the application arguments that were passed to SpringApplication.run(-?), you can inject a org.springframework.boot.ApplicationArguments bean. The ApplicationArguments interface provides access to both the raw String[] arguments

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

一:任务 1.任务 文件的上传 文件的下载 二:文件的上传 1.新建一个对象 FileInfo.java 1 package com.cao.dto; 2 3 public class FileInfo { 4 private String path; 5 public FileInfo(String path) { 6 this.path=path; 7 } 8 public String getPath() { 9 return path; 10 } 11 public void setPa

Eclipse常用命令+ 简单的自动售票程序

Alt+/  快速打出一个类. 比如Scanner类. 再输入的时候可以Scan 到这里的时候使用“ALT+/” 这时就会发现和Scanner相关的都以下拉菜单的方式弹出来来了,这里选择第一个 Scanner类会直接出来,同时代码首行会加入 import java.util.Scanner.*; Scanner是个输入类,JAVA没有自动加载,使用这个类需要IMPORT这个包. 选定多行的方法: SHIFT+↑  或者 SHIFT+↓         选定多行加注释: CTRL+/ 单行加注释C

uip移植telnetd并添加自定义命令

刚刚移植了一下uip的telnetd,还是比较简单方便的. 首先添加文件,注意usershell是自己写的. 在tcp.c中添加tcp端口监听程序 添加#include "telnetd.h" void tcp_demo_appcall(void) { if(uip_conn->lport == HTONS(TCP_ClinetPort)) { tcp_client_demo_appcall(); } else if(uip_conn->lport == HTONS(80)

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

Thymeleaf是一个java类库,他是一个xml/xhtml/html5的模板引擎和Struts框架的freemarker模板类似,可以作为mvc的web应用的view层. Thymeleaf还提供了额外的模块与Spring MVC集成,所以我们可以使用Thymeleaf完全替代jsp. spring Boot 通过org.springframework.boot.autoconfigure.thymeleaf包对Thymeleaf进行了自动配置. 通过ThymeleafAutoConfig

在OpenSSL中添加自定义加密算法

一.简介 本文以添加自定义算法EVP_ssf33为例,介绍在OpenSSL中添加自定义加密算法的方法 二.步骤 1.修改crypto/object/objects.txt,注册算法OID,如下: rsadsi 3 255 : SSF33 : ssf33 2.进入目录:crypto/object/,执行如下命令,生成算法的声明 perl objects.pl objects.txt obj_mac.num obj_mac.h 3.在crypto/evp/下添加e_ssf33.c,内容如下 #inc

springboot(十一):Spring boot中mongodb的使用

mongodb是最早热门非关系数据库的之一,使用也比较普遍,一般会用做离线数据分析来使用,放到内网的居多.由于很多公司使用了云服务,服务器默认都开放了外网地址,导致前一阵子大批 MongoDB 因配置漏洞被攻击,数据被删,引起了人们的注意,感兴趣的可以看看这篇文章:场屠戮MongoDB的盛宴反思:超33000个数据库遭遇入侵勒索,同时也说明了很多公司生产中大量使用mongodb. mongodb简介 MongoDB(来自于英文单词"Humongous",中文含义为"庞大&qu

Ubuntu基础 卸载boot中不需要的内核

1 查看/boot中的文件 2 查看我们正在使用的内核版本 3 使用命令卸载内核 我要卸载 4.2.0-16版本的内核 输入Y 4 效果 我们在查看boot中的文件时,