Linux内核移植
2016-05-20 22:40
357 查看
本文是基于JZ2440板进行内核移植,结合了《嵌入式Linux应用开发完全手册》内核移植和其他文章的总结出的。
一、利用打补丁的方式实现内核移植
$ tar xjf linux-2.6.22.6.tar.bz2 –C ./
$ cd inux-2.6.22
$ patch -p1 <.../linux-2.6.22.6_jz2440.patch
$ mv …/4.3寸LCD_mach-smdk2440.c arch/arm/mach-s3c2440/mach-smdk2440.c
$ cp config_ok .config
$ make uImage
将在arch/arm/boot目录生成zImage文件。后面只要将uImage烧写到板子就完成移植了。
二、移植前准备
$ tar xjf linux-2.6.22.6.tar.bz2 –C ./
$ cd linux-2.6.22
三、内核的移植
ARCH ?= $(SUBARCH)
CROSS_COMPILE ?=
改成:
ARCH ?= arm
CROSS_COMPILE ?= arm-linux-
$ gedit arch/arm/mach-s3c2440/mach-smdk2440.c
在327行
linux内核的机器码在:arch/arm/tools/mach-types
u-boot的机器码是在:include/asm-arm/mach-types.h
$ gedit arch/arm/tools/mach-types
s3c2410 ARCH_S3C2410 S3C2410 182
smdk2410 ARCH_SMDK2410 SMDK2410 193
s3c2440
a193
ARCH_S3C2440 S3C2440 362
$ gedit include/asm-arm/mach-types.h
#define MACH_TYPE_S3C2410 182
#define MACH_TYPE_SMDK2410 193
#define MACH_TYPE_S3C2440 362
根据bootlorder 里面的分区情况进行更改。会涉及到如下结构:
static struct platform_device __initdata *smdk_devs[]= {};
static struct mtd_partition smdk_default_nand_part[] ={};
$ gedit arch/arm/mach-s3c2440/mach-smdk2440.c
static struct platform_device *smdk2440_devices[]__initdata = {
&s3c_device_usb,
&s3c_device_lcd,
&s3c_device_wdt,
&s3c_device_i2c,
&s3c_device_iis,
&s3c2440_device_sdi,
};
static struct mtd_partition smdk_default_nand_part[] ={
[0] = {
.name = "kernel",
.size = SZ_2M,
.offset = 0,
},
[1] = {
.name = "jffs2",
.offset= MTDPART_OFS_APPEND,
.size = SZ_8M,
},
[2] = {
.name = "yaffs",
.offset= MTDPART_OFS_APPEND,
.size = MTDPART_SIZ_FULL,
}
};
其中MTDPART_OFS_APPEND表示当前分区紧接着上一个分区,MTDPART_SIZ_FULL表示当前分区的大小为剩余flash空间。
$ make menuconfig
$ cd /.../Development/yaffs2
$ ./patch-ker.shc /…/linux-2.6.22.6
$ cp config_ok .config
$ make uImage
将在arch/arm/boot目录生成zImage文件
$ tftp 0x32000000 zImage
或$ nfs 0x30000000192.168.1.106:/home/ubuntu/nfs/zImage
$ nand erase 00x200000
$ nand write.jffs2 0x32000000 0 $ (filesize)
$ nboot 0x32000000 0 0
$ bootm 0x3200000
要想开发板上电后内核自动启动,可以设置bootcmd环境变量。
$ set bootcmd ‘nboot0x32000000 0 0; bootm 0x32000000’
$saveenv
一、利用打补丁的方式实现内核移植
$ tar xjf linux-2.6.22.6.tar.bz2 –C ./
$ cd inux-2.6.22
$ patch -p1 <.../linux-2.6.22.6_jz2440.patch
$ mv …/4.3寸LCD_mach-smdk2440.c arch/arm/mach-s3c2440/mach-smdk2440.c
$ cp config_ok .config
$ make uImage
将在arch/arm/boot目录生成zImage文件。后面只要将uImage烧写到板子就完成移植了。
二、移植前准备
$ tar xjf linux-2.6.22.6.tar.bz2 –C ./
$ cd linux-2.6.22
三、内核的移植
1.修改顶层Makefile
在185行ARCH ?= $(SUBARCH)
CROSS_COMPILE ?=
改成:
ARCH ?= arm
CROSS_COMPILE ?= arm-linux-
2.修改平台时钟
平台时钟要看你的开发板上外接的晶振是多少。$ gedit arch/arm/mach-s3c2440/mach-smdk2440.c
在327行
static void __init smdk2440_map_io(void) { s3c24xx_init_io(smdk2440_iodesc, ARRAY_SIZE(smdk2440_iodesc)); //s3c24xx_init_clocks(16934400); //注释这句,加入下一句 s3c24xx_init_clocks(12000000); s3c24xx_init_uarts(smdk2440_uartcfgs, ARRAY_SIZE(smdk2440_uartcfgs)); } |
3.修改机器码
在arch/arm/tools/mach-type 中s3c2440的机器码一定要与u-boot中的一致,linux内核的机器码在:arch/arm/tools/mach-types
u-boot的机器码是在:include/asm-arm/mach-types.h
$ gedit arch/arm/tools/mach-types
s3c2410 ARCH_S3C2410 S3C2410 182
smdk2410 ARCH_SMDK2410 SMDK2410 193
s3c2440
a193
ARCH_S3C2440 S3C2440 362
$ gedit include/asm-arm/mach-types.h
#define MACH_TYPE_S3C2410 182
#define MACH_TYPE_SMDK2410 193
#define MACH_TYPE_S3C2440 362
4.移植nandflash驱动(修改NAND Flash分区)
$ gedit arch/arm/plat-s3c24xx/common-smdk.c根据bootlorder 里面的分区情况进行更改。会涉及到如下结构:
static struct platform_device __initdata *smdk_devs[]= {};
static struct mtd_partition smdk_default_nand_part[] ={};
$ gedit arch/arm/mach-s3c2440/mach-smdk2440.c
static struct platform_device *smdk2440_devices[]__initdata = {
&s3c_device_usb,
&s3c_device_lcd,
&s3c_device_wdt,
&s3c_device_i2c,
&s3c_device_iis,
&s3c2440_device_sdi,
};
5.修改MTD分区
$ gedit arch/arm/plat-s3c24xx/common-smdk.cstatic struct mtd_partition smdk_default_nand_part[] ={
[0] = {
.name = "kernel",
.size = SZ_2M,
.offset = 0,
},
[1] = {
.name = "jffs2",
.offset= MTDPART_OFS_APPEND,
.size = SZ_8M,
},
[2] = {
.name = "yaffs",
.offset= MTDPART_OFS_APPEND,
.size = MTDPART_SIZ_FULL,
}
};
其中MTDPART_OFS_APPEND表示当前分区紧接着上一个分区,MTDPART_SIZ_FULL表示当前分区的大小为剩余flash空间。
6.配置内核
$ cp arch/arm/configs/s3c2410_defconfig .config$ make menuconfig
7.移植YAFFS文件系统
一般而言,在NOR Flash上使用JFFS2文件系统,在NANDFlash上使用YAFFS文件系统。$ cd /.../Development/yaffs2
$ ./patch-ker.shc /…/linux-2.6.22.6
8.编译内核
$mv .../4.3寸LCD_mach-smdk2440.c arch/arm/mach-s3c2440/mach-smdk2440.c(这一步是为了把4.3寸LCD的源码覆盖原来的3.5寸源码)$ cp config_ok .config
$ make uImage
将在arch/arm/boot目录生成zImage文件
9.烧写内核
将文件拷到tftp文件夹。$ tftp 0x32000000 zImage
或$ nfs 0x30000000192.168.1.106:/home/ubuntu/nfs/zImage
$ nand erase 00x200000
$ nand write.jffs2 0x32000000 0 $ (filesize)
10.启动内核
可以使用以下命令启动NAND Flash上的内核$ nboot 0x32000000 0 0
$ bootm 0x3200000
要想开发板上电后内核自动启动,可以设置bootcmd环境变量。
$ set bootcmd ‘nboot0x32000000 0 0; bootm 0x32000000’
$saveenv
相关文章推荐
- 《Linux及安全》课程实践二
- linux目录结构
- linux的ulimit各种限制之深入分析
- Linux常用命令--目录管理、文件管理、权限管理
- Linux常用命令--文件搜索、用户管理、压缩解压
- Linux下进程的通信方式: 有名管道(命名管道)
- Linux发行分支时间轴
- linux awk命令详解
- Linux中如何添加/删除FTP用户并设置权限(后续)
- 环境——LINUX上 JDK 的安装
- linux Cent-OS 安装中文输入法
- Linux下查看MySQL的安装路径
- 【Linux】多路复用之—select
- Linux is not Matrix——日志搜集平台ELK(II)
- Linux下的进程通信方式: 管道通信详解
- 在linux下安装android模拟器
- linux文件的三种时间
- Linux 命令行模式快捷键使用
- CentOS(5.8/6.4)linux生产环境若干优化实战
- 坑爹的一天——关于配置samba服务器(1)