覆盆子u-boot加载图像并从SD卡运行图像

时间:2013-06-20 05:29:58

标签: raspberry-pi u-boot

我已经在Raspberry PI上从https://github.com/gonzoua/u-boot-pi/tree/rpi编译并安装了u-boot。效果很好。它很好,效果很好(见http://arrizza.org/wiki/index.php/RPI_U-boot)。我可以使用s-rec版本的可执行文件加载示例应用程序。

现在我想创建一个图像,把它放在SD卡上(u-boot图像所在的同一张SD卡),然后加载并执行该图像。这与s-rec过程相同:通过s-rec加载图像,然后使用“go”执行,但不是通过串口加载,只需从SD卡上取下图像。

我尝试过使用:

load mmc 0 0x0100000 hello_world.bin

然后

go 0x0100000

加载好了:

U-Boot> fatload mmc 0 0x01000000 hello_world.bin
reading hello_world.bin
594 bytes read in 27222 ms (0 Bytes/s)
U-Boot> go 0x01000000
## Starting application at 0x01000000 ...

但是rPI会重新启动。

  • 我也尝试了使用相同结果的fatload

  • 我尝试使用./imagetool-uncompressed.py创建一个图像,然后使用load或fatload,但是没有快乐

  • 我尝试使用bootm加载/加载,但仍然没有去

还有其他可供我尝试的吗?

约翰

更新:@microMolvi指出我使用了错误的地址。我重新跑了:

U-Boot> load mmc 0 0x01001000 hello_world.bin 
reading hello_world.bin
594 bytes read in 27200 ms (0 Bytes/s)
U-Boot> go 0x01001000
## Starting application at 0x01001000 ...
<snip>about 100 garbage characters<snip>
<I pressed Enter here>
## Application terminated, rc = 0x0
U-Boot> 

这是printenv的输出:

U-Boot> printenv
arch=arm
baudrate=115200
board=rpi_b
board_name=rpi_b
bootargs=dma.dmachans=0x7f35 bcm2708_fb.fbwidth=656 bcm2708_fb.fbheight=416 bcm2708.boardrev=0xe bcm2708.serial=0x4e82105a smsc95xx.macaddr=B8:27:EB:82:10:5A sdhci-bcm2708.emmc_clock_freq=100000000 vc_mem.mem_base=0x1ec00000 vc_mem.mem_size=0x20000000  dwc_otg.lpm_enable=0 console=ttyAMA0,115200 kgdboc=ttyAMA0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait
bootcmd=if mmc rescan ${mmcdev}; then if run loadbootenv; then run importbootenv; fi; if run loadbootscript; then run bootscript; fi; fi
bootenv=uEnv.txt
bootscript=echo Running bootscript from mmc${mmcdev} ...; source ${loadaddr}
cpu=arm1176
filesize=0x252
importbootenv=echo Importing environment from mmc ...; env import -t $loadaddr $filesize
loadaddr=0x00200000
loadbootenv=fatload mmc ${mmcdev} ${loadaddr} ${bootenv}
loadbootscript=fatload mmc ${mmcdev} ${loadaddr} boot.scr
mmcdev=0
soc=bcm2835
stderr=serial,lcd
stdin=serial
stdout=serial,lcd
usbethaddr=B8:27:EB:82:10:5A
vendor=raspberrypi

Environment size: 1092/16380 bytes
U-Boot> 

2 个答案:

答案 0 :(得分:4)

好吧,看起来你不能只在任何地方加载bin文件。

这是我做的: 1)我重新加载了s-rec版本

U-Boot> loads
## Ready for S-Record download ...

## First Load Addr = 0x0C100000
## Last  Load Addr = 0x0C100251
## Total Size      = 0x00000252 = 594 Bytes
## Start Addr      = 0x0C100000
U-Boot> 

注意“Start Addr”,它是0x0C10-00000

2)我重置了rPI,然后将bin加载到0x0C10-0000

U-Boot> load mmc 0 0x0C100000 hello_world.bin
reading hello_world.bin
594 bytes read in 15644 ms (0 Bytes/s)

3)并从同一个地址运行它:

U-Boot> go 0x0C100000
## Starting application at 0x0C100000 ...
Example expects ABI version 6
Actual U-Boot ABI version 6
Hello World
argc = 1
argv[0] = "0x0C100000"
argv[1] = "<NULL>"
Hit any key to exit ... 

## Application terminated, rc = 0x0
U-Boot> 

我不确定默认地址0x0C10-0000来自何处,所以此时我还不知道如何在编译/链接期间更改它,但是这里有记录:

u-boot-pi-rpi/doc/README.standalone

这表示基于ARM的电路板(如rPI)已加载并在0x0C10-0000处启动:    应用程序的默认加载和起始地址如下:

                    Load address    Start address
    x86             0x00040000      0x00040000
    PowerPC         0x00040000      0x00040004
    ARM             0x0c100000      0x0c100000
    MIPS            0x80200000      0x80200000
    Blackfin        0x00001000      0x00001000
    NDS32           0x00300000      0x00300000
    Nios II         0x02000000      0x02000000

答案 1 :(得分:2)

在arch / arm / config.mk中有:

CONFIG_STANDALONE_LOAD_ADDR = 0xc100000

在文件示例/ standalone / .hello_world.cmd

cmd_examples/standalone/hello_world := arm-linux-gnueabi-ld.bfd   -g -Ttext 0xc100000 -o examples/standalone/hello_world -e hello_world examples/standalone/hello_world.o examples/standalone/libstubs.o -L /usr/lib/gcc-cross/arm-linux-gnueabi/4.7 -lgcc

这里-Ttext是0xc100000。这意味着hello_world入口地址为0xc100000。因此必须将hello.bin加载到内存地址0xc100000。