linux内核移植jz2440,移植新内核4.15.6到JZ2440开发板

近来无事就想着动手移植新的内核在JZ2440开发板上跑起来,https://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

各个文件的定义详解请见http://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_time(dir) do {

(dir)->i_ctime = (dir)->i_mtime = CURRENT_TIME;

} while (0)

diff -urN compare-linux-4.15.6/linux-4.15.6/fs/yaffs2/yportenv.h linux-4.15.6/fs/yaffs2/yportenv.h

--- compare-linux-4.15.6/linux-4.15.6/fs/yaffs2/yportenv.h      2018-03-03 09:19:34.482203584 +0800

+++ linux-4.15.6/fs/yaffs2/yportenv.h   2018-03-02 17:36:59.814250025 +0800

@@ -59,6 +59,7 @@

#define YAFFS_ROOT_MODE                        0755

#define YAFFS_LOSTNFOUND_MODE          0700

+#define CURRENT_TIME            (current_kernel_time()) //查看3.4.2源码中该宏所对应函数

#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 5, 0))

#define Y_CURRENT_TIME CURRENT_TIME.tv_sec

diff -urN compare-linux-4.15.6/linux-4.15.6/include/linux/timer.h linux-4.15.6/include/linux/timer.h

--- compare-linux-4.15.6/linux-4.15.6/include/linux/timer.h     2018-02-25 18:15:44.000000000 +0800

+++ linux-4.15.6/include/linux/timer.h  2018-03-02 17:29:01.310250025 +0800

@@ -19,7 +19,7 @@

unsigned long           expires;

void                    (*function)(struct timer_list *);

c2c9ed493cd281aa86d8a6f5178c4c01.gif [1] [2] [3] 610626052e95c7fbe3d254abc769d9ad.gif

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值