NUC980如何进行内核修改并进行烧录

由于此处使用的为nor-flash,而且不适用RAMfs文件系统,因此配置内核为3MB大小,uboot为1MB大小,剩余的空间为文件系统空间,后续如果有需求再进行改动。
1、配置环境变量的文件系统,配置内容下:

baudrate=115200
bootdelay=1
stderr=serial
stdin=serial
stdout=serial
setspi=sf probe 0 50000000  //配置SPI-flash读取速度为50M
loadkernel=sf read 0x7fc0 0x100000 0x300000 //从1M的地址空间读取3MB的数据到内存中
bootcmd=run setspi;run loadkernel;bootm 0x7fc0 //load内核文件,直接启动
bootargs=noinitrd root=/dev/mtdblock2 rw rootfstype=jffs2 console=ttyS0,115200n8 rdinit=/sbin/init mem=64M mtdparts=nor0:0x100000@0x0(u-boot),0x300000@0x100000(kernel),-(user);//mtdparts 用于传递参数到内核当中
环境变量直接烧录到0x80000位置即可,使用nuwriter烧录模式即可。

这里还是要说几句,在进行u-boot移植时,有人喜欢将MTD分区表设置好,然后使用uboot指令进行相关的文件操作,个人感觉是没有必要的,uboot在实际的开发工作中,占比比较小,正常操作应该直接将参数传递到内核中,由内核进行MTD分区,然后通过启动文件系统即可,这样启动的速度是最快,u-boot做MTD只是用于内存操作时比较方便,其他没什么作用,而且设置错误也会出现编译问题,因此尽量先不要将MTD编译到u-boot当中,直接使用厂家的uboot即可。
为保证移植成功,要修改内核的mtd分区,通过修改源代码的方式进行修改,主要就是修改mtd的配置,直接在内核的文件夹输入

vim arch/arm/mach-nuc980/dev.c 

将其修改为如下数值,然后保存,后续配置后进行make即可。

static struct mtd_partition nuc980_qspi0_flash_partitions[] = {
#ifdef CONFIG_BOARD_ETH2UART
        {
                .name = "lighttpd",
                .size = 0x0200000,
                .offset = 0x0C00000,
        },
#else
        {
                .name = "u-boot",
                .size = 0x0100000,
                .offset = 0,
        },
        {
                .name = "kernel",
                .size = 0x0300000,
                .offset = 0x100000,
        },
        {
                .name = "user",
                .size = 0xc00000,
                .offset = 0x0400000,
        },

注意在内核进行配置的过程中使用make nuc980_defconfig,这样可以将内核的标准配置导出来,如果使用ETH2UART的config文件,则不会调用此处修改的mtd分区,可以在内核的实际打印信息中看到。
这样制作空间划分如下

  1. Uboot 1M空间
  2. 内核 3M空间
  3. 用户 12M空间

如果没有增加非常多的服务,那么这样的划分是没有问题的,内核的裁剪一定要到位,不必要的服务必须全部切掉,保证内核足够精简,user的空间其实也可以划分为两部分,使用前面7M用于挂在文件系统,后面用于挂在其他文件,保证加载文件系统的速度。
2、内核需增加MTD相关选项,SPI-flash相关选项,并将所有不必要的选项都关闭,如关闭USB,关闭网络等,都是没有必要的程序,删除之后就可以进行编译下载了,并取消使用RAM加载文件系统的选项,编译完成的内核代码一般都在2M以内,根据上述的分配,内核空间有3M,完全满足需求,直接将代码下载到0x100000位置即可。
3、实际的内核裁剪比较复杂,选线比较多,如果有不清楚的选项可以先进行搜索,确认其功能然后进行修改,在修改的过程中,应该先修改硬件相关的驱动文件,然后修改mtd,然后修改文件系统等,因为各个选项都是关联的,如果驱动没有被选中,那么在工作的过程中就会出现问题,对于没有选择的硬件驱动,应该尽量将对应的应用驱动删除,如没有选用nand相关的硬件驱动,则应该删除nand相关的文件系统支持,否则编译就会出错。
进行裁剪后加载完成的界面如图

U-Boot 2016.11-g3ac85d0-dirty (Aug 17 2019 - 15:51:52 +0800)
    
    CPU: NUC980
    Board: NUC980
    DRAM:  64 MiB
    SF: Detected W25Q128BV with page size 256 Bytes, erase size 64 KiB, total 16 MiB
    In:    serial
    Out:   serial
    Err:   serial
    Net:   Net Initialization Skipped
    No ethernet found.
    Hit any key to stop autoboot:  0 
    SF: Detected W25Q128BV with page size 256 Bytes, erase size 64 KiB, total 16 MiB
    device 0 offset 0x100000, size 0x300000
    SF: 3145728 bytes @ 0x100000 Read: OK
    ## Booting kernel from Legacy Image at 00007fc0 ...
       Image Name:   
       Image Type:   ARM Linux Kernel Image (uncompressed)
       Data Size:    1579528 Bytes = 1.5 MiB
       Load Address: 00007fc0
       Entry Point:  00008000
       Verifying Checksum ... OK
       Loading Kernel Image ... OK
    
    Starting kernel ...
    
    SF: Detected W25Q128BV with page size 256 Bytes, erase size 64 KiB, total 16 MiB
    SF: Deviceting Linux on physical CPU 0x0
    Linux version 4.4.179 (root@dongwb) (gcc version 4.8.4 (GCC) ) #27 PREEMPT Thu Aug 22 00:01:15 CST 2019
    CPU: ARM926EJ-S [41069265] revision 5 (ARMv5TEJ), cr=0005317f
    CPU: VIVT data cache, VIVT instruction cache
    Machine: NUC980
    Memory policy: Data cache writeback
    Built 1 zonelists in Zone order, mobility grouping on.  Total pages: 16256
    Kernel command line: noinitrd root=/dev/mtdblock2 rw rootfstype=jffs2 console=ttyS0,115200n8 rdinit=/sbin/init mem=64M mtdparts=nor0:0x100000@0x0(u-boot),0x300000@0x100000(kernel),-(user)PID hash table entries: 256 (order: -2, 1024 bytes)
    Dentry cache hash table entries: 8192 (order: 3, 32768 bytes)
    Inode-cache hash table entries: 4096 (order: 2, 16384 bytes)
    Memory: 61428K/65536K available (2162K kernel code, 199K rwdata, 768K rodata, 124K init, 195K bss, 4108K reserved, 0K cma-reserved)
    Virtual kernel memory layout:
        vector  : 0xffff0000 - 0xffff1000   (   4 kB)
        fixmap  : 0xffc00000 - 0xfff00000   (3072 kB)
        vmalloc : 0xc4800000 - 0xff800000   ( 944 MB)
        lowmem  : 0xc0000000 - 0xc4000000   (  64 MB)
        modules : 0xbf000000 - 0xc0000000   (  16 MB)
          .text : 0xc0008000 - 0xc02e4ecc   (2932 kB)
          .init : 0xc02e5000 - 0xc0304000   ( 124 kB)
          .data : 0xc0304000 - 0xc0335f00   ( 200 kB)
           .bss : 0xc0335f00 - 0xc0366e78   ( 196 kB)
    SLUB: HWalign=32, Order=0-3, MinObjects=0, CPUs=1, Nodes=1
    Preemptible hierarchical RCU implementation.
            Build-time adjustment of leaf fanout to 32.
    NR_IRQS:545
    clocksource: nuc980-timer5: mask: 0xffffff max_cycles: 0xffffff, max_idle_ns: 62215505635 ns
    sched_clock: 32 bits at 100 Hz, resolution 10000000ns, wraps every 21474836475000000ns
    Console: colour dummy device 80x30
    console [ttyS0] enabled
    Calibrating delay loop... 148.88 BogoMIPS (lpj=744448)
    pid_max: default: 32768 minimum: 301
    Mount-cache hash table entries: 1024 (order: 0, 4096 bytes)
    Mountpoint-cache hash table entries: 1024 (order: 0, 4096 bytes)
    CPU: Testing write buffer coherency: ok
    Setting up static identity map for 0x8400 - 0x843c
    devtmpfs: initialized
    clocksource: jiffies: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 19112604462750000 ns
    futex hash table entries: 256 (order: -1, 3072 bytes)
    pinctrl core: initialized pinctrl subsystem
    DMA: preallocated 256 KiB pool for atomic coherent allocations
    SCSI subsystem initialized
    clocksource: Switched to clocksource nuc980-timer5
    NetWinder Floating Point Emulator V0.97 (double precision)
    jffs2: version 2.2. (NAND) (SUMMARY)  © 2001-2006 Red Hat, Inc.
    Block layer SCSI generic (bsg) driver version 0.4 loaded (major 254)
    io scheduler noop registered (default)
    nuc980_gpio_probe - pdev = nuc980-gpio
    nuc980_dma_probe - pdev = nuc980-dma
    nuc980-dma nuc980-dma: NUC980 DMA ready
    nuc980-uart.0: ttyS0 at I/O 0x0 (irq = 36, base_baud = 750000) is a NUC980
    brd: module loaded
    RX nuc980_qspi0_probe: dma0chan0 module removed
    TX nuc980_qspi0_probe: dma0chan1 module removed
    m25p80 spi0.0: found w25q128, expected mx66l51235l
    m25p80 spi0.0: w25q128 (16384 Kbytes)
    Creating 3 MTD partitions on "m25p80":
    0x000000000000-0x000000100000 : "u-boot"
    0x000000100000-0x000000400000 : "kernel"
    0x000000400000-0x000001000000 : "user"
    RX nuc980_spi0_probe: dma0chan2 module removed
    TX nuc980_spi0_probe: dma0chan3 module removed
    m25p80 spi1.0: unrecognized JEDEC id bytes: ff, ff, ff
    m25p80: probe of spi1.0 failed with error -2
    VFS: Mounted root (jffs2 filesystem) on device 31:2.
    devtmpfs: mounted
    Freeing unused kernel memory: 124K
    [Mount JFFS2]: /dev/mtdblock2 --> /mnt/mtdblock2
    
    BusyBox v1.22.1 (2016-02-03 14:11:04 CST) built-in shell (ash)
    Enter 'help' for a list of built-in commands.

(代码已经添加了相关busybox,如果没有busybox需要自行裁剪)
根据上述代码可以看出,内核已经对空间进行了分配,根据需要分配成三个区,并将文件系统挂载到
(VFS: Mounted root (jffs2 filesystem) on device 31:2)
此处的device31:2是什么含义呢?如果挂载了文件系统,则可以看出此代码的含义为挂载在主设备号为31,次设备号为2的设备上,即经过分配的nor0的mtdblock2上。

NUC980@root#ls -l | grep mtdblock2
brw-rw----    1 root     root       31,   2 Jan  1 00:00 mtdblock2
lrwxrwxrwx    1 root     root             9 Jan  1 00:00 root -> mtdblock2

4、如果内核裁剪不到位的话,可能会导致mtd分配失败,只要多设置几次,mtd一定会加载成功的,只要在内核的打印输出中出现如下信息,则代表mtd已经分配成功,可以进行文件系统挂载,在这里还是需要提醒大家,下载到的linux源代码还是尽量不要进行代码级别的修改,否则不是老鸟,出现错误无法查找。

到此移植内核已经完成了,如果有不清楚的可以留言,能回答的可会回复。

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值