最近這幾天的晚上我在移植2.6的kernel,。因?yàn)樗胶懿?,所以不太順利?br> 我用的是kernel是2.6.14.2, 這個(gè)內(nèi)核直接支持S3C2410的板子,,不必打任何補(bǔ)丁。從
www.下載了內(nèi)核,。然后找來(lái)了3.4.1的GCC交叉編譯器(經(jīng)典的2.95.3編譯2.6內(nèi)核會(huì)出錯(cuò)),。解開(kāi)內(nèi)核開(kāi)始修改。
(該部分轉(zhuǎn)貼自:
http://superlp.blogchina.com/blog/1391393.html 感謝superlp)
1. 增加nand分區(qū)信息
打開(kāi)arch/arm/mach-s3c2410/devs.c
增加頭文件
#include <linux/mtd/partitions.h>
#include <asm/arch/nand.h>
#include <linux/mtd/nand.h>
增加分區(qū)數(shù)據(jù)
/*****************************add here***************************/
static struct mtd_partition partition_info[] ={
{
name: "loader",
size: 0x00020000,
offset: 0,
}, {
name: "param",
size: 0x00010000,
offset: 0x00020000,
}, {
name: "kernel",
size: 0x001c0000,
offset: 0x00030000,
}, {
name: "root",
size: 0x00200000,
offset: 0x00200000,
mask_flags: MTD_WRITEABLE,
}, {
name: "user",
size: 0x03af8000,
offset: 0x00400000,
}
};
struct s3c2410_nand_set nandset ={
nr_partitions: 5 ,
partitions: partition_info ,
};
struct s3c2410_platform_nand superlpplatform={
tacls:0,
twrph0:30,
twrph1:0,
sets: &nandset,
nr_sets: 1,
};
/********************************end add****************************/
struct platform_device s3c_device_nand = {
.name = "s3c2410-nand",
.id = 0xec,
.num_resources = ARRAY_SIZE(s3c_nand_resource),
.resource = s3c_nand_resource,
.dev = {
.platform_data = &superlpplatform //***********add here*****
}
};
(分區(qū)部分根據(jù)實(shí)際情況修改)
2. 打開(kāi)arch/arm/mach-s3c2410/mach-smdk2410.c
把"&s3c_device_nand"添加到__initdata
3. 打開(kāi)drivers/mtd/nand/s3c2410.c
把chip->eccmode = NAND_ECC_SOFT;改成chip->eccmode = NAND_ECC_NONE;
4. 修改Makefile, 把設(shè)定SUBARCH := arm CROSS_COMPILE ?= arm-linux-(事先得安裝交叉
編譯器)
接著開(kāi)始make menuconfig,,并且載入arch/arm/configs/def_s3c2410config,,保存后就make,如果編譯器沒(méi)有問(wèn)題得話,,應(yīng)該一次就能編譯成功,。
接下來(lái)編譯bootload, 我用vivi, 從
www.下 載vivi的源代碼包,解開(kāi)后make menuconfig, 載入arch/def-configs/smdk2410, 保存退出后修改arch/s3c2410/smdk.c,,修改里面的分區(qū)信息和啟動(dòng)參數(shù),。分區(qū)信息根據(jù)實(shí)際情況設(shè)置,啟動(dòng)參數(shù)設(shè)置成“noinitrd root=/dev/mtdblock3 init=/linuxrc console=ttySAC0,115200 mac=00:0e:3a:aa:bb:cc”. 保存退出后make, 得到vivi的BIN.
把vivi和kernel的BIN文件燒錄到FLASH后給板子上電,,發(fā)現(xiàn)一個(gè)問(wèn)題,,vivi并沒(méi)有使用我設(shè)置好的分區(qū)信息和啟動(dòng)參數(shù),而是使用一個(gè)默認(rèn) 的值,,要使用命令param reset和part reset才可以重置我設(shè)置的值,。vivi默認(rèn)的kernel分區(qū)大小是1M,而我的kernel的BIN文件有1.2M,,開(kāi)始嘗試了好多次都失敗,。重置 了參數(shù)以后kernel可以執(zhí)行起來(lái), 但是找不到根文件系統(tǒng),,那是當(dāng)然的,,因?yàn)槲疫€沒(méi)有燒錄文件系統(tǒng)。
一. 準(zhǔn)備必要的文件
我們首先去官方網(wǎng)站下載最新的 llinux 內(nèi)核
http://www./pub/linux/kernel/v2.6/linux-2.6.14.tar.bz2
因?yàn)?/span> linux2.6.14 內(nèi)核需要更新版本的編譯器,,所以我們需要下載交叉編譯器
ftp://ftp.handhelds.org/projects/toolchain/arm-linux-gcc-3.4.1.tar.bz2
注:這個(gè)編譯器已經(jīng)包含在光盤(pán)的 \DISK4\linux 相關(guān) \linuxtool 目錄下面,。
二. 安裝文件
我們把 gcc 安裝在 /usr/local/arm/3.4.1 目錄下,安裝方法和安裝 gcc2.95.3 和 gcc3.3.2 是相同的,,(
cd /
tar jxvf arm-linux-gcc-3.4.1.tar.bz2
vi ~/.bash_profile
把a(bǔ)rm-linux-gcc的路徑/usr/local/arm/3.4.1/bin添加到PATH中)
接下來(lái)需要解壓 linux 內(nèi)核,,輸入命令:
[root · localhost hfrk]# tar jxvf linux-2.6.14.tar.bz2
內(nèi)核被解壓到 linux-2.6.14 目錄下。
三. 修改 makefile 文件
內(nèi)核的編譯是根據(jù) makefile 文件的指示進(jìn)行的,, Makefile 文件來(lái)組織內(nèi)核的各模塊之間的關(guān)系,,記錄了各個(gè)模塊之間的相互聯(lián)系和依賴關(guān)系。
我們首先修改 linux-2.6.14 的根目錄下的 makfile 文件,,我們須改的主要內(nèi)容是目標(biāo)代碼的類型和為編譯內(nèi)核指定一個(gè)編譯器,。
我們注釋掉以下內(nèi)容:
#ARCH ?= $(SUBARCH)
#CROSS_COMPILE ?=
增加如下內(nèi)容:
ARCH : = arm
CROSS_COMPILE =/usr/local/arm/3.4.1/bin/arm-linux-
四. 修改相關(guān)的文件。
1. 修改 arch\arm\mach-s3c2410\devs.c 文件
增加頭文件定義
/***********add here***********/
#include <linux/mtd/partitions.h>
#include <asm/arch/nand.h>
#include <linux/mtd/nand.h>
/**************end add********/
增加 nand flash 分區(qū)信息
/***********add here***********/
static struct mtd_partition partition_info[] ={
{
name: "loader",
size: 0x00020000,
offset: 0,
}, {
name: "param",
size: 0x00010000,
offset: 0x00020000,
}, {
name: "kernel",
size: 0x001c0000,
offset: 0x00030000,
}, {
name: "root",
size: 0x00200000,
offset: 0x00200000,
mask_flags: MTD_WRITEABLE,
}, {
name: "user",
size: 0x03af8000,
offset: 0x00400000,
}
};
struct s3c2410_nand_set nandset ={
nr_partitions: 5 ,
partitions: partition_info ,
};
struct s3c2410_platform_nand superlpplatform={
tacls:0,
twrph0:30,
twrph1:0,
sets: &nandset,
nr_sets: 1,
};
/**************end add********/
struct platform_device s3c_device_nand = {
.name = "s3c2410-nand",
.id = -1,
.num_resources = ARRAY_SIZE(s3c_nand_resource),
.resource = s3c_nand_resource,
/***********add here****************/
.dev = {
.platform_data = &superlpplatform
}
/**************end here************/
};
2. 修改 arch\arm\mach-s3c2410\mach-smdk2410.c 文件
Startic struct platform_device *smdk2410_devices[] __initdata={
&s3c_device_usb,
&s3c_device_lcd;
&s3c_device_wdt,
&s3c_device_i2c;
&s3c_device_iis,
&s3c_device_nand, /*add here*/
};
五. 我們做完以上修改以后,,內(nèi)核編譯以后就可以在 hfrk2410 開(kāi)發(fā)板上運(yùn)行了,。
打開(kāi)終端窗口,,切換到 linux-2.6.14 目錄下,輸入命令:
# make smdk2410_defconfig
#make menuconfig /*選擇nand flash模塊*/
# make
等編譯完成以后,,會(huì)生成鏡像文件 arch/arm/boot/zImage ,,把這個(gè)文件下載到開(kāi)發(fā)板上,就會(huì)看到 linux2.6 的內(nèi)核啟動(dòng)信息,,我們邁出了 linux2.6 內(nèi)核移植的第一步,!
如果出現(xiàn)field `list‘ has incomplete type
那是因?yàn)閜artitions.h中沒(méi)有定義head_list,在partitions.h的頭加上#include <linux/list.h>
就ok了,,哈哈
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1529788
在華恒2410平臺(tái)上移植2.6內(nèi)核
allbone 發(fā)表于 2006-4-7 16:57:00 第一次做linux的移植,,走了很多彎路,也學(xué)到很多知識(shí),,僅把過(guò)程
記錄下來(lái),,以備日后之用。
手里這塊板是華恒的一個(gè)學(xué)習(xí)平臺(tái),,配置比較低:
s3c2410, 8M Nor Flash(Intel 28F640), 16M SDRAM
配套安裝的是2.4的內(nèi)核,,根文件系統(tǒng)安裝在ramdisk上。我的想
法很簡(jiǎn)單,,就是將2.6的內(nèi)核跑起來(lái),,掛上原來(lái)的文件系統(tǒng)。就是說(shuō)
只要系統(tǒng)啟動(dòng)到shell提示符,,我的目的就達(dá)到了,,至于周邊設(shè)備的
驅(qū)動(dòng)移植則不在此行計(jì)劃內(nèi)。很自然的,,整個(gè)過(guò)程大致分為兩個(gè)階段,。
一、內(nèi)核移植
由于2.6內(nèi)核已經(jīng)正式支持2410這款cpu以及smdk2410這塊公板,,
只要配置得當(dāng),,在不修改一行內(nèi)核代碼的情況下,內(nèi)核就可以運(yùn)行起來(lái),。
所以我覺(jué)得這里再提移植就不恰當(dāng)了,,而僅僅是個(gè)配置、交叉編譯內(nèi)
核的過(guò)程,。
make ARCH=arm CROSS_COMPILE=arm-linux- smdk2410_defconfig
make ARCH=arm CROSS_COMPILE=arm-linux- zImage
為了接下來(lái)方便,,可以直接在top level的Makefile中設(shè)置ARCH
和CROSS_COMPILE變量。在2.6內(nèi)核中,,console的名稱發(fā)生了變化,
需要在bootloader或者內(nèi)核的配置中修改啟動(dòng)參數(shù),,例如
2.4中啟動(dòng)參數(shù)為 …… console=ttyS0,115200,
在2.6中則應(yīng)改為 …… console=ttySAC0,115200
現(xiàn)在用新內(nèi)核啟動(dòng),,可以在串口接收到啟動(dòng)信息,,但由于還沒(méi)有
安裝根文件系統(tǒng),所以中途會(huì)panic,,這是我們?cè)谙乱浑A段需要解決
的問(wèn)題,,而第一階段工作結(jié)束。
非常簡(jiǎn)單的過(guò)程,,我卻沒(méi)那么幸運(yùn),。開(kāi)始用的是最新的2.6.16的
kernel,經(jīng)過(guò)上述配置,,啟動(dòng)后收不到任何消息,。折騰無(wú)數(shù)次后,抱
著有病亂投醫(yī)的想法,,嘗試了一下2.6.14,,竟然順利啟動(dòng)。翻了一遍
2.6.16的changelog,,也沒(méi)發(fā)現(xiàn)個(gè)所以然,,等待高手解惑……
二、安裝根文件系統(tǒng)
首先對(duì)flash進(jìn)行分區(qū),。網(wǎng)上的經(jīng)典文章《Linux 2.6.10 以后版
本對(duì)S3C2410的支持》僅提到了對(duì)Nand flash分區(qū)的方法,,對(duì)Nor
flash不適用。對(duì)Nor flash的分區(qū),,是通過(guò)在
linux/drivers/mtd/maps下增加特定mapping驅(qū)動(dòng)程序來(lái)實(shí)現(xiàn),。該目
錄下的驅(qū)動(dòng)程序結(jié)構(gòu)相似,可以找一個(gè)來(lái)修改成自己的,。我用的是
cfi_flagadm.c這個(gè),。
cp cfi_flagadm.c s3c2410.c
將FLASH_PHYS_ADDR和FLASH_SIZE這兩個(gè)宏分別修改成自己板子
的flash起始地址和大小。然后修改結(jié)構(gòu)體數(shù)組flagadm_parts添加自
己的分區(qū)信息,。
接下來(lái)告訴內(nèi)核使用該驅(qū)動(dòng)程序,。修改maps目錄下的Kconfig文
件,該文件決定出現(xiàn)在menuconfig中的項(xiàng)目,,在config
MTD_CDB89712之后添加
config MTD_S3C2410
tristate "HuaHeng 2410 board"
修改該目錄下的Makefile,,添加如下內(nèi)容:
obj-$(CONFIG_MTD_S3C2410) += s3c2410.o
現(xiàn)在make menuconfig時(shí),在MTD項(xiàng)目中將出現(xiàn)HuaHneng 2410
board選項(xiàng),,選中它并重新編譯內(nèi)核就完成了分區(qū)工作,,啟動(dòng)時(shí)將看
到分區(qū)信息。
現(xiàn)在,,內(nèi)核可以檢測(cè)到分區(qū),,并找到了壓縮的RAMDISK,并試圖
解壓縮,。如果你使用smdk2410的默認(rèn)配置,,這時(shí)會(huì)報(bào)錯(cuò),,類似
RAMDISK:incomplete 云云。解決辦法很簡(jiǎn)單,,將內(nèi)核配置中的
BLK_DEV_RAM_SIZE的值從默認(rèn)的4096改為8192即可,。
原2.4內(nèi)核中對(duì)設(shè)備文件的管理是通過(guò)devfs完成的,所有設(shè)備文
件均在啟動(dòng)后檢測(cè)到設(shè)備時(shí)動(dòng)態(tài)建立,,所以我的RAMDISK中/dev目錄
是空的,。而2.6內(nèi)核從某個(gè)版本號(hào)后移除了devfs,取而代之的是udev,。
我一沒(méi)有啟用udev,,二沒(méi)有手動(dòng)建立任何設(shè)備文件,所以內(nèi)核警告無(wú)
法初始化控制臺(tái),。手工添加設(shè)備文件即可:
mknod /dev/console c 5 1
為了避免再出現(xiàn)類似錯(cuò)誤,,我用原2.4內(nèi)核啟動(dòng),把devfs建立好
的設(shè)備文件全部拷了出來(lái),,添加到RAMDISK當(dāng)中,。
到此為止內(nèi)核已經(jīng)啟動(dòng)到VFS:freeing xxxK memory。但出現(xiàn)一
行reboot(magic=000000)的信息,,就沒(méi)有下文了,。搜了一下,發(fā)現(xiàn)在
配置內(nèi)核時(shí)必須選中Floating Point Emulator,,否則就會(huì)導(dǎo)致這個(gè)
錯(cuò)誤,。再次重新編譯內(nèi)核,重啟,,終于出現(xiàn)了期待已久的#提示符,。
寫(xiě)的比較亂,大家去粗取精的看吧 :) 主要參考資料為L(zhǎng)inux
Forum嵌入式版對(duì)2.6內(nèi)核移植的專題討論帖,。
移植2.6.17.13到s3c2410
前一陣子移植了u-boot1.1.4之后,,移植2.6.17.13走了一些彎路,采用了別人移植的2.6.14或2.6.11等方法都不成功,,后來(lái)發(fā)現(xiàn)2.6.17比前幾個(gè)版本的內(nèi)核更容易,。
從
www.下載2.6.17.13.tar.bz2,解壓:
#tar jxvf 2.6.17.13.tar.bz2
1,、重新編譯和修改u-boot
以前移植u-boot用的是arm-linux-gcc 2.95.3,,到移植2.6內(nèi)核的時(shí)候發(fā)現(xiàn)必須用gcc3.0以上的編譯器,沒(méi)辦法只好下載了個(gè)arm-linux-gcc3.4.4 +glibc2.3.5,,怕由于編譯器不一致引起問(wèn)題,,重新編譯了一次u-boot,沒(méi)遇到任何錯(cuò)誤。
2,、修改內(nèi)核頂層目錄的Makefile,,找到ARCH和CROSS_COMPILE的地方,修改為
ARCH ?= arm
CROSS_COMPILE ?= arm-linux-
保存,。
3、 修改arch/arm/mach-s3c2410/common-smdk.c
設(shè)置Nand Flash的分區(qū)和信息,,下面是我的分區(qū)結(jié)構(gòu):
static struct mtd_partition smdk_default_nand_part[] = {
[0] = {
.name = "bootloader",
.size = SZ_1M,
.offset = 0,
},
[1] = {
.name = "kernel",
.offset = SZ_1M,
.size = SZ_2M,
},如果您是在公共場(chǎng)合使用計(jì)算機(jī),,離開(kāi)時(shí)
[2] = {
.name = "root",
.offset = SZ_1M*3,
.size = SZ_8M*5,
},
[3] = {
.name = "user",
.offset = SZ_1M*43,
.size = SZ_1M*21,
},
};
static struct s3c2410_platform_nand smdk_nand_info = {
.tacls = 0,
.twrph0 = 30,
.twrph1 = 0,
.nr_sets = ARRAY_SIZE(smdk_nand_sets),
.sets = smdk_nand_sets,
};
說(shuō)明:這里2.6.17的設(shè)置分區(qū)與其他版本如2.6.14或2.6.11有點(diǎn)區(qū)別,其他版本是修改
arch/arm/machs3c2410/devs.c
和
arch/arm/machs3c2410/machsmdk2410.
2.6.17.13設(shè)置這些文件無(wú)效,。
4,、禁止Flash ECC校驗(yàn)
內(nèi)核都是通過(guò)u-boot寫(xiě)數(shù)據(jù)到Nand Flash的, u-boot通過(guò)的軟件ECC算法產(chǎn)生ECC校驗(yàn)碼, 這與內(nèi)核校驗(yàn)的ECC碼不一樣, 內(nèi)核中的ECC碼是由S3C2410中Nand Flash控制器產(chǎn)生的. 所以, 我們?cè)谶@里選擇禁止內(nèi)核ECC校驗(yàn)。
修改drivers/mtd/nand/s3c2410.c 文件,,找到s3c2410_nand_init_chip()函數(shù),,在該函數(shù)體最后加上一條語(yǔ)句:
chip->eccmode = NAND_ECC_NONE;
保存,退出。
5,、支持啟動(dòng)時(shí)掛載devfs
為了我們的內(nèi)核支持devfs以及在啟動(dòng)時(shí)并在/sbin/init運(yùn)行之前能自動(dòng)掛載/dev為devfs文件系統(tǒng),,修改fs/Kconfig文件,找到
menu "Pseudo filesystems"
添加如下語(yǔ)句:
config DEVFS_FS
bool "/dev file system support (OBSOLETE)"
default y
config DEVFS_MOUNT
bool "Automatically mount at boot"
default y
depends on DEVFS_FS
6,、使用SMDK板子的config配置內(nèi)核
#cp arch/arm/configs/smdk2410_defconfig .config
#make menuconfig
在smdk2410_defconfig的基礎(chǔ)上,,增加了下面選項(xiàng):
Loadable module support >
[*] Enable loadable module support
[*] Automatic kernel module loading
System Type -->
[*] S3C2410 DMA support
Boot options -->
Default kernel command string:
noinitrd root=/dev/mtdblock2 init=/linuxrc console=ttySAC0,115200 mem=32M
#說(shuō)明:mtdblock2代表第3個(gè)flash分區(qū),用來(lái)作根文件系統(tǒng)rootfs,;
# console=ttySAC0,115200使kernel啟動(dòng)期間的信息全部輸出到串口0上,,波特率為115200;
# 2.6內(nèi)核對(duì)于串口的命名改為ttySAC0,,但這不影響用戶空間的串口編程,。
# 用戶空間的串口編程針對(duì)的仍是/dev/ttyS0等
# mem=32M表示內(nèi)存是32M,如果是64則設(shè)為64M
Floating point emulation -->
[*] NWFPE math emulation
#This is necessary to run most binaries!!!
#接下來(lái)要做的是對(duì)內(nèi)核MTD子系統(tǒng)的設(shè)置
Device Drivers -->
Memory Technology Devices (MTD) -->
[*] MTD partitioning support
#支持MTD分區(qū),,這樣我們?cè)谇懊嬖O(shè)置的分區(qū)才有意義
[*] Command line partition table parsing
#支持從命令行設(shè)置flash分區(qū)信息,,靈活
RAM/ROM/Flash chip drivers -->
<*> Detect flash chips by Common Flash Interface (CFI) probe
<*> Detect nonCFI AMD/JEDECcompatible flash chips
<*> Support for Intel/Sharp flash chips
<*> Support for AMD/Fujitsu flash chips
<*> Support for ROM chips in bus mapping
NAND Flash Device Drivers -->
<*> NAND Device Support
<*> NAND Flash support for S3C2410/S3C2440 SoC
Character devices -->
[*] Nonstandard serial port support
[*] S3C2410 RTC Driver
USB Support -->
<*> Support for Host-side USB
MMC/SD Card Support -->
<*> MMC Support
<*> MMC block device driver
#接下來(lái)做的是針對(duì)文件系統(tǒng)的設(shè)置,本人實(shí)驗(yàn)時(shí)目標(biāo)板上要上的文件系統(tǒng)是cramfs,故做如下配置
File systems -->
<> Second extended fs support #去除對(duì)ext2的支持
Pseudo filesystems -->
[*] /proc file system support
[*] Virtual memory file system support (former shm fs)
[*] /dev file system support (OBSOLETE)
[*] Automatically mount at boot (NEW)
#這里會(huì)看到我們前先修改fs/Kconfig的成果,,devfs已經(jīng)被支持上了
Miscellaneous filesystems >
<*> Compressed ROM file system support (cramfs)
#支持cramfs
Network File Systems >
<*> NFS file system support
保存退出,,產(chǎn)生.config文件。
7,、編譯內(nèi)核,,下載到板子上
#make zImage
生成zImage在arch/arm/boot/目錄下
zImage下載到板子上之后可以直接用go來(lái)執(zhí)行,但是go啟動(dòng)內(nèi)核的話會(huì)出現(xiàn)下面錯(cuò)誤:
random2410 # tftp 30008000 2.6.17.13
TFTP from server 192.168.1.10; our IP address is 192.168.1.110
Filename ‘2.6.17.13‘.
Load address: 0x30008000
Loading: #################################################################
#################################################################
#################################################################
########################
done
Bytes transferred = 1118644 (1111b4 hex)
random2410 # go 30008000
## Starting application at 0x30008000 ...
Uncompressing Linux.............................................................
Error: unrecognized/unsupported machine ID (r1 = 0x31f07d30).
Available machine support:
ID (hex) NAME
000000c1 SMDK2410
Please check your kernel config and/or bootloader.
產(chǎn)生的原因是go啟動(dòng)內(nèi)核的話,,u-boot不會(huì)傳machiine ID給內(nèi)核,,因?yàn)間o只是執(zhí)行普通的應(yīng)用程序,不考慮到傳遞參數(shù)給內(nèi)核的問(wèn)題,沒(méi)有必要在乎它,。如果只是想看看go能不能啟動(dòng)內(nèi)核的話,,修改方法有兩個(gè):
a、修改u-boot的common/cmd_boot.c的do_go()函數(shù):
/*#if defined(CONFIG_I386)*/ <==注釋掉
DECLARE_GLOBAL_DATA_PTR;
/*#endif*/ <==注釋掉
....
#if !defined(CONFIG_NIOS)
/*******************add here*******************************/
if(argc==2)
rc = ((ulong (*)(int, char *[]))addr) (0, gd->bd->bi_arch_number);
else
/*********************add end *****************************/
rc = ((ulong (*)(int, char *[]))addr) (--argc, &argv[1]);
b,、修改內(nèi)核的arch/arm/kernel/head.S,,直接將s3c2410的參數(shù)賦給內(nèi)核
__INIT
.type stext, %function
ENTRY(stext)
/****************add here*****************/
mov r0, #0
mov r1, #0xc1
ldr r2, =0x30000100
/***************end add******************/
msr cpsr_c, #PSR_F_BIT | PSR_I_BIT | MODE_SVC @ ensure svc mode
@ and irqs disabled
8、用bootm啟動(dòng)內(nèi)核
這個(gè)方法u-boot可以將machine ID傳給內(nèi)核,,正常啟動(dòng),,不過(guò)用u-boot的mkimage工具(在u-boot1.1.4/tools/目錄下)將前面生成的zImage加上一個(gè)信息頭(有關(guān)如何添加頭的命令和使用tftp在后面講述),之后下載到板子上,,啟動(dòng)控制臺(tái)信息如下:
U-Boot 1.1.4 (Sep 20 2006 - 00:34:30)
U-Boot code: 31F80000 -> 31F9628C BSS: -> 31F9A578
RAM Configuration:
Bank #0: 30000000 32 MB
Flash: 512 kB
*** Warning - bad CRC, using default environment
In: serial
Out: serial
Err: serial
random2410 # tftp 30008000 uImage2.6.17.13
TFTP from server 192.168.1.10; our IP address is 192.168.1.110
Filename ‘uImage2.6.17.13‘.
Load address: 0x30008000
Loading: #################################################################
#################################################################
#################################################################
########################
done
Bytes transferred = 1116720 (110a30 hex)
random2410 # bootm 30008000
## Booting image at 30008000 ...
Image Name: linux-2.6.17.13
Created: 2006-09-19 17:25:57 UTC
Image Type: ARM Linux Kernel Image (uncompressed)
Data Size: 1116656 Bytes = 1.1 MB
Load Address: 30008000
Entry Point: 30008040
Verifying Checksum ... OK
XIP Kernel Image ... OK
Starting kernel ...
cleanup before linux...
enter the Kerne....address is 30008040
transfer params to linux kernel:
machine ID: r1=c1, boot params addr: r2=30000100
enter decompress_kernel...
finished to arch_decomp_setup
Uncompressing Linux......................................................................... done, booting the kernel.
Linux version 2.6.17.13 (
xzs@xzs-pc) (gcc version 3.4.4) #7 Wed Sep 20 01:23:13 CST 2006
CPU: ARM920Tid(wb) [41129200] revision 0 (ARMv4T)
Machine: SMDK2410
Warning: bad configuration page, trying to continue
Memory policy: ECC disabled, Data cache writeback
CPU S3C2410A (id 0x32410002)
S3C2410: core 202.800 MHz, memory 101.400 MHz, peripheral 50.700 MHz
S3C2410 Clocks, (c) 2004 Simtec Electronics
CLOCK: Slow mode (1.500 MHz), fast, MPLL on, UPLL on
CPU0: D VIVT write-back cache
CPU0: I cache: 16384 bytes, associativity 64, 32 byte lines, 8 sets
CPU0: D cache: 16384 bytes, associativity 64, 32 byte lines, 8 sets
Built 1 zonelists
Kernel command line: noinitrd root=/dev/mtdblock2 init=/linuxrc console=ttySAC0,115200 mem=32M
irq: clearing pending ext status 00000200
irq: clearing subpending status 00000002
PID hash table entries: 256 (order: 8, 1024 bytes)
timer tcon=00500000, tcnt a509, tcfg 00000200,00000000, usec 00001e4c
Console: colour dummy device 80x30
Dentry cache hash table entries: 4096 (order: 2, 16384 bytes)
Inode-cache hash table entries: 2048 (order: 1, 8192 bytes)
Memory: 32MB = 32MB total
Memory: 30080KB available (1856K code, 404K data, 92K init)
Mount-cache hash table entries: 512
CPU: Testing write buffer coherency: ok
NET: Registered protocol family 16
S3C2410: Initialising architecture
usbcore: registered new driver usbfs
usbcore: registered new driver hub
NET: Registered protocol family 2
IP route cache hash table entries: 256 (order: -2, 1024 bytes)
TCP established hash table entries: 1024 (order: 0, 4096 bytes)
TCP bind hash table entries: 512 (order: -1, 2048 bytes)
TCP: Hash tables configured (established 1024 bind 512)
TCP reno registered
S3C2410 DMA Driver, (c) 2003-2004 Simtec Electronics
DMA channel 0 at c2800000, irq 33
DMA channel 1 at c2800040, irq 34
DMA channel 2 at c2800080, irq 35
DMA channel 3 at c28000c0, irq 36
NetWinder Floating Point Emulator V0.97 (double precision)
JFFS2 version 2.2. (NAND) (C) 2001-2003 Red Hat, Inc.
io scheduler noop registered
io scheduler anticipatory registered (default)
io scheduler deadline registered
io scheduler cfq registered
Console: switching to colour frame buffer device 80x25
fb0: Virtual frame buffer device, using 1024K of video memory
S3C2410 RTC, (c) 2004 Simtec Electronics
s3c2410-uart.0: s3c2410_serial0 at MMIO 0x50000000 (irq = 70) is a S3C2410
s3c2410-uart.1: s3c2410_serial1 at MMIO 0x50004000 (irq = 73) is a S3C2410
s3c2410-uart.2: s3c2410_serial2 at MMIO 0x50008000 (irq = 76) is a S3C2410
RAMDISK driver initialized: 16 RAM disks of 4096K size 1024 blocksize
S3C24XX NAND Driver, (c) 2004 Simtec Electronics
s3c2410-nand: Tacls=1, 9ns Twrph0=4 39ns, Twrph1=1 9ns
NAND device: Manufacturer ID: 0xec, Chip ID: 0x76 (Samsung NAND 64MiB 3,3V 8-bit)
NAND_ECC_NONE selected by board driver. This is not recommended !!
Scanning device for bad blocks
Bad eraseblock 629 at 0x009d4000
Creating 4 MTD partitions on "NAND 64MiB 3,3V 8-bit":
0x00000000-0x00100000 : "bootloader"
mtd: Giving out device 0 to bootloader
0x00100000-0x00300000 : "kernel"
mtd: Giving out device 1 to kernel
0x00300000-0x02b00000 : "root"
mtd: Giving out device 2 to root
0x02b00000-0x04000000 : "user"
mtd: Giving out device 3 to user
usbmon: debugfs is not available
mice: PS/2 mouse device common for all mice
ts: Compaq touchscreen protocol output
TCP bic registered
NET: Registered protocol family 1
Reading data from NAND FLASH without ECC is not recommended
No filesystem could mount root, tried: cramfs romfs
Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(31,2)
這里因?yàn)槲覜](méi)有添加任何應(yīng)用程序和文件系統(tǒng),,所以出錯(cuò),不影響內(nèi)核已經(jīng)成功移植,。
9,、使用mkimage給zImage添加信息頭
mkimage -A arm -O linux -T kernel -C none -a 30008000 -e 30008040 -n linux-2.6.17.13 -d zImage uImage2.6.17.13
-A arm -------- 架構(gòu)是arm
-O linux -------- 操作系統(tǒng)是linux
-T kernel -------- 類型是kernel
-C none -------- 壓縮類型為無(wú)壓縮
-a 30008000 ---- image的載入地址(hex)
-e 30008040 ---- 內(nèi)核的入口地址(hex),因?yàn)樾畔㈩^的大小是0x40
-n linux-2.6.17.13 --- image的名字
-d zImage ---- 無(wú)頭信息的image文件名
uImage2.6.17.13 ---- 加了頭信息之后的image文件名
10,、使用tftp下載內(nèi)核
a,、安裝atftpd
我現(xiàn)在用的linux是ubuntu6.06,安裝了atftpd,,沒(méi)安裝的話使用
#sudo apt-get install atftpd
安裝,。
b、接著建立/tftp目錄,,并設(shè)置所有人都有讀寫(xiě)運(yùn)行權(quán)限:
#sudo mkdir /tftp
#sudo chmod 777 tftp
c,、啟動(dòng)tftp服務(wù):
#sudo atftpd --daemon --user xzs --group root /tftp
d、將zImage和uImage2.6.17.13復(fù)制到/tftp目錄下
e,、啟動(dòng)minicom,,復(fù)位板子,在minicom下輸入
tftp 30008000 uImage2.6.17.13
如果已經(jīng)板子和PC機(jī)已經(jīng)通過(guò)網(wǎng)線連接,,IP也正確,,則會(huì)出現(xiàn)一下信息:
TFTP from server 192.168.1.10; our IP address is 192.168.1.110
Filename ‘uImage2.6.17.13‘.
Load address: 0x30008000
Loading: #################################################################
#################################################################
#################################################################
########################
done
Bytes transferred = 1116720 (110a30 hex)
linux 2.6.22.1 的在s3c2410板子上的移植
-------------------作者:無(wú)貓
++++++++++++++++++++++++++++++++++++++++++++++
----------------------------------------------
bootloader編譯環(huán)境:
vivi版本:0.1.4
交叉編譯器(CROSS-COMPILE)版本:2.95.3
(下載地址略:網(wǎng)上很多搜下。)
操作系統(tǒng):Fedora 7
======================================
linux內(nèi)核編譯環(huán)境:
內(nèi)核版本:linux2.6.22.1
交叉編譯器(CROSS-COMPILE)版本: 4.2.0
(下載地址:
http://www./gnu_toolchains/arm/download.html)
注意:下載選項(xiàng),,要選 ARM EABI 的選項(xiàng),,和 IA32 GNU/linux
操作系統(tǒng): Fedora 7
======================================
文件系統(tǒng)編譯環(huán)境:
busybox1.5.1,或1.4.2
交叉編譯器(CROSS-COMPILE)版本: 3.3.2
(下載地址:
http://linux./pub/toolchain/ )
操作系統(tǒng): Fedora 7
----------------------------------------------
硬件:
板子是北京恒頤高科技術(shù)有限公司的H2410EB
內(nèi)存: 64MB SDRAM(2×16M×16位),;
CPU: S3C2410 ARM處理器,,
Nor Flash:2MB的Nor Flash,用于固化測(cè)試程序(用來(lái)下載bootloader,,內(nèi)核,,或文件系統(tǒng)),;
NANDflash: 64MB的Nand Flash,用于存儲(chǔ)Bootloader,、Linux內(nèi)核及文件系統(tǒng),、應(yīng)用程序和數(shù)據(jù);
++++++++++++++++++++++++++++++++++++++++++++++
==================================================================================================
一: 編譯環(huán)境搭建
==================================================================================================
一:搭建交叉編譯環(huán)境
說(shuō)明:由于編譯交叉編譯環(huán)境比較繁瑣,,建議大家用已經(jīng)編譯好的交叉編譯環(huán)境,。
下面以3.3.2的交叉編譯環(huán)境的搭建為例,其他的兩個(gè)的編譯器環(huán)境搭建一樣,。
2. 把解壓的文件夾中的 “3.3.2”文件夾拷貝到 /usr/local/arm目錄下
(如果沒(méi)有arm目錄就新建arm目錄,,但是一定要是拷貝到這個(gè)目錄,不然不能運(yùn)行),。
3. 在命令窗口輸入
export PATH=/usr/local/arm/3.3.2/bin:$PATH
4. 如果輸入 arm- 然后按下tab鍵能自動(dòng)補(bǔ)全命令 arm-linux- 說(shuō)明搭建成功。
===================================================================================================
二: bootloader 編譯
===================================================================================================
二: bootloader的修改
主要修改分區(qū)信息,,如果要能下載yaffs文件系統(tǒng)還得另外打補(bǔ)丁,,最近我會(huì)寫(xiě)編這樣的文章。
具體修改:
1. 解壓vivi(具體命令略,,如果你解壓都不會(huì),,移植可能對(duì)你來(lái)說(shuō)有點(diǎn)困難)
[root@localhost vivi]# ls
arch CVS drivers init Makefile Rules.make test vivi vivi.map
COPYING Documentation include lib Makefile.newSDK scrīpts util vivi-elf
2. [root@localhost vivi]# vim ./arch/s3c2410/smdk.c
修改 NAND flash 分區(qū)如下:
----------------------------------------------------------------------
mtd_partition_t default_mtd_partitions[] = {
{
name: "bootloader",
offset: 0,
size: 0x00020000,
flag: 0
}, {
name: "param",
offset: 0x00020000,
size: 0x000E0000,
flag: 0
}, {
name: "kernel",
offset: 0x00100000,
size: 0x00300000,
flag: 0
}, {
name: "root",
offset: 0x00400000,
size: 0x01400000,
flag: MF_BONFS
}, {
name: "user",
offset: 0x01800000,
size: 0x02C00000,
flag: MF_BONFS
}
};
-------------------------------------------------------------------------
3. 修改Makefile
[root@localhost vivi]# vim Makefile
修改 ARCH LINUX_INCLUDE_DIR CROSS_COMPILE 如下:
------------------------------------------------------------------------
ARCH := arm
LINUX_INCLUDE_DIR = /usr/local/arm/2.95.3/include/
CROSS_COMPILE = /usr/local/arm/2.95.3/bin/arm-linux-
3. 編譯
[root@localhost vivi]# make
------------------------------------------------------------------------
會(huì)在 vivi目錄生成你要的 vivi 程序(bootloader)
------------------------------------------------------------------------
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
說(shuō)明:我的nand falsh的一塊為16k,
所以上面的分區(qū):
**************************************
分區(qū)信息
**************************************
bootloader: 128k
param : 896k
kernel : 3M
root : 20M
user : 40M
**************************************
bon 操作
**************************************
bon part 0 1M 4M:m 24M:m
解釋一下上面的命令:
第1個(gè)分區(qū)從0開(kāi)始;
第2個(gè)分區(qū)從0x30000(即192K)開(kāi)始;
第3個(gè)分區(qū)從0x200000(即2M)開(kāi)始;
第4個(gè)分區(qū)從0x400000(即4M)開(kāi)始.
***********************************
bon part info
***********************************
bon part info
BON info. (4 partitions)
No: offset size flags bad
---------------------------------------------
0: 0x00000000 0x00100000 00000000 0 1M
1: 0x00100000 0x00300000 00000000 0 3M
2: 0x00400000 0x01400000 00000001 0 20M
3: 0x01800000 0x027fc000 00000001 0 39M+1008k
***********************************
part show
***********************************
mtdpart info. (5 partitions)
name offset size flag
------------------------------------------------
bootloader : 0x00000000 0x00020000 0 128k
param : 0x00020000 0x000e0000 0 896k
kernel : 0x00100000 0x00300000 0 3M
root : 0x00400000 0x01400000 4 20M
user : 0x01800000 0x02c00000 4 44M
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
===================================================================================================
三: 內(nèi)核 編譯
===================================================================================================
三: 內(nèi)核 編譯
注意:用的編譯器是4.2.0的交叉編譯器
1. 修改 Makefile
[root@localhost porting]# cd linux-2.6.22
[root@localhost linux-2.6.22]# vim Makefile
修改 ARCH 和 CROSS_COMPILE
--------------------------------------------------------------
ARCH ?= arm
CROSS_COMPILE ?=/usr/local/arm/4.2.0/bin/arm-none-eabi-
2. 修改common-smdk.c文件
[root@localhost linux-2.6.22]# vim arch/arm/plat-s3c24xx/common-smdk.c
------------------------------------------------------------------------------
static struct mtd_partition smdk_default_nand_part[] = {
[0] = {
.name = "Boot",
.size = SZ_128K,
.offset = 0,
},
[1] = {
.name = "param",
.offset = MTDPART_OFS_APPEND,
.size = SZ_1M - SZ_128K,
},
[2] = {
.name = "kernel",
.offset = SZ_1M,
.size = SZ_1M * 3,
},
[3] = {
.name = "root",
.offset = MTDPART_OFS_APPEND,
.size = SZ_2M * 10,
},
/*
,
[5] = {
.name = "S3C2410 flash partition 5",
.offset = SZ_1M * 14,
.size = SZ_1M * 10,
},
[6] = {
.name = "S3C2410 flash partition 6",
.offset = SZ_1M * 24,
.size = SZ_1M * 24,
},
[7] = {
.name = "S3C2410 flash partition 7",
.offset = SZ_1M * 48,
.size = SZ_16M,
}
*/
};
---------------------------------------------------------------------------------
3. 去掉nand flash 的ECC
[root@localhost linux-2.6.22]# vim drivers/mtd/nand/s3c2410.c
---------------------------------------------------------------------------------
1,、打開(kāi)drivers/mtd/nand/s3c2410.c
2,、搜索關(guān)鍵字NAND_ECC_SOFT,在s3c2410_nand_init_chip函數(shù)里
3,、修改NAND_ECC_SOFT為NAND_ECC_NONE
---------------------------------------------------------------------------------
4. 支持啟動(dòng)時(shí)掛載devfs
為了我們的內(nèi)核支持devfs以及在啟動(dòng)時(shí)并在/sbin/init運(yùn)行之前能自動(dòng)掛載/dev為devfs文件系統(tǒng),。
[root@localhost linux-2.6.22]# vi fs/Kconfig
-----------------------------------------------------------------------------------
找到menu "Pseudo filesystems"
添加如下語(yǔ)句:
config DEVFS_FS
bool "/dev file system support (OBSOLETE)"
default y
config DEVFS_MOUNT
bool "Automatically mount at boot"
default y
depends on DEVFS_FS
----------------------------------------------------------------------------------
5. 編譯內(nèi)核
[root@localhost linux-2.6.22]# cp ./arch/arm/configs/s3c2410_defconfig .config
[root@localhost linux-2.6.21.5]# make xconfig
----------------------------------------------------------------------------------
Userspace binary formats
[ ]Kernel support for a.out and ECOFF binaries (BINFMT_AOUT) (去除該選項(xiàng))
Boot options
Default kernel command string
改成:
noinitrd root=/dev/mtdblock3 console=ttySAC0,115200 init=/linuxrc
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
再選上你想選的選項(xiàng),如果編譯通不過(guò),,對(duì)照著錯(cuò)誤,,看下把哪些選項(xiàng)去除,或添加哪些選項(xiàng),。
-----------------------------------------------------------------------------------
6. 編譯
[root@localhost linux-2.6.22]# make zImage
===================================================================================================
四: 文件系統(tǒng)的制作
===================================================================================================
四: 文件系統(tǒng)的制作
注意:交叉編譯器 3.3.2,, busybox1.5.1, 靜態(tài)編譯
編譯更詳細(xì)的內(nèi)容:http://bbs.ss.pku.edu.cn/ss/index.php/5836/action_viewspace_itemid_11825.html
1. busybox的編譯
-----------------------------------------------------------------------------
一 修改busybox中的 Makefile文件
找到 ARCH 和 CROSS_COMPILE 修改成如下
ARCH ?= arm
CROSS_COMPILE ?= /usr/local/arm/3.3.2/bin/arm-linux-
二 配置
[root@localhost busybox-1.4.2]# make defconfig
[root@localhost busybox-1.4.2]# make xconfig
=============================================
修改配置 主要修改如下
=============================================
Busybox Settings
Build Options
[*]Build BusyBox as a static binary
//選此項(xiàng)靜態(tài)編譯,。
Miscellaneous Utilities
[]taskset //選了就會(huì)出錯(cuò)
-------------------------------------------------
三 編譯
[root@localhost busybox-1.5.1]# make all install
-----------------------------------------------------------------
最后會(huì)在 busybox-1.5.1/_install/目錄生成你要的 bin sbin usr 目錄
------------------------------------------------------------------
2. 編寫(xiě)linuxrc 文件
-----------------------------------------------------------------
#!/bin/sh
#echo "mount /etc as ramfs"
/bin/mount -n -t ramfs ramfs /etc
/bin/cp -a /mnt/etc/* /etc
echo "re-create the /etc/mtab entries"
# re-create the /etc/mtab entries
/bin/mount -f -t cramfs -o remount,ro /dev/mtdblock/3 /
#mount some file system
echo "mount /dev/shm as tmpfs"
/bin/mount -n -t tmpfs tmpfs /dev/shm
#掛載/proc為proc文件系統(tǒng)
echo "mount /proc as proc"
/bin/mount -n -t proc none /proc
#掛載/sys為sysfs文件系統(tǒng)
echo "mount /sys as sysfs"
/bin/mount -n -t sysfs none /sys
/bin/mount -f -t ramfs ramfs /etc
echo "yaffs is mounted"
/bin/mount -t yaffs /dev/mtdblock/1 /mnt/yaffs
exec /sbin/init
---------------------------------------------------------------------
3. 權(quán)限修改
chmod chmod 775 linuxrc
4. 編寫(xiě) inittab文件
---------------------------------------------------------------------
::sysinit:/etc/init.d/rc
::askfirst:-/bin/sh
tty2::askfirst:-/bin/sh
tty3::askfirst:-/bin/sh
tty4::askfirst:-/bin/sh
tty0::askfirst:-/bin/sh
::restart:/sbin/init
::ctrlaltdel:/sbin/reboot
::shutdown:/bin/umount -a -r
::shutdown:/sbin/swapoff -a
----------------------------------------------------------------------
5. rc文件
----------------------------------------------------------------------
#!/bin/sh
/bin/mount -a
-----------------------------------------------------------------------
6. fastab 文件
----------------------------------------------------------------------
none /proc proc defaults 0 0
none /dev/pts devpts mode=0622 0 0
tmpfs /dev/shm tmpfs defaults 0 0
----------------------------------------------------------------------
7. 各文件的關(guān)系
----------------------------------------------------------------------
7.1 建立一個(gè)目標(biāo)板的空根目錄
我們將在這里構(gòu)建構(gòu)建根文件系統(tǒng),,創(chuàng)建基礎(chǔ)目錄結(jié)構(gòu). 存放交叉編譯后生成的目標(biāo)應(yīng)用程序
(BUSYBOX,TINYLOGIN),,存放庫(kù)文件等,。
[root@localhost rootfs]# mkdir my_rootfs
[root@localhost rootfs]# pwd
/home/arm/dev_home/rootfs/my_rootfs
[root@localhost rootfs]# cd my_rootfs
[root@localhost my_rootfs]#
7.2 在my_rootfs中建立Linux目錄樹(shù)
[root@localhost my_rootfs]#mkdir bin dev etc home lib mnt proc sbin sys tmp root usr
[root@localhost my_rootfs]#mkdir mnt/etc
[root@localhost my_rootfs]#mkdir usr/bin usr/lib usr/sbin
[root@localhost my_rootfs]#touch linuxrc
[root@localhost my_rootfs]#tree
|bin
|dev
|etc
|home
|lib
|linuxrc
/* 此文件為啟動(dòng)腳本,是一shell腳本文件,。本文后面有專門(mén)介紹 */
|mnt
| `etc
|proc
|sbin
|sys
|tmp
|root
`usr
|bin
|lib
`sbin
8. 把上面編譯出來(lái)的 busybox文件拷貝到 my_rootfs 文件系統(tǒng)
---------------------------------------------------------------
把 busybox1.5.1/_install/目錄下的 bin sbin usr 覆蓋 my_rootfs
文件夾里的空文件夾,。
--------------------------------------------------------------
9. 把 5 生成的文件(rc)拷貝到 /mnt/etc/init.d/目錄(先在/mnt/etc/目錄新建格init.d目錄)
把 4,6生成的文件(inittab和 fastab )放到 /mnt/etc/目錄
把 2 生成的文件linuxrc 放到/目錄
這里所提到的 /目錄即my_rootfs目錄。
10. 新建/dev設(shè)備,在/dev目錄(即my_rootfs/dev/).
mknod console c 5 1
8. 生成cramfs文件
----------------------------------------------------------------
下載mkfs.cramfs工具,,然后用下面命令生成你要的cramfs文件系統(tǒng)
./mkfs.cramfs ./my_rootfs ./root.cramfs
移植就這么簡(jiǎn)單,,剩下的就是下載,燒寫(xiě)內(nèi)核,,文件系統(tǒng)等,。聰明的你不用我說(shuō)怎么做了吧
:)