近来无事就想着动手移植新的内核在JZ2440开发板上跑起来,/zixunimg/eeworldimg/www.kernel.org/ 下载kernel linux-4.15.6.tar.xd,执行
xz -d linux-4.15.6.tar.xz
tar -xvf linux-4.15.6.tar
进行解压操作,就可以进行移植操作了。
1.修改Makefile文件:
-ARCH ?= $(SUBARCH)
-CROSS_COMPILE ?= $(CONFIG_CROSS_COMPILE:"%"=%)
+ARCH ?= arm
+CROSS_COMPILE ?= arm-linux-gnueabi-
在3.4.2内核中交叉编译设置arm-linux-就可以编译,这里不知为何会出错,网上查找设置成arm-linux-gnueabi-就可以,我的arm-linux-gcc 的版本是4.3.2,arm-linux-gnueabi-gcc的版本是4.7.3。需要注意的是arm和arm-linux-gnueabi-之后不能添加任何的空格否则会出现莫名其妙的错误。
复制arch/arm/config/s3c2410_defconfig文件到内核源码根目录
2.修改晶振频率
linux-4.15.6/arch/arm/mach-s3c24xx/mach-smdk2440.c 文件中
static void __init smdk2440_init_time(void)
{
//s3c2440_init_clocks(16934400);
s3c2440_init_clocks(12000000);
samsung_timer_init();
}
修改时钟频率为12M,否则串口输出将为乱码
3.修改mtd分区
/linux-4.15.6/arch/arm/mach-s3c24xx/common-smdk.c文件中
/* NAND parititon from 2.4.18-swl5 */
static struct mtd_partition smdk_default_nand_part[] = {
[0] = {
.name = "bootloader",
.size = SZ_256K,
.offset = 0,
},
[1] = {
.name = "params",
.offset = MTDPART_OFS_APPEND,
.size = SZ_128K,
},
[2] = {
.name = "kernel",
.offset = MTDPART_OFS_APPEND,
.size = SZ_4M,
},
[3] = {
.name = "rootfs",
.offset = MTDPART_OFS_APPEND,
.size = MTDPART_SIZ_FULL,
}
};
这个要跟uboot的mtdparts相对应,由于新的kernel比较大,原先的2M不够,故这里修改为4M。设置uboot变量用set 命令,后需要saveenv进行保存变量。
uboot环境变量:
baudrate=115200
ethaddr=08:00:3e:26:0a:5b
serverip=192.168.7.11
netmask=255.255.255.0
mtdids=nand0=nandflash0
bootdelay=5
ipaddr=172.16.91.161
mtdparts=mtdparts=nandflash0:256k@0(bootloader),128k(params),4m(kernel),-(root)
machid=16a //s3c2440对应的id
filesize=1A7540
bootcmd=nand read 0x30008000 0x80000 0x500000
bootargs=init=/linuxrc console=ttySAC0,115200 root=/dev/mtdblock3 rootfstype=yaffs2 rw mem=64M
nand=read 30000000 kernel;bootm 30000000
stdin=serial
stdout=serial
stderr=serial
partition=nand0,0
mtddevnum=0
mtddevname=bootloader
Environment size: 525/131068 bytes
make s3c2410_defconfig配置生成.config文件,
make uImage在arch/arm/boot/目录底下生成uImage镜像文件。
4.分区设置好之后但是还是不能正常启动开发板,需要制作根文件系统。
4.1
下载busybox-1.20.0,make menuconfig
Busybox Settings ===>Build Options ====>Build Busybox as a static binary(no shared libs)编为静态库
4.2
修改Makefile 中的 ARCH 和 CROSS_COMPILE 为arm 和 arm-linux-
直接进行make,之后进行安装,执行命令
4.3
make CONFIG_PREFIX=/home/username/rootfs
安装到指定目录位置,这里装到roofs目录底下,将出现bin sbin usr 目录和linuxrc文件
修改linuxrc文件权限chmod 777 linuxrc。
4.4
创建etc lib proc tmp dev home mnt root sys等目录。
在etc文件夹底下创建fstab、inittab、mdev.conf等文件,创建文件夹init.d,并在其目录底下创建rcS文件。
inittab文件中的内容定义如下:
::sysinit:/etc/init.d/rcS
console::askfirst:-/bin/sh
::ctrlaltdel:/sbin/reboot
::shutdown:/bin/umount -a -r
fstab文件中的内容定义如下:
#device mount-point type option dump fsck order
proc /proc proc defaults 0 0
tmpfs /tmp tmpfs defaults 0 0
sysfs /sys sysfs defaults 0 0
tmpfs /dev tmpfs defaults 0 0
rcS文件中的内容定义如下:
PATH=/sbin:/bin:/usr/sbin:/usr/bin
runlevel=S
prevlevel=N
umask 022
export PATH runlevel prevlevel
mount -a
echo /sbin/mdev>/proc/sys/kernel/hotplug
mdev -s
各个文件的定义详解请见/zixunimg/eeworldimg/blog.csdn.net/mybelief321/article/details/10007719
4.5
添加库文件。查看自己的工具链环境变量echo $PATH,可得知其安装目录。如我的是/usr/local/arm/4.3.2/目录
/opt/jdk1.6.0_32/bin:/opt/jdk1.6.0_32/jre/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/arm/4.3.2/bin:
执行命令
cp /usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/armv4t/lib/*so* lib/ -d
-d :若来源文件为连结文件的属性(link file),则复制连结文件属性而非档案本身;
4.6
需要在dev中创建console 和null节点
mknod console c 5 1
mknod null c 1 3
权限要求加sudo
4.7
制作yaffs2根文件系统:
由于所使用的开发板NAND是256M的,需要使用工具mkyaffs2image-128M进行制作根文件系统。
cd /home/username/
mkyaffs2image-128M rootfs/ rootfs.yaffs2
制作根文件系统文件rootfs.yaffs2,通过uboot进行烧写进开发板。
而此时的开发板内核是没有支持yaffs2文件系统的,需要进行打补丁。
5.内核增加支持yaffs2文件系统
git clone git://www.aleph1.co.uk/yaffs2
下载yaffs2源码,进入yaffs2源码根目录,给4.15.6内核打补丁
./patch-ker.sh c m /your kernel path
将在内核fs目录底下添加yaffs2文件夹,fs目录底下的Makefile和Kconfig中添加对yaffs2文件系统的支持。
make menuconfig配置内核,
Location: │
│ -> File systems │
│ -> Miscellaneous filesystems (MISC_FILESYSTEMS [=y]) │
│ (2) -> yaffs2 file system support (YAFFS_FS [=y])
make clean清理下
make uImage重新生成内核镜像文件uImage
6.
由于yaffs2的更新脚步跟不上kernel的更新,所以在编译uImage时候会出现错误。
根据错误提示进行相应位置的修改即可:
iff -urN compare-linux-4.15.6/linux-4.15.6/fs/yaffs2/yaffs_vfs.c linux-4.15.6/fs/yaffs2/yaffs_vfs.c
--- compare-linux-4.15.6/linux-4.15.6/fs/yaffs2/yaffs_vfs.c 2018-03-03 09:19:34.482203584 +0800
+++ linux-4.15.6/fs/yaffs2/yaffs_vfs.c 2018-03-02 17:27:47.442250025 +0800
@@ -136,7 +136,8 @@
#if (LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 26))
#define Y_INIT_TIMER(a) init_timer(a)
#else
-#define Y_INIT_TIMER(a) init_timer_on_stack(a)
+//#define Y_INIT_TIMER(a) init_timer_on_stack(a)//查看源码4.15.6并无该函数
+#define Y_INIT_TIMER(a) __init_timer_on_stack(a,NULL,0)
#endif
#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 27))
@@ -262,6 +263,8 @@
#define YAFFS_NEW_GET_LINK 0
#endif
+#define CURRENT_TIME (current_kernel_time())
+
#define update_dir
『本文转载自网络,版权归原作者所有,如有侵权请联系删除』