uboot命令行,uboot命令详解

  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的实现。

uboot命令行,uboot命令详解