由于此处使用的为nor-flash,而且不适用RAMfs文件系统,因此配置内核为3MB大小,uboot为1MB大小,剩余的空间为文件系统空间,后续如果有需求再进行改动。
1、配置环境变量的文件系统,配置内容下:
1
2
3
4
5
6
7
8
9
10
11baudrate=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的配置,直接在内核的文件夹输入
1
2vim arch/arm/mach-nuc980/dev.c
将其修改为如下数值,然后保存,后续配置后进行make即可。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24static 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分区,可以在内核的实际打印信息中看到。
这样制作空间划分如下
- Uboot 1M空间
- 内核 3M空间
- 用户 12M空间
如果没有增加非常多的服务,那么这样的划分是没有问题的,内核的裁剪一定要到位,不必要的服务必须全部切掉,保证内核足够精简,user的空间其实也可以划分为两部分,使用前面7M用于挂在文件系统,后面用于挂在其他文件,保证加载文件系统的速度。
2、内核需增加MTD相关选项,SPI-flash相关选项,并将所有不必要的选项都关闭,如关闭USB,关闭网络等,都是没有必要的程序,删除之后就可以进行编译下载了,并取消使用RAM加载文件系统的选项,编译完成的内核代码一般都在2M以内,根据上述的分配,内核空间有3M,完全满足需求,直接将代码下载到0x100000位置即可。
3、实际的内核裁剪比较复杂,选线比较多,如果有不清楚的选项可以先进行搜索,确认其功能然后进行修改,在修改的过程中,应该先修改硬件相关的驱动文件,然后修改mtd,然后修改文件系统等,因为各个选项都是关联的,如果驱动没有被选中,那么在工作的过程中就会出现问题,对于没有选择的硬件驱动,应该尽量将对应的应用驱动删除,如没有选用nand相关的硬件驱动,则应该删除nand相关的文件系统支持,否则编译就会出错。
进行裁剪后加载完成的界面如图
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98U-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上。
1
2
3
4NUC980@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源代码还是尽量不要进行代码级别的修改,否则不是老鸟,出现错误无法查找。
到此移植内核已经完成了,如果有不清楚的可以留言,能回答的可会回复。
最后
以上就是重要帆布鞋最近收集整理的关于NUC980如何进行内核修改并进行烧录的全部内容,更多相关NUC980如何进行内核修改并进行烧录内容请搜索靠谱客的其他文章。
发表评论 取消回复