转在s3c2410板上移植2.6kernel_mmeelv
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
转在s3c2410板上移植2.6kernel_mmeelv
最近这几天的晚上我在移植2.6的kernel。
因为水平很菜,所以不太顺利。
我用的是kernel是2.6.14.2, 这个内核直接支持S3C2410的板子,不必打任何补丁。
从下载了内核。
然后找来了3.4.1的GCC交叉编译器(经典的2.95.3编译2.6内核会出错)。
解开内核开始修改。
(该部分转贴自:/blog/1391393.html 感谢superlp)
1. 增加nand分区信息
打开arch/arm/mach-s3c2410/devs.c
增加头文件
#include <linux/mtd/partitions.h>
#include <asm/arch/nand.h>
#include <linux/mtd/nand.h>
增加分区数据
/*****************************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*****
}
};
(分区部分根据实际情况修改)
2. 打开arch/arm/mach-s3c2410/mach-smdk2410.c
把"&s3c_device_nand"添加到__initdata
3. 打开drivers/mtd/nand/s3c2410.c
把chip->eccmode = NAND_ECC_SOFT;改成chip->eccmode = NAND_ECC_NONE;
4. 修改Makefile, 把设定SUBARCH := arm CROSS_COMPILE ?= arm-linux-(事先得安装交叉
编译器)
接着开始make menuconfig,并且载入arch/arm/configs/def_s3c2410config,保存后就make,如果编译器没有问题得话,应该一次就能编译成功。
接下来编译bootload, 我用vivi, 从下载vivi的源代码包,解开后make menuconfig, 载入arch/def-configs/smdk2410, 保存退出后修改arch/s3c2410/smdk.c,修改里面的分区信息和启动参数。
分区信息根据实际情况设置,启动参数设置成“noinitrd root=/dev/mtdblock3 init=/linuxrc console=ttySAC0,115200 mac=00:0e:3a:aa:bb:cc”. 保存退出后make, 得到vivi的BIN.
把vivi和kernel的BIN文件烧录到FLASH后给板子上电,发现一个问题,vivi并没有使用我设置好的分区信息和启动参数,而是使用一个默认的值,要使用命令param reset和part reset才可以重置我设置的值。
vivi默认的kernel分区大小是1M,而我的kernel的BIN
文件有1.2M,开始尝试了好多次都失败。
重置了参数以后kernel可以执行起来,但是找不到根文件系统,那是当然的,因为我还没有烧录文件系统。
一.准备必要的文件
我们首先去官方网站下载最新的 llinux 内核
pub/linux/kernel/v2.6/linux-2.6.14.tar.bz2
因为 linux2.6.14 内核需要更新版本的编译器,所以我们需要下载交叉编译器
ftp:///projects/toolchain/arm-linux-gcc-3.4.1.tar.bz2
注:这个编译器已经包含在光盘的 \DISK4\linux 相关 \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
把arm-linux-gcc的路径/usr/local/arm/3.4.1/bin添加到PATH 中)
接下来需要解压 linux 内核,输入命令:
[root · localhost hfrk]# tar jxvf linux-2.6.14.tar.bz2
内核被解压到 linux-2.6.14 目录下。
三.修改 makefile 文件
内核的编译是根据 makefile 文件的指示进行的, Makefile 文件来组织内核的各模块之间的关系,记录了各个模块之间的相互联系和依赖关系。
我们首先修改linux-2.6.14 的根目录下的makfile 文件,我们须
改的主要内容是目标代码的类型和为编译内核指定一个编译器。
我们注释掉以下内容:
#ARCH ?= $(SUBARCH)
#CROSS_COMPILE ?=
增加如下内容:
ARCH : = arm
CROSS_COMPILE =/usr/local/arm/3.4.1/bin/arm-linux- 四.修改相关的文件。
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 分区信息
/***********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*/
};
五.我们做完以上修改以后,内核编译以后就可以在hfrk2410 开发板上运行了。
打开终端窗口,切换到 linux-2.6.14 目录下,输入命令:
# make smdk2410_defconfig
#make menuconfig /*选择nand flash模块*/
# make
等编译完成以后,会生成镜像文件 arch/arm/boot/zImage ,把这个文件下载到开发板上,就会看到linux2.6 的内核启动信息,我们迈出了 linux2.6 内核移植的第一步!
如果出现field `list‘ has incomplete type
那是因为partitions.h中没有定义head_list,在partitions.h的头加上#include <linux/list.h>
就ok了,哈哈
Trackback:
/TrackBack.aspx?PostId=1529788
在华恒2410平台上移植2.6内核
allbone 发表于 2006-4-7 16:57:00 第一次做linux的移植,走了很多弯路,也学到很多知识,仅把过程
记录下来,以备日后之用。
手里这块板是华恒的一个学习平台,配置比较低:
s3c2410, 8M Nor Flash(Intel 28F640), 16M SDRAM
配套安装的是2.4的内核,根文件系统安装在ramdisk上。
我的想
法很简单,就是将2.6的内核跑起来,挂上原来的文件系统。
就是说
只要系统启动到shell提示符,我的目的就达到了,至于周边设备的
驱动移植则不在此行计划内。
很自然的,整个过程大致分为两个阶段。
一、内核移植
由于2.6内核已经正式支持2410这款cpu以及smdk2410这块公板,
只要配置得当,在不修改一行内核代码的情况下,内核就可以运行起来。
所以我觉得这里再提移植就不恰当了,而仅仅是个配置、交叉编译内
核的过程。
make ARCH=arm CROSS_COMPILE=arm-linux- smdk2410_defconfig
make ARCH=arm CROSS_COMPILE=arm-linux- zImage
为了接下来方便,可以直接在top level的Makefile中设置ARCH 和CROSS_COMPILE变量。
在2.6内核中,console的名称发生了变化,
需要在bootloader或者内核的配置中修改启动参数,例如
2.4中启动参数为…… console=ttyS0,115200,
在2.6中则应改为…… console=ttySAC0,115200
现在用新内核启动,可以在串口接收到启动信息,但由于还没有
安装根文件系统,所以中途会panic,这是我们在下一阶段需要解决
的问题,而第一阶段工作结束。
非常简单的过程,我却没那么幸运。
开始用的是最新的2.6.16的
kernel,经过上述配置,启动后收不到任何消息。
折腾无数次后,抱
着有病乱投医的想法,尝试了一下2.6.14,竟然顺利启动。
翻了一遍
2.6.16的changelog,也没发现个所以然,等待高手解惑……
二、安装根文件系统
首先对flash进行分区。
网上的经典文章《Linux 2.6.10 以后版
本对S3C2410的支持》仅提到了对Nand flash分区的方法,对Nor
flash不适用。
对Nor flash的分区,是通过在
linux/drivers/mtd/maps下增加特定mapping驱动程序来实现。
该目
录下的驱动程序结构相似,可以找一个来修改成自己的。
我用的
是
cfi_flagadm.c这个。
cp cfi_flagadm.c s3c2410.c
将FLASH_PHYS_ADDR和FLASH_SIZE这两个宏分别修改成自己板子
的flash起始地址和大小。
然后修改结构体数组flagadm_parts添加自
己的分区信息。
接下来告诉内核使用该驱动程序。
修改maps目录下的Kconfig 文
件,该文件决定出现在menuconfig中的项目,在config
MTD_CDB89712之后添加
config MTD_S3C2410
tristate "HuaHeng 2410 board"
修改该目录下的Makefile,添加如下内容:
obj-$(CONFIG_MTD_S3C2410) += s3c2410.o
现在make menuconfig时,在MTD项目中将出现HuaHneng 2410
board选项,选中它并重新编译内核就完成了分区工作,启动时将看
到分区信息。
现在,内核可以检测到分区,并找到了压缩的RAMDISK,并试图
解压缩。
如果你使用smdk2410的默认配置,这时会报错,类似
RAMDISK:incomplete 云云。
解决办法很简单,将内核配置中的
BLK_DEV_RAM_SIZE的值从默认的4096改为8192即可。
原2.4内核中对设备文件的管理是通过devfs完成的,所有设备文件均在启动后检测到设备时动态建立,所以我的RAMDISK中/dev目录
是空的。
而2.6内核从某个版本号后移除了devfs,取而代之的是udev。
我一没有启用udev,二没有手动建立任何设备文件,所以内核警告无
法初始化控制台。
手工添加设备文件即可:
mknod /dev/console c 5 1
为了避免再出现类似错误,我用原2.4内核启动,把devfs建立好的设备文件全部拷了出来,添加到RAMDISK当中。
到此为止内核已经启动到VFS:freeing xxxK memory。
但出现一
行reboot(magic=000000)的信息,就没有下文了。
搜了一下,发现在
配置内核时必须选中Floating Point Emulator,否则就会导致这个
错误。
再次重新编译内核,重启,终于出现了期待已久的#提示符。
写的比较乱,大家去粗取精的看吧 :) 主要参考资料为Linux
Forum嵌入式版对2.6内核移植的专题讨论帖。
移植2.6.17.13到s3c2410
前一阵子移植了u-boot1.1.4之后,移植2.6.17.13走了一些弯路,采用了别人移植的2.6.14或2.6.11等方法都不成功,后来发现2.6.17比前几个版本的内核更容易。
从下载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内核的时候发现必须用gcc3.0以上的编译器,没办法只好下载了个arm-linux-gcc3.4.4 +glibc2.3.5,怕由于编译器不一致引起问题,重新编译了一次u-boot,没遇到任何错误。
2、修改内核顶层目录的Makefile,找到ARCH和CROSS_COMPILE的地方,修改为
ARCH ?= arm
CROSS_COMPILE ?= arm-linux-
保存。
3、修改arch/arm/mach-s3c2410/common-smdk.c
设置Nand Flash的分区和信息,下面是我的分区结构:
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,
},如果您是在公共场合使用计算机,离开时
[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,
};
说明:这里2.6.17的设置分区与其他版本如2.6.14或2.6.11有点区别,其他版本是修改
arch/arm/machs3c2410/devs.c
和
arch/arm/machs3c2410/machsmdk2410.
2.6.17.13设置这些文件无效。
4、禁止Flash ECC校验
内核都是通过u-boot写数据到Nand Flash的, u-boot通过的软
件ECC算法产生ECC校验码, 这与内核校验的ECC码不一样, 内核中的ECC码是由S3C2410中Nand Flash控制器产生的. 所以, 我们在这里选择禁止内核ECC校验。
修改drivers/mtd/nand/s3c2410.c 文件,找到s3c2410_nand_init_chip()函数,在该函数体最后加上一条语句: chip->eccmode = NAND_ECC_NONE;
保存,退出。
5、支持启动时挂载devfs
为了我们的内核支持devfs以及在启动时并在/sbin/init运行之前能自动挂载/dev为devfs文件系统,修改fs/Kconfig文件,找到menu "Pseudo filesystems"
添加如下语句:
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配置内核
#cp arch/arm/configs/smdk2410_defconfig .config
#make menuconfig
在smdk2410_defconfig的基础上,增加了下面选项:
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
#说明:mtdblock2代表第3个flash分区,用来作根文件系统rootfs;
# console=ttySAC0,115200使kernel启动期间的信息全部输出到串口0上,波特率为115200;
# 2.6内核对于串口的命名改为ttySAC0,但这不影响用户空间的串口编程。
# 用户空间的串口编程针对的仍是/dev/ttyS0等
# mem=32M表示内存是32M,如果是64则设为64M
Floating point emulation -->
[*] NWFPE math emulation
#This is necessary to run most binaries
#接下来要做的是对内核MTD子系统的设置
Device Drivers -->
Memory Technology Devices (MTD) -->
[*] MTD partitioning support
#支持MTD分区,这样我们在前面设置的分区才有意义
[*] Command line partition table parsing
#支持从命令行设置flash分区信息,灵活
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
#接下来做的是针对文件系统的设置,本人实验时目标板上要上的文件系统是cramfs,故做如下配置
File systems -->
<> Second extended fs support #去除对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)
#这里会看到我们前先修改fs/Kconfig的成果,devfs已经被支持上了
Miscellaneous filesystems >
<*> Compressed ROM file system support (cramfs)
#支持cramfs
Network File Systems >
<*> NFS file system support
保存退出,产生.config文件。
7、编译内核,下载到板子上
#make zImage
生成zImage在arch/arm/boot/目录下
zImage下载到板子上之后可以直接用go来执行,但是go启动内核的话会出现下面错误:
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.
产生的原因是go启动内核的话,u-boot不会传machiine ID给内核,因为go只是执行普通的应用程序,不考虑到传递参数给内核的问题,没有必要在乎它。
如果只是想看看go能不能启动内核的话,修改方法有两个:
a、修改u-boot的common/cmd_boot.c的do_go()函数:
/*#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、修改内核的arch/arm/kernel/head.S,直接将s3c2410的参数赋给内核
__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启动内核
这个方法u-boot可以将machine ID传给内核,正常启动,不过
用u-boot的mkimage工具(在u-boot1.1.4/tools/目录下)将前面生成的zImage加上一个信息头(有关如何添加头的命令和使用tftp 在后面讲述),之后下载到板子上,启动控制台信息如下: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)
这里因为我没有添加任何应用程序和文件系统,所以出错,不影响内核已经成功移植。
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 -------- 架构是arm
-O linux -------- 操作系统是linux
-T kernel -------- 类型是kernel
-C none -------- 压缩类型为无压缩
-a 30008000 ---- image的载入地址(hex)
-e 30008040 ---- 内核的入口地址(hex),因为信息头的大小是0x40
-n linux-2.6.17.13 --- image的名字
-d zImage ---- 无头信息的image文件名
uImage2.6.17.13 ---- 加了头信息之后的image文件名
10、使用tftp下载内核
a、安装atftpd
我现在用的linux是ubuntu6.06,安装了atftpd,没安装的话使用
#sudo apt-get install atftpd
安装。
b、接着建立/tftp目录,并设置所有人都有读写运行权限:
#sudo mkdir /tftp
#sudo chmod 777 tftp
c、启动tftp服务:
#sudo atftpd --daemon --user xzs --group root /tftp
d、将zImage和uImage2.6.17.13复制到/tftp目录下
e、启动minicom,复位板子,在minicom下输入
tftp 30008000 uImage2.6.17.13
如果已经板子和PC机已经通过网线连接,IP也正确,则会出现一下信息:
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板子上的移植
-------------------作者:无猫
++++++++++++++++++++++++++++++++++++++ ++++++++
----------------------------------------------
bootloader编译环境:
vivi版本:0.1.4
交叉编译器(CROSS-COMPILE)版本:2.95.3
(下载地址略:网上很多搜下。
)
操作系统:Fedora 7
====================================== linux内核编译环境:
内核版本:linux2.6.22.1
交叉编译器(CROSS-COMPILE)版本: 4.2.0
(下载地址:
)
注意:下载选项,要选 ARM EABI 的选项,和 IA32 GNU/linux 操作系统: Fedora 7
====================================== 文件系统编译环境:
busybox1.5.1,或1.4.2
交叉编译器(CROSS-COMPILE)版本: 3.3.2
(下载地址:)
操作系统: Fedora 7
----------------------------------------------
硬件:
板子是北京恒颐高科技术有限公司的H2410EB
内存: 64MB SDRAM(2×16M×16位);
CPU: S3C2410 ARM处理器,
Nor Flash:2MB的Nor Flash,用于固化测试程序(用来下载bootloader,内核,或文件系统);
NANDflash: 64MB的Nand Flash,用于存储Bootloader、Linux内核及文件系统、应用程序和数据;
++++++++++++++++++++++++++++++++++++++ ++++++++
====================================== ========================================= ===================
一:编译环境搭建
====================================== ========================================= ===================
一:搭建交叉编译环境
说明:由于编译交叉编译环境比较繁琐,建议大家用已经编译好的交叉编译环境。
下面以3.3.2的交叉编译环境的搭建为例,其他的两个的编译器环境搭建一样。
1. 解压文件命令:
tar jxvf obsolete-gcc-3.3.2.tar.bz2
(obsolete-gcc-3.3.2.tar.bz2下载地址:)
2. 把解压的文件夹中的“
3.3.2”文件夹拷贝到 /usr/local/arm目录下
(如果没有arm目录就新建arm目录,但是一定要是拷贝到这个目录,不然不能运行)。
3. 在命令窗口输入
export PATH=/usr/local/arm/3.3.2/bin:$PATH
4. 如果输入arm-然后按下tab键能自动补全命令arm-linux -说明搭建成功。
======================================
========================================= ====================
二: bootloader 编译
======================================
========================================= ====================
二: bootloader的修改
主要修改分区信息,如果要能下载yaffs文件系统还得另外打补丁,最近我会写编这样的文章。
具体修改:
1. 解压vivi(具体命令略,如果你解压都不会,移植可能对你来说有点困难)
[root@localhost vivi]# ls
arch CVS drivers init Makefile Rules.make te st vivi vivi.map
COPYING Documentation include lib Makefile.newSDK s crīpts util vivi-elf
2. [root@localhost vivi]# vim ./arch/s3c2410/smdk.c
修改 NAND flash 分区如下:
----------------------------------------------------------------------
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
------------------------------------------------------------------------
会在 vivi目录生成你要的 vivi 程序(bootloader)
------------------------------------------------------------------------
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 说明:我的nand falsh的一块为16k,
所以上面的分区:
**************************************
分区信息
**************************************
bootloader: 128k
param : 896k
kernel : 3M
root : 20M
user : 40M
**************************************
bon 操作
**************************************
bon part 0 1M 4M:m 24M:m
解释一下上面的命令:
第1个分区从0开始;
第2个分区从0x30000(即192K)开始;
第3个分区从0x200000(即2M)开始;
第4个分区从0x400000(即4M)开始.
***********************************
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
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^
====================================== ========================================= ====================
三:内核编译
====================================== ========================================= ====================
三:内核编译
注意:用的编译器是4.2.0的交叉编译器
1. 修改 Makefile
[root@localhost porting]# cd linux-2.6.22
[***********************.22]#vimMakefile
修改 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、打开drivers/mtd/nand/s3c2410.c
2、搜索关键字NAND_ECC_SOFT,在s3c2410_nand_init_chip 函数里
3、修改NAND_ECC_SOFT为NAND_ECC_NONE
---------------------------------------------------------------------------------
4. 支持启动时挂载devfs
为了我们的内核支持devfs以及在启动时并在/sbin/init运行之前能自动挂载/dev为devfs文件系统。
[***********************.22]#vifs/Kconfig
-----------------------------------------------------------------------------------
找到menu "Pseudo filesystems"
添加如下语句:
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. 编译内核
[root@localhost linux-2.6.22]# cp ./arch/arm/configs/s3c2410_defconfig .config
[***********************.21.5]#makexconfig
----------------------------------------------------------------------------------
Userspace binary formats
[ ]Kernel support for a.out and ECOFF binaries (BINFMT_AOUT) (去除该选项)
Boot options
Default kernel command string
改成:
noinitrd root=/dev/mtdblock3 console=ttySAC0,115200 init=/linuxrc。