uboot命令行,uboot命令详解
我们知道uboot的最终目的是将OS内核从flash复制到ram,并跳转到OS内核的地址,将处理器的控制权交给OS。U-boot一个很重要的特点就是用命令来操作底层。通过执行这些命令,我们可以实现上述目标。这里实现了一个简单的led_blink硬件操作,分析了uboot从命令执行到led操作的过程。根据这个例子,我们可以对包括NAND、USB、串口等驱动的实现过程有一个比较清晰的了解。以及uboot的移植。
常用目录下是常用的命令文件,文件名格式为cmd_xxx.c,如图所示:
在这个目录中,构建我们的命令和由命令指定的操作函数。操作函数调用驱动程序目录中的驱动程序,即直接操作硬件的代码。drivers目录包含了各种特定的设备驱动,基本都是通用的。它们通过宏从外部引入与平台或开发板相关的功能。如图所示:
从单片机的角度来看,drivers目录下的驱动文件是由同一个目录的makefile进行预处理、编译和汇编,链接器从库文件中获取所需代码,并复制到生成的可执行文件中。因此,我们需要在makefile中为我们自己编写的驱动程序文件和命令文件指定编译规则。
下面是led_blink具体实现过程。
首先从功能上来说,我们需要建立两个文件来实现从上层的命令操作到下层的物理操作,一个是在drivers/GPIO/SML 2440 _ LED _ blink . c文件中;一个在
文件。这样我们就可以按照uboot规则在sml2440_led_blink.c文件中写驱动,在cmd_ledblink.c文件中写命令。
Cmd_ledblink.c如下:
//common/cmd_ledblink.c
#包含常用内容. h
#include命令
int do_led(void)
s 3c 24x 0 _ led _ blink();
返回0;
U_BOOT_CMD(
led,2,1,do_led,
ledblink,仅用于测试,
测试说明,让led闪烁
学习指导和驾驶过程
分析:
u _ BOOT _ CMD();是建立指令的格式(宏),led是指令的名称,2是指令的参数个数,1是指令可以重复执行,do_led是指令执行的函数指针。所以我们编写了do_led的另一个函数,其内容是调用底层驱动的s 3c 24 x 0 _ LED _ blink();功能。头文件的自我分析。
drivers/gpio/SML 2440 _ led _ blink . c文件的内容如下:
//drivers/gpio/SML 2440 _ led _ blink . c
#包含常用内容. h
#include asm/arch/s3c24x0_cpu.h
静态无效延迟(无符号长循环)
__asm__ volatile (1:n
subs %0,%1,#1n
bne 1b:=r (循环): 0 (循环));
int s3c24x0_led_init(void)
struct s 3c 24 x 0 _ led * led=s 3c 24 x 0 _ get _ base _ led();
led-GPF con=0x 55;
led-gp fup=0x ff;
led-GPF dat=0;
返回0;
int s3c24x0_led_blink(void)
int N=10
struct s 3c 24 x 0 _ led * led=s 3c 24 x 0 _ get _ base _ led();
while(N - ){
led-GPF dat=0x ff;
延时(20000000);
led-GPF dat=0x 00;
延时(20000000);
返回0;
}
解析:首先我们知道上层的指令led会调用s3c24x0_led_blink()函数,我们继续在底层写。为了实现这个功能,满足底层操作的要求,我们需要操作控制led的寄存器。相信led闪烁的方式可以理解,就是io引脚的延时升降。struct s 3c 24 x 0 _ led * led=s 3c 24 x 0 _ get _ base _ led();http://blog.csdn.net/seek_0380/article/details/8764777在这篇博客中解释说,这是为了取出一个第一个地址固定的内存空间,以满足自定义寄存器的要求。我们在s3c24x0.h中定义了一个连续的寄存器空间具体实现方法请看链接博文(这里只是一个实现技巧)。然后将数据写入寄存器。
然后,为了生成可执行文件,我们还需要修改makefile并指定规则以使源文件被编译。将以下内容添加到drivers/gpio下的makefile中:
COBJS-$(CONFIG _ SML 2440 _ LED)=SML 2440 _ LED _ blink . o
然后它将被连接以生成一个静态库
LIB :=$(obj)libgpio.a
对于common下面的makefile文件,添加以下代码。
COBJS-y=cmd_ledblink.o
这样我们把编译好的uboot镜像文件下载到flash里,在终端输入help,就会看到led驱动及其描述。当我们键入led时,我们将看到在led闪烁十次后,终端将返回到命令接收模式。这样就完成了uboot下led_blink的实现。