基于TQ2440的linux-2.6.30.4内核移植
2021-07-26 来源:eefocus
移植环境
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 在 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 #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:abn”); 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 ifconfign”, 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内核基本移植完成,剩下的根文件系统构建和常用驱动移植下次在写。