2.6.27是Linux內(nèi)核的最新版本。昨天中午下載的,用了半天的時(shí)間完成了針對(duì)ARM CPU的基本配置,第一次做Linux移植就出乎意料的順利,其實(shí)這主要得益于Linux內(nèi)核優(yōu)良的設(shè)計(jì)和該版本對(duì)ARM處理器近乎完美的支持!
http://blog.csdn.net/rssn_net/article/details/3073302
關(guān)鍵詞: Linux 2.6.27 內(nèi)核 移植 ARM S3C2410
再寫(xiě)一遍:
下面把我的整個(gè)配置過(guò)程與大家分享一下:
第一部分 準(zhǔn)備工作
1. 下載Linux內(nèi)核:
從 http://www./pub/linux/kernel/v2.6/ 下載最新版的,tar.gz和tar.bz2
均可,我下載的是linux-2.6.27.tar.bz2這個(gè),使用 tar -jxvf linux-2.6.27.tar.bz2 解壓縮,cd
linux-2.6.27 轉(zhuǎn)到內(nèi)核代碼根目錄;
2. 下載安裝并配置 arm-linux-gcc 工具鏈:
以前配置過(guò)的話,該步可以忽略。我用的是3.4.1版本,建議安裝到/usr/local/arm/3.4.1目錄下,記得要設(shè)置一下工具鏈程序的搜索目錄, export PATH=$PATH:/usr/local/arm/3.4.1/bin 即可;
第二部分 代碼配置
3. 修改Makefile:
# gedit Makefile
ARCH ?= arm
CROSS_COMPILE ?= /usr/local/arm/3.4.1/bin/arm-linux-
4. 修改C程序文件,指明Flash分區(qū)信息,添加NAND Flash驅(qū)動(dòng)支持:
總共只有兩個(gè)文件需要修改:
/arch/arm/plat-s3c24xx/common-smdk.c
/arch/arm/plat-s3c24xx/devs.c
(1) 指明分區(qū)信息:
common-smdk.c 中找到 static struct mtd_partition smdk_default_nand_part[],根據(jù)自己板子的分區(qū)結(jié)構(gòu)修改,例如我的vivi下的分區(qū)信息為:
name offset size flag
------------------------------------------------
vivi : 0x00000000 0x00020000 0 128k
param : 0x00020000 0x00010000 0 64k
kernel : 0x00040000 0x002c0000 0 2M+768k
root : 0x00300000 0x01d00000 16 29M
rootfs : 0x02000000 0x01f00000 0 31M
我的Flash分了4個(gè)區(qū),這個(gè)變量就應(yīng)設(shè)置為:
static struct mtd_partition smdk_default_nand_part[] = {
[0] = {
.name = "vivi",
.offset = 0x00000000,
.size = 0x00020000,
},
[1] = {
.name = "param",
.offset = 0x00020000,
.size = 0x00010000,
},
[2] = {
.name = "kernel",
.offset = 0x00040000,
.size = 0x002c0000,
},
[3] = {
.name = "root",
.offset = 0x00300000,
.size = 0x01d00000,
},
[4] = {
.name = "rootfs",
.offset = 0x02000000,
.size = 0x01f00000,
},
};
與上面的信息一一對(duì)應(yīng),很容易理解;
(2) 建立NAND Flash芯片支持:
common-smdk.c 中找到 static struct s3c2410_platform_nand smdk_nand_info,修改為:
/*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,
};
這
個(gè)變量是與NAND Flash時(shí)序有關(guān)的設(shè)置,talcs, twrph0, twrph1
的含義見(jiàn)S3C2410手冊(cè)的6-3,隨著板子的Flash芯片不同這里的值可能會(huì)有些差別,我的是K9S1208型號(hào)的;另外注意,一定要將變量前面的
static修飾詞刪除或者注釋掉,原因在后面;
(3) 加入NAND Flash芯片支持到NAND Flash驅(qū)動(dòng):
devs.c 中找到 struct platform_device s3c_device_nand,在前面加上前面 smdk_nand_info 變量的 extern,后面加上smdk_nand_info的指針引用,具體代碼如下:
extern struct s3c2410_platform_nand smdk_nand_info;
struct platform_device s3c_device_nand = {
.name = "s3c2410-nand",
.id = -1,
.num_resources = ARRAY_SIZE(s3c_nand_resource),
.resource = s3c_nand_resource,
/* Add the NAND Flash device */
.dev=
{
.platform_data = &smdk_nand_info,
}
};
(4) 指定啟動(dòng)時(shí)初始化:
找到這一段代碼:
static struct platform_device __initdata *smdk_devs[] = {
&s3c_device_nand,
&smdk_led4,
&smdk_led5,
&smdk_led6,
&smdk_led7,
};
這段代碼指定了內(nèi)核啟動(dòng)時(shí)初始化的設(shè)備,其中s3c_device_nand是必須有的,因?yàn)槲覀冃枰狽AND Flash驅(qū)動(dòng)來(lái)掛載根文件系統(tǒng),其余的根據(jù)需可自行添加,這里我們使用默認(rèn)設(shè)置,不做修改。
5. 禁止Flash ECC校驗(yàn):據(jù)說(shuō)vivi或uboot通過(guò)軟件算法產(chǎn)生的ecc校驗(yàn)碼于S3C2410 NAND Flash 控制器產(chǎn)生的ecc校驗(yàn)碼不一致,所以我們?cè)谶@里選擇禁止內(nèi)核ECC校驗(yàn),具體做法如下:
在drivers/mtd/nand/s3c2410.c文件中找到s3c2410_nand_init_chip()函數(shù),在函數(shù)體最后加上 chip->ecc.mode = NAND_ECC_NONE; 保存,退出。
以下為內(nèi)核配置部分
6. 支持啟動(dòng)時(shí)掛載devfs:
由于2.6內(nèi)核去掉了對(duì)devfs的支持,這里我們需要手動(dòng)將其加上,并在/sbin/init運(yùn)行之前能自動(dòng)掛上/dev為devfs文件系統(tǒng),修改fs/Kconfig文件:
找到menu "Pseudo filesystem",在其后添加如下語(yǔ)句:
config DEVFS_FS
bool "/dev file system support (OBSOLETE)"
default y
config DEVFS_MOUNT
bool "Automatically mount at boot"
default y
depend on DEVFS_FS
7. 配置內(nèi)核產(chǎn)生.config文件
# cp arch/arm/configs/s3c2410_defconfig ./.config
# make menuconfig
絕大部分選項(xiàng)都先采用默認(rèn)設(shè)置,待移植成功后我們?cè)龠M(jìn)一步裁減,這里只設(shè)置一項(xiàng):
Boot Options ---> Default kernel command string: noinitrd root=/dev/mtdblock4 console=ttySAC0,115200
注:因?yàn)槲业腇lash分了5個(gè)區(qū),標(biāo)識(shí)符分別為mtdblock0、mtdblock1... mtdblock4,第五個(gè)分區(qū)(也就是mtdblock4)是我們存放cramfs根文件系統(tǒng)的分區(qū),故設(shè)置 root=/dev/mtdblock4。
到此,內(nèi)核配置完成
第三部分 編譯測(cè)試
8. 編譯內(nèi)核
# make zImage
9.
載入內(nèi)核映像,試運(yùn)行: 可以先用tftp將zImage映像下載到RAM某個(gè)地址(通常是0x30008000),然后用vivi命令 go
0x30008000 0 193 跳到這個(gè)地址執(zhí)行(0和193是傳遞給內(nèi)核的參數(shù),用寄存器r0,
r1存放),之后如果在終端中打印出設(shè)備初始化信息,那恭喜你,你已經(jīng)成功一大半了!否則,回過(guò)頭去檢查是否有遺漏或錯(cuò)誤的地方。
第四部分 應(yīng)用程序的移植
包括busybox的移植、啟動(dòng)腳本的編寫(xiě)、cramfs映像的創(chuàng)建等,請(qǐng)參見(jiàn)《Linux系統(tǒng)移植》文檔的《應(yīng)用程序移植》章節(jié)
再寫(xiě)一遍關(guān)鍵詞: S3C2410 ARM 內(nèi)核移植 Linux 2.6.27
參考資料:
劉勇等. Linux系統(tǒng)移植. ---, --- http://www./bbs/data/uploads/linux_mig_release_G4oyxcsIVyIZ.pdf
所用設(shè)備:
陽(yáng)初S3C2410開(kāi)發(fā)板V2.3版 http://www./
(原創(chuàng)文章,轉(zhuǎn)載時(shí)請(qǐng)注明本文網(wǎng)址)