Chinaunix首页 | 论坛 | 博客
  • 博客访问: 798844
  • 博文数量: 281
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 2770
  • 用 户 组: 普通用户
  • 注册时间: 2009-08-02 19:45
个人简介

邮箱:zhuimengcanyang@163.com 痴爱嵌入式技术的蜗牛

文章分类
文章存档

2020年(1)

2018年(1)

2017年(56)

2016年(72)

2015年(151)

分类: 嵌入式

2016-12-24 22:57:13

移植最新的内核:linux-4.9

实验工具:
开发板:    JZ2440
移植内核:  linux-4.9
下载地址:

交叉编译器:4.4.3
下载地址:

=============================
1. 配置时钟,使能串口打印信息
1.1 解压,配置内核
tar xzf linux-4.9.tar.gz

1.2 配置,编译内核
搜寻内核中的配置文件:
    find -name "*defconfig"
    找到一项:
    arch/arm/configs/s3c2410_defconfig
配置:
    make ARCH=arm CROSS_COMPILE=arm-linux- s3c2410_defconfig
    make ARCH=arm CROSS_COMPILE=arm-linux- menuconfig
    
编译内核:
    make ARCH=arm CROSS_COMPILE=arm-linux- uImage
编译打印出错信息:
    arm-linux-ld: ERROR: arch/arm/lib/built-in.o uses FPA instructions, whereas .tmp_vmlinux1 does not
    arm-linux-ld: ERROR: arch/arm/lib/built-in.o uses hardware FP, whereas .tmp_vmlinux1 uses software FP
    arm-linux-ld: failed to merge target specific data of file arch/arm/lib/built-in.o
    arm-linux-ld: ERROR: virt/built-in.o uses FPA instructions, whereas .tmp_vmlinux1 does not
    arm-linux-ld: ERROR: virt/built-in.o uses hardware FP, whereas .tmp_vmlinux1 uses software FP
    arm-linux-ld: failed to merge target specific data of file virt/built-in.o
    make: *** [vmlinux] Error 1

可能是编译器的问题,先把编译器从4.3.2改为4.4.3,修改为4.4.3以后,就可以编译内核镜像uImage了
配置编译器:
方法1:    
    export PATH=$PATH:/opt/FriendlyARM/toolschain/4.4.3/bin
方法2:
    在文件:/etc/environment中添加新增加的编译器绝对地址
    PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/opt/FriendlyARM/toolschain/4.4.3/bin"
这里用第二种方法。

1.3 烧写进开发板启动测试:
TFTP烧写:
    tftp 30000000 uImage; bootm 30000000
NFS烧写:
    nfs 30000000 192.168.1.240:/work/nfs_root/uImage; bootm 30000000

NFS烧写出现问题:UBOOT中nfs烧写出错 T T *** ERROR: Cannot umount
解决方法:http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=22072065&id=5757026

测试启动,打印乱码:
## Booting kernel from Legacy Image at 30000000 ...
   Image Name:   Linux-4.9.0
   Image Type:   ARM Linux Kernel Image (uncompressed)
   Data Size:    3200728 Bytes = 3.1 MiB
   Load Address: 30108000
   Entry Point:  30108000
   Verifying Checksum ... OK
   Loading Kernel Image ... OK
OK
Using machid 0x16a from environment

Starting kernel ...

Uncompressing Linux... done, booting the kernel.
?§'_d?{?¤d?[??''?§|??§???'d[[¤ ?8?'§{à?_c?;?§''?G£
看这里,使用的机器ID是:0x16a,对应的开发板是SMDK2440.
将机器ID设置成mini2440开发板:
set machid 0x7cf
下载新的内核进开发板,是可以启动内核的。

这说明:是SMDK2440开发板的时钟设置的不对,导致串口波特率设置不正确,从而打印乱码。
1.4 修改源码:
linux-4.9\arch\arm\mach-s3c24xx\mach-smdk2440.c
    __init smdk2440_init_time(void)
        s3c2440_init_clocks(16934400);
        修改为:
        s3c2440_init_clocks(12000000);    

重新编译,下载启动就可以看到可以启动内核了。


=============================
2. 修改分区, 制作新的文件系统
2.1 搜索与分区相关的字符串:
grep "\"Boot Agent\"" * -nR
arch/arm/mach-s3c24xx/common-smdk.c:114:                .name   = "Boot Agent",

查看文件:arch/arm/mach-s3c24xx/common-smdk.c
分区信息:
static struct mtd_partition smdk_default_nand_part[] = {
    [0] = {
        .name    = "Boot Agent",
        .size    = SZ_16K,
        .offset    = 0,
    },
    [1] = {
        .name    = "S3C2410 flash partition 1",
        .offset = 0,
        .size    = SZ_2M,
    },
    [2] = {
        .name    = "S3C2410 flash partition 2",
        .offset = SZ_4M,
        .size    = SZ_4M,
    },
    [3] = {
        .name    = "S3C2410 flash partition 3",
        .offset    = SZ_8M,
        .size    = SZ_2M,
    },
    [4] = {
        .name    = "S3C2410 flash partition 4",
        .offset = SZ_1M * 10,
        .size    = SZ_4M,
    },
    [5] = {
        .name    = "S3C2410 flash partition 5",
        .offset    = SZ_1M * 14,
        .size    = SZ_1M * 10,
    },
    [6] = {
        .name    = "S3C2410 flash partition 6",
        .offset    = SZ_1M * 24,
        .size    = SZ_1M * 24,
    },
    [7] = {
        .name    = "S3C2410 flash partition 7",
        .offset = SZ_1M * 48,
        .size    = MTDPART_SIZ_FULL,
    }
};

修改为:
    static struct mtd_partition smdk_default_nand_part[] = {
        [0] = {
            .name    = "u-boot",
            .size    = SZ_256K,
            .offset    = 0,
        },
        [1] = {
            .name    = "params",
            .offset = MTDPART_OFS_APPEND,  // 表示是追加信息
            .size    = SZ_128K,
        },
        [2] = {
            .name    = "kernel",
            .offset = MTDPART_OFS_APPEND,
            .size    = SZ_2M,
        },
        [3] = {
            .name    = "rootfs",
            .offset    = MTDPART_OFS_APPEND,
            .size    = MTDPART_SIZ_FULL, // 表示剩余的大小都为rootfs
        }
    };


重新编译:
make ARCH=arm CROSS_COMPILE=arm-linux- uImage && cp arch/arm/boot/uImage /work/nfs_root/uImage

下载:nfs 30000000 192.168.1.240:/work/nfs_root/uImage; bootm 30000000
启动打印:
....
Creating 4 MTD partitions on "NAND":
0x000000000000-0x000000040000 : "u-boot"
0x000000040000-0x000000080000 : "params"
0x000000080000-0x000000280000 : "kernel"
0x000000280000-0x000010000000 : "rootfs"
.....
可以看到分区是创建成功了。

2.2 烧写JFFS文件系统:
tftp 30000000 my_fs.jffs2; nand erase.part rootfs; nand write.jffs2 30000000 260000 $filesize

设置启动参数:
set bootargs console=ttySAC0,115200 root=/dev/mtdblock3 rootfstype=jffs2; save

不成功。

2.3 烧写YAFFS文件系统:
tftp 30000000 fs_mini_mdev.yaffs2; nand erase.part rootfs; nand write.yaffs 30000000 260000 $filesize
启动参数设置:
set bootargs console=ttySAC0,115200 root=/dev/mtdblock3; save
同样不成功。

2.4 利用busybox自己制作根文件系统
2.4.1 下载busybox:busybox-1.20.0.tar.bz2
2.4.2 解压busybox,安装交叉编译器

    解压:tar xjf busybox-1.20.0.tar.bz2
    安装交叉编译器,修改主目录下的Makefile文件:
    164 CROSS_COMPILE ?=
    改为
    164 CROSS_COMPILE ?= arm-linux-
    
    配置:make menuconfig
    CROSS_COMPILER_PREFIX 设置为:arm-linux-

2.4.3 编译:make

2.4.4 创建根文件系统的文件夹:/work/nfs_root/my_fs_new
    mkdir /work/nfs_root/my_fs_new
    
2.4.5 安装busybox到刚建立的根文件目录中
    book@book-desktop:/work/system/busybox-1.20.0$ make install CONFIG_PREFIX=/work/nfs_root/my_fs_new
    编译安装完成,可以查看目录:/work/nfs_root/my_fs_new 已经有以下目录,表示安装成功。
    bin  linuxrc  sbin  usr

2.4.6 安装库文件lib
    book@book-desktop:/work/nfs_root/my_fs_new$ mkdir lib
    book@book-desktop:/work/nfs_root/my_fs_new$ mkdir usr/lib -p     // -p 表示递归创建文件夹
    
    从编译器里面拷贝库文件到文件系统目录中:
    sudo cp /opt/FriendlyARM/toolschain/4.4.3/arm-none-linux-gnueabi/sys-root/lib/*so*      /work/nfs_root/my_fs_new/lib     -d
    sudo cp /opt/FriendlyARM/toolschain/4.4.3/arm-none-linux-gnueabi/sys-root/usr/lib/*so*  /work/nfs_root/my_fs_new/usr/lib -d

2.4.7 构建etc文件:
    cp /work/nfs_root/first_fs/etc/   /work/nfs_root/my_fs_new/ -rf

2.4.8 构建dev文件:
    cd /work/nfs_root/my_fs_new
    mkdir dev
    book@book-desktop:/work/nfs_root/my_fs_new/dev$ sudo mknod console c 5 1
    book@book-desktop:/work/nfs_root/my_fs_new/dev$ sudo mknod null c 1 3
    book@book-desktop:/work/nfs_root/my_fs_new/dev$ ls -l
    total 0
    crw-r--r-- 1 root root 5, 1 2016-12-19 01:54 console
    crw-r--r-- 1 root root 1, 3 2016-12-19 01:54 null

2.4.9 构建其他目录:proc tmp mnt sys root
    book@book-desktop:/work/nfs_root/my_fs_new$ mkdir proc tmp mnt sys root
    book@book-desktop:/work/nfs_root/my_fs_new$ ls
    bin  dev  etc  lib  linuxrc  mnt  proc  root  sbin  sys  tmp  usr

2.5 制作jffs2:
    mkfs.jffs2 -n -s 2048 -e 128KiB -d my_fs_new -o my_fs_new.jffs2

2.6 测试
    烧写my_fs_new.jffs2到板子
    tftp 30000000 my_fs_new.jffs2; nand erase.part rootfs; nand write.jffs2 30000000 260000 $filesize

    挂接jffs2文件系统,修改启动参数:
    set bootargs console=ttySAC0,115200 root=/dev/mtdblock3 rootfstype=jffs2

    利用新内核启动,jffs2文件系统
    tftp 32000000 uImage; bootm 32000000

    启动打印错误信息:
    ....
    ALSA device list:
      No soundcards found.
    VFS: Mounted root (jffs2 filesystem) on device 31:3.
    Freeing unused kernel memory: 216K (c06ce000 - c0704000)
    This architecture does not have kernel memory protection.
    Kernel panic - not syncing: Attempted to kill init! exitcode=0x00000004
    ......    

2.7 内核编译增加EABI接口
  | Symbol: AEABI [=n]                                                                             |  
  | Type  : boolean                                                                                |  
  | Prompt: Use the ARM EABI to compile the kernel                                                 |  
  |   Location:                                                                                    |  
  | (1) -> Kernel Features                                                                         |  
  |   Defined at arch/arm/Kconfig:1607                                                             |  
  |   Selected by: ARCH_OMAP2PLUS_TYPICAL [=n] && (ARCH_MULTI_V6 [=n] || ARCH_MULTI_V7 [=n]) && AR |  

修改为:
  | Symbol: AEABI [=y]                                                                             |  
  | Type  : boolean                                                                                |  
  | Prompt: Use the ARM EABI to compile the kernel                                                 |  
  |   Location:                                                                                    |  
  | (1) -> Kernel Features                                                                         |  
  |   Defined at arch/arm/Kconfig:1607                                                             |  
  |   Selected by: ARCH_OMAP2PLUS_TYPICAL [=n] && (ARCH_MULTI_V6 [=n] || ARCH_MULTI_V7 [=n]) && AR |  

重新编译内核,生成新的内核镜像文件: uImage
make ARCH=arm CROSS_COMPILE=arm-linux- uImage && cp arch/arm/boot/uImage /work/nfs_root/uImage

挂接jffs2文件系统,修改启动参数:
set bootargs console=ttySAC0,115200 root=/dev/mtdblock3 rootfstype=jffs2

利用新内核启动,jffs2文件系统
nfs 30000000 192.168.1.240:/work/nfs_root/uImage; bootm 30000000

测试,下载新的内核到板子,挂接jffs2文件系统,启动打印信息:
    ......
    NET: Registered protocol family 17
    hctosys: unable to open rtc device (rtc0)
    ALSA device list:
      No soundcards found.
    VFS: Mounted root (jffs2 filesystem) on device 31:3.
    Freeing unused kernel memory: 204K (c06b1000 - c06e4000)
    This architecture does not have kernel memory protection.

    Please press Enter to activate this console.
    / #
    ....

这里看一看启动的配置文件:
/etc/inittab:
    console::askfirst:-/bin/sh
    ::sysinit:/etc/init.d/rcS

/etc/init.d/rcS:
    #mount -t proc none /proc
    mount -a
    mkdir /dev/pts
    mount -t devpts devpts /dev/pts
    echo /sbin/mdev > /proc/sys/kernel/hotplug
    mdev -s
    
所以不会出现像移植内核linux-3.4.2类似的错误。
    
============================
3. 移植YAFFS文件系统到新内核
是不是自己的FLASH有问题 ,发现下载原来的文件系统,利用nand挂接也有问题啊。
可以看到启动的时候,在rootfs区域有很多坏块。
这一步先不做。

利用JFFS2文件系统还是可以挂接的,不知道为什么?
暂时用JFFS2文件系统来实验。

===============================
4. 裁剪内核大小以及制作补丁文件
4.1 根据配置文件.config来配置需要的选项,以此来达到裁剪内核的目的
    修改配置文件:
    make ARCH=arm CROSS_COMPILE=arm-linux- menuconfig
    
4.2 注意:
    在内核中对NAND划分的分区中,kernel分区为:2M。
    所以要配置禁止相关的内核编译选项,使之最终编译的内核镜像文件的大小应该不大于分区大小:2M。

    配置完成后,先把配置文件备份一个:
        cp .config config_ok
    编译内核:
        make ARCH=arm CROSS_COMPILE=arm-linux- uImage
    编译这个内核会花很长时间.....................................

    编译完发现,配置到基本删除了所有功能,内核还是很大,有2M以上的大小。
        OBJCOPY arch/arm/boot/zImage
        Kernel: arch/arm/boot/zImage is ready
        UIMAGE  arch/arm/boot/uImage
        Image Name:   Linux-4.9.0
        Created:      Mon Dec 19 04:23:02 2016
        Image Type:   ARM Linux Kernel Image (uncompressed)
        Data Size:    2399944 Bytes = 2343.70 kB = 2.29 MB
        Load Address: 0x30008000
        Entry Point:  0x30008000
        Kernel: arch/arm/boot/uImage is ready    
        
    这就要修改nand上的内核kernel分区大小,可以改成:3M大小。
    这就需要修改:
    (1) u-boot中易用性需要修改分区的大小: kernel改成3M分区
    SMDK2410 # mtdparts

    device nand0 , # parts = 4
     #: name                size            offset          mask_flags
     0: u-boot              0x00040000      0x00000000      0
     1: params              0x00020000      0x00040000      0
     2: kernel              0x00300000      0x00060000      0
     3: rootfs              0x0fca0000      0x00360000      0

    active partition: nand0,0 - (u-boot) 0x00040000 @ 0x00000000

    defaults:
    mtdids  : nand0=jz2440-0
    mtdparts: mtdparts=jz2440-0:256k(u-boot),128k(params),3m(kernel),-(rootfs)
    SMDK2410 #
    
    (2) kernel中需要修改真正的分区大小:kernel分区在这里真正地改成3M空间大小
    重新编译内核,启动,打印启动信息:
    NAND read: device 0 offset 0x60000, size 0x300000
    Skipping bad block 0x00260000
    Skipping bad block 0x00280000
    Skipping bad block 0x002a0000
    Skipping bad block 0x002c0000
    Skipping bad block 0x002e0000
    Skipping bad block 0x00300000
    Skipping bad block 0x00320000
    Skipping bad block 0x00340000
    Skipping bad block 0x00360000
    Skipping bad block 0x00380000
    Skipping bad block 0x003a0000
    Skipping bad block 0x003c0000
    Skipping bad block 0x003e0000
    Skipping bad block 0x00400000
    Skipping bad block 0x00420000
    Skipping bad block 0x00440000
    Skipping bad block 0x00460000
    Skipping bad block 0x00480000
    Skipping bad block 0x004a0000
    Skipping bad block 0x004c0000
    Skipping bad block 0x004e0000
    Skipping bad block 0x00500000
    Skipping bad block 0x00520000
    Skipping bad block 0x00540000
    Skipping bad block 0x00560000
    Skipping bad block 0x00580000
    Skipping bad block 0x005a0000
    Skipping bad block 0x005c0000
    Skipping bad block 0x005e0000
    Skipping bad block 0x00600000
    Skipping bad block 0x00620000
    Skipping bad block 0x00640000
    Skipping bad block 0x00660000
    Skipping bad block 0x00680000
    Skipping bad block 0x006a0000
    Skipping bad block 0x006c0000
    Skipping bad block 0x006e0000
    Skipping bad block 0x00700000
    Skipping bad block 0x00720000
    Skipping bad block 0x00740000
    Skipping bad block 0x00760000
    Skipping bad block 0x00780000
    Skipping bad block 0x007a0000
    Skipping bad block 0x007c0000
    Skipping bad block 0x007e0000
    Skipping bad block 0x00800000
    Skipping bad block 0x00820000
    Skipping bad block 0x00840000
    Skipping bad block 0x00860000
    Skipping bad block 0x00880000
    Skipping bad block 0x008a0000
    Skipping bad block 0x008c0000
    Skipping bad block 0x008e0000
    Skipping bad block 0x00900000
    Skipping bad block 0x00920000
    Skipping bad block 0x00940000
    Skipping bad block 0x00960000
    Skipping bad block 0x00980000
    Skipping bad block 0x009a0000
     3145728 bytes read: OK
    ## Booting kernel from Legacy Image at 30000000 ...
       Image Name:   Linux-4.9.0
       Image Type:   ARM Linux Kernel Image (uncompressed)
       Data Size:    2406568 Bytes = 2.3 MiB
       Load Address: 30008000
       Entry Point:  30008000
       Verifying Checksum ... Bad Data CRC
    ERROR: can't get kernel image!

    居然错误,这可以看到,以前rootfs分区从地址0x00260000开始一直到256M,估计是不是YAFFS一直在烧写这个地方,
    导致这里的FLASH出现坏块。
    问题:YAFFS文件系统有耗损均衡算法么?怎么就这块一直烧写的YAFFS文件的FLASH区域直接全部是坏块,是不是一直
    存在这个地方呢?但是烧写JFFS就没有问题。
    回答:暂时还没有时间去考虑这个问题。
    
    还是解决上面的问题:
    坏块的区域大小 = (0x009a0000 - 0x00260000) = 7M空间,
    kernel从60000到260000是没有问题的2M空间大小,我们这里需要3M的有效空间,
    所以可以给kernel预留10M空间大小:2M(有效块) + 7M(无效块) + 1M(有效块),实际只预留了3M有效空间大小。

    kernel分区大小为:0xA00000,偏移地址为:0x00060000
    继续同上折腾:
    在kernel源码中修改NAND分区表:
static struct mtd_partition smdk_default_nand_part[] = {
    [0] = {
        .name    = "u-boot",
        .size    = SZ_256K,
        .offset    = 0,
    },
    [1] = {
        .name    = "params",
        .offset = MTDPART_OFS_APPEND,
        .size    = SZ_128K,
    },
    [2] = {
        .name    = "kernel",
        .offset = MTDPART_OFS_APPEND,
        .size    = 10 * SZ_1M,         
    },
    [3] = {
        .name    = "rootfs",
        .offset    = MTDPART_OFS_APPEND,
        .size    = MTDPART_SIZ_FULL,    
    }
};

        终于看到启动信息了。
        ....
        usbserial: USB Serial support registered for pl2303
        NET: Registered protocol family 17
        ALSA device list:
          No soundcards found.
        VFS: Mounted root (jffs2 filesystem) on device 31:3.
        Freeing unused kernel memory: 148K (c0451000 - c0476000)
        This architecture does not have kernel memory protection.

        Please press Enter to activate this console.
        / #
        / #
        / #
        ......
        分区信息:
        SMDK2410 # mtdparts

        device nand0 , # parts = 4
         #: name                size            offset          mask_flags
         0: u-boot              0x00040000      0x00000000      0
         1: params              0x00020000      0x00040000      0
         2: kernel              0x00a00000      0x00060000      0
         3: rootfs              0x0f5a0000      0x00a60000      0

        active partition: nand0,0 - (u-boot) 0x00040000 @ 0x00000000

        defaults:
        mtdids  : nand0=jz2440-0
        mtdparts: mtdparts=jz2440-0:256k(u-boot),128k(params),10m(kernel),-(rootfs)
        
        烧写的时候,可以看到,果然是经常烧写YAFFS文件系统的那些FLASH的块已经坏掉了。
        但是我们可以错开这些区域进行烧写。
        生命在于折腾.....折腾的蛋疼...
        咦,是不是可以利用这种方法来挂接YAFFS根文件系统了。。。哈哈。。
        
        内核启动,打印的分区信息:
        Creating 4 MTD partitions on "NAND":
        0x000000000000-0x000000040000 : "u-boot"
        0x000000040000-0x000000060000 : "params"
        0x000000060000-0x000000a60000 : "kernel"
        0x000000a60000-0x000010000000 : "rootfs"
        
烧写,测试:
烧写该内核镜像到NAND中:
    tftp 30000000 uImage; nand erase.part kernel; nand write 30000000 kernel
    或者:
    nfs 30000000 192.168.1.240:/work/nfs_root/uImage; nand erase.part kernel; nand write 30000000 kernel
    
烧写文件系统:
    tftp 30000000 my_fs_new.jffs2; nand erase.part rootfs; nand write.jffs2 30000000 260000 $filesize
    这里修改为:260000改为A60000
    tftp 30000000 my_fs_new.jffs2; nand erase.part rootfs; nand write.jffs2 30000000 a60000 $filesize

设置启动参数
    set 'nand read 30000000 kernel;bootm 30000000'
    set bootargs console=ttySAC0,115200 root=/dev/mtdblock3 rootfstype=jffs2
    set machid 16a          // smdk2440  mach-smdk2440.c
    save

但是发现输入reboot关机出现问题:
    / # reboot
    The system is going down NOW!
    Sent SIGTERM to all processes
    Terminated
    Sent SIGKILL to all processes
    Requesting system reboot
    reboot: Restarting system
    Reboot failed -- System halted   // 系统一直停在这里,无法复位,是不是不watchdog给禁止了?

重新配置内核,编译,烧写测试:
把Watchdog功能配置上去以后,就可以了:
    / # reboot
    The system is going down NOW!
    Sent SIGTERM to all processes
    Terminated
    Sent SIGKILL to all processes
    Requesting system reboot
    reboot: Restart

    U-Boot 2012.04.01 (Dec 21 2016 - 00:35:44)
    ....
    到U-boot重启了...
    
查看生成的uImage大小:
book@book-desktop:/work/system/linux-4.9$ ls /work/nfs_root/uImage -l
-rw-r--r-- 1 book book 2412520 2016-12-21 01:19 /work/nfs_root/uImage
    
4.3 制作内核的补丁文件:

4.3.1 先把配置文件.config拷贝为config_ok   (注意:一定要记得备份这个配置文件.config)
4.3.2 make distclean   // 清除所有配置生成的东西
4.3.3 清除完后,再制作补丁文件

    复制编译后的内核文件为:linux-4.9_grant
    mv linux-4.9 linux-4.9_grant
    
    下载,解压纯净代码树:
    tar xjf linux-4.9.tar.gz
    
    制作补丁,这里并没有支持YAFFS。
    diff -urN linux-4.9 linux-4.9_grant > linux-4.9_grant_noYaffs.patch

    可以查看已经生成了补丁文件:
    $ ls linux-4.9_grant_noYaffs.patch -l
    
4.4 给纯净的内核打补丁文件

进入纯内核代码树目录下:
    cd linux-4.9
    patch -p1 < ../linux-4.9_grant.patch
    cp config_ok .config
    make ARCH=arm CROSS_COMPILE=arm-linux- menuconfig
    make ARCH=arm CROSS_COMPILE=arm-linux- uImage

=====================
5. 移植DM9000网卡驱动

【第一种情况:移植内核做好的DM9000驱动】
启动内核可以发现:
如果machID = SMDK2440,则并没有支持网卡
而如果使用mini2440,则支持了网卡驱动。

可以通过设置不同的机器ID这个环境变量,来启动板子看结果:
set machid 16a     // SMDK2440  mach-smdk2440.c    
set machid 7CF       // mini2440  mach-mini2440.c

可以对比修改,将mini2440的DM9000网卡驱动移植到SMDK2440的板子上去。(很容易移植)

DM9000设备在内核中,是注册了一个平台设备驱动。搜索driver.name就可以知道在哪里注册了一个DM9000设备。

mini2440开发板注册DM9000设备流程:
static void __init mini2440_init(void)
    platform_add_devices(mini2440_devices, ARRAY_SIZE(mini2440_devices));
        platform_device_register(devs[i]);  // 在这个devs[i]数组中,有DM9000设备:mini2440_device_eth 这一项
        
static struct platform_device mini2440_device_eth = {
    .name        = "dm9000",
    .id        = -1,
    .num_resources    = ARRAY_SIZE(mini2440_dm9k_resource),
    .resource    = mini2440_dm9k_resource,
    .dev        = {
        .platform_data    = &mini2440_dm9k_pdata,
    },
};        

SMDK2440开发板应该仿照mini2440的做法,加入相关的DM9000初始化的代码,在板子初始化的时候,向内核注册DM9000驱动程序。
linux-3.4.2\arch\arm\mach-s3c24xx\mach-smdk2440.c

测试:
    注意当启动开发板,输入命令ifconfig的时候,根本没有任何反应,但是在板子的启动信息可以看到已经检测到DM9000的驱动,
    并且获得了ethernet网卡的地址。
    这个时候,需要输入命令:ifconfig eth0 192.168.1.17,这样才能启动板子的网卡了。之前一直不知道要这样做,还以为网卡没有
    配置成功,一直在修改内核的配置选项。
        / # ifconfig
        / # ifconfig eth0 192.168.1.17
        dm9000 dm9000 eth0: link down
        / # dm9000 dm9000 eth0: link down
        dm9000 dm9000 eth0: link up, 100Mbps, full-duplex, lpa 0xCDE1

        / #
        / #
        / # ifconfig
        eth0      Link encap:Ethernet  HWaddr 00:0C:29:2F:4E:70  
                  inet addr:192.168.1.17  Bcast:192.168.1.255  Mask:255.255.255.0
                  UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
                  RX packets:0 errors:0 dropped:0 overruns:0 frame:0
                  TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
                  collisions:0 txqueuelen:1000
                  RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)
                  Interrupt:55 Base address:0xc300

        / #
        / # mount -t nfs -o nolock,vers=2 192.168.1.240:/work/nfs_root /mnt
        / # cd /mnt
    可以利用NFS命令挂接服务器的文件夹了。
    但是当板子重新启动,这些命令有的重新输入,才能使能DM9000网卡了。
    可以在配置文件里加入这句话,在/etc/init.d/rcS中增加:
    ifconfig eth0 192.168.1.17
    
【第二种情况:使用厂家移植好的驱动程序】
1. 拷贝驱动程序到内核代码树下
cp dm9000.h dm9dev9000c.c /work/system/linux-3.4.2/drivers/net/ethernet/davicom/

2. 修改Makefile,将dm9dev9000c.c编译进内核文件
vi /work/system/linux-3.4.2/drivers/net/ethernet/davicom/Makefile
    #obj-$(CONFIG_DM9000) += dm9000.o
    修改为:
    obj-$(CONFIG_DM9000) += dm9dev9000c.o
    
3. 重新编译内核
    make uImage
    
4. 烧写进板子,重新启动,可以配置网卡了。

    烧写自己制作的内核, 支持网卡DM9000:
    tftp 30000000 uImage_net; bootm 30000000

    下载内核镜像到NAND中:
    tftp 30000000 uImage_net; nand erase.part kernel; nand write 30000000 kernel

    ifconfig eth0 192.168.1.17

    挂接/mnt
    mount -t nfs -o nolock,vers=2 192.168.1.10:/work/nfs_root /mnt
    
6. 移植YAFFS文件系统到新内核
重新按照前面的说法,看看能否支持YAFFS文件系统。
6.1 下载解压yaffs源代码
注意:在linux内核中并没有集成yaffs文件系统的源代码,需要额外去下载。
tar xjf yaffs2.tar.bz2
cd yaffs2/
./patch-ker.sh c m /work/system/linux-4.9

6.2 内核树种查看
查看源代码中是否集成了yaffs源码:
cd ../linux-4.9/
ls fs/yaffs2/


6.3 配置内核支持yaffs
$make ARCH=arm CROSS_COMPILE=arm-linux- menuconfig

  | Symbol: YAFFS_YAFFS2 [=n]                                                                |  
  | Type  : boolean                                                                          |  
  | Prompt: 2048 byte (or larger) / page devices                                             |  
  |   Location:                                                                              |  
  |     -> File systems                                                                      |  
  |       -> Miscellaneous filesystems (MISC_FILESYSTEMS [=y])                               |  
  | (2)     -> yaffs2 file system support (YAFFS_FS [=n])                                    |  
  |   Defined at fs/yaffs2/Kconfig:72                                                        |  
  |   Depends on: MISC_FILESYSTEMS [=y] && YAFFS_FS [=n]                                     |  
  |   Selected by: YAFFS_FS [=n] && MISC_FILESYSTEMS [=y] && MTD_BLOCK [=y]    
修改为支持YAFFS:
  | Symbol: YAFFS_YAFFS2 [=y]                                                                                  |  
  | Type  : boolean                                                                                            |  
  | Prompt: 2048 byte (or larger) / page devices                                                               |  
  |   Location:                                                                                                |  
  |     -> File systems                                                                                        |  
  |       -> Miscellaneous filesystems (MISC_FILESYSTEMS [=y])                                                 |  
  | (2)     -> yaffs2 file system support (YAFFS_FS [=y])                                                      |  
  |   Defined at fs/yaffs2/Kconfig:72                                                                          |  
  |   Depends on: MISC_FILESYSTEMS [=y] && YAFFS_FS [=y]                                                       |  
  |   Selected by: YAFFS_FS [=y] && MISC_FILESYSTEMS [=y] && MTD_BLOCK [=y]   
这里并没有做完,先写到这里,以后有空再把这个加上。


 
记录常用命令:
make ARCH=arm CROSS_COMPILE=arm-linux- menuconfig
make ARCH=arm CROSS_COMPILE=arm-linux- uImage && cp arch/arm/boot/uImage /work/nfs_root/uImage

nfs 30000000 192.168.1.240:/work/nfs_root/uImage; bootm 30000000
烧写内核:
nfs 30000000 192.168.1.240:/work/nfs_root/uImage; nand erase.part kernel; nand write 30000000 kernel
    

动态链接库文件:
/opt/FriendlyARM/toolschain/4.4.3/arm-none-linux-gnueabi/sys-root/lib/
/opt/FriendlyARM/toolschain/4.4.3/arm-none-linux-gnueabi/sys-root/usr/lib/
    
烧写u-boot:
nfs 30000000 192.168.1.240:/work/nfs_root/u-boot.bin; protect off all; erase 0 3ffff; cp.b 30000000 0 40000

JFFS文件烧写:注意:这里的烧写地址改为:a60000
tftp 30000000 my_fs_new.jffs2; nand erase.part rootfs; nand write.jffs2 30000000 a60000 $filesize

压缩根文件系统,生成压缩包:my_fs_new.tar.gz
tar -zcvf my_fs_new.tar.gz my_fs_new


阅读(2293) | 评论(0) | 转发(2) |
给主人留下些什么吧!~~