【发布时间】:2013-09-05 17:29:18
【问题描述】:
我想知道如何为内核设置正确的MACH_TYPE 或arch_id。我搜索并找到了至少 2 个内核将挂在“Starting Kernel ...”的引用。这些都有相同的答案。正确设置您的机器类型。但随后都没有提到如何做到这一点。有人知道怎么做吗?
Pretty good explanation for the hang. 和 Another good description.
这两种情况都与我尝试引导内核时的体验相近。它卡在“正在启动内核...”上并且不会继续。我已经从 .configs 构建了几次内核,这些 .configs 应该完全适合我的模型。
Timesys (LinuxLink) 提供了一个 .config,它应该与他们提供的免费构建服务的内核相匹配。但这也行不通。如果我使用他们预先构建的内核,它启动没有问题。所以我知道这不是我的 u-boot 或我如何配置我的 SD 卡。问题一定来自内核构建。
我像这样运行我的 make:make ARCH=arm CROSS_COMPILE=${PATH_TO_TOOLCHAIN}/bin/armv7l-timesys-linux-gnueabi- uImage 并按如下方式制作我的图像:sudo mkimage -A arm -O linux -T kernel -C none -a 0x70800000 -e 0x70800000 -n "Linux-2.6.35-ts-armv7l" -d arch/arm/boot/uImage ../../uImage
我正在使用飞思卡尔 i.MX53 评估板。当我尝试运行内核时:
U-Boot 2009.08-dirty (Aug 02 2013 - 19:57:03)
CPU: Freescale i.MX53 family 2.1V at 800 MHz
mx53 pll1: 800MHz
mx53 pll2: 400MHz
mx53 pll3: 432MHz
mx53 pll4: 455MHz
ipg clock : 66666666Hz
ipg per clock : 33333333Hz
uart clock : 66666666Hz
cspi clock : 108000000Hz
ahb clock : 133333333Hz
axi_a clock : 400000000Hz
axi_b clock : 200000000Hz
emi_slow clock: 133333333Hz
ddr clock : 400000000Hz
esdhc1 clock : 80000000Hz
esdhc2 clock : 80000000Hz
esdhc3 clock : 80000000Hz
esdhc4 clock : 80000000Hz
nfc clock : 26666666Hz
Board: MX53-LOCO 1.0 Rev. B
Boot Reason: [POR]
Boot Device: SD
I2C: ready
DRAM: 1 GB
MMC: FSL_ESDHC: 0,FSL_ESDHC: 1
In: serial
Out: serial
Err: serial
Serial reinitilized!
Net: got MAC address from IIM: 00:04:9f:01:f7:ce
FEC0 [PRIME]
Hit any key to stop autoboot: 0
mmc0 is current device
MMC read: dev # 0, block # 2048, count 8192 ... 8192 blocks read: OK
## Booting kernel from Legacy Image at 70800000 ...
Image Name: Linux-2.6.35-ts-armv7l
Image Type: ARM Linux Kernel Image (uncompressed)
Data Size: 2999932 Bytes = 2.9 MB
Load Address: 70800000
Entry Point: 70800000
Verifying Checksum ... OK
XIP Kernel Image ... OK
OK
Starting kernel ...
u-boot 环境:
bootdelay=3
baudrate=115200
netdev=eth0
ethprime=FEC0
uboot=u-boot.bin
kernel=uImage
nfsroot=/opt/eldk/arm
bootargs_base=setenv bootargs console=ttymxc0,115200
bootargs_nfs=setenv bootargs ${bootargs} root=/dev/nfs ip=dhcp nfsroot=${serverip}:${nfsroot},v3,tcp
bootcmd_net=run bootargs_base bootargs_nfs; tftpboot ${loadaddr} ${kernel}; bootm
bootcmd=run bootcmd_mmc
ethact=FEC0
lcd=video=mxcdi0fb:RGB24,SEIKO-WVGA di0_primary
bootargs_mmc=setenv bootargs ${bootargs} gpu_nommu ${lcd} ip=dhcp root=/dev/mmcblk0p1 rootwait rw
bootargs=console=ttymxc0,115200 gpu_nommu video=mxcdi0fb:RGB24,SEIKO-WVGA di0_primary ip=dhcp root=/dev/mmcblk0p1 rootwait rw
bootcmd_mmc=run bootargs_base bootargs_mmc; mmc dev 0; mmc read ${loadaddr} 0x800 0x2000; bootm
loadaddr=0x70800000
stdin=serial
stdout=serial
stderr=serial
【问题讨论】:
-
你的机器支持
earlyprintk吗?如果是这样,您可以启用它并访问更多调试输出。 -
当你“制作uImage”时,内核已经为你运行了mkimage。您将标头放在标头上,我认为您的挂起是因为您正在尝试执行标头而不是内核入口代码...(uImage 是带有 u-boot 标头的 zImage 的名称)
-
Freescale 的内核启动前代码与其他 ARM SoC 有点不同,因为机器 ID 用于在解压过程中指定串行端口。如果机器 ID 未被识别,则
putc()代码将挂起的可能性为 50/50。请显示更多 U-Boot 输出。所以你将uImage安装到SD卡上?你的bootdef变量是什么? @unixsmurf 指出了一个需要首先解决的问题。在 uImage 的开头做一个od看看你是否真的有一个双标题。 -
我现在正在检查双标头。
-
@eepp 我似乎无法编译 earlyprintk。我会继续努力。应该不会花太长时间。
标签: linux-kernel arm cross-compiling embedded-linux u-boot