【发布时间】:2014-12-15 04:28:21
【问题描述】:
我尝试用不同的 ARCH(x64, i386) 和不同的工具链为我的 beaglebone black 交叉编译 linux 内核 3.14 很多时间。但是它们都不能正确启动。它总是停在
## Booting kernel from Legacy Image at 80007fc0 ...
Image Name: Linux-3.17.1+
Image Type: ARM Linux Kernel Image (uncompressed)
Data Size: 6732680 Bytes = 6.4 MiB
Load Address: 80008000
Entry Point: 80008000
Verifying Checksum ... OK
## Flattened Device Tree blob at 80f80000
Booting using the fdt blob at 0x80f80000
XIP Kernel Image ... OK
OK
Using Device Tree in place at 80f80000, end 80f92df6
Starting kernel ...
我认为我使用了不正确的工具链,所以我尝试使用 ti StarsWares 和 linaro-toolchain 中的工具链。但它仍然不起作用。我也觉得我需要使用 32bit 的 ubuntu 而不是我的 ubuntu 14.10(64bit),但还是不行。
最后,我尝试编译一个示例 c 程序并尝试在我的 beaglebone 上运行它。它说:
root@beaglebone:~\# ./test
-sh: ./test: No such file or directory
看来我使用了不正确的工具链。
我尝试使用内核配置文件:
git://github.com/beagleboard/kernel.git
但它仍然停留在:
Starting kernel ...
我的交叉编译工具链是。
我的内核构建命令是:
make ARCH=arm CROSS_COMPILE=/home/larry/develop/linaro-toolchain/gcc-linaro-arm-linux-gnueabihf-4.9-2014.09_linux/bin/arm-linux-gnueabihf-
make modules ARCH=arm CROSS_COMPILE=/home/larry/develop/linaro-toolchain/gcc-linaro-arm-linux-gnueabihf-4.9-2014.09_linux/bin/arm-linux-gnueabihf-
make modules_install INSTALL_MOD_PATH=mymodules ARCH=arm CROSS_COMPILE=/home/larry/develop/linaro-toolchain/gcc-linaro-arm-linux-gnueabihf-4.9-2014.09_linux/bin/arm-linux-gnueabihf-
make LOADADDR=0x80008000 uImage dtbs ARCH=arm CROSS_COMPILE=/home/larry/develop/linaro-toolchain/gcc-linaro-arm-linux-gnueabihf-4.9-2014.09_linux/bin/arm-linux-gnueabihf-
kernel .config 在这里:
我的 U-Boot 配置是:
`U-Boot# printenv
arch=arm
baudrate=115200
board=am335x
board_name=A335BNLT
board_rev=000B
bootcmd=gpio set 53; i2c mw 0x24 1 0x3e; run findfdt; mmc dev 0; if mmc rescan ; then echo micro SD card found;setenv mmcdev 0;else echo No micro SD card found, setting mmcdev to 1;setenv mmcdev 1;fi;setenv bootpart ${mmcdev}:2;mmc dev ${mmcdev}; if mmc rescan; then gpio set 54; echo SD/MMC found on device ${mmcdev};if run loadbootenv; then echo Loaded environment from ${bootenv};run importbootenv;fi;if test -n $uenvcmd; then echo Running uenvcmd ...;run uenvcmd;fi;gpio set 55; if run loaduimage; then gpio set 56; run loadfdt;run mmcboot;fi;fi;
bootdelay=1
bootdir=/boot
bootenv=uEnv.txt
bootfile=uImage
bootpart=0:2
console=ttyO0,115200n8
cpu=armv7
dfu_alt_info_emmc=rawemmc mmc 0 3751936
dfu_alt_info_mmc=boot part 0 1;rootfs part 0 2;MLO fat 0 1;MLO.raw mmc 100 100;u-boot.img.raw mmc 300 3C0;u-boot.img fat 0 1;uEnv.txt fat 0 1
dfu_alt_info_nand=SPL part 0 1;SPL.backup1 part 0 2;SPL.backup2 part 0 3;SPL.backup3 part 0 4;u-boot part 0 5;kernel part 0 7;rootfs part 0 8
ethact=cpsw
ethaddr=1c:ba:8c:95:c8:fa
fdt_high=0xffffffff
fdtaddr=0x80F80000
fdtfile=am335x-boneblack.dtb
findfdt=if test $board_name = A33515BB; then setenv fdtfile am335x-evm.dtb; fi; if test $board_name = A335X_SK; then setenv fdtfile am335x-evmsk.dtb; fi;if test $board_name = A335BONE; then setenv fdtfile am335x-bone.dtb; fi; if test $board_name = A335BNLT; then setenv fdtfile am335x-boneblack.dtb; fi
importbootenv=echo Importing environment from mmc ...; env import -t $loadaddr $filesize
kloadaddr=0x80007fc0
loadaddr=0x80200000
loadbootenv=load mmc ${mmcdev} ${loadaddr} ${bootenv}
loadfdt=load mmc ${bootpart} ${fdtaddr} ${bootdir}/${fdtfile}
loadramdisk=load mmc ${mmcdev} ${rdaddr} ramdisk.gz
loaduimage=load mmc ${bootpart} ${kloadaddr} ${bootdir}/${bootfile}
mmcargs=setenv bootargs console=${console} ${optargs} root=${mmcroot}
rootfstype=${mmcrootfstype}
mmcboot=echo Booting from mmc ...; run mmcargs; bootm ${kloadaddr} - ${fdtaddr}
mmcdev=0
mmcroot=/dev/mmcblk0p2 ro
mmcrootfstype=ext4 rootwait
mtdids=nand0=omap2-nand.0
mtdparts=mtdparts=omap2-nand.0:128k(SPL),128k(SPL.backup1),128k(SPL.backup2),128k(SPL.backup3),1920k(u-boot),128k(u-boot-env),5m(kernel),-(rootfs)
nandargs=setenv bootargs console=${console} ${optargs} root=${nandroot}
rootfstype=${nandrootfstype}
nandboot=echo Booting from nand ...; run nandargs; nand read ${loadaddr} ${nandsrcaddr} ${nandimgsize}; bootm ${loadaddr}
nandimgsize=0x500000
nandroot=ubi0:rootfs rw ubi.mtd=7,2048
nandrootfstype=ubifs rootwait=1
nandsrcaddr=0x280000
netargs=setenv bootargs console=${console} ${optargs} root=/dev/nfs
nfsroot=${serverip}:${rootpath},${nfsopts} rw ip=dhcp
netboot=echo Booting from network ...; setenv autoload no; dhcp; tftp ${loadaddr} ${bootfile}; tftp ${fdtaddr} ${fdtfile}; run netargs; bootm ${loadaddr} - ${fdtaddr}
nfsopts=nolock
ramargs=setenv bootargs console=${console} ${optargs} root=${ramroot}
rootfstype=${ramrootfstype}
ramboot=echo Booting from ramdisk ...; run ramargs; bootm ${loadaddr} ${rdaddr} ${fdtaddr}
ramroot=/dev/ram0 rw ramdisk_size=65536 initrd=${rdaddr},64M
ramrootfstype=ext2
rdaddr=0x81000000
rootpath=/export/rootfs
soc=am33xx
spiargs=setenv bootargs console=${console} ${optargs} root=${spiroot}
rootfstype=${spirootfstype}
spiboot=echo Booting from spi ...; run spiargs; sf probe ${spibusno}:0; sf read ${loadaddr} ${spisrcaddr} ${spiimgsize}; bootm ${loadaddr}
spibusno=0
spiimgsize=0x362000
spiroot=/dev/mtdblock4 rw
spirootfstype=jffs2
spisrcaddr=0xe0000
static_ip=${ipaddr}:${serverip}:${gatewayip}:${netmask}:${hostname}::off
stderr=serial
stdin=serial
stdout=serial
usbnet_devaddr=1c:ba:8c:95:c8:fa
vendor=ti
ver=U-Boot 2013.04-dirty (Jun 19 2013 - 09:57:14)
Environment size: 3877/131068 bytes
它花了我很多时间。任何人都可以帮助我吗? 谢谢。
【问题讨论】:
-
我想在你的桌面上安装 Linux 会有所帮助:首先,你会学习 Linux,其次,在 Linux 上交叉编译可能更容易。
-
您可能没有交叉编译问题。从
0x80007fc0引导对于 Beaglebone 来说似乎很典型,但对于其他 ARM 板则不然。尝试将 uImage 加载到0x80200000并将 DTB 加载到0x81200000,如 here 所述。这些地址必须在 bootcmd U-Boot 环境变量中修改。 -
“我尝试编译一个示例 c 程序并尝试在我的 beaglebone 上运行它...” -- 此失败很可能是共享库问题。使用
-staticGCC 编译/链接选项静态链接您的程序。 -
我在uboot中将uImage加载到0x80200000和DTB
0x81200000,但它仍然停在Starting kernel,我使用uboot默认配置,它可以启动kernel-3.8(系统默认) ,但无法从我的kernel-3.17(由我编译)启动。 @sawdust -
然后你需要开始解释你的构建环境是什么,你正在使用什么工具链,你用来构建内核的命令,以及 U-Boot 环境变量。通过editing it将此信息添加到您的问题中。
标签: cross-compiling embedded-linux beagleboneblack u-boot