手把手教你移植linux内核(目标平台S3C2410)

Linux内核的最初版本由Linus Torvalds在1991年发布,后来内核版本不断更新:

Linux1.0 1994年3月 仅支持386

Linux1.2 1995年3月 多平台支持

Linux2.0 1996年6月 支持SMP

Linux2.2 1999年1月 支持更多的硬件

Linux2.4 2001年1月 支持桌面系统和USB

Linux2.6 2003年12月 支持更多平台,使用新的调度器,内核可被抢占,模块子系统和文件系统做了大量改进,支持更多的硬件驱动。

内核的目录结构:

Ü arch

目录里存放的是与体系结构相关的代码。对应于每个支持的体系结构,有一个相应的子目录如x86、arm等,每个体系结构子目录下包含几个主要子目录:

.boot 启动内核所需的平台特有代码

.kernel 体系结构特有特征(如SMP)的实现

.mm 与体系结构相关的内存管理代码

.lib 与体系结构相关的通用函数的实现

Ü drivers

所有设备驱动程序代码,它占整个内核代码量一半以上,每一个子目录对应一类驱动程序。

Ü fs

文件系统代码,每个支持的文件系统有相应的子目录,如cramfs,yaffs,jffs2等

Ü include

包括编译内核所需的大部分头文件,与平台无关的头文件放在include/linux子目录下,平台相关的头文件如include/asm-arm

Ü init 内核初始化代码

Ü kernel 内核管理核心代码

Ü lib 库函数代码

Ü mm 内存管理代码

Ü net 网络支持代码

Ü sound 音频设备驱动代码

Ü scripts 用于配置内核的脚本文件

Ü documentation 内核相关文档

具体移植过程:

1、首先得到源码包及需要用到的文件,包括:“linux-2.6.24.4.tar.bz2”、“yaffs2.tar.gz”、“dm9000.h”、“dm9000.c”四个文件。

2、解压linux内核和yaffs2压缩包,进入yaffs2解压后的目录,为内核打补丁使其支持yaffs2文件系统,具体命令为:

#./patch-ker.sh c ../linux-2.6.24.4/

3、修改Makefile文件,使其支持交叉编译

进入内核源码目录,执行命令:

#gedit Makefile

在打开的文件中找到下面两行并修改:

ARCH ?= arm (目标平台是arm)

CROSS_COMPILE ?= arm-linux- (交叉编译器的前缀是arm-linux-)

4、得到.config文件

.config是内核编译时所依赖的重要文件,与具体的硬件构架和开发板类型相关。这里我们选择内核提供的s3c2410_defconfig进行修改,执行以下命令:

#cp arch/arm/configs/s3c2410_defconfig .config

5、修改Nand Flash分区

执行以下命令:

#gedit arch/arm/plat-s3c24xx/common-smdk.c

然后在打开的文件中修改分区信息结构体:

static struct mtd_partition smdk_default_nand_part[] = {

[0] = {

.name = "Bootloader",

.size = 0x80000,

.offset = 0,

},

[1] = {

.name = "Linux Kernel",

.offset = 0x80000,

.size = SZ_2M,

},

[2] = {

.name = "Root File System",

.offset = 0x280000,

.size = SZ_4M,

},

[3] = {

.name = "User Space",

.offset = 0x680000,

.size = 0x3980000,

},

};

6、禁止ECC校验

内核是通过U-BOOT写到Nand Flash的, UBOOT产生的ECC校验码, 这与内核产生的ECC校验码不一样, 所以, 我们在这里选择禁止内核ECC校验。

修改drivers/mtd/nand/s3c2410.c文件,执行以下命令:

#gedit drivers/mtd/nand/s3c2410.c

在打开的文件中找到s3c2410_nand_init_chip()函数,在该函数体最后加上一条语句:

chip->eccmode = NAND_ECC_NONE;

然后保存,退出。

7、添加LCD支持

执行以下命令:

#gedit arch/arm/mach-s3c2410/mach-smdk2410.c

在打开的文件中添加两个头文件:

#include <asm/arch/fb.h>

#include <linux/platform_device.h>

然后再添加两个结构体:

static struct s3c2410fb_display smdk2410_fb[] __initdata =

{

{

.lcdcon5 = (1<<12)|(1<<11)|(1<<9)|(1<<8)|(1<<0),

.type = (3<<5),

.width = 640,

.height = 480,

.pixclock = 39721,

.xres = 640,

.yres = 480,

.bpp = 16,

.left_margin = 40,

.right_margin = 32,

.hsync_len = 32,

.vsync_len = 2,

.upper_margin = 35,

.lower_margin = 5,

},

};

static struct s3c2410fb_mach_info smdk2410_fb_info __initdata =

{

.displays = smdk2410_fb,

.num_displays = 1,

.default_display = 0,

.gpcup = 0xffffffff,

.gpcup_mask = 0x0,

.gpccon = 0xaaaaaaaa,

.gpccon_mask = 0x0,

.gpdup = 0xffffffff,

.gpdup_mask = 0x0,

.gpdcon = 0xaaaaaaaa,

.gpdcon_mask = 0x0,

.lpcsel = 0,

};

最后在“smdk2410_init”函数的末尾一行添加:

s3c24xx_fb_set_platdata(&smdk2410_fb_info);

8、添加网卡驱动

执行以下命令:

#gedit arch/arm/mach-s3c2410/mach-smdk2410.c

在打开的文件中添加两个结构体,用于定义端口地址和中断号等设备信息:

static struct resource s3c_dm9ks_resource[] = {

[0] = {

.start = 0x10000000,

.end = 0x10000040,

.flags = IORESOURCE_MEM,

},

[1] = {

.start = IRQ_EINT2,

.end = IRQ_EINT2,

.flags = IORESOURCE_IRQ,

},

};

struct platform_device s3c_device_dm9ks = {

.name = "s3c2410-dm9ks",

.id = -1,

.num_resources = ARRAY_SIZE(s3c_dm9ks_resource),

.resource = s3c_dm9ks_resource,

};

然后在“struct platform_device *smdk2410_devices[] __initdata”末尾加入网卡数据:

&s3c_device_dm9ks,

最后将新的“dm9000.c”和“dm9000.h”拷贝到“linux-2.6.24.2/drivers/net”文件夹内,替换旧的文件,执行以下命令:

#cp /home/kernel/dm9000.* drivers/net/

9、配置内核

运行以下命令:

#make menuconfig

然后进入内核配置界面,进行以下配置:

一、选择硬件系统

System Type à

S3C2410 Machines à

[*] SMDK2410/A9M2410

其他不要选,以免内核太大。

二、配置Nand Flash驱动

Device Driversà

<*> Memory Technology Device (MTD) supportà

<*> NAND Device Supportà

<*> NAND Flash support for S3C2410/S3C2440 SoC

三、配置LCD驱动

Device Drivers à

Graphics support à

<*> Support for frame buffer devices à

<*> S3C2410 LCD framebuffer support

Device Drivers à

Graphics support à

[*] Bootup logoà

[*] Standard black and white Linux logo

[*] Standard 16-color Linux logo

[*] Standard 224-color Linux logo

四、配置网卡驱动

Device Driversà

[*] Network device supportà

[*] Ethernet (10 or 100Mbit)à

-*- Generic Media Independent Interface device support

<*> ASIX AX88796 NE2000 clone support

[ ] ASIX AX88796 external 93CX6 eeprom support

< > SMC 91C9x/91C1xxx support

< > DM9000 support

< > Broadcom 440x/47xx ethernet support

五、配置文件系统

使其支持CRAMFS文件系统、YAFFS文件系统、NFS文件系统

File systemsà

Miscellaneous filesystemsà

<*> YAFFS2 file system support

-*- 512 byte / page devices

[ ] Use older-style on-NAND data format with pageStatus byte

[ ] Lets Yaffs do its own ECC

-*- 2048 byte (or larger) / page devices

[*] Autoselect yaffs2 format

[ ] Disable lazy loading

[ ] Turn off wide tnodes

[ ] Force chunk erase check

[*] Cache short names in RAM

< > Journalling Flash File System v2 (JFFS2) support

<*> Compressed ROM file system support (cramfs)

File systemsà

[*] Network File Systemsà

<*> NFS file system support

[*] Provide NFSv3 client support

[*] Provide client support for the NFSv3 ACL protocol extension

[ ] Provide NFSv4 client support (EXPERIMENTAL)

[*] Allow direct I/O on NFS files

< > NFS server support

[*] Root file system on NFS

10、编译内核

内核源码目录执行以下命令:

#make clean

#make

编译完成后会在“linux-2.6.24.2/arch/arm/boot/”目录下生成内核镜像文件zImage,这个生成的zImage还不能通过U-BOOT启动,需要使用编译u-boot时生产的工具mkimage进行处理才能正常启动,具体过程为:

#cp /home/uboot/u-boot-1.3.2/tools/mkimage arch/arm/boot/

#./mkimage –A arm –T kernel –C none –O linux –a 0x30008000 –e 0x30008040 –d zImage –n ‘Linux-2.6.24’ uImage

上述过程完成后就生成了我们需要的内核映像文件uImage,这个文件就是我们要烧写到板子上的内核映像。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
linuxdriver_code_tool |-- 03 | `-- 2.6内核升级工具 | |-- device-mapper-1.00.19-2.i386.rpm | |-- lvm2-2.00.25-1.01.i386.rpm | |-- mkinitrd-4.2.0.3.tar.tar | |-- module-init-tools-3.2.2.tar.bz2 | `-- modutils-2.4.5-1.src.rpm |-- 04 | |-- 内核模块参数范例 | | `-- book.c | |-- 内核模块导出符号 | | `-- export_symb.c | `-- 最简单的内核模块 | `-- hello.c |-- 05 | `-- udev源代码 | `-- udev-114.tar.gz |-- 06 | |-- globalmem驱动 | | `-- globalmem.c | `-- 包含2个globalmem设备的驱动 | `-- globalmem_two.c |-- 07 | `-- 含并发控制的globalmem驱动 | `-- globalmem_lock.c |-- 08 | |-- globalfifo驱动 | | `-- globalfifo.c | `-- poll应用程序范例 | `-- pollmonitor.c |-- 09 | |-- 异步通知应用程序范例 | | `-- asyncmonitor.c | `-- 支持异步通知的globalfifo | `-- globalfifo_async.c |-- 10 | |-- S3C2410实时钟驱动 | | `-- s3c2410-rtc.c | `-- 秒设备驱动与应用程序 | |-- second.c | `-- second_test.c |-- 11 | |-- DMA范例 | | |-- 3c505.c | | |-- 3c505.h | | `-- dma.h | `-- 静态映射范例 | `-- mach-smdk2440.c |-- 12 | |-- NVRAM驱动 | | `-- generic_nvram.c | |-- 触摸屏驱动 | | |-- 作为input设备 | | | |-- s3c2410_ts.c | | | `-- s3c2410_ts.h | | `-- 作为普通字符设备 | | `-- s3c2410-ts.c | |-- 看门狗驱动 | | `-- s3c2410_wdt.c | `-- 平台设备 | `-- devs.c |-- 13 | |-- IDE驱动 | | |-- ide-disk.c | | `-- ide-h8300.c | `-- RAMDISK驱动 | `-- rd.c |-- 14 | |-- S3C2410串口驱动 | | |-- regs-gpio.h | | |-- regs-serial.h | | `-- s3c2410.c | `-- 串口核心层 | |-- serial_core.c | `-- serial_core.h |-- 15 | |-- S3C2410 I2C主机驱动 | | |-- i2c-s3c2410.c | | |-- iic.h | | |-- regs-gpio.h | | `-- regs-iic.h | `-- SAA711x I2C设备驱动 | `-- saa711x.c |-- 16 | `-- CS8900以太网设备驱动 | |-- cs89x0.c | `-- cs89x0.h |-- 17 | |-- ALSA工具及库 | | |-- alsa-driver-1.0.15.tar.bz2 | | |-- alsa-firmware-1.0.15.tar.bz2 | | |-- alsa-lib-1.0.15.tar.bz2 | | |-- alsa-oss-1.0.15.tar.bz2 | | |-- alsa-tools-1.0.15.tar.bz2 | | |-- alsa-utils-1.0.13.tar.bz2 | | `-- pyalsa-1.0.15.tar.bz2 | |-- ALSA驱动范例 | | |-- sa11xx-uda1341.c | | `-- uda1341.h | |-- ALSA应用程序范例 | | |-- pcm.c | | `-- pcm_min.c | |-- OSS驱动范例 | | `-- s3c2410-uda1341.c | `-- OSS应用程序范例 | |-- mixer.c | `-- sound.c |-- 18 | |-- FRAMEBUFFER应用程序范例 | | `-- fb_display | | |-- fb_display.c | | |-- fb_display.h | | |-- Makefile | | |-- README | | `-- test.c | `-- S3C2410 LCD驱动 | |-- s3c2410fb.c | `-- s3c2410fb.h |-- 19 | |-- busybox源代码 | | `-- busybox-1.2.1.tar.bz2 | |-- MTD工具 | | `-- mtd-utils-1.0.0.tar.gz | |-- nand驱动范例 | | `-- s3c2410.c | |-- nor驱动范例 | | `-- s3c2410nor.c | `-- yaffs&yaffs2源代码 | |-- yaffs.tar.gz | `-- yaffs2.tar.gz |-- 20 | |-- USB串口驱动 | | |-- usb-serial.c | | `-- usb-serial.h | |-- USB工具 | | `-- usbview-1.0.tar.tar | |-- USB骨架程序 | | `-- usb-skeleton.c | |-- USB键盘驱动 | | |-- input.h | | |-- usb_input.h | | `-- usbkbd.c | `-- usb主机控制器驱动范例 | |-- ohci-s3c2410.c | `-- usb-control.h |-- 21 | |-- PCI骨架程序 | | `-- pci-skeleton.c | `-- PCI驱动范例 | `-- i810_audio.c `-- 22 |-- 范例代码 | |-- oops范例 | | |-- oops_example.asm | | `-- oops_example.c | `-- proc范例 | `-- sim_proc.c `-- 内核调试工具 |-- ddd-3.3.11.tar.gz |-- gdbmod-2.4.bz2 |-- kdb-v4.4-2.6.15-rc5-common-1.bz2 |-- kdb-v4.4-2.6.15-rc5-common-2.bz2 |-- kdb-v4.4-2.6.15-rc5-i386-1.bz2 `-- linux-2.6.15.5-kgdb-2.4.tar.tar 73 directories, 91 files

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值