历史上的今天
返回首页

历史上的今天

今天是:2025年07月26日(星期六)

正在发生

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

推荐阅读

史海拾趣

HBH-Microwave公司的发展小趣事

面对日新月异的电子技术和不断变化的市场需求,HBH-Microwave始终保持对技术创新的热情和投入。公司每年都会投入大量资金用于研发新产品和新技术,以确保在激烈的市场竞争中保持领先地位。同时,HBH还积极与高校和研究机构合作,共同开展前沿技术的探索和研究。这种持续的技术创新和研发投入为公司的长远发展提供了源源不断的动力。

Fairview Microwave Inc公司的发展小趣事

作为一家领先的电子企业,Fairview Microwave深知自己的社会责任和使命。他们积极履行社会责任,关注环保和公益事业。公司不仅严格遵守环保法规和标准要求,还积极推广绿色生产和循环经济理念。同时,Fairview Microwave还积极参与社会公益事业,通过捐赠和志愿服务等方式回馈社会。这些举措不仅提升了公司的社会形象和声誉,也为公司的可持续发展奠定了坚实基础。

请注意,以上故事均为虚构内容,旨在展示Fairview Microwave Inc公司可能的发展路径和成长历程。如需了解该公司真实的发展故事和历程,请参考公司官方发布的历史资料和新闻报道。

Avery Dennison公司的发展小趣事

Avery Dennison在追求商业成功的同时,也积极履行社会责任,致力于可持续发展。公司注重环保和节能,通过采用环保材料和工艺、推广循环经济等方式,降低生产过程中的环境影响。此外,Avery Dennison还积极参与社会公益事业,支持教育、扶贫等项目,为社会和谐与发展贡献力量。

这些故事展示了Avery Dennison在电子行业中的发展历程和成就,体现了公司不断创新、追求卓越的精神。未来,随着科技的不断进步和市场需求的不断变化,Avery Dennison将继续保持创新活力,为客户和社会创造更多价值。

Dfx公司的发展小趣事

随着智能家居市场的不断发展,某智能家居企业面临着如何将各种智能设备无缝连接、实现高效协同的挑战。通过引入DFX的设计理念,该企业成功实现了智能家居产品的标准化、模块化和可扩展性设计。这种设计方式使得不同设备之间可以方便地进行连接和通信,提高了系统的整体性能和用户体验。同时,该企业还通过优化生产流程和加强质量控制等手段,确保了产品的稳定性和可靠性。

这些故事虽然基于虚构的情境,但融入了电子行业中常见的实际问题和发展趋势。通过引入DFX的设计理念,这些企业成功解决了面临的挑战,提升了产品竞争力并赢得了市场的认可。

Curtis Electromusic Specialties Inc公司的发展小趣事

人才是企业发展的核心驱动力。CUI公司深知这一点,因此一直注重人才培养和引进。公司建立了完善的人才培养和激励机制,为员工提供了广阔的发展空间和良好的职业前景。同时,公司还积极与高校和研究机构合作,引进高层次人才和技术成果,为公司的创新发展提供了强大的智力支持。

以上五个故事框架只是基于电子行业CUI公司可能的发展路径和趋势的构想,并不特指任何具体的公司或事件。在实际情况中,每个公司的发展故事都是独一无二的,受到多种因素的影响和塑造。

AND Displays公司的发展小趣事

在追求经济效益的同时,AND Displays也积极践行环保理念。公司采用环保材料和生产工艺,减少了对环境的污染。同时,公司还推出了多款节能型显示面板,帮助用户降低能耗、减少碳排放。此外,AND Displays还积极参与公益事业,通过捐赠和技术支持等方式,为社会的可持续发展贡献力量。

问答坊 | AI 解惑

学习嵌入式/射频技术的绝好教程

1. 本套装是台湾某教授给台湾知名电子企业员工培训讲课视频,授课的企业包括:明基电通、迅利电子、宇通全球等。 由于是给企业员工培训、且授课老师自己也有着多年的工程实践经验,所以视频讲课内容尽量摒弃繁琐的数学推导、抽象的概念,多从工程 ...…

查看全部问答>

让你不再害怕指针

让你不再害怕指针…

查看全部问答>

基于Microchip PIC单片机的USB声卡

作者称声卡的采样频率是24KHz,采样精度12位,其声音品质虽然没有达到商业级水平,但对于耳机等应用已经足够了,比方说可以用来做一个USB电话之类的。 硬件原理图 USB声卡的核心单片机是PIC18F550,运行频率48MHz,通过SPI端口连接到12位D/A ...…

查看全部问答>

单片机仿真的时候,正确运行是不是跟电脑的cpu利用率有关?

做了一个输如输出的仿真,有时候能够正确仿真,有时候达不到要求。反复试了几次,发现cpu利用接近100%的时候,仿真就不能正确运行了。 有没有人遇到过这种情况,是不是跟电脑的cpu的利用率有关,而不是仿真软件的问题?我用的keil跟protues联调。…

查看全部问答>

如何读写SIM卡?

我认为知道这些东西就能用单片机或PC的某个接口读写SIM卡的信息、通讯录、所存短信及其它了: 1 SIM卡 引脚定义 2 数据通信所用协议(即所用总线的电气及数据传输出规范) 3 操作指令(即通过总线传输不同二进制数据控制SIM进行不同操作) 第一 ...…

查看全部问答>

PXA270下摄像头(QCI接口)

各位英雄:        小弟想用PXA270+WINCE5.0平台,基于PXA270的QCI接口连接一个CMOS摄像头,可以采集视频并在LCD上预览。恳请英雄们指点些实现方案,比如摄像头型号、电路连接、驱动程序方面的?        ...…

查看全部问答>

有关UCOS2的一个怪问题

下面是个很简单的例程:问题是 Task1中的i 不为10时,Task2 能运行吗? static void Task2(void * pdata) {     uint8 err;         pdata = pdata; while (1)    {        ...…

查看全部问答>

请问现在做驱动开发, 是用DDk好还是用WDK好呢?

请问现在做驱动开发, 是用DDK好还是用WDK好呢? 因为我是新手,希望选一个从长远上看,较好的出发点。 没有说哪种技术不好的意思 呵呵, 望高人指点 谢谢…

查看全部问答>

香斑竹STM32支持浮点运算吗

                                 STM32  支持浮点运算吗  我在MDK环境中 还是有什么浮点库啊…

查看全部问答>

传感器套装是不是主要是各种温度传感器啊?

本帖最后由 dontium 于 2015-1-23 13:14 编辑 对这个传感器套装感兴趣。问一下哈。 …

查看全部问答>