GEC2440&L inux 2.6 .30.4 内核移植实验 概述 : 对于嵌入式 linux 系统来说,有各种体系结构的处理器和硬件平台,用户根据自己 的需要定制的硬件平台 , 只要是硬件平台有一点点变化 , 就需要做一些移植工作 , linu x 内核移植是嵌入式 linux 系统中最常见的一项工作。 由于 linux 内核具备可移植性的特点,并且已经支持了很多种目标板,这样,用户 很容易从中找到跟自己硬件平台类似的目标板 , 参考内核已经支持的目标板来进行移植 工作。 linux-2. 6 内核已经支 持 S3C244 0 处理器的多种硬件板 , 由 于 S3C241 0 跟 S3C244 0 同属于 ARM920T 系列芯片 , 且寄存器等硬件电路基本一致 , 我们可以参考 SMDK24 1 0 参考板来移植 2440 开发板 实验步骤 : ( 1 )准备工作 ( 2 )修改顶层 Makefile ( 3 )修改 falsh 分区 ( 4 )配置编译内核 一、准备工作 建立工作目录,下载内核源码: linux-2.6.30.4.tar.bz2 。 步骤如下: Mkdir cd /root/build_kernel tar jxvf linux-2.6. 30 . 4 .tar. gz 解压后会在当前目录下生成一个 linux-2.6.30.4 的内核源码目录 安装交叉工具链,步骤如下: 安装交叉工具链,步骤如下: # mkdir /usr/local/arm # cd /usr/local/arm # tar jxvf eabi-0529.tar.bz2 解压后会在当前目录下生成一个 eabi 的工具链目录 # mv eabi 4.1.2 修改环境变量,添加新工具链的路径信息,步骤如下: # vi /etc/bashrc 在 bashrc 脚本的最后一行添加工具链的路劲信息: # export PATH=/usr/local/arm/ 4.1.2 /bin:$PATH 使 bashrc 脚本生效 # source /etc/bashrc 二、修改内核源码顶层 Makefile Makefile Makefile 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.1 1 的 /board/samsun/gec2440/gec2440. c 设置 了 MACH_TYP E 的类型 为 MACH_TYPE_SMDK24 1 0 ,查看 u-boot 里的 include/asm-arm/mach-types.h 文件,有下 面定义: #define MACH_TYPE_SMDK24 1 0 1 93 // 针对 2440 的 MACH_TYPE 码的值定义为 1 93 而 linux 内核源码的 arch/arm/tools/mach-types 文件有如下定义: smdk24 1 0 MACH_SMDK24 1 0 SMDK24 1 0 1 93 即 u-boot 和 linux 内核的同样类型的机器码都为 1 93 。 那么我们就修改 kernel 的 MACH_TYPE 代码引用部分,确定 kernel 的 MACH_TYPE 。 如下: 修改 arch/arm/mach-s3c2440/mach-smdk2440.c : // 修改文件最后面 将 MACHINE_START(S3C2440, "SMDK2440") 修改为: MACHINE_START( SMDK24 1 0 , "SMDK2440") 修改 arch/arm/kernel/head.S // 在 ENTRY(stext) 下添加如下代码 ( 红色部分 ) ENTRY(stext) mov r0, #0 mov r1, #0xc1 // MACH_TYPE_SMDK24 1 0 值 1 93 换成十六进制就是 0x c1 ldr r2, =0x30000100 //Linux kernel parameter 第二种改法: 查 linux 内核源码的 arch/arm/tools/mach-types 文件有如下定义: smdk24 4 0 MACH_SMDK24 4 0 SMDK24 4 0 1 008 做如下修改 # vi arch/arm/mach-s3c2440/mach-smdk2440.c 将 MACHINE_START(S3C2440, "SMDK2440") 修改为: MACHINE_START( SMDK24 4 0 , "SMDK2440") 修改 arch/arm/kernel/head.S // 在 ENTRY(stext) 下添加如下代码 ( 红色部分 ) ENTRY(stext) mov r0, #0 mov r1, #0x 3f0 // MACH_TYPE_SMDK2440 值 1008 换成十六进制就是 0x3f0 ldr r2, =0x30000100 //Linux kernel parameter 这种改法中会出现如下问题: 定义在 arch/arm/mach-s3c24 1 0/mach-smdk24 1 0.c 中的设备驱动没能链接进来。
四 、设置 flash flash flash flash 分区 1 、找到修改的内核文件, 此处 需 要修改 以下 文件 : arch/arm/plat-s3c24xx/common-smdk.c ; 修 2 、确定内核分区表
????
我们可以根据以上的分区信息来配置我们的系统. 3.1 3.1 3.1 3.1 修改分区信息 ( 默认 8 8 8 8 个分区 , 具体分区数目可以根据项目而定 , 本初设置为 3 3 3 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, // 分区大小 256 k .offset = 0, // 本分区起始地址 0x 0 }, [1] = { .name = "Kernel", .offset = 1 6 *SZ_16K, // 本分区起始地址 0x 4 0000 .size = 3 *SZ_ 1M , // 分区大小 3 M }, [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 s3c24 1 0_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 3.2 3.2 3.2 .修改时钟 ( ( ( ( 终端输出若有乱码则需修改 ) ) ) ) 在 arch/arm/mach-s3c2440/mach-smdk2440.c 中修改 smdk2440_m 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_u } 3.3 3.3 3.3 3.3 修改 nand nand nand nand Flash Flash Flash Flash 的校验方式 , 去掉 ECC ECC ECC ECC 校验 , 否则上电启动会 者 I/O I/O I/O I/O 读取错误。 在 drivers/mtd/nand/s3c24 1 0.c 中 将 chip->ecc.mode = NAND_ECC_ SOFT ; 将 chip->ecc.mode = NAND_ECC_ SOFT ; 改为 chip->ecc.mode = NAND_ECC_ NONE ; 五 、配置编译内核 # make s3c24 1 0_defconfig # make menuconfig 在 s3c24 1 0_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 等5 # 接下来做的是针对文件系统的设置,实验时目标板上要上的文件系统是 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 、触摸 DM 900 0 网卡、 L 屏、 USB 、音频等驱动。 |