Linux内核移植

来源:互联网 发布:数据库置疑 编辑:程序博客网 时间:2024/05/16 11:38
xz -d linux-3.14.12.tar.xz
tar -xf linux-3.14.12.tar


1、修改MAkefile,将
ARCH            ?= $(SUBARCH)
CROSS_COMPILE   ?= $(CONFIG_CROSS_COMPILE:"%"=%)
改为
ARCH            ?= arm
CROSS_COMPILE   ?= arm-linux-

在arch/arm/configs里寻找相似配置文件,发现有s3c2410_defconfig比较接近。
执行make s3c2410_defconfig,然后make uImage ,
将生成的uImage用nfs烧写到开发板的SDRAM,命令如:nfs 32000000 192.168.1.112:/wfprj/nfs_root/uImage,
烧进内存后执行bootm 32000000 启动内核,
发现内核启动时乱码。可能是因为机器id没有匹配。
注:如果是第一次编译内核,那么还得需要一个工具mkimage,在u-boot生成的文件下的目录里,
将其拷贝到/usr/local/bin下。例如:
sudo cp  ../u-boot-2014.01/tools/mkimage /usr/local/bin/




2、打开u-boot,寻找bootm的启动过程,搜索"bootm",
在arch/arm/lib/bootm.c里发现函数do_bootm_linux。
do_bootm_linux
boot_jump_linux
unsigned long machid = gd->bd->bi_arch_number;
搜索bi_arch_number
在smdk2440.c里发现
gd->bd->bi_arch_number = MACH_TYPE_SMDK2410;
因为我们用的是2440,而这里用的是2410所以需要修改
试着改为MACH_TYPE_SMDK2440,发现没有这个定义,进入该宏,在其页面下搜索2440发现有 MACH_TYPE_S3C2440,
将MACH_TYPE_SMDK2410改为MACH_TYPE_S3C2440
执行编译运行,乱码
在内核里搜索SMDK2440
找到
MACHINE_START(S3C2440, "SMDK2440")
smdk2440_map_io
s3c24xx_init_clocks(16934400);
发现这里设置是时钟与我们的12M不一样,将其改为12000000
编译运行,可以

3、根据内核打印的分区信息,在内核源码里搜索“"Boot Agent"”,发现在文件arch/arm/mach-s3c24xx/common-smdk.c里,
修改数组smdk_default_nand_part的内容。将其改为u-boot设置的分区表:
[0] = {
.name = "bootloader",
.size = SZ_512K,
.offset = 0,
},
[1] = {
.name = "params",
.offset = MTDPART_OFS_APPEND,
.size = SZ_128K,
},
[2] = {
.name = "kernel",
.offset = MTDPART_OFS_APPEND,
.size = SZ_4M,
},
[3] = {
.name = "rootfs",
.offset = MTDPART_OFS_APPEND,
.size = MTDPART_SIZ_FULL,
},

编译启动内核,能正确打印分区
0x000000000000-0x000000080000 : "bootloader"
0x000000080000-0x0000000a0000 : "params"
0x0000000a0000-0x0000004a0000 : "kernel"
0x0000004a0000-0x000010000000 : "rootfs"


由打印出来的分区表可以确定u-boot里的地址
#define CONFIG_BOOTCOMMAND "nand read 30000000 0xffff 0x400000; bootm 30000000"
0xffff 为 0xa0000
所以将其改为
#define CONFIG_BOOTCOMMAND "nand read 30000000 0xa0000 0x400000; bootm 30000000"




内核启动,但无法挂接文件系统,重新配置内核,设置其eabi接口。
 在-> Kernel Features


4、移植yaffs2文件系统
内核本身不支持yaffs文件系统,下载yaffs2文件系统源码,
解压:tar -xjf yaffs2.tar.bz2
打补丁:./patch-ker.sh  c m linux-tree   比如 ./patch-ker.sh  c m /wfprj/systemfile/linux-3.4.2
重新配置内核,设置其eabi接口。在内核顶层目录执行make menuconfig
 在-> Kernel Features
配置内核支持YAFFS,然后编译内核,出错,。
  排错
提醒一个错误,
有一个错误为
root = d_alloc_root(inode);
改为
root = d_make_root(inode);
即可,其他的只要加上下划线就可以了。

   编译通过后,重新make menuconfig 配置内核支持yaffs2文件系统,编译内核。
   
5、smdk2410没有支持dm9000网卡,参考mini的代码,加上dm9000的支持即可。
在mach-smdk2440.c里添加
#include <linux/dm9000.h>
/* DM9000AEP 10/100 ethernet controller */

static struct resource smdk2440_dm9k_resource[] = {
[0] = {
.start = MACH_SMDK2440_DM9K_BASE,
.end   = MACH_SMDK2440_DM9K_BASE + 3,
.flags = IORESOURCE_MEM
},
[1] = {
.start = MACH_SMDK2440_DM9K_BASE + 4,
.end   = MACH_SMDK2440_DM9K_BASE + 7,
.flags = IORESOURCE_MEM
},
[2] = {
.start = IRQ_EINT7,
.end   = IRQ_EINT7,
.flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHEDGE,
}
};


/*
* The DM9000 has no eeprom, and it's MAC address is set by
* the bootloader before starting the kernel.
*/
static struct dm9000_plat_data smdk2440_dm9k_pdata = {
.flags = (DM9000_PLATF_16BITONLY | DM9000_PLATF_NO_EEPROM),
};

static struct platform_device smdk2440_device_eth = {
.name = "dm9000",
.id = -1,
.num_resources= ARRAY_SIZE(smdk2440_dm9k_resource),
.resource = smdk2440_dm9k_resource,
.dev = {
.platform_data= &smdk2440_dm9k_pdata,
},
};




在static struct platform_device *smdk2440_devices[] __initdata = {
里添加
&smdk2440_device_eth,






烧写及启动命令:
nfs 32000000 192.168.1.112:/wfprj/nfs_root/uImage ; bootm 32000000

0 0
原创粉丝点击