jz2440-linux3.4.2-kernel移植

云平台

  平台:jz2440

  作者:庄泽彬

  说明:linux系统移植

  交叉编译工具:arm-linux-gcc (GCC)4.3.2

  linux:linu3.4.2

  PC环境:ubuntu18.04

  一、kernel的编译和烧录:

  下载linux-3.4.2版本进行移植,下载链接:https://mirrors.edge.kernel.org/pub/linux/kernel/v3.x/

  修改顶层Makefile,设置为arm架构,以及设置交叉工具链

  zhuang@zhuang:~/project/3-jz2440/systems/linux-3.4.2$ git diff .diff --git a/Makefile b/Makefileindex 901a9557..9cc1639a 100644--- a/Makefile+++ b/Makefile@@ -192,8 +192,8 @@ SUBARCH := $(shell uname -m

   sed -e s/i.86/i386/ -e s/sun4u/sparc64/ \ # Default value for CROSS_COMPILE is not to prefix executables # Note: Some architectures assign CROSS_COMPILE in their arch/*/Makefile export KBUILD_BUILDHOST := $(SUBARCH)-ARCH ?= $(SUBARCH)-CROSS_COMPILE ?= $(CONFIG_CROSS_COMPILE:"%"=%)+ARCH ?= arm+CROSS_COMPILE ?= arm-linux- # Architecture as present in compile.h UTS_MACHINE := $(ARCH)编译:

  make s3c2410_defconfigmake uImage -j4

  哎呀,竟然报了下面这个错误:

  应该是高版本的make导致这个错误出现的,按照错误的log修改文件。

  修改如下:

  diff --git a/kernel/timeconst.pl b/kernel/timeconst.plindex eb51d76e..04612394 100644--- a/kernel/timeconst.pl+++ b/kernel/timeconst.pl@@ -370,7 +370,7 @@ if ($hz eq '--can') { } @val = @{$canned_values{$hz}};- if (!defined(@val)) {+ if (!@val) { @val = compute_values($hz); } output($hz, @val);生成对应的uImage :

  上述编译出来的内核烧录到板子加载内核却出现乱码,出现乱码,有可能是我们的机器ID没有设置好,导致调用的初始化错误导致的。:

  二 、内核的启动

  uboot启动内核主要的操作如下,从nandflash里把内核读入内存,设置TAG参数(内存的起始地址大小,命令行参数等等),R1存放机器ID,R2存放参数的存放地址,内核在启动的时候会解析TAG参数,根据uboot传递过来的机器ID,判断是否能够该机器,从而调用对应板子的初始化函数.

  uboot设置机器ID的代码主要流程如下:

  Smdk2410.c (board\samsung\smdk2440) board_init gd->bd->bi_arch_number = MACH_TYPE_SMDK2410; //设置机器ID的默认值Bootm.c (arch\arm\lib)boot_jump_linuxunsigned long machid = gd->bd->bi_arch_number;s = getenv("machid"); //可根据环境变量设置机器ID我在cmdline随便设置一个machid,看看内核那些板子

  set machid 33333启动过程打印的log,根据log可以看出有匹配对应的开发板子的一个过程,最后由于匹配失败,卡在这里。

  OKUsing machid 0x33333 from environmentStarting kernel ...Uncompressing Linux... done, booting the kernel.Error: unrecognized/unsupported machine ID (r1 = 0x00033333).Available machine support:ID (hex) NAME00000400 AML_M59000000014b Simtec-BAST0000015b IPAQ-H19400000039f Acer-N3500000290 Acer-N30000002a8 Nex Vision - Otom 1.100000454 QT2410000000c1 SMDK2410000005b4 TCT_HAMMER000001db Thorcom-VR1000000005d2 JIVE000003fe SMDK2413000003f1 SMDK241200000377 S3C241300000474 VSTMS00000695 SMDK2416000002de Simtec-Anubis00000707 AT2440EVB000007cf MINI2440000002a9 NexVision - Nexcoder 24400000034a Simtec-OSIRIS00000250 IPAQ-RX37150000016a SMDK244000000518 GTA02000003b8 HP iPAQ RX19500000043c SMDK24432.1 mini2440开发板的machid 7cf

  设置cmdline波特率为115200

  set bootargs console=ttySAC0,115200 root=/dev/mtdblock3 nfs 32000000 192.168.1.100:/work/nfs_root/uImage //烧录内核命令设置machid为mini2440的开发板7cf,启动,串口不会有乱码.

  2.2smdk2440开发板的machid 16a

  设置machid为smdk2440开发板16a,串口却出现乱码:

  我们来看看内核smd2440开发板初始化代码,是不是跟jz2440有差异:

  Mach-smdk2440.c (arch\arm\mach-s3c24xx) MACHINE_START(S3C2440, "SMDK2440") /* Maintainer: Ben Dooks <ben-linux@fluff.org> */ .atag_offset= 0x100, .init_irq= s3c24xx_init_irq, .map_io= smdk2440_map_io, //这个函数的初始化化有点问题, .init_machine= smdk2440_machine_init, .timer= &s3c24xx_timer, .restart= s3c244x_restart, MACHINE_static void __init smdk2440_map_io(void) { s3c24xx_init_io(smdk2440_iodesc, ARRAY_SIZE(smdk2440_iodesc));s3c24xx_init_clocks(16934400); //jz2440开发板是12M的晶振,使用使用smdk2440的machid,这里要修改为12000000s3c24xx_init_uarts(smdk2440_uartcfgs, ARRAY_SIZE(smdk2440_uartcfgs));}代码修改如下,smdk2440开发板,串口输出不会有乱码:

  zhuang@zhuang:~/project/3-jz2440/systems/linux-3.4.2$ git diff .diff --git a/arch/arm/mach-s3c24xx/mach-smdk2440.c b/arch/arm/mach-s3c24xx/mach-smdk2440.cindex 83a1036d..b92c2bd5 100644--- a/arch/arm/mach-s3c24xx/mach-smdk2440.c+++ b/arch/arm/mach-s3c24xx/mach-smdk2440.c@@ -162,7 +162,7 @@ static struct platform_device *smdk2440_devices[] __initdata = { static void __init smdk2440_map_io(void) { s3c24xx_init_io(smdk2440_iodesc, ARRAY_SIZE(smdk2440_iodesc));- s3c24xx_init_clocks(16934400);+ s3c24xx_init_clocks(12000000); //jz2440开发板是12M的晶振,使用使用smdk2440的machid,这里要修改为12000000 s3c24xx_init_uarts(smdk2440_uartcfgs, ARRAY_SIZE(smdk2440_uartcfgs)); }设置为smdk2440开发板的machid 16a,启动系统串口没有输出乱码见下图:

  三、修改内核分区

  内核将nandflash分区划分如下:

  0x00000000-0x00040000 : "bootloader"0x00040000-0x00060000 : "params"0x00060000-0x00260000 : "kernel"0x00260000-0x10000000 : "root"代码修改如下:

  diff --git a/arch/arm/mach-s3c24xx/common-smdk.c b/arch/arm/mach-s3c24xx/common-smdk.cindex 084604be..f7dce9b9 100644--- a/arch/arm/mach-s3c24xx/common-smdk.c+++ b/arch/arm/mach-s3c24xx/common-smdk.c@@ -110,43 +110,23 @@ static struct platform_device smdk_led7 = { static struct mtd_partition smdk_default_nand_part[] = { [0] = {- .name = "Boot Agent",- .size = SZ_16K,+ .name = "bootloader",+ .size = SZ_256K, .offset = 0, }, [1] = {- .name = "S3C2410 flash partition 1",- .offset = 0,- .size = SZ_2M,+ .name = "params",+ .offset = MTDPART_OFS_APP,+ .size = SZ_128K, }, [2] = {- .name = "S3C2410 flash partition 2",- .offset = SZ_4M,- .size = SZ_4M,- },- [3] = {- .name = "S3C2410 flash partition 3",- .offset = SZ_8M,+ .name = "kernel",+ .offset = MTDPART_OFS_APP, .size = SZ_2M, },- [4] = {- .name = "S3C2410 flash partition 4",- .offset = SZ_1M * 10,- .size = SZ_4M,- },- [5] = {- .name = "S3C2410 flash partition 5",- .offset = SZ_1M * 14,- .size = SZ_1M * 10,- },- [6] = {- .name = "S3C2410 flash partition 6",- .offset = SZ_1M * 24,- .size = SZ_1M * 24,- },- [7] = {- .name = "S3C2410 flash partition 7",- .offset = SZ_1M * 48,+ [3] = {+ .name = "rootfs",+ .offset = MTDPART_OFS_APP, .size = MTDPART_SIZ_FULL, } };zhuang@zhuang:~/project/3-jz2440/systems/linux-3.4.2$内核启动将会把nandflash划分为上述四个分区

  四、制作新的文件系统

  3.1编译busybox1.20.0

  解压busybox

  tar -xvf busybox-1.20.0.tar.bz2

  设置交叉工具链make menuconfig

  编译:make

  安装:make install CONFIG_PREFIX=/work/nfs_root/fs_mini_mdev_new

  从交叉工具链安装glibc

   cd /work/nfs_root/fs_mini_mdev_new mkdir lib usr/lib cp /usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/armv4t/lib/*so* lib/ -d cp /usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/armv4t/usr/lib/*so* usr/lib/ -d创建etc目录

  mkdir etc在etc目录下创建inittab文件

  vim inittab //内容从2-6行# /etc/inittab::sysinit:/etc/init.d/rcSconsole::askfirst:-/bin/sh::ctrlaltdel:/sbin/reboot::shutdown:/bin/umount -a -r在etc目录下穿件init.d/rcS文件

  mkdir init.dvim init.d/rcS chmod a+x init.d/rcS //设置为可执行文件rcS文件内容如下:#!/bin/shmount -amkdir /dev/ptsmount -t devpts devpts /dev/ptsecho /sbin/mdev > /proc/sys/kernel/hotplugmdev -s在etc目录下创建fstab文件:内容如下:

  # device mount-point type options dump fsck orderproc /proc proc defaults 0 0 tmpfs /tmp tmpfs defaults 0 0 sysfs /sys sysfs defaults 0 0 tmpfs /dev tmpfs defaults 0 0创建dev目录:

  mkdir devsudo mknod console c 5 1sudo mknod null c 1 3创建其他目录

  mkdir proc tmp mnt sys root编译制作jffs2映像文件的工具

   tar -xvf mtd-utils-05.07.23.tar.bz2 cd mtd-utils-05.07.23/util make sudo make install//根据需要有可能要先编译zlib库将fs_mini_mdev_new目录制作成文件系统镜像命令:

  mkfs.jffs2 -n -s 2048 -e 128KiB -d fs_mini_mdev_new -o fs_mini_mdev_new.jffs2在uboot中将文件系统和内核烧录进系统命令

  nfs 30000000 192.168.1.100:/work/nfs_root/fs_mini_mdev_new.jffs2nand erase.part rootfsnand write.jffs2 30000000 260000 $filesizeset bootargs console=ttySAC0,115200 root=/dev/mtdblock3 rootfstype=jffs2//烧录内核nfs 32000000 192.168.1.100:/work/nfs_root/uImage7 bootm 32000000启动系统,却报了如下的错误,这是由于我们的交叉工具链接在编译的时候是使用eabi接口的,内核也要使用这种接口才行

  进入内核make menuconfig,加上EABI接口

  重新烧录系统,成功进入系统没有问题。

  五、移植yaffs文件系统

  下载yaffs文件系统的链接:https://yaffs.net/get-yaffs

  或者使用git下载命令:

  git clone git://www.aleph1.co.uk/yaffs2将yaffs文件系统源码安装到内核:

  ./patch-ker.sh c m /home/zhuang/project/3-jz2440/systems/linux-3.4.2

  make menuconfig选中yaffs文件系统

  编译却报了如下的错误:

  查看内核struct mtd_info的定义,并没有sync成员而是_sync,把报错的地方都加上_即可。

  将文件系统制作成yaffs2文件系统镜像

   mkyaffs2image fs_mini_mdev_new fs_mini_mdev_new.yaffs2烧录启动:

  nfs 30000000 192.168.1.100:/work/nfs_root/fs_mini_mdev_new.yaffs2nand erase.part rootfsnand write.yaffs 30000000 260000 $filesize

  觉得不错,就给我点小吧,蟹蟹

标签: 云平台