现在的位置: 首页 > 综合 > 正文

移植Linux2.6.39到杨创utu2440

2013年11月11日 ⁄ 综合 ⁄ 共 6224字 ⁄ 字号 评论关闭

http://blog.csdn.net/panzhenjie/article/details/6443311

移植是基于比较新的官方的2.6.39的内核,下载下来linux-2.6.39.tar.bz2,然后解压。

  1. tar jxvf linux-2.6.39.tar.bz2  

进入内核目录,把最接近utu2440的默认配置文件拷贝出来。

  1. cd linux-2.6.39cp arch/arm/configs/s3c2410_defconfig .config  

然后进行配置

  1. make menuconfig  

暂时没有什么需要修改的,直接就用默认的编译。

  1. make uImage  

漫长的等待之后,会在arch/arm/boot下产生一个uImage文件,这就是编译出来的给uboot使用的内核了。

  1. 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

  1. 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运行,出现如下信息。

  1. ## 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

  1. s3c2440         ARCH_S3C2440        S3C2440         362改成s3c2440            ARCH_S3C2440        S3C2440         5244  

然后重新make并下载至板子,这次内核成功启动,但是输出一堆的乱码。

这个应该是串口的波特率设置不对,正好见到网上有篇文章,得知是因为uboot和kernel设置的时钟频率不一样。

于是修改之,arch/arm/mach-s3c2440/mach-smdk2440.c

  1. 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没有成功加载

  1. 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。

  1. #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,};  

这下,网络也起来了,出现了如下信息

  1. 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的文件夹。

  1. sudo tar xvf output/images/rootfs.tar -C ~/development/nfsroot/  

重启看到输出信息有所变化了

  1. 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,一切搞定!

抱歉!评论已关闭.