1. 程式人生 > >移植最新的核心linux-4.9到開發板JZ2440全過程筆記

移植最新的核心linux-4.9到開發板JZ2440全過程筆記

移植最新的核心:linux-4.9

實驗工具:
開發板:    JZ2440
移植核心:  linux-4.9
下載地址:https://www.kernel.org/pub/linux/kernel/v4.x/linux-4.9.tar.gz

交叉編譯器:4.4.3
下載地址:http://download.csdn.net/download/mengzhuicanyang/9717995

=============================
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到剛建立的根檔案目錄中
    
[email protected]
:/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
    [email protected]:/work/nfs_root/my_fs_new$ mkdir lib
    [email protected]:/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
    
[email protected]
:/work/nfs_root/my_fs_new/dev$ sudo mknod console c 5 1
    [email protected]:/work/nfs_root/my_fs_new/dev$ sudo mknod null c 1 3
    [email protected]:/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
    
[email protected]
:/work/nfs_root/my_fs_new$ mkdir proc tmp mnt sys root
    [email protected]:/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 <jz2440-0>, # 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 <jz2440-0>, # 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大小:
[email protected]:/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


相關推薦

移植最新核心linux-4.9開發JZ2440全過程筆記

移植最新的核心:linux-4.9 實驗工具: 開發板:    JZ2440 移植核心:  linux-4.9 下載地址:https://www.kernel.org/pub/linux/kernel/v4.x/linux-4.9.tar.gz 交叉編譯器:4.4.3 下載地址:http://download

linux裝置驅動開發》,基於最新linux 4.0核心-----筆記

第二章 Linux 的核心結構及構建 ---->這一章是自己總結的 1、核心結構(主要是下面這幾個部分) 系統呼叫介面<–>System call interface 程序管理<------>Process manag

Linux裝置驅動開發詳解 第3版 (即 Linux裝置驅動開發詳解 基於最新Linux 4 0核心 )進展同步更

                本博實時更新《Linux裝置驅動開發詳解(第3版)》的最新進展。 目前已經完成稿件。 2015

關於召回《Linux裝置驅動開發詳解-基於最新Linux 4.0核心》的通知

問題描述關於《Linux裝置驅動開發詳解:基於最新的Linux 4.0核心》一書1.華章分社在沒

LinuxLinux裝置驅動開發詳解:基於最新Linux 4.0核心

1 Linux裝置驅動概述及開發環境構建 1.1 裝置驅動的作用 驅使硬體裝置行動 1.2 無作業系統時的裝置驅動 典型架構:一個無限迴圈中夾雜著對裝置中斷的檢測或者對裝置的輪詢 1.3 有作業系統時的裝置驅動 併發 、記

Linux裝置驅動開發詳解:基於最新Linux 4.0核心》一刷勘誤

這是第一次印刷的勘誤,大部分應該買的都是5刷了,這些錯誤基本已經絕跡。還是有部分童鞋買的書老書,

最新核心3.4Linux 裝置樹載入I2C client adapter 的流程(核心3.4 高通)

BLSP(BAM Low-Speed Peripheral) , 每一個BLSP含有兩個QUP, 每一個QUP可以被配置為I2C, SPI, UART, UIM介面, BLSP是高通對於低速介面的一種管理方式。 [email protec

Device Tree(四)linux-4.19.10 移植

1、修改Makefile ARCH ?= arm CROSS_COMPILE ?= arm-linux-gnueabihf- 如果發現:/tmp/cc8nFJm8.s:549: Error: garbage following instruction -- `d

Windows平臺安裝最新OpenCV-2.4.9,利用Eclipse、MinGW構建C++呼叫OpenCV開發環境

最近電腦重灌系統了,第一件事重灌OpenCV。這次直接裝最新版,2014-4-25日釋出的OpenCV2.4.9版本,下載連結:1、新建資料夾OpenCV2.4.9,然後將348M大小的opencv-2.4.9.exe開啟,路徑選到新建的這個資料夾,可以看到解壓出來有4個多G

linux-4.9 核心 debain 8 (jessie)

Starting kernel ... [    0.000000] Booting Linux on physical CPU 0x0 [    0.000000] Linux version 4.9.39 ([email protected]) (gcc version 4.7.3 (Ubun

【嵌入式Linux】ARM開發通過NFS掛載Linux主機實現檔案共享

一般在Linux主機上arm-linux-gcc編譯程式,然後將該生成的可執行檔案傳送給ARM開發板,ARM開發板再執行該檔案。 (主機Linux系統)--->(ARM開發板Linux系統)  傳送檔案的過程可以採用NFS,FTP等多種方法 採用NFS實現遠端掛載,ARM

移植OpenCV+QT到ARM S3C6818開發上(2)

續《移植OpenCV+QT到ARM S3C6818開發板上(1)》 安裝QT開發環境到宿主機 解壓qt5.7.0原始碼(時間稍稍有點長,為待會編譯捏了一把汗啊!) 解壓完之後進入原始碼根目錄,終端輸入: sudo ./configure -v -release

核心裁剪,arm_mini2440開發中增刪自己寫的驅動

1、把編譯通過的buttons1711.c檔案放入 /home/mini2440/linux-2.6.32.2/drivers/char/ 2、修改Makefile         在同一個目錄下(第1步中放入.c檔案

OK6410開發學習之安裝linux系統至開發

說來慚愧,OK6410開發板自從買來就一直在躺灰,當時連教程也花了1千多大洋了,近來感覺前途迷茫,遂決定將其拿出來研究研究,看是否能夠給我新出路。 廢話不多說,先上一張OK6410開發板大圖: 不要問我讓其躺灰的這些年我幹啥了,我也不知道,要不是最近找工作處處碰壁,可能它還得繼續躺下去,

linux】ARM開發上設定RTC時間,斷電重啟後,設定失效的原因分析

問題描述 linux中使用date設定時間後用hwclock -w同步到RTC,斷電重啟後,有時會失效 原因分析 儲存時間戳 1、使用命令關機(halt)會呼叫rc0.d中的指令碼; 2、使用命令重啟(reboot)會呼叫rc6.d中的指令碼;

qemu執行linux 4.9

1、git clone最新的Qemu程式碼到本地: ubuntu@ubuntu-X556UB:~/Qemu$ git clone git://git.qemu-project.org/qemu.git 正克隆到 'qemu'... remote: Counting ob

【內核配置】十、Linux3.4.2開發環境搭建

part oot board arm-linux 啟動 搭建 服務器 arm uimage 主 機:VMWare--Ubuntu-16.04.2-x64-100ask 開發板:JZ2440--256M NandFlash,   2M NorFlash,   64M

NUCLEO-8L152開發中文應用筆記整理集合

【AN5182】基於Adafruit TFT Shield與STM8 Nucleo-64板的圖片檢視器:https://www.yiboard.com/thread-962-1-1.html 本應用筆記簡要介紹瞭如何將Adafruit 1.8”TFT shield與STM8 Nucleo-64開發板配

《Spark核心原始碼分析與開發實戰》讀書筆記之一

第1章 Spark系統概述 1.1 Spark是什麼 1. Spark比Hadoop快在哪裡 (1)Spark使用記憶體計算,而Hadoop使用IO (2)Hadoop的計算是按部就班一步一步進行的,而Spark則是提前生成了DAG,優化了運算路徑   1.2 Sp

普中PZ6806開發 STM32學習筆記1 環境配置

開發板介紹 普中PZ6806L (STM32-F1)開發板,使用STM32F103ZET6晶片,外觀圖: 功能模組 各模組功能: 蜂鳴器 DS18B20溫度感測器介面 紅外接收頭 電源開關 USB