单片机
返回首页

基于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内核基本移植完成,剩下的根文件系统构建和常用驱动移植下次在写。

进入单片机查看更多内容>>
相关视频
  • RISC-V嵌入式系统开发

  • SOC系统级芯片设计实验

  • 云龙51单片机实训视频教程(王云,字幕版)

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • TI 新一代 C2000™ 微控制器:全方位助力伺服及马达驱动应用

  • MSP430电容触摸技术 - 防水Demo演示

精选电路图
  • PIC单片机控制的遥控防盗报警器电路

  • 使用ESP8266从NTP服务器获取时间并在OLED显示器上显示

  • 用NE555制作定时器

  • 如何构建一个触摸传感器电路

  • 基于ICL296的大电流开关稳压器电源电路

  • 基于TDA2003的简单低功耗汽车立体声放大器电路

    相关电子头条文章