基于TQ2440的linux-2.6.30.4内核移植(笔记)

移植环境

CPU:S3C2440
交叉编译器:arm-linux-gcc-4.3.3
虚拟机系统:Ubuntu12.04
参考资料:《天嵌科技linux移植手册》

移植步骤

1、获取内核源码

网址:http://ftp.sjtu.edu.cn/sites/ftp.kernel.org/pub/linux/kernel/
找到linux-2.6.30.4压缩包下载即可,然后拷贝到虚拟机中解压

2、在系统中添加对ARM的支持

进入内核源码根目录 Makefile中,修改
ARCH = arm
CROSS_COMPILE = arm-linux-

3、修改平台输入时钟

修改内核源码
arch/arm/mach-s3c2440/mach-smdk2440.c” 文件的大概162行或163行,把16.9344MHz改为12MHz
然后make menuconfig ,进入默认菜单保存一下

4、尝试编译内核,给内核打补丁

make uImage,出现某某未定义,其实是内核需要打补丁
可以参考以下文章 https://blog.csdn.net/pillarpeng/article/details/38282193
打完补丁后,编译生成uImage,下载到开发板,现象如下
在这里插入图片描述

5、制作自己的配置清单

先调用自带的一个默认配置单,该配置单在内核源码的arch/arm/configs/目录下面,名为:s3c2410_defconfig,该配置文件里面选择了几乎所有的和 S3C24XX 系列 CPU 相关的配置选项,在该配置单的基础上进行配置。
载入这个配置单,选择和S3C2440相关的设置项。
选择支持EABI

6、修改机器码,编译镜像

机器码保存在内核源码的“arch/arm/tools/mach-types”文件中,在大概 379 行,把原来的 362 改为 168 保存即可。这个机器码是和U-boot相匹配的。
编译uImage成功如下所示:
在这里插入图片描述

下载uImage到开发板中:

在这里插入图片描述

7、Nandflash驱动移植

到这里仅仅是可以引导了,还需要配置Nandflash。
修改内核源码“arch/arm/plat-s3c24xx/common-smdk.c”文件,在 109 行左右,有一个结构体名为:
smdk_default_nand_part[],将其修改为如下列表所示:
static struct mtd_partition smdk_default_nand_part[] = {
[0] = {
.name = “le2440_Board_uboot”,
.offset = 0x00000000,
.size = 0x00040000,
},
[1] = {
.name = “le2440_Board_kernel”,
.offset = 0x00200000,
.size = 0x00300000,
},
[2] = {
.name = “le2440_Board_yaffs2”,
.offset = 0x00500000,
.size = MTDPART_SIZ_FULL
}
};
然后修改“drivers/mtd/nand/s3c2410.c”文件的 752 行
将原来的内容改为如下所示
chip->ecc.mode = NAND_ECC_NONE;
在内核配置单中添加上对Nandflash的支持
Device Drivers —>
<> NAND Device Support -->
<
> NAND Flash support for S3C2410/S3C2440 SoC
然后编译出镜像,烧到开发版中,现象如下所示:
在这里插入图片描述

8、网卡驱动移植

因为我打算使用NFS网络文件系统来挂载根文件系统,所以只需要配置一下网卡和NFS即可。
修改 Linux-2.6.30.4 内核源码的“arch/arm/mach-s3c2440/mach-smdk2440.c”文件,添加头文件如下:
#include <linux/dm9000.h>
在 154 行添加如下内容所示:
/* DM9000 */
static struct resource s3c_dm9k_resource[] = {
[0] = {
.start= S3C2410_CS4,
.end = S3C2410_CS4 + 3,
.flags = IORESOURCE_MEM,
},
[1] = {
.start= S3C2410_CS4 + 4,
.end = S3C2410_CS4 + 4 + 3,
.flags = IORESOURCE_MEM,
},
[2] = {
.start= IRQ_EINT7,
.end = IRQ_EINT7,
.flags = IORESOURCE_IRQ | IRQF_TRIGGER_RISING,
}
};
static struct dm9000_plat_data s3c_dm9k_platdata = {
.flags = DM9000_PLATF_16BITONLY,
};
struct platform_device s3c_device_dm9000 = {
.name = “dm9000”,
.id = 0,
.num_resources = ARRAY_SIZE(s3c_dm9k_resource),
.resource = s3c_dm9k_resource,
.dev = {
.platform_data = &s3c_dm9k_platdata,
}
};
在 194 行添加如下内容所示:
static struct platform_device *smdk2440_devices[] __initdata = {
&s3c_device_usb,
&s3c_device_lcd,
&s3c_device_wdt,
&s3c_device_i2c0,
&s3c_device_iis,
&s3c_device_dm9000, //添加的
};
在 Linux-2.6.30.4 中“drivers/net/dm9000.c”文件中修改如下:
在 41 行添加的头文件内容如下:
#if defined(CONFIG_ARCH_S3C2410)
#include <mach/regs-mem.h>
#endif
在 1194 行添加内容如下所示:
#if defined(CONFIG_ARCH_S3C2410)
unsigned int oldval_bwscon = *(volatile unsigned int *)S3C2410_BWSCON;
unsigned int oldval_bankcon4 = *(volatile unsigned int *)S3C2410_BANKCON4;
#endif
在 1209 行添加如下内容:
#if defined(CONFIG_ARCH_S3C2410)
*((volatile unsigned int *)S3C2410_BWSCON) = (oldval_bwscon & ~(3<<16)) |
S3C2410_BWSCON_DW4_16 | S3C2410_BWSCON_WS4 | S3C2410_BWSCON_ST4;
*((volatile unsigned int )S3C2410_BANKCON4) = 0x1f7c;
#endif
修改 1278 行开始的内容如下所示:(红色部分为修改内容,主要是添加 mac 值)
#if defined(CONFIG_ARCH_S3C2410)
printk(“Now use the default MAC address: 10:23:45:67:89:ab\n”);
mac_src = “EmbedSky”;
ndev->dev_addr[0] = 0x10;
ndev->dev_addr[1] = 0x23;
ndev->dev_addr[2] = 0x45;
ndev->dev_addr[3] = 0x67;
ndev->dev_addr[4] = 0x89;
ndev->dev_addr[5] = 0xab;
#else
mac_src = “eeprom”;
/
try reading the node address from the attached EEPROM /
for (i = 0; i < 6; i += 2)
dm9000_read_eeprom(db, i / 2, ndev->dev_addr+i);
if (!is_valid_ether_addr(ndev->dev_addr) && pdata != NULL) {
mac_src = “platform data”;
memcpy(ndev->dev_addr, pdata->dev_addr, 6);
}
if (!is_valid_ether_addr(ndev->dev_addr)) {
/
try reading from mac */
mac_src = “chip”;
for (i = 0; i < 6; i++)
ndev->dev_addr[i] = ior(db, i+DM9000_PAR);
}
if (!is_valid_ether_addr(ndev->dev_addr))
dev_warn(db->dev, "%s: Invalid ethernet MAC address. Please "
“set using ifconfig\n”, ndev->name);
#endif
在 1423 行添加如下内容:
#if defined(CONFIG_ARCH_S3C2410)
*(volatile unsigned int *)S3C2410_BWSCON = oldval_bwscon;
*(volatile unsigned int *)S3C2410_BANKCON4 = oldval_bankcon4;
#endif
修改完以上的内容之后,输入:#make menuconfig,进入配置单,然后添加上对 DM9000 网卡和NFS的配置,之前载入的s3c2410_defconfig的配置单已经做好了这些配置,此处不再展示。
最后make uImage编译成镜像文件下载到开发板如下:
在这里插入图片描述
至此,linux-2.6.30.4内核基本移植完成,剩下的根文件系统构建和常用驱动移植下次在写。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值