• Linux内核移植


    实验步骤:
    (1)准备工作
    (2)修改顶层Makefile
    (3)修改falsh 分区
    (4)配置编译内核

    下面以Linux2.6.30.4内核移植到gec2440为例:

    一、准备工作:
    建立工作目录,下载内核源码并解压:linux-2.6.30.4.tar.bz2。步骤如下:
    Mkdir
    cd /root/build_kernel
    tar -xvf linux-2.6.30.4.tar.gz

    cd linux-2.6.30.4
    解压后会在当前目录下生成一个linux-2.6.30.4 的内核源码目录
    安装交叉工具链,然后修改环境变量,添加新工具链的路径信息,步骤如下:
    #vi /etc/bashrc
    在bashrc 脚本的最后一行添加工具链的路劲信息:
    #export PATH=/usr/local/arm/4.1.2/bin:$PATH
    使bashrc 脚本生效
    #source /etc/bashrc

    二、修改内核源码顶层 Makefile
    修改内核目录树根下的的Makefile,指明体系结构是arm,交叉编译工具是arm-linux- 。
    #vi Makefile
    找到ARCH 和CROSS_COMPILE,修改
    ARCH ?= arm
    CROSS_COMPILE ?= /usr/local/arm/4.1.2/bin/arm-linux-
    保存退出。

    三、修改机器码
    在u-boot-2009.11 的/board/samsun/gec2440/gec2440.c 设置了MACH_TYPE 的类型为
    MACH_TYPE_SMDK2410,查看u-boot 里的include/asm-arm/mach-types.h 文件,有下
    面定义:
    #define MACH_TYPE_SMDK2410 193
    //针对2440 的MACH_TYPE 码的值定义为193
    而linux 内核源码的arch/arm/tools/mach-types 文件有如下定义:
    smdk2410 MACH_SMDK2410 SMDK2410 193
    即u-boot 和linux 内核的同样类型的机器码都为193。
    那么我们就修改kernel 的MACH_TYPE 代码引用部分,确定kernel 的MACH_TYPE。
    如下,修改arch/arm/mach-s3c2440/mach-smdk2440.c :
    //修改文件最后面
    将MACHINE_START(S3C2440, "SMDK2440") 修改为:MACHINE_START(SMDK2410, "SMDK2440")
    修改arch/arm/kernel/head.S
    //在ENTRY(stext)下添加如下代码(红色部分)
    ENTRY(stext)
    mov r0, #0
    mov r1, #0xc1 // MACH_TYPE_SMDK2410 值193 换成十六进制就是0xc1
    ldr r2, =0x30000100 //Linux kernel parameter
    第二种改法:
    查linux 内核源码的arch/arm/tools/mach-types 文件有如下定义:
    smdk2440 MACH_SMDK2440 SMDK2440 1008
    做如下修改
    # vi arch/arm/mach-s3c2440/mach-smdk2440.c
    将MACHINE_START(S3C2440, "SMDK2440")修改为:MACHINE_START(SMDK2440, "SMDK2440")
    修改arch/arm/kernel/head.S
    //在ENTRY(stext)下添加如下代码(红色部分)
    ENTRY(stext)
    mov r0, #0
    mov r1, #0x3f0 // MACH_TYPE_SMDK2440 值1008 换成十六进制就是0x3f0
    ldr r2, =0x30000100 //Linux kernel parameter
    这种改法中会出现如下问题:
    定义在arch/arm/mach-s3c2410/mach-smdk2410.c 中的设备驱动没能链接进来。

    四、设置 flash分区
    1、找到修改的内核文件,此处需要修改以下文件:
    arch/arm/plat-s3c24xx/common-smdk.c ;修改分区信息
    2、确定内核分区表
    3.1、修改分区信息(默认 8个分区,具体分区数目可以根据项目而定,本初设置为 3个)
    vi arch/arm/plat-s3c24xx/common-smdk.c
    修改内核分区信息(本示例分设四个分区)。
    意义:要让内核知道nand flash 的分区信息,设置成跟bootloader 一致。修改如下:
    static struct mtd_partition smdk_default_nand_part[] = {
        [0] = {
            .name = "U-Boot",
            .size = 16*SZ_16K, //分区大小256k
            .offset = 0, // 本分区起始地址0x0
        },
        [1] = {
            .name = "Kernel",
            .offset = 16*SZ_16K, // 本分区起始地址0x40000
            .size =3*SZ_1M, // 分区大小3M
        },
        [2] = {
            .name = "Rootfs",
            .offset = MTDPART_OFS_APPEND, // 紧接上一分区地址
            // 本区起始地址0x340000
            .size = MTDPART_SIZ_FULL, // 使用剩余全部空间
        } //本分区大小0x3cc0000
    }; // 62208K
    name: 代表分区名字
    size: 代表flash 分区大小(单位:字节)
    offset: 代表flash 分区的起始地址(相对于0x0 的偏移)
    保存退出。
    另外在该文件中修改smdk_nand_info 如下:
    static struct s3c2410_platform_nand smdk_nand_info = {
        .tacls =0, //default is 20 参数设置需参看datasheet,上有描述
        .twrph0 =30, //default is 60
        .twrph1 =0, //defualt is 20
        .nr_sets = ARRAY_SIZE(smdk_nand_sets),
        .sets = smdk_nand_sets,
    };
    3.2、修改时钟 (终端输出若有乱码则需修改)
    在arch/arm/mach-s3c2440/mach-smdk2440.c 中修改smdk2440_map_io 如下
    static void __init smdk2440_map_io(void)
    {
        s3c24xx_init_io(smdk2440_iodesc, ARRAY_SIZE(smdk2440_iodesc));
        s3c24xx_init_clocks(12000000); //default is 0
        s3c24xx_init_uarts(smdk2440_uartcfgs, ARRAY_SIZE(smdk2440_uartcfgs));
    }
    3.3、修改 nand Flash的校验方式,去掉 ECC校验,否则上电启动会提示ECC错误或者 I/O读取错误。
    在drivers/mtd/nand/s3c2410.c 中
    将chip->ecc.mode = NAND_ECC_SOFT; 改为 chip->ecc.mode = NAND_ECC_NONE;

    五、配置编译内核
    #make s3c2410_defconfig
    #make menuconfig
    在s3c2410_defconfig 基础上,增删的内核配置项如下:
    这里约定“#”后面的是注释部分。
    Boot options --> Default kernel command string:
    noinitrd root=/dev/mtdblock2 init=/linuxrc console=ttySAC0,115200 (接下行)
    rootfstype=jffs2
    #说明:mtdblock2 代表第3 个flash 分区,它是预设的rootfs 分区
    # console=ttySAC0,115200 使kernel 启动期间的信息全部输出到串口0 上.
    # 2.6 内核对于串口的命名改为ttySAC0,但这不影响用户空间的串口编程。
    # 用户空间的串口编程针对的仍是/dev/ttyS0 等
    #接下来做的是针对文件系统的设置,实验时目标板上要上的文件系统是cramfs
    与jffs2,故做如下配置
    File systems -->
        <> Second extended fs support
        #去除对ext2 的支持
        Miscellaneous filesystems -->
            [*] JFFS2 XATTR support (EXPERIMENTAL)
        #支持jffs2 和cramfs 文件系统
        Network File Systems --> #支持NFS 文件系统
            [ ] NFS client support for the NFSv3 ACL protocol extension
            [*]NFS client support for NFS version 4 (EXPERIMENTAL)
            <*> NFS server support
    Kernel Features --->
        [*] Use the ARM EABI to compile the kernel
        # 一定要选上, 否则会出现内核恐慌(内核指针跑飞)
    保存退出,产生.config 内核配置文件,该文件会在make 的时候被调用。
    编译内核:make
    编译完成后会在arch/arm/boot/目录下生产zImage 内核映象。zImage 映象是可引导的,
    压缩的内核映象,就是我们要移植到开发板上的内核映象文件。
    uImage 镜像制作:
    [root@localhost tools]# ./mkimage -n 'linux-2.6.30.4' -A arm -O linux -T kernel -C none -a 0x30008000 -e 0x30008040 -d /root/build_kernel/linux-2.6.30.4/arch/arm/boot/zImage /root/build_kernel/linux-2.6.30.4/arch/arm/boot/uImage
    上述步骤仅添加了外设flash 与串口等一些基本的驱动,实现一个能在开发板上运行的内核镜像。根据项目要求,需要继续移植的还有:
    CD、触摸DM9000 网卡、L 屏、USB、音频等驱动。

    详细文档下载链接: http://download.csdn.net/detail/klcf0220/5749067

    http://download.csdn.net/detail/klcf0220/5823991

    S5PV210的Linux-2.6.35内核移植: http://download.csdn.net/detail/klcf0220/5751173

    S5PV210的u-boot移植:http://download.csdn.net/detail/klcf0220/5823953

  • 相关阅读:
    Element Pagination分页组件 二次封装
    vue 发送短信验证码倒计时
    生成动态海报,带二维码
    H5九宫格抽奖,亲测可用
    elementui el-select使用远程搜索单选,输入内容不会触发remote-method
    日期格式转换,转换格式YYYY-MM-DD HH:mm:ss
    bignumber.js是一款用于任意精度十进制和非十进制算术的JavaScript库
    element table切换分页不勾选的自带方法
    密码强度校验
    webdriver-设置代理
  • 原文地址:https://www.cnblogs.com/klcf0220/p/3188731.html
Copyright © 2020-2023  润新知