×
单片机 > 单片机程序设计 > 详情

移植新内核4.15.6到JZ2440开发板

发布时间:2024-05-05 发布时间:
|

近来无事就想着动手移植新的内核在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

[1] [2] [3]
移植内核4156JZ2440开发板

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
单片机中高阻态的实质及意义