首先要申明下的,虽说原创,但是整个过程都是辛苦的查阅网络资料一点一点的完成。同时掺杂自己的心得。所以还是希望有些用处,同时也是自己整理一下思路,加深下记忆。
MINI2440的开发板买了很久了。年末的一段时间感觉都点堕落了,春节嘛。然后工作中又掺杂好多事情。毕竟我的工作不是做这些。这些都是自己的兴趣一直鼓动着我让我前进。我的工作是开发遥控器程序,由于在这里已经有快3年了。单片机的开发可以说还是比较简单的。所以个人一直都觉得应该向ARM发展
拿了板子很早就把资料看了遍。板子的开发资料还是很全的。有需要的我可以共享下。
好了,切入正题。
准备:
linux的内核一直在不断更新,目前我知道的是2.6.26.
GCC我之前的是3.4.1,然后我也升级到了4.1.1 这里是交叉编译用的。
开发板为S3C2440的MINI2440,友善之臂的产品。
虚拟环境为VMware
1.
好了,准备好了这些就可以开始了
解压好2.6.26 其实任意地方都行 这里无所谓,
然后立马接着打开这里的makefile文件 必须修改编译器
#ARCH ?= $(SUBARCH)
#CROSS_COMPILE ?=
修改为
ARCH ?= arm
CROSS_COMPILE ?= /usr/local/4.1.1/bin/arm-xscale-linux-gnu-
路径是你自己的GCC的路径。
2.
这样就可以用自己的GCC生成一个默认配置文件
# make s3c2410_defconfig
3.
增加yaffs2系统支持和devfs文件系统支持
yaffs2的加入则必须从以前的内核里拷出/fs/yaffs2文件夹放入新的内核的同样位置
然后修改/fs/Kconfig文件
menu "Miscellaneous filesystems" 后面添加
# Patched by YAFFS
source "fs/yaffs2/Kconfig" 整合yaffs系统
menu "Pseudo filesystems" 后面加入原内核所有的DEVFS的3项,具体我就不贴了,旧内核文件应该都有的。
4.
可以修改晶振了,否则编译后串口显示会有乱码
arch/arm/mach-s3c2440/mach-smdk2440.c 文件中的 s3c24xx_init_clocks(16934400);
修改为12M
5.
然后就要分区了。
我的分区是3个这点也是完全摘自旧内核分区,其实也是为了避免错误的产生
当然新的内核的分区文件发生了改变 现在生效的是arch/arm/plat-s3c24xx/common-smdk.c
打开此文件 找到
static struct mtd_partition smdk_default_nand_part[]
全部替代掉。
static struct mtd_partition smdk_default_nand_part[] = {
[0] = {
.name = "vivi",
.size = 0x00020000,
.offset = 0X00000000,
},
[1] = {
.name = "kernel",
.offset = 0x00050000,
.size = 0x00200000,
},
[2] = {
.name = "root",
.offset =0x00250000,
.size =0x03dac000,
}
};
显然这样就只有3个分区内核启动后是可以看得到的 。
6.
修改cpu ID,不修改将会出现无法进入内核由于CPU mach_type 不对应找不到对应的CPU。
arch/arm/tools/mach-types 这个文件打开修改对应CPU 的ID
比如我修改 S3C2410 对应为 782(我的VIVI的ID)。这样就可以找到S3C2410了
当然有人说直接修改VIVI ,我要说VIVI 没有源码(SUPERVIVI,友善的)。软件式的修改每次重新烧写到NANDflash都得再来一次修改 麻烦
7.
基本差不多了 ,还有一个校验的问题
drivers/mtd/nand/s3c2410.c
NAND_ECC_SOFT;----》NAND_ECC_NONE;
8.
修改完成,可以进行内核配置了。
MAKE menuconfig
如果仅仅是测试移植的话 很多时候很多东西可以不用管
Boot options 要改 root=/dev/mtdblock2 rootfstype=cramfs init=/linuxrc console=ttySAC1,115200 devfs=mount mem=64
System Type 要选上 2410
yaffs 文件系统添加上 虽然我们启动方式中文件系统是cramfs 但是用yaffs时可以用到
devfs 文件系统也得加上
9.
配置都完成了 保存退出 编译内核了 不出意外 2分钟完成
可以烧入 VIVI zImage filesystem 测试你的内核了
+---------------------------------------------+
| S3C2440A USB Downloader ver R0.03 2004 Jan |
+---------------------------------------------+
USB: IN_ENDPOINT:1 OUT_ENDPOINT:3
FORMAT: <ADDR(DATA):4>+<SIZE(n+10):4>+<DATA:n>+<CS:2>
NOTE: Power off/on or press the reset button for 1 sec
in order to get a valid USB device address.
NAND device: Manufacture ID: 0xec, Chip ID: 0x76 (Samsung K9D1208V0M)
Could not found stored vivi parameters. Use default vivi parameters.
Press Return to start the LINUX/Wince now, any other key for vivi
Copy linux kernel from 0x00050000 to 0x30008000, size = 0x00200000 ... done
zImage magic = 0x016f2818
Setup linux parameters at 0x30000100
linux command line is: "noinitrd root=/dev/mtdblock2 init=/linuxrc console=ttySA
C0"
MACH_TYPE = 782
NOW, Booting Linux......
Uncompressing Linux.............................................................
......................................... done, booting the kernel.
Linux version 2.6.26 (root@lynn-desktop) (gcc version 4.1.1) #6 Tue Jan 13 16:58
:30 CST 2009
CPU: ARM920T [41129200] revision 0 (ARMv4T), cr=c0007177
Machine: SMDK2410
ATAG_INITRD is deprecated; please update your bootloader.
Memory policy: ECC disabled, Data cache writeback
CPU S3C2440A (id 0x32440001)
S3C244X: core 405.000 MHz, memory 101.250 MHz, peripheral 50.625 MHz
S3C24XX Clocks, (c) 2004 Simtec Electronics
CLOCK: Slow mode (1.500 MHz), fast, MPLL on, UPLL on
Creating 3 MTD partitions on "NAND 64MiB 3,3V 8-bit":
0x00000000-0x00020000 : "vivi"
0x00050000-0x00250000 : "kernel"
0x00250000-0x03ffc000 : "root"