本文将介绍如何移植linux-3.4.2内核到JZ2440开发板上的全过程,使用的交叉编译工具版本为 arm-linux-gcc-4.3.2.tar.bz2

    下面来一步一步介绍如何移植。

    由于kernel的启动参数是由Uboot传递的,关键的参数有 R0=0 R1=Mach-Type R2=Tag参数地址

    其中,Mach-Type为内核支持板子的硬件型号,tag参数为Uboot存放传递给Kernel参数的内存地址。

    内核启动时,根据传入的Mach-Type参数选择对应的板级初始化函数来初始化,然后解析tag参数,设置相应系统状态值,装载驱动程序,最后挂载根文件系统。

    1. 编译内核

     修改根目录下面的Makefile,该ARCH ?= arm ,CROSS_COMPILE ?= arm-linux-

     针对arm架构的板级配置文件,位于 arch/arm/configs/mini2440_defconfig 和 s3c2410_defconfig 这两个有参考意义的配置文件。

     配置内核  make s3c2410_defconfig

     编译内核  make  uImage    //最终生成的uImage位于 arch/arm/boot/uImage

     测试新内核  开机进入boot命令行,tftp 0x32000000 uImage ; bootm 0x32000000;

     问题解决:新内核启动后,有可能串口打印出乱码,原因可能是 Uboot没有传递 console 的正确参数,也有可能是内核对于串口时钟频率没有初始化成功。

     Uboot启动时传递的Mach-Type,如果有命令行指定的,则使用指定的,否则就使用环境变量中的machid值。

     对于内核来说,每种硬件配置的板子都对于一个固定的Mach-Type ID,Uboot传递的Mach-Typ必须与其一致,这样,内核才能正确识别。 

     最少的内核启动命令行: set bootargs console=ttySAC0,115200 root=/dev/mtdblock3 ; set machid MACH_ID

     内核支持的板级列表文件为:  include/generated/mach-types.h

     这里,我们使用的是smdk2440配置:

   1:  //arch/arm/mach-s3c24xx/mach-smdk2440.c
   2:  static void __init smdk2440_map_io(void)
   3:  {
   4:      s3c24xx_init_io(smdk2440_iodesc, ARRAY_SIZE(smdk2440_iodesc));
   5:      s3c24xx_init_clocks(12000000);   //将原来的16934400 改为 12000000
   6:      s3c24xx_init_uarts(smdk2440_uartcfgs, ARRAY_SIZE(smdk2440_uartcfgs));
   7:  }

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }     然后,重新编译,测试就可以。

 

    2. 修改内核默认分区

    默认内核启动,对nand flash的分区如下:

   

    这样的分区,不是我们想要的,通过在内核代码中搜索 “S2C2410 flash partitions 1”可以找到位于 common-smdk.c中smdk_default_nand_part分区数组。

    我们期望的分区为:

     ,经过修改后的分区数组如下:

   1:  //  arch/arm/mach-s3c24xx/common-smdk.c
   2:  static struct mtd_partition smdk_default_nand_part[] = {
   3:      [0] = {
   4:          .name    = "Bootloader",
   5:          .size    = SZ_256K,
   6:          .offset    = 0,
   7:      },
   8:      [1] = {
   9:          .name    = "params",
  10:          .offset = MTDPART_OFS_APPEND,
  11:          .size    = SZ_128K,
  12:      },
  13:      [2] = {
  14:          .name    = "kernel",
  15:          .offset = MTDPART_OFS_APPEND,
  16:          .size    = SZ_2M,
  17:      },
  18:      [3] = {
  19:          .name    = "rootfs",
  20:          .offset    = MTDPART_OFS_APPEND,
  21:          .size    = MTDPART_SIZ_FULL,
  22:      }
  23:  };

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

3. 修改内核支持yaffs2文件系统

    3.4.2内核版本 默认支持  jaffs2 文件系统,而且在挂载根文件系统的过程中,尝试能够支持的文件系统类型(ext2,3,cramfs,vfat,msdos romfs等)

     如果文件系统类型为 jffs2类型,需要重新设置bootargs,

     set bootargs console=ttySAC0,115200 root=/dev/mtdblock3 rootfstype=jffs2

    如果是yaffs2类型,不需要重新设置

    编译根文件系统的编译器最好和编译内核的编译器保持一致。 先配置好交叉编译工具链,然后编译Busybox后,执行 make install CONFIG_PREFIX=/home/hao/nfs/fs_mini_mdev_new/ , 这样,基本的文件系统框架出来了。

    接着,安装glibc库,    拷贝交叉编译工具链目录下的   这两个库的所有的so文件拷贝到 fs_mini_mdev_new目录下的lib目录(新建立的lib目录),拷贝的时候,注意 cp *so* /home/hao/nfs/fs_mini_mdev_new/lib –d  -d选项拷贝保留链接属性。目录属性对应一致。  

    构建基本的linux目录,etc目录,这个目录可以参考以前已经创建好的etc目录

    dev目录,这个目录下,需要事先创建两个特殊设备 console 和null ,具体信息可以参考linux系统上的设备

    其他必须的目录有,proc,tmp,mnt,sys,root等。

    创建jffs2文件类型的根文件系统:

    mkfs.jffs2 -n -s 2048 -e 128KiB -d fs_mini_mdev_new -o fs_mini_mdev_new.jffs2

    -s    扇区大小  

    -e    可擦除块

    -d    源目录

    -o    输出文件

    如果出现 :

    说明,内核收到退出代码为0x04的信号,经过查阅得知为非法指令,可能是内核不支持由此编译器编译出的init的特殊指令,需要设置内核支持此指令。

    Kernel Features –> Use the ARM EABI to compile the kernel  选中已支持 eabi特性。

 

   为什么内核不支持yaffs2文件系统呢?因为内核代码中不包含yaffs文件系统源码,但是包含jffs2文件系统源码。

   通过git命令下载yaffs2文件系统源码:git clone git://www.aleph1.co.uk/yaffs2

   切换到yaffs2目录中,执行 ./patch-ker.sh c m /to/linux/dir ,然后去linux源码中,通过make menuconfig来配置yaffs2即可。

   编译yaffs2中出现的错误,是yaffs中结构体函数引用不正确,加上下划线就可以了。

   另外,需要在 最新版本的Uboot的代码 drivers/mtd/nand/nand_util.c 中 ,添加 WITH_YAFFS_OOB这一项,就可以正常启动yaffs格式的uImage了。

// drivers/mtd/nand/nand_util.c
 
555  if (!need_skip && !(flags & WITH_DROP_FFS) && !(WITH_YAFFS_OOB)) {                                   
556         rval = nand_write(nand, offset, length, buffer);
557         if (rval == 0)
558             return 0;
559 
560         *length = 0;
561         printf("NAND write to offset %llx failed %d\n",
562             offset, rval);
563         return rval;
564     }

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

4. 裁剪内核

    现在 .config配置文件中找支持的单板类型,然后在menuconfig中搜索选项配置位置,按图索骥,去掉对于支持类型选项。

    去掉内核支持的其他单板类型,只保留指定单板代码:

搜索可知: ,去掉对于支持的类型即可。

   在嵌入式领域用不到的文件系统,可以去掉,例如 ext2、ext3、ext4等。msdos要保留,应该以后可能会接U盘,而U盘一般为vfat文件系统。

   ……..写的不好,未完待续……………..

Technorati 标签: kernel 移植

移植3.4.2的Kernel到JZ2440的更多相关文章

  1. 移植linux4.7.2与ubifs到jz2440

    前言 整个暑假跟着韦东山的视频和书籍移植了linux2.3.6到jz2440,现在自己尝试移植linux4.7.2到板子上,并使用ubifs文件系统代替旧的jffs2文件系统. 下载交叉编译工具链 工 ...

  2. Android6.0内核移植(2):kernel编译内核

    普通步骤是:用来编译整个Android源码 source build/envsetup.sh lunch sabresd_6dq-user make -j20 不过每次这样太繁琐,下面来单独编译ker ...

  3. JZ2440 u-boot-2016.11、linux-4.17和busybox-1.28.4移植笔记

    2018年5月份开始在JZ2440上陆续移植了u-boot-2016.11.u-boot-spl-2016.11.linux-4.17和busybox-1.28.4,其中linux-4.17和busy ...

  4. jz2440不能成功地启动文件系统, Failed to execute /linuxrc.

    文件系统加载失败,错误信息提示:    VFS: Mounted root (nfs filesystem).    Freeing init memory: 140K    Failed to ex ...

  5. Qualcomm平台camera调试移植入门

    1  camera基本代码架构 高通平台对于camera的代码组织,大体上还是遵循Android的框架:即上层应用和HAL层交互,高通平台在HAL层里面实现自己的一套管理策略:在kernel中实现se ...

  6. [IMX6]Android6.0移植和分析

    0. 知识点 中断(设备树) [IMX6]设备树分析--dts 1. 编译 Android6.0内核移植(1):分析编译日志 Android6.0内核移植(2):kernel编译内核 单独烧录kern ...

  7. linux kernel如何处理大端小端字节序

    (转)http://blog.csdn.net/skyflying2012/article/details/43771179 最近在做将kernel由小端处理器(arm)向大端处理器(ppc)的移植的 ...

  8. 【LiteOS】STM32F103-LiteOS移植教程(详细篇)【华为云技术分享】

    版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/devcloud/article/detai ...

  9. 【LiteOS】STM32F103-LiteOS移植教程(详细篇)

    总览 本文基于STM32F103C8T6,详细讲述华为LiteOS的移植过程.开发工具是MDK5.LiteOS官方已经适配过cortex M系列内核的单片机,因此移植过程非常简单. LiteOS有两种 ...

随机推荐

  1. Android开发(三十)——ScrollView中ListView的高度自动适应

    int totalHeight = 0; for (int i = 0; i < mStrings.length; i++) { //pullList ListView //mAdapter A ...

  2. iOS概念之KVO(Key-Value Observing)

    在一个复杂的,有状态的系统中,当一个对象的状态发生改变,如何通知系统,并对状态改变做出相应的行为是必需考虑的一个问题,在iOS中为这类问题提供了4种解决方法: 1. NSNotifiactaion和N ...

  3. [EF] 如何在 Entity Framework 中以手动方式设定 Code First 的 Migration 作业

    Entity Framework (简称 EF) 发展到现在, 版本已经进入 6.1.0, 距离我写的「在 VS2013 以 Code First 方式建立 EF 资料库」这篇文章已有半年的时间.如果 ...

  4. 迷你版mvc框架执行过程

    一.把路由添加到路由表, 二.注册ControllerBuilder(老板)和默认工厂(DefaultControllerFactory) 2.1默认工厂获取可以创建的Controller. 三.由于 ...

  5. Spring boot 报错 Unable to start EmbeddedWebApplicationContext due to missing EmbeddedServletContainerFactory bean.

    在实际开发中修改别人的代码,发现了这个报错,后来发现是因为pom.xml里面 只要将注释掉的部分注释掉就好了.

  6. [转]MySQL中int(11)最大长度是多少?

    原文地址:https://blog.csdn.net/allenjay11/article/details/76549503 今天在添加数据的时候,发现当数据类型为 int(11) 时,我当时让用户添 ...

  7. azkaban安装

    1.下载:git clone https://github.com/azkaban/azkaban.git 2.编译:./gradlew build -x test 3. 创建目录并拷贝 mkdir ...

  8. Windows API 常用函数

    .Net中虽然类库很强的,但还是有些时候功能有限,掌握常用的api函数,会给我们解决问题提供另一种思路,下面给出自己常用到的Api函数,以备查询. 知道api函数,但却不知道c#或VB.net该如何声 ...

  9. linux 的服务与进程管理(二)

    2.linux 的服务与进程管理 [2.1]系统启动流程 简单的介绍下linux的系统启动流程,方便我们深入了解linux操作系统,对排除linux系统故障进行帮助.启动流程虽然简单但背后还有着更加复 ...

  10. 阿里云免费SSL证书绑定+sever2012 IIS配置

    1.阿里云域名 2.点击证书 3.免费证书 4.下载证书 5.服务器-运行-mmc 进入制台程序 6.制台程序,选择菜单“文件"中的"添加/删除管理单元”-> “添加”,从“ ...