歡迎您光臨本站 註冊首頁

Kernel內核的裁剪及移植(一)

←手機掃碼閱讀     火星人 @ 2014-03-09 , reply:0

Linux內核移植實驗指導書

1、獲得Linux內核源碼

我們的光碟中提供了linux-2.6.24.4的內核源碼,也可以從www.kernel.org 上下載.

linux-2.6.24.4.tar.bz2拷貝到工作目錄下,解壓,就可以得到完整的Linux內核源碼

包:

[[email protected] 2410-s]# pwd

/root/2410-s

[[email protected] 2410-s]# cp /mnt/hgfs/arm/kernel/linux-2.6.24.4.tar.bz2 ./

[[email protected] 2410-s]# tar -xjvf linux-2.6.24.4.tar.bz2

[[email protected] 2410-s]# cd linux-2.6.24.4

2、修改Makefile

為了交叉編譯內核,需要修改內核的底層Makefile

[[email protected] linux-2.6.24.4]# vi Makefile

找到下面的兩行:

ARCH ?= $(SUBARCH)

CROSS_COMPILE ?=

修改成如下兩行:

ARCH ?= arm

CROSS_COMPILE ?= arm-softfloat-linux-

上面這樣修改的意思是說我們的目標平台是arm,使用的交叉編譯器的前綴是

arm-softfloat-linux-.

3、得到.config文件

編譯內核時會依賴於源代碼目錄下的.config 文件.如果沒有這個文件,在

make

menuconfig的時候,會默認按照i386的配置生成.config文件,而這不是我們需要的.因

此我們要有自己的.config文件.

由於我們的配置和SMDK2410開發板的類似,因此可以使用它的.config文件,只需要

把它的.config文件拷貝到源代碼根目錄下的.config文件即可:

[[email protected] linux-2.6.24.4]#

cp arch/arm/configs/s3c2410_defconfig .config

4、修改Nand Flash分區

由於我們使用的是SMDK2410開發板的原型,SMDK2410開發板的NAND Flash和我們的

不一樣,因此需要修改.打開arch/arm/plat-s3c24xx/common-smdk.c這個文件:

[[email protected] linux-2.6.24.4]# vi arch/arm/plat-s3c24xx/common-smdk.c

找到struct mtd_partition smdk_default_nand_part[]這個結構體,並修改它.修改

后的結構體如下面的代碼所示:

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,

},

};

這樣就把我們的64MNAND Flash分為四個區:

第一個區從

0x000000000x00080000,大小為0.5M

第二個區從0x000800000x00280000,大小為2M

第三個區從0x002800000x00680000,大小為4M

第四個區從0x006800000x04000000,大小為57.5M

5、添加LCD支持

我們的開發平台上配置有640*480 的液晶屏,我們來為它加上驅動支持.需要在

arch/arm/mach-s3c2410/mach-smdk2410.c中添加一些內容.

[[email protected] linux-2.6.24.4]#

vi arch/arm/mach-s3c2410/mach-smdk2410.c

要包含我們的LCD使用的數據結構的頭文件,增加如下內容:

#include <asm/arch/fb.h>

#include <linux/platform_device.h>

然後添加如下內容:

static struct s3c2410fb_display up2410_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 up2410_fb_info __initdata =

{

.displays = up2410_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

這個函數,在函數的末尾添加這樣一行,來

LCD的數據進行設置:

s3c24xx_fb_set_platdata(&up2410_fb_info);

6、添加網卡驅動支持

開發板上配置了

DM9000A網卡,內核已經有網卡驅動的實現代碼,需要我們做一定的

配置.在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,

};

然後,把網卡數據加入smdk2410_devices數組:

static struct platform_device *smdk2410_devices[] __initdata = {

&s3c_device_usb,

&s3c_device_lcd,

&s3c_device_wdt,

&s3c_device_i2c,

&s3c_device_iis,

&s3c_device_dm9ks,

};

另外,根據我們的經典2410開發板的配置,網卡驅動需要修改.由於修改的地方比較

多,這裡就不詳細說明了,直接給出修改後的源文件,在我們光碟的相應src目錄下.共兩

個文件:dm9000.cdm9000.h.現在需要作的只是把內核中的drivers/net目錄下的這兩個

文件用我們提供的文件替換掉.

[[email protected] linux-2.6.24.4]# cp /mnt/hgfs/arm/kernel/dm9000.* drivers/net/

cp:是否覆蓋‘drivers/net/dm9000.c? y

cp:是否覆蓋‘drivers/net/dm9000.h? y

[[email protected] linux-2.6.24.4]#

其中需要注意的是對開發板的初始化.我們的開發板上使用BANK2作為DM9000IO,

中斷使用EINT2,因此需要配置好

BANK2EINT2,實現的函數如下(已經在我們的驅動文

件中添加了,不需要手動添加):

static void uptech_dm9k_init(void)

{

u32 bwscon;

bwscon = __raw_readl(S3C2410_BWSCON);

bwscon&= ~(S3C2410_BWSCON_WS2|S3C2410_BWSCON_ST2|S3C2410_BWSCON_DW2_32);

bwscon |= (S3C2410_BWSCON_ST2|S3C2410_BWSCON_DW2_16);

__raw_writel(bwscon, S3C2410_BWSCON);

__raw_writel(S3C2410_BANKCON_Tacs4|S3C2410_BANKCON_Tcos4|

S3C2410_BANKCON_Tacc14|S3C2410_BANKCON_Tcoh4|S3C2410_BANKCON_Tcah4|

S3C2410_BANKCON_Tacp 6| S3C2410_BANKCON_PMCnorm, S3C2410_BANKCON2);

set_irq_type(IRQ_EINT2,IRQT_RISING);

s3c2410_gpio_cfgpin(S3C2410_GPF2, S3C2410_GPF2_EINT2);

s3c2410_gpio_pullup(S3C2410_GPF2, 0);

printk(KERN_INFO "Board init for AX88796 finished!n");

}

然後在這個文件中的

axdrv_init函數的開頭部分調用這個函數:

static int __init dm9k_init_module(void)

{

uptech_dm_init();

return platform_driver_register(&dm9k_driver);

七、添加

YAFFS文件系統支持

將我們提供的YAFFS的源代碼yaffs2.tar.gz拷貝到linux-2.6.24.4的同級目

錄下,解壓該源碼包,獲得YAFFS源碼:

[[email protected] linux-2.6.24.4]# cd ..

[[email protected] 2410-s]# pwd

/root/2410-s

[[email protected] 2410-s]# cp /mnt/hgfs/arm/kernel/yaffs2.tar.gz ./

[[email protected] 2410-s]# tar -zxvf yaffs2.tar.gz

然後進入

yaffs2目錄,運行./patch-ker.sh給內核打上補丁:

[[email protected] 2410-s]# cd yaffs2

[[email protected] yaffs2]# ./patch-ker.sh c ../linux-2.6.24.4/

這樣打好補丁以後,再做正確的配置,內核就可以支持YAFFS文件系統了.

本文出自 「嵌入式技術」 博客,請務必保留此出處http://chenboqiang.blog.51cto.com/1068057/484069


[火星人 ] Kernel內核的裁剪及移植(一)已經有686次圍觀

http://coctec.com/docs/linux/show-post-50075.html