概述
由于此处使用的为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分区,可以在内核的实际打印信息中看到。
这样制作空间划分如下
- Uboot 1M空间
- 内核 3M空间
- 用户 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源代码还是尽量不要进行代码级别的修改,否则不是老鸟,出现错误无法查找。
到此移植内核已经完成了,如果有不清楚的可以留言,能回答的可会回复。
最后
以上就是重要帆布鞋为你收集整理的NUC980如何进行内核修改并进行烧录的全部内容,希望文章能够帮你解决NUC980如何进行内核修改并进行烧录所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复