渠道:mini2440 穿插东西链:arm-linux-gcc-4.3.2
一、内核移植基本知识
移植内核也叫构建BSP(boardsupprot packet)。BSP的效果有两个:一是为内核运转供给底层支撑,二是屏蔽与板相关的细节。
BSP的构建分三个层次
1、体系结构层次
对一些体系结供给linux内核支撑,比如说ARM,X86等芯片。这一类作业一般在arc/xxx/下面额除了palt-xxx和mach-xxx目录的其他目录完结。
2、SOC层次
对一些公司供给的SOC微处理器供给linux内核支撑,比如说三星公司的 S3C2440。这一类作业一般在arch/xxx/plat-xxxxarch/xxx/mach-xxxx目录下完结。咱们可以看到在arch /arm/目录下同时有plat-s3c24xx和mach-s3c2440两个目录,这样做是因为plat-s3c24xx目录下存放了一切s3c24 系列相同的代码,mach-s3c2440则只存放了与S3C2440有关的代码。
2,板级层次
这是咱们一般的菜鸟要做的,上面两个层次一般有芯片公司的大牛完结了,可是不同的电路板的板级层次则需要由咱们菜鸟完结的。这一类作业主要在mach- xxxx/目录下面的板文件完结,比如说mach-s3c2440/smdk-s3c2440.c这个S3C2440标准板文件。许多文档许多书本都都直接在这个文件里边进行修正,这样是不对的,关于不同的电路板应该树立不同的板文件,比如说我的是mini2440,就应该树立一个smdk- mini2440.c文件或许mach-mini2440.c文件在mach-s3c2440下面。假如直接在里边修正是十分不标准的做法,这样不是在移植内核,这样是在损坏内核!(这一句是宋宝华说的)。
下面开端移植。
二、BSP构建
1.树立板文件支撑
这一步我会从头树立一个板文件mach-mini2440.c,而不是直接在smdk-s3c2440.c里边修正,这样或许费事一些,可是为了坚持对内核尊重的情绪和标准的做法,以为应该这样做。
假如咱们从头树立一个空的板文件将会导致很多的作业量,走运的是smdk-s3c2440.c文件现已帮咱们做了很多的作业,咱们直接仿制过来命名为mach-mini2440.c
cp arch/arm/mach-s3c2440/smdks3c2440.c arch/arm/mach-s3c2440/mach-mini2440.c
修正arch/arm/mach-s3c2440/mach-mini2440.c文件将MACHINE_START宏括号里边的姓名换成ID换成 MINI2440,姓名随意取,咱们取“MINI2440”,这个ID终究会被扩展为MACH_TYPE_MINI2440,然后到arch/arm /tools/mach_types里边找对应的ID号,一切做完以这一步咱们要在mach_types增加咱们机器的ID
MACHINE_START(MINI2440,”MINI2440″)
.phys_io = S3C2410_PA_UART,
.io_pg_offst = (((u32)S3C24XX_VA_UART) >> 18)& 0xfffc,
.boot_params = S3C2410_SDRAM_PA + 0x100,
.init_irq = s3c24xx_init_irq,
.map_io = smdk2440_map_io,
.init_machine = smdk2440_machine_init,
.timer = &s3c24xx_timer,
MACHINE_END
然后在mach_types里边增加咱们机器的ID,再最终一行增加
mini2440 MACH_MINI2440 MINI2440 1999
第一个表明机器姓名,这个也随意取,第二个在Kconfig装备项里边界说的宏称号,下面一步咱们会界说到,咱们取名为MACH_MINI2440,第三表明MACH_START第一个参数ID姓名,第四个是ID号。ID号咱们取为1999。
修正arch/arm/mach-s3c2440/目录下的Kconfig和Makefile,以树立内核对板文件的支撑使其可以被装备和编译进内核。
首要修正Kconfig,在endmenu之前参加下面的内容:
87 config MACH_MINI2440 // 开发板称号宏界说
88 bool “mini2440” // 开发板称号
89 select CPU_S3C2440 // 开发板运用的处理器类型
90 help
91 Say Y here if you are using the mini2440. // 协助信息
再修正Makefile:
obj-$(CONFIG_MACH_MINI2440)+= mach-mini2440.o
留意这一行要增加在obj-$(CONFIG_ARCH_S3C2440)+= smdk-s3c2440.o后边,不然会编译过错。
这样咱们就可以经过makemenuconfig装备mini2440的板文件是否编译进内核。
咱们再跳到linux-2.6.22目录,履行makemenuconfig
履行加载默许装备文件后,可以开端装备新增加的菜单。进入System Types菜单项,翻开S3C24XX Implementations菜单,呈现一个方针开发板的列表:
[ ] Simtec ElectronicsBAST (EB2410ITX)
[ ] IPAQ H1940
[ ] Acer N30
[ ] SMDK2410/A9M2410
[ ] SMDK2440
[ ] AESOP2440
[ ] Thorcom VR1000
[ ] HP iPAQ rx3715
[ ] NexVision OTOM Board
[ ] NexVision NEXCODER2440 Light Board
[ ] mini2440
选中mini2440选项
然后履行makezImage,假如可以正常编译,现已可以将mini2440板文件编译进内核了。假如不可,请查看上述过程。
2.修正机器码
将编译在arch/arm/boot下面生成的zImage烧写到nand的kernel分区,然后发动。
Copylinux kernel from 0x00060000 to 0x30008000, size = 0x00500000 … done
zImage magic = 0x016f2818
Setup linux parameters at 0x30000100
linux command line is: “console=ttySAC0 root=/dev/nfsnfsroot=192.168.1.101:/home/work/shiyan/rootfsip=192.168.1.102:192.168.1.101:192.168.1.1:255.255.255.0:mini2440:eth0:off”
MACH_TYPE = 362
NOW, Booting Linux……
UncompressingLinux…………………………………………………………………………………….done, booting the kernel.
Error: unrecognized/unsupported machine ID (r1 = 0x0000016a).
内核提示不能辨认的机器ID,所以修正bootloader的参数使其机器ID为1999,我用的是supervivi运用指令:
set parammach_type 1999
3.修正时钟源频率
发动内核,呈现一系列的乱码,这是因为时钟源设置的不对,我的开发板用的是12M的晶振,所以在arch/arm/mach-s3c2440.c的 s3c24xx_init_clocks(16934400);处将16924400修正为12000000。即改为 s3c24xx_init_clocks(12000000);
4.增加nand分区信息
再发动,发现仍是不能发动,这是因为内核中填写的nand分区信息不对。所以修正nand分区信息,许多人的做法是直接修正arch/arm /plat-s3c24xx/Common-smdk.c文件里边的smdk_default_nand_part数据结构,这样是不发起的做法,因为仍是那句话,损坏了内核。咱们应该再arch/arm/mach-s3c2440/mach-mini2440.c文件中树立咱们自己板文件的nand信息。咱们在mach-mini2440.c的staticstruct platform_device *smdk2440_devices[]前面增加
static struct mtd_partition smdk_default_nand_part[] = {
//这儿边填的是我用的mini2440分区信息//
[0] = {
.name = “patition1 supervivi”,
.size = 0x00040000,
.offset = 0,
},
[1] = {
.name = “patition2 param”,
.offset =0x00040000,
.size = 0x00020000,
},
[2] = {
.name = “patition3 kernel”,
.offset =0x00060000,
.size = 0x00500000,
},
[3] = {
.name = “patition4 root”,
.offset = 0x00560000,
.size = 64*1024*1024,
},
[4] = {
.name = “patition5 nand”,
.offset = 0,
.size = 64*1024*1024,
},
};
static struct s3c2410_nand_set smdk_nand_sets[] = {
[0] = {
.name = “NAND”,
.nr_chips = 1,
.nr_partitions = ARRAY_SIZE(smdk_default_nand_part),
.partitions = smdk_default_nand_part,
},
};
再修正mach-mini2440.c的smdk2440_machine_init函数,将咱们的nand传给给nand设备
static void __init smdk2440_machine_init(void)
{
s3c24xx_fb_set_platdata(&smdk2440_lcd_cfg);
//将咱们的nand信息传给nand设备//
s3c_device_nand.dev.platform_data= &smdk_nand_info; //set nand infoto nand
platform_add_devices(smdk2440_devices,ARRAY_SIZE(smdk2440_devices));
//smdk_machine_init();
//smdk_machine_init()函数屏蔽,因为他会将arch/arm/plat-s3c24xx/Common-smdk.c里边的分区信息传给nand,这样咱们的自己的nand信息就被覆盖了
s3c2410_pm_init();//增加加这个函数是因为smdk_machine_init()里边调用了。
}
再修正mach-mini2440.c的smdk2440_devices
static struct platform_device *smdk2440_devices[] __initdata = {
&s3c_device_usb,
&s3c_device_lcd,
&s3c_device_nand,//向内核增加nand设备
&s3c_device_wdt,
&s3c_device_i2c,
&s3c_device_iis,
};
6.增加YAFFS文件体系支撑
完结上述过程作业后,仍是不能正常挂载根文件体系,因为内核还没对yaffs文件体系进行支撑。
下载cvs-root-yaffs.tar.gz补丁包文件,解压,运转yaffs2文件夹里边的脚本文件patch-ker.sh来给内核打补丁,用法如下
Usage: ./patch-ker.sh c/l kernelpath
if c/l is c,then copy, if l then link
假如是l则yaffs2源码被链接到内核,假如是c则仿制
咱们运转./patch-ker.sh c work/kernel_make/linux2.6.22
给内核打上yaffs2补丁,然后运用makemenuconfig装备内核使其支撑yaffs2文件体系
File systems —>
Miscellaneous filesystems —>
<*>YAFFS2 file system support
7.装备内核支撑EABI接口
完结上面的过程之后运转,内核会在输出
VFS: Mounted root (yaffs filesystem) on device 31:2.
Freeing init memory: 132K
之后卡住,这个打印反应出内核实际上现已挂接上了根文件体系,之所以卡在这儿是因为无法发动根文件体系上的init进程。是因为内核和根文件体系的应用程序的接口不一致。所以在内核中运用make menuconfig装备EABI支撑
Kernel Features —>
Memory split…—>
[ ]preemptible Kernel…
[*]Use the ARM EABI to compile thekernel
[*] Allow old ABI binaries to run……
Memory model(flatMemory)—>
[ ]Add lru list to tarcknon-evictable pages
声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/ceping/baogao/263433.html