1. 程式人生 > >手把手教你移植linux核心(目標平臺S3C2410)

手把手教你移植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,這個檔案就是我們要燒寫到板子上的核心映像。