本文主要是介绍移植Linux2.6.39到杨创utu2440,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
http://blog.csdn.net/panzhenjie/article/details/6443311
移植是基于比较新的官方的2.6.39的内核,下载下来linux-2.6.39.tar.bz2,然后解压。
- tar jxvf linux-2.6.39.tar.bz2
进入内核目录,把最接近utu2440的默认配置文件拷贝出来。
- cd linux-2.6.39cp arch/arm/configs/s3c2410_defconfig .config
然后进行配置
- make menuconfig
暂时没有什么需要修改的,直接就用默认的编译。
- make uImage
漫长的等待之后,会在arch/arm/boot下产生一个uImage文件,这就是编译出来的给uboot使用的内核了。
- OBJCOPY arch/arm/boot/ImageKernel: arch/arm/boot/Image is readyAS arch/arm/boot/compressed/head.oGZIP arch/arm/boot/compressed/piggy.gzipCC arch/arm/boot/compressed/misc.oCC arch/arm/boot/compressed/decompress.oSHIPPED arch/arm/boot/compressed/lib1funcs.SAS arch/arm/boot/compressed/piggy.gzip.oAS arch/arm/boot/compressed/lib1funcs.oLD arch/arm/boot/compressed/vmlinuxOBJCOPY arch/arm/boot/zImageKernel: arch/arm/boot/zImage is readyUIMAGE arch/arm/boot/uImage
把uImage拷贝到tftp的文件夹下,启动板子,首先要配置uboot从tftp下载kernel
- bootdelay=1baudrate=115200ethaddr=00:0c:20:02:0a:5bnetmask=255.255.255.0bootcmd=tftp 0x32000000 uImage; bootm 0x32000000ipaddr=192.168.1.200bootargs=console=ttySAC0,115200 root=/dev/nfs rw nfsroot=192.168.1.100:/home/zhenjie/development/nfsroot ip=192.168.1.200:192.168.1.100:192.168.1.1:255.255.255.0 init=/linuxrcserverip=192.168.1.100stdin=serialstdout=serialstderr=serial
配置完成后重启,板子下载kernel运行,出现如下信息。
- ## Booting image at 32000000 ... Image Name: Linux-2.6.39 Created: 2011-05-24 13:05:07 UTC Image Type: ARM Linux Kernel Image (uncompressed) Data Size: 2109548 Bytes = 2 MB Load Address: 30108000 Entry Point: 30108000 Verifying Checksum ... OKOKStarting kernel ...Uncompressing Linux... done, booting the kernel.Error: unrecognized/unsupported machine ID (r1 = 0x0000147c).Available machine support:ID (hex) NAME000000c1 SMDK24100000015b IPAQ-H19400000039f Acer-N3500000290 Acer-N300000014b Simtec-BAST000002a8 Nex Vision - Otom 1.100000400 AML_M5900000005b4 TCT_HAMMER000001db Thorcom-VR100000000454 QT2410000005d2 JIVE000003fe SMDK2413000003f1 SMDK241200000377 S3C241300000474 VSTMS00000695 SMDK2416000002de Simtec-Anubis0000034a Simtec-OSIRIS00000250 IPAQ-RX37150000016a SMDK2440000002a9 NexVision - Nexcoder 244000000707 AT2440EVB000007cf MINI244000000518 GTA02000003b8 HP iPAQ RX19500000043c SMDK2443Please check your kernel config and/or bootloader.
这个主要是因为uboot传过来的id无法和列表里的匹配。
因为utu2440烧写uboot速度极为缓慢,不方便调试,所以就采取uboot不变,尽可能修改内核的策略。
在arch/arm/tools下有个文件mach-types,修改里面的一行id配置,0x0000147c=5244
- s3c2440 ARCH_S3C2440 S3C2440 362改成s3c2440 ARCH_S3C2440 S3C2440 5244
然后重新make并下载至板子,这次内核成功启动,但是输出一堆的乱码。
这个应该是串口的波特率设置不对,正好见到网上有篇文章,得知是因为uboot和kernel设置的时钟频率不一样。
于是修改之,arch/arm/mach-s3c2440/mach-smdk2440.c
- static void __init smdk2440_map_io(void){s3c24xx_init_io(smdk2440_iodesc, ARRAY_SIZE(smdk2440_iodesc));s3c24xx_init_clocks(16934400);s3c24xx_init_uarts(smdk2440_uartcfgs, ARRAY_SIZE(smdk2440_uartcfgs));}s3c24xx_init_clocks(16934400);改成s3c24xx_init_clocks(12000000);
重新make并下载,串口终于可以正常输出了。
但是出现了kernel panic然后停住了,看了看串口信息,nfs没有成功加载
- VFS: Unable to mount root fs via NFS, trying floppy.VFS: Cannot open root device "nfs" or unknown-block(2,0)
既然kernel已经有了nfs的支持,那会不会是以太网驱动有问题那?于是转去看以太网模块。
发现在arch/arm/mach-s3c2440/mach-smdk2440.c里完全没有dm9000的踪迹,看来标准的smdk2440是没有包含dm9000。
于是找了下其他文件,发现mach-mini2440.c里有dm9000的配置代码,于是华丽得Ctrl+C, Ctrl+V。
再根据schematic修改dm9000的片选和中断GPIO。
- #include <linux/dm9000.h>/* DM9000AEP 10/100 ethernet controller */#define MACH_SMDK2440_DM9K_BASE (S3C2410_CS3 + 0x300)static struct resource smdk2440_dm9k_resource[] = {[0] = {.start = MACH_SMDK2440_DM9K_BASE,.end = MACH_SMDK2440_DM9K_BASE + 3,.flags = IORESOURCE_MEM},[1] = {.start = MACH_SMDK2440_DM9K_BASE + 4,.end = MACH_SMDK2440_DM9K_BASE + 7,.flags = IORESOURCE_MEM},[2] = {.start = IRQ_EINT9,.end = IRQ_EINT9,.flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHEDGE,}};/* * The DM9000 has no eeprom, and it's MAC address is set by * the bootloader before starting the kernel. */static struct dm9000_plat_data smdk2440_dm9k_pdata = {.flags = (DM9000_PLATF_16BITONLY | DM9000_PLATF_NO_EEPROM),};static struct platform_device smdk2440_device_eth = {.name = "dm9000",.id = -1,.num_resources = ARRAY_SIZE(smdk2440_dm9k_resource),.resource = smdk2440_dm9k_resource,.dev = {.platform_data = &smdk2440_dm9k_pdata,},};static struct platform_device *smdk2440_devices[] __initdata = {&s3c_device_ohci,&s3c_device_lcd,&s3c_device_wdt,&s3c_device_i2c0,&s3c_device_iis,&smdk2440_device_eth,};
这下,网络也起来了,出现了如下信息
- VFS: Mounted root (nfs filesystem) on device 0:12.Freeing init memory: 152KFailed to execute /linuxrc. Attempting defaults...Kernel panic - not syncing: No init found. Try passing init= option to kernel. See Linux Documentation/init.txt for guidance.
这证明nfs已经连上了,下面要做的是做个最简单的rootfs了。
make buildroot时提示没有makeinfo,安装texinfo即可。
于是把buildroot做好的tar包解压到nfs的文件夹。
- sudo tar xvf output/images/rootfs.tar -C ~/development/nfsroot/
重启看到输出信息有所变化了
- VFS: Mounted root (nfs filesystem) on device 0:12.Freeing init memory: 152KKernel panic - not syncing: Attempted to kill init!Backtrace:[<c003b390>] (dump_backtrace+0x0/0x110) from [<c030e240>] (dump_stack+0x18/0x1c) r6:c0407140 r5:c0407140 r4:c0423178[<c030e228>] (dump_stack+0x0/0x1c) from [<c030e2a0>] (panic+0x5c/0x180)[<c030e244>] (panic+0x0/0x180) from [<c0050f0c>] (do_exit+0xb0/0x614) r3:60000013 r2:c3819e4c r1:00000001 r0:c039e05d r7:c3819fb0[<c0050e5c>] (do_exit+0x0/0x614) from [<c005175c>] (do_group_exit+0x90/0xc0) r7:c3819fb0[<c00516cc>] (do_group_exit+0x0/0xc0) from [<c005b794>] (get_signal_to_deliver+0x304/0x33c) r4:0830009f[<c005b490>] (get_signal_to_deliver+0x0/0x33c) from [<c003a620>] (do_signal+0x84/0x55c)[<c003a59c>] (do_signal+0x0/0x55c) from [<c003afc8>] (do_notify_resume+0x1c/0x50)[<c003afac>] (do_notify_resume+0x0/0x50) from [<c0038874>] (work_pending+0x24/0x28) r4:00000008
在网上查了下,原来是因为buildroot的用EABI编译的,而kernel的CONFIG_AEABI选项没有打开,所以不兼容。
那就把kernel的CONFIG_AEABI打开重新编译运行,成功进入shell,一切搞定!
这篇关于移植Linux2.6.39到杨创utu2440的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!