UBOOT添加命令的执行流程

发布者:泉趣人最新更新时间:2023-09-07 来源: elecfans关键字:UBOOT  执行流程 手机看文章 扫描二维码
随时随地手机看文章

BootLoader(引导装载程序)是嵌入式系统软件开发的第一个环节,它把操作系统和硬件平台衔接在一起,对于嵌入式系统的后续软件开发十分重要,在整个开发中也占有相当大的比例。U-BOOT是当前比较流行、功能强大的BootLoader,可以支持多种体系结构。LH7A400是Sharp公司生产的一款基于ARM922T内核的32位RISC芯片,本文详细介绍U-BOOT的功能、特点以及在LH7A400处理器上的移植过程。希望对大家有所帮助,更好的了解uboot命令的执行流程。

具体内容如下:
U-Boot的命令为用户提供了交互功能,并且已经实现了几十个常用的命令。如果开发板需要很特殊的操作,可以添加新的U-Boot命令。

U-Boot的每一个命令都是通过U_Boot_CMD宏定义的。这个宏在include/command.h头文件中定义,每一个命令定义一个cmd_tbl_t结构体。

#define U_BOOT_CMD(name,maxargs,rep,cmd,usage,help) /
cmd_tbl_t __u_boot_cmd_##name Struct_Section =
{#name, maxargs, rep, cmd, usage, help}
这样每一个U-Boot命令有一个结构体来描述。结构体包含的成员变量:命令名称、最大参数个数、重复数、命令执行函数、用法、帮助。

从控制台输入的命令是由common/command.c中的程序解释执行的。(这就是我要找的)find_cmd()负责匹配输入的命令,从列表中找出对应的命令结构体。

基于U-Boot命令的基本框架,来分析一下简单的icache操作命令,就可以知道添加新命令的方法。

(1)定义CACHE命令。在include/cmd_confdefs.h中定义了所有U-Boot命令的标志位。

#define CFG_CMD_CACHE 0x00000010ULL /* icache, dcache */
如果有更多的命令,也要在这里添加定义。

(2)实现CACHE命令的操作函数。下面是common/cmd_cache.c文件中icache命令部分的代码。

#if (CONFIG_COMMANDS & CFG_CMD_CACHE)
static int on_off (const char *s)
{ //这个函数解析参数,判断是打开cache,还是关闭cache
if (strcmp(s, "on") == 0) { //参数为“on”
return (1);
} else if (strcmp(s, "off") == 0) { //参数为“off”
return (0);
}
return (-1);
}

int do_icache ( cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
{ //对指令cache的操作函数
switch (argc) {
case 2: /* 参数个数为1,则执行打开或者关闭指令cache操作 */
switch (on_off(argv[1])) {
case 0: icache_disable(); //打开指令cache
break;
case 1: icache_enable (); //关闭指令cache
break;
}
/* FALL TROUGH */
case 1: /* 参数个数为0,则获取指令cache状态*/
printf ("Instruction Cache is %s/n",
icache_status() ? "ON" : "OFF");
return 0;
default: //其他缺省情况下,打印命令使用说明
printf ("Usage:/n%s/n", cmdtp->usage);
return 1;
}
return 0;
}
……
U_Boot_CMD( //通过宏定义命令
icache, 2, 1, do_icache, //命令为icache,命令执行函数为do_icache()
"icache - enable or disable instruction cache/n", //帮助信息
"[on, off]/n"
" - enable or disable instruction cache/n"
);
……
#endif
U-Boot的命令都是通过结构体__U_Boot_cmd_##name来描述的。根据U_Boot_CMD在include/command.h中的两行定义可以明白。 #define U_BOOT_CMD(name,maxargs,rep,cmd,usage,help) /
cmd_tbl_t __u_boot_cmd_##name Struct_Section =
{#name, maxargs, rep, cmd, usage, help}
还有,不要忘了在common/Makefile中添加编译的目标文件。

(3)打开CONFIG_COMMANDS选项的命令标志位。这个程序文件开头有#if语句需要预处理是否包含这个命令函数。CONFIG_COMMANDS选项在开发板的配置文件中定义。例如:SMDK2410平台在include/configs/smdk2410.h中有如下定义。

/***********************************************************
* Command definition
***********************************************************/
#define CONFIG_COMMANDS /
(CONFIG_CMD_DFL | /
CFG_CMD_CACHE | /
CFG_CMD_REGINFO | /
CFG_CMD_DATE | /
CFG_CMD_ELF)
按照这3步,就可以添加新的U-Boot命令。


关键字:UBOOT  执行流程 引用地址:UBOOT添加命令的执行流程

上一篇:uboot 添加hello命令
下一篇:关于linux下的嵌入式文件系统以及flash文件系统选择

推荐阅读最新更新时间:2024-11-12 11:20

mini2440_NFS 利用uboot启动
本文记录mini2440开发板如何利用uboot通过nfs服务来启动内核。 背景: 放了好久的板子,今天又得重新拿来使唤,之前换了机子,虽说除了kernel和rootfs通过nfs挂载的,但u-boot死活进不去...搞定u-boot,nfs又不好使了。 环境: 1.OS:ubuntu11.10; 2.串口工具:C-kermit 涉及: 1.nfs中exports的配置; 2.u-boot中env的设置; 3.遇到的问题... 一、nfs中配置文件:/etc/exports $sudo vim /etc/exports 1.添加开发板要挂载的nfs目录: /your/nfsroo
[单片机]
AT91RM9200的UBOOT启动烧写过程
Uboot 烧写过程 1. 一开始令BMS=1(拔掉跳线),则系统从片内ROM中启动。内部启动程序初始化调试串口和USB设备接口从外部载入启动程序。在Windows平台下,启动超级终端,发送文件loader.bin和u-boot.bin到SDRAM,成功启动u-boot. 2. 启动了u-boot后就利用u-boot的功能,发送boot.bin和u-boot.gz到SDRAM,然后再拷贝到FLASH,那么FLASH里面就固化了启动程序boot.bin和u-boot.gz。 3. 烧写FLASH的过程如下: U-Boot protect off all (注:清除Flash全部块的写保护) U-Boot erase a
[单片机]
mini2440uboot移植-基本操作指令
继续uboot移植的基础知识学习 1.首先学习下nandfalsh基本操作指令 nand info(显示可以使用的nand flash) nand device (显示或设定当前使用的nand flash) nand read addr off size (nand flash读取命令,从nand的off偏移地址处读取size字节的数据到SDRAM的addr地址) nand write addr off size (nand flash烧写命令,将SDRAM的addr地址处的size字节的数据烧写到nand flash的off偏移地址) nand write ] addr off size(烧写yaffs映
[单片机]
Exynos4412 Uboot 移植(一)—— Uboot 编译流程分析
Uboot 所用版本 u-boot-2013.01 u-boot-2013.01 中有上千文件,要想了解对于某款开发板,使用哪些文件、哪些文件首先执行、可执行文件占用内存的情况,最好的方法就是阅读它的Makefile。 根据顶层Readme文件的说明: 可以知道如果使用开发板board/ board_name ,就先执行“make board_name _config”命令进行配置,然后执行“make all”, 就可以生成如下3个文件: U-Boot.bin:二进制可执行文件,它就是可以直接烧入eMMC中的文件。 U-Boot : ELF格式的可执行文件。 U-Boot.srec : 摩托罗拉格式的可执行
[单片机]
Exynos4412 <font color='red'>Uboot</font> 移植(一)—— <font color='red'>Uboot</font> 编译<font color='red'>流程</font>分析
uboot-2011.12移植到S3C2440(三)——硬件初始化:看门狗、中断、时钟
/* * turn off dog, see C18P3 */ ldr r0, =pWTCON mov r1, #0x0 str r1, /* * C14 * mask all IRQs by setting all bits in the INTMR - default */ mov r1, #0xffffffff ldr r0, =INTMSK str r1, ldr r1, =0x7fff ldr r0, =INTSUBMSK str r1, /* * FCLK:HCLK:P
[单片机]
Exynos4412 Uboot 编译工具 —— 交叉工具链 arm-linux-gcc 的安装
一、什么是交叉编译? 在开发主机运行编译器编译内核、应用程序。内核和程序在目标机上运行,这个编译过程被称为交叉编译。编译器运行在开发主机(通常是X86体系的PC机)上,编译出的的代码是目标机体系结构的,如:ARM。 在主机上除了编译还可以完成制作根文件系统地工作。 嵌入式Linux开发,交叉编译使用开源GNU工具集,gcc等。 二、制作交叉编译器 我们可以自己制作交叉编译器,需要gcc,glibc,二进制工具集 ,通过crosstool,crosstool-ng脚本来实现。这里不展示制作过程。 三、安装交叉编译器 1、解压工具链压缩包 1)将gcc-4.6.4.tar.xz 拷贝到 toolschain文
[单片机]
Exynos4412 <font color='red'>Uboot</font> 编译工具 —— 交叉工具链 arm-linux-gcc 的安装
S3C2440移植uboot之支持NORFLASH
上节S3C2440移植uboot之支持NAND启动修改了代码支持了NAND启动。这节我们分析uboo使其支持NORFLASH的操作。 目录 1.分析启动错误 2.修改代码 3.在匹配数组中添加我们的NORFLASH 4.然后重新烧写 5.解决栈设置错误的问题 1.分析启动错误   上一节启动uboot出现如下所示,我们搜索下错误代码Flash:   上面的Flash: *** failed *** 是属于uboot第二阶段函数board_init_r()里的代码, 代码如下所示(位于arch/arm/lib/board.c): /*第二阶段*/ void board_init_r(gd_t *id, ulong
[单片机]
S3C2440移植<font color='red'>uboot</font>之支持NORFLASH
arm uboot平台烧录信息
一、环境变量展示 U-Boot print baudrate=115200 bootargs=m=128M console=/dev/null initrd=0x23000000,17000000 mtdparts=atmel_nand:3M(kernel)ro,3M(rootfs),4M(wxjn_config),-(jnc_soft) root=/dev/ram0 rw bootcmd=nand read.jffs2 0x22000000 0x0 0x300000;nand read.jffs2 0x23000000 0x300000 0x300000;bootm 0x22000000 bootdelay=1 eth1a
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
更多往期活动

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved