【原创】嵌入式LINUX内核移植(mini2440)----09.02

2019-07-13 00:15发布

     首先要申明下的,虽说原创,但是整个过程都是辛苦的查阅网络资料一点一点的完成。同时掺杂自己的心得。所以还是希望有些用处,同时也是自己整理一下思路,加深下记忆。 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: +++
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"