交叉编译linux内核为beaglebone black

时间:2014-10-20 08:32:03

标签: cross-compiling embedded-linux beagleboneblack u-boot

我尝试用不同的ARCH(x64,i386)和不同的工具链对我的beaglebone黑色交叉编译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中的工具链。但它仍然无效。我还认为我需要使用32位ubuntu而不是我的ubuntu 14.10(64位),但它仍然不起作用。

最后,我尝试编译一个示例c程序并尝试在我的beaglebone上运行它。它说:

root@beaglebone:~\# ./test 
-sh: ./test: No such file or directory

似乎我使用了不正确的工具链。

我尝试使用内核配置文件:

git://github.com/beagleboard/kernel.git

但它仍然停留在:

Starting kernel ...

我的交叉编译工具链是。

linaro toolchain

我的内核构建命令是:

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-

内核.config在这里:

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

我花了很多时间。有人可以帮帮我吗? 感谢。

4 个答案:

答案 0 :(得分:1)

我们遇到了与Beagleboard xM类似的问题。我们按照维基页面上的步骤进行操作,但它总是用来挂起启动内核....

其中一个最奇怪的解决方案是使用HDMI线将其插入显示器,而不是使用minicom或其他串行控制台。早些时候我们没有配备支持HDMI的显示器......但是当我们更换显示器并插入HDMI ......那里就是受到追捧的Angstrom标志和登录屏幕。

我搜索了很多原因。还没有回复,但也许您可以更改bootargs中的控制台参数。我们使用标准ttyS0将其更改为ttyO2并尝试或只是尝试插入HDMI线缆。

答案 1 :(得分:1)

我在我的debian预装BBB上遇到了同样的麻烦。我编译了3.14内核,当我在BBB上尝试它时,它常常陷入“启动内核......”

但我的错误是我只用zImage替换了/boot/uboot/中的am335x-boneblack.dtb。当我将/boot/uboot/dtbs/中的am335x-boneblack.dtb替换为我在3.14中编译的kernel_dir/arch/arm/boot/dts时,它就开始工作了。可以在modules_install中找到新的/lib/modules。并且不要忘记使用新模块(从{{1}}命令)复制目录到BBB的{{1}}

答案 2 :(得分:0)

root@beaglebone:~\# ./test -sh: ./test: No such file or directory

此问题归因于shared library issue与rootfs和您的工具链不同。

如何验证..?

compile the code with statically linked

例如arm-none-linux-gnueabi-gcc hello.c -static -o hello

并尝试执行。

同时检查此Linux Cant find dynamically linked applications

答案 3 :(得分:0)

我遇到了类似的问题,最后通过将dtb放在0x88000000来解决它。 我猜原来的位置可能与内核重叠......