Linux內核移植實驗指導書
1、獲得Linux內核源碼
我們的光碟中提供了linux-2.6.24.4的內核源碼,也可以從www.kernel.org 上下載.
將
linux-2.6.24.4.tar.bz2拷貝到工作目錄下,解壓,就可以得到完整的Linux內核源碼包:
[root@localhost 2410-s]# pwd
/root/2410-s
[root@localhost 2410-s]# cp /mnt/hgfs/arm/kernel/linux-2.6.24.4.tar.bz2 ./
[root@localhost 2410-s]# tar -xjvf linux-2.6.24.4.tar.bz2
[root@localhost 2410-s]# cd linux-2.6.24.4
2、修改Makefile
為了交叉編譯內核,需要修改內核的底層Makefile:
[root@vm-dev 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 文件.如果沒有這個文件,在
makemenuconfig的時候,會默認按照i386的配置生成.config文件,而這不是我們需要的.因
此我們要有自己的.config文件.
由於我們的配置和SMDK2410開發板的類似,因此可以使用它的.config文件,只需要
把它的.config文件拷貝到源代碼根目錄下的.config文件即可:
[root@vm-dev linux-2.6.24.4]#
cp arch/arm/configs/s3c2410_defconfig .config4、修改Nand Flash分區
由於我們使用的是SMDK2410開發板的原型,SMDK2410開發板的NAND Flash和我們的
不一樣,因此需要修改.打開arch/arm/plat-s3c24xx/common-smdk.c這個文件:
[root@vm-dev 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,
},
};
這樣就把我們的64M的NAND Flash分為四個區:
第一個區從
0x00000000到0x00080000,大小為0.5M第二個區從0x00080000到0x00280000,大小為2M
第三個區從0x00280000到0x00680000,大小為4M
第四個區從0x00680000到0x04000000,大小為57.5M
5、添加LCD支持
我們的開發平台上配置有640*480 的液晶屏,我們來為它加上驅動支持.需要在
arch/arm/mach-s3c2410/mach-smdk2410.c中添加一些內容.
[root@vm-dev 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.c和dm9000.h.現在需要作的只是把內核中的drivers/net目錄下的這兩個
文件用我們提供的文件替換掉.
[root@localhost 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
[root@localhost linux-2.6.24.4]#
其中需要注意的是對開發板的初始化.我們的開發板上使用BANK2作為DM9000的IO,
中斷使用EINT2,因此需要配置好
BANK2和EINT2,實現的函數如下(已經在我們的驅動文件中添加了,不需要手動添加):
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源碼:
[root@localhost linux-2.6.24.4]# cd ..
[root@localhost 2410-s]# pwd
/root/2410-s
[root@localhost 2410-s]# cp /mnt/hgfs/arm/kernel/yaffs2.tar.gz ./
[root@localhost 2410-s]# tar -zxvf yaffs2.tar.gz
然後進入
yaffs2目錄,運行./patch-ker.sh給內核打上補丁:[root@vm-dev 2410-s]# cd yaffs2
[root@vm-dev yaffs2]# ./patch-ker.sh c ../linux-2.6.24.4/
這樣打好補丁以後,再做正確的配置,內核就可以支持YAFFS文件系統了.
本文出自 「嵌入式技術」 博客,請務必保留此出處http://chenboqiang.blog.51cto.com/1068057/484069
[火星人 ] Kernel內核的裁剪及移植(一)已經有882次圍觀