历史上的今天
返回首页

历史上的今天

今天是:2025年01月04日(星期六)

2021年01月04日 | 移植u-boot-2016.11到TQ2440开发板全过程记录

2021-01-04 来源:eefocus

  • 移植前的准备

  1. 获取并解压源码

SAMSUNG公司于2017年初停止了对S3C2410系列CPU的官方u-boot支持(可在最新版u-boot源码中打开doc/README.scrapyard,搜索关键字S3C2440查看相关说明)。从http://ftp.denx.de/pub/u-boot/下载支持S3C2410处理器的最后一版官方u-boot源码u-boot-2016.11.tar.bz2,放到宿主机的/opt/u-boot/下。

解压源代码并进入根目录:

tar jxvf u-boot-2016.11.tar.bz2

cd u-boot-2016.11/

  1. 指定交叉编译器

gedit Makefile

找到:

# set default to nothing for native builds

ifeq ($(HOSTARCH),$(ARCH))

CROSS_COMPILE ?=

endif

在下方新插入一行:

CROSS_COMPILE ?=arm-linux-

  1. 创建板卡支持文件

(1)创建板卡支持文件夹

拷贝官方smdk2410文件夹进行修改:

cp -rf board/samsung/smdk2410/ board/samsung/tq2440

(2)修改板卡硬件初始化文件

gedit board/samsung/tq2440/lowlevel_init.S

修改s3c2410.S为tq2440.S,修改SMDK2410为TQ2440。

(3)修改板卡高级初始化文件

重命名该文件夹下的smdk2410.c为tq2440.c:

mv board/samsung/tq2440/smdk2410.c board/samsung/tq2440/tq2440.c

编辑该文件:

gedit board/samsung/tq2440/tq2440.c

替换所有SMDK2410为TQ2440,并添加编译选项。

gedit board/samsung/tq2440/Makefile

修改smdk2410.o为tq2440.o

(4)修改板卡配置文件

编辑该文件:

gedit board/samsung/tq2440/Kconfig

内容为:

if TARGET_TQ2440

 

config SYS_BOARD

       default "tq2440"

 

config SYS_VENDOR

       default "samsung"

 

config SYS_SOC

       default "s3c24x0"

 

config SYS_CONFIG_NAME

       default "tq2440"

 

endif

(5)添加板卡支持文件信息

gedit arch/arm/Kconfig

找到

config TARGET_SMDK2410

       bool "Support smdk2410"

       select CPU_ARM920T

在下方插入:

config TARGET_TQ2440

       bool "Support tq2440"

       select CPU_ARM920T

找到:

source "board/samsung/smdk2410/Kconfig"

在下方插入:

source "board/samsung/tq2440/Kconfig"

(6)修改板卡支持维护信息

gedit board/samsung/tq2440/MAINTAINERS

修改内容为:

TQ2440 BOARD

M:   Lion <41979748@qq.com>

S:    Maintained

F:    board/samsung/tq2440/

F:    include/configs/tq2440.h

F:    configs/tq2440_defconfig

(7)添加板卡识别信息

gedit arch/arm/include/asm/mach-types.h

找到:

#define MACH_TYPE_SMDK2410             193

在下方插入:

#define MACH_TYPE_TQ2440          168

找到:

#ifdef CONFIG_ARCH_SMDK2410

# ifdef machine_arch_type

#  undef machine_arch_type

#  define machine_arch_type __machine_arch_type

# else

#  define machine_arch_type MACH_TYPE_SMDK2410

# endif

# define machine_is_smdk2410()   (machine_arch_type == MACH_TYPE_SMDK2410)

#else

# define machine_is_smdk2410()   (0)

#endif

在下面插入一段:

#ifdef CONFIG_ARCH_TQ2440

# ifdef machine_arch_type

#  undef machine_arch_type

#  define machine_arch_type __machine_arch_type

# else

#  define machine_arch_type MACH_TYPE_TQ2440

# endif

# define machine_is_tq2440()  (machine_arch_type == MACH_TYPE_TQ2440)

#else

# define machine_is_tq2440()  (0)

#endif

  1. 创建板卡配置头文件

cp include/configs/smdk2410.h include/configs/tq2440.h

编辑该文件:

gedit include/configs/tq2440.h

替换S3C2410为S3C2440,替换SMDK2410为TQ2440

  1. 创建NAND Flash驱动文件

cp drivers/mtd/nand/s3c2410_nand.c drivers/mtd/nand/s3c2440_nand.c

      编辑该文件:

gedit drivers/mtd/nand/s3c2440_nand.c

      添加编译选项:

gedit drivers/mtd/nand/Makefile

找到:

obj-$(CONFIG_NAND_S3C2410) += s3c2410_nand.o

在下方插入一行:

obj-$(CONFIG_NAND_S3C2440) += s3c2440_nand.o

  1. 创建默认编译配置文件

创建tq2440开发板默认配置文件:

cp configs/smdk2410_defconfig configs/tq2440_defconfig

编辑该文件:

gedit configs/tq2440_defconfig

修改开发板目标:

替换CONFIG_TARGET_SMDK2410=y为CONFIG_TARGET_TQ2440=y;

修改命令行前缀:

替换CONFIG_SYS_PROMPT="SMDK2410 # "为CONFIG_SYS_PROMPT="TQ2440 # ";

  1. 测试编译环境

(1)清理环境并重新编译

make distclean

make tq2440_defconfig

make

编译失败,并提示” Not enough room for program headers, try linking with -N”错误:

错误信息:

arm-linux-ld.bfd: u-boot: Not enough room for program headers, try linking with -N

arm-linux-ld.bfd: final link failed: Bad value

Makefile:1209: recipe for target 'u-boot' failed

make: *** [u-boot] Error 1

(2)根据网上资料,修改顶层配置文件:

gedit Makefile

找到:

LDFLAGS_u-boot += $(LDFLAGS_FINAL)

在下面插入:

# Avoid 'Not enough room for program headers' error on binutils 2.28 onwards

LDFLAGS_u-boot += $(call ld-option, --no-dynamic-linker)

(3)重新编译

make

在根目录下生成了u-boot.bin文件,但提示“Error: You must add new CONFIG options using Kconfig”错误

错误信息:

Error: You must add new CONFIG options using Kconfig

The following new ad-hoc CONFIG options were detected:

CONFIG_NAND_S3C2440

CONFIG_SYS_S3C2440_NAND_HWECC

CONFIG_TQ2440

 

Please add these via Kconfig instead. Find a suitable Kconfig

file and add a 'config' or 'menuconfig' option.

Makefile:827: recipe for target 'all' failed

make: *** [all] Error 1

这一个错误产生的原因是修改了配置头文件中的默认宏定义而导致配置检查无法通过,如果根据消息提示手工在whitelist.txt文件中添加相应宏,由于不知道whitelist.txt文件中的排序规则,仍旧可能报错。

(4)解决白名单校验不通过问题

根据网上资料来看,目前切实有效的解决办法是关闭该校验功能。

gedit Makefile

找到:

       $(srctree)/scripts/check-config.sh u-boot.cfg

              $(srctree)/scripts/config_whitelist.txt ${srctree} 1>&2

在开头位置使用#屏蔽这两行:

#     $(srctree)/scripts/check-config.sh u-boot.cfg

#            $(srctree)/scripts/config_whitelist.txt ${srctree} 1>&2

  1. 创建自动编译批处理脚本

(1)编写自动编译脚本

gedit auto_build.sh

添加如下内容:

#!/bin/bash 

echo "Clean Configuration File..." 

make distclean 

echo "Clean Obj..." 

make clean 

echo "Load Configuration File..." 

make tq2440_defconfig 

echo "make..." 

make CROSS_COMPILE=arm-linux-

echo "Copy bins to TFTP Folder...."

cp /opt/u-boot/u-boot-2016.11/u-boot.bin /opt/TFTP/u-boot.bin

cp /opt/u-boot/u-boot-2016.11/spl/u-boot-spl.bin /opt/TFTP/u-boot-spl.bin

(2)为自动编译脚本文件添加执行权限

sudo chmod +X auto_build.sh

(3)修改自动编译脚本文件所有者

sudo chown -R tq2440:root /opt/u-boot/u-boot-2016.11/auto_build.sh

(4)执行自动编译脚本

bash ./auto_build.sh

编译成功:

  1. 小结

至此,我们完成了u-boot-2016.11移植到TQ2440开发板的前期准备工作。

  • 修改芯片初始化代码

  1. 修改屏蔽中断代码

gedit arch/arm/cpu/arm920t/start.S

找到:

# if defined(CONFIG_S3C2410)

       ldr   r1, =0x3ff

       ldr   r0, =INTSUBMSK

       str   r1, [r0]

# endif

在下面为S3C2440芯片添加:

# if defined(CONFIG_S3C2440)

       ldr   r1, =0x7ff

       ldr   r0, =INTSUBMSK

       str   r1, [r0]

# endif

  1. 修改时钟初始化代码

(1)修改芯片时钟初始化代码

gedit arch/arm/cpu/arm920t/start.S

找到:

       /* FCLK:HCLK:PCLK = 1:2:4 */

       /* default FCLK is 120 MHz ! */

       ldr   r0, =CLKDIVN

       mov       r1, #3

       str   r1, [r0]

替换为:

#if defined(CONFIG_S3C2440)

#define CLK_CTL_BASE      0x4C000000

#define MDIV_405   0x7f<<12

#define PSDIV_405  0x21

       /* FCLK:HCLK:PCLK = 1:4:8 */

       /* default FCLK is 405 MHz ! */

       ldr   r0, =CLKDIVN

       mov       r1, #5

       str   r1, [r0]

       /* set asynchronous bus mod */

       mrc p15, 0, r1, c1, c0, 0

       orr   r1, r1, #0xc0000000  

       mcr p15, 0, r1, c1, c0, 0

       /* MPLL is 405 MHz ! */

       mov       r1, #CLK_CTL_BASE

       mov       r2, #MDIV_405

       add r2, r2, #PSDIV_405

       str   r2, [r1, #0x04]

#else

       /* FCLK:HCLK:PCLK = 1:2:4 */

       /* default FCLK is 120 MHz ! */

       ldr   r0, =CLKDIVN

       mov       r1, #3

       str   r1, [r0]

#endif    /* CONFIG_S3C2440 */

(2)修改板卡时钟初始化代码

gedit board/samsung/tq2440/tq2440.c

添加一个新的FCLK配置模式,找到:

#define FCLK_SPEED 1

修改为:

#if !defined(CONFIG_S3C2440)

#define FCLK_SPEED 1

#else

#define FCLK_SPEED 2

#endif /* CONFIG_S3C2440 */

找到对应的配置项:

#if (FCLK_SPEED == 0)        /* Fout = 203MHz, Fin = 12MHz for Audio */

#define M_MDIV      0xC3

#define M_PDIV 0x4

#define M_SDIV 0x1

#elif (FCLK_SPEED == 1)            /* Fout = 202.8MHz */

#define M_MDIV      0xA1

#define M_PDIV 0x3

#define M_SDIV 0x1

#endif

添加配置模式为2的分支选项:

#if (FCLK_SPEED == 0)        /* Fout = 203MHz, Fin = 12MHz for Audio */

#define M_MDIV      0xC3

#define M_PDIV 0x4

#define M_SDIV 0x1

#elif (FCLK_SPEED == 1)            /* Fout = 202.8MHz */

#define M_MDIV      0xA1

#define M_PDIV 0x3

#define M_SDIV 0x1

#elif (FCLK_SPEED == 2)            /* Fout = 405Hz */

#define M_MDIV      0x7f

#define M_PDIV 0x2

#define M_SDIV 0x1

#endif

添加一个新的UCLK配置模式,找到:

#define USB_CLOCK 1

替换为:

#if !defined(CONFIG_S3C2440)

#define USB_CLOCK 1

#else

#define USB_CLOCK 2

#endif /* CONFIG_S3C2440 */

找到对应的配置项:

#if (USB_CLOCK == 0)

#define U_M_MDIV 0xA1

#define U_M_PDIV  0x3

#define U_M_SDIV  0x1

#elif (USB_CLOCK == 1)

#define U_M_MDIV 0x48

#define U_M_PDIV  0x3

#define U_M_SDIV  0x2

#endif

添加配置模式为2的分支选项:

#if (USB_CLOCK == 0)

#define U_M_MDIV 0xA1

推荐阅读

史海拾趣

Eagle-Picher公司的发展小趣事

然而,Eagle-Picher的发展并非一帆风顺。1991年9月16日,位于密苏里州乔普林的Eagle-Picher工业公司电子部遭受了一场毁灭性的大火。火灾导致公司的电池生产设备化为灰烬,给公司的业务带来了巨大的打击。然而,Eagle-Picher并没有放弃,而是迅速组织力量进行重建和恢复生产。这一事件虽然给公司带来了短期的困难,但也展现了Eagle-Picher的坚韧和决心。

Gulf Semiconductor公司的发展小趣事

Eagle-Picher公司的历史可以追溯到1843年,最初是由Edgar和他的兄弟Stephen J. Conkling在俄亥俄州辛辛那提成立的,专注于生产商业涂料颜料。随着时间的推移,公司经历了多次转型和变革。1847年,Stephen离开公司后,Edgar引入了新的合伙人威廉·伍德,并更名为康克林木业公司。随后,公司在不同的业务领域内扩展,直到1922年,Eagle-Picher正式进入电池市场,开始了其电子行业的历程。

Datapro International Inc公司的发展小趣事

Datapro International Inc公司成立于20世纪90年代初,当时正值电子信息技术飞速发展的时期。公司的创始人是一群充满激情和创新精神的年轻工程师,他们看到了在数据存储和处理方面的巨大潜力。于是,他们决定成立Datapro International Inc公司,致力于开发高效、稳定的数据存储解决方案。

在创立初期,Datapro International Inc公司面临着重重困难,包括资金短缺、技术挑战和市场竞争等。然而,他们凭借坚定的信念和不懈的努力,成功开发出了第一款具有创新性的数据存储产品,该产品凭借其卓越的性能和稳定性迅速赢得了市场的认可。这一成功为Datapro International Inc公司的发展奠定了坚实的基础。

Abracon公司的发展小趣事

为了进一步提升技术实力和市场竞争力,Datapro International Inc公司开始寻求与国内外知名企业的战略合作。他们与一些在数据存储和处理领域具有领先地位的企业建立了合作关系,共同研发新产品、拓展新市场。

通过战略合作,Datapro International Inc公司获得了更多的技术资源和市场机会。同时,他们也从合作伙伴身上学到了许多先进的管理理念和市场策略。这些经验和知识为Datapro International Inc公司的未来发展提供了有力的支持。

AnDAPT__Inc.公司的发展小趣事

Datapro International Inc公司成立于20世纪90年代初,当时正值电子信息技术飞速发展的时期。公司的创始人是一群充满激情和创新精神的年轻工程师,他们看到了在数据存储和处理方面的巨大潜力。于是,他们决定成立Datapro International Inc公司,致力于开发高效、稳定的数据存储解决方案。

在创立初期,Datapro International Inc公司面临着重重困难,包括资金短缺、技术挑战和市场竞争等。然而,他们凭借坚定的信念和不懈的努力,成功开发出了第一款具有创新性的数据存储产品,该产品凭借其卓越的性能和稳定性迅速赢得了市场的认可。这一成功为Datapro International Inc公司的发展奠定了坚实的基础。

台湾唯圣(GW)公司的发展小趣事
电路设计应遵循相关的行业标准和安全规范,确保各元器件的选型、布局和连接方式合理可靠。

问答坊 | AI 解惑

汽车无线接入技术解决方案

全球汽车半导体面临极大的市场机会,但设计工程师同样面临在成本、功耗、安全性等多方面的技术挑战。本文以可接收和发送数据的最新智能应答器为例,向中国汽车设计工程师介绍了在汽车无线接入系统设计中解决这些挑战的技术方法。 …

查看全部问答>

汽车电子神经系统的架构设计和小线径化

用“复杂”来形容当今的汽车是再恰当不过的一个词。安全、操控、驱动和娱乐仅仅是依赖电子/电气架构的部分子系统。如今的驾驶者都希望他们的座驾能够无限精准且不间歇地运转。但是控制整个汽车的电子神经系统的内部却是如此的复杂。如今,大部分汽 ...…

查看全部问答>

单片机音乐播放中歌曲的代码

单片机音乐播放中歌曲的代码怎样弄出来的? 我看了网上的一些教程。。一个个的算很麻烦。。而且我对音乐不熟悉。 这样效率很低。。有没有一些快点的方法? 先在这里谢了~…

查看全部问答>

关于evc的按钮问题

编程环境:evc 程序的功能:点击按钮弹出对话框 情况说明: 在evc下采用MFC编写应用程序,实现点击按钮button1,弹出对话框,用鼠标点击,没有问题,可以正常运行,点击键盘上的ENTER键(确定),也可以弹出对话框。 由于需要进行按钮美化,将b ...…

查看全部问答>

基于ARM的图像边缘检测

现在开发一个基于嵌入式的边缘检测系统,大概实现工业领域对产品零件的检测。该系统通过微型工业相机拍摄零件图片。然后对图片中零件进行边缘检测,来标定零件是否合格。 问题: 1.这种方案有无可行性? 2.硬件用ARM还是DSP? 3.有没有相关领域 ...…

查看全部问答>

我在wince中用

我在wince中用SendMessage(m_hCtlHtml, DTM_NAVIGATE, \"file://\\\\files\\\\a.htm\")方法显示了一个网页,但是其中的链接都不能点击,这是为什么?求大家帮帮我!谢谢~…

查看全部问答>

opa627做跟随,输出被放大

前面的是个阻容衰减电路,在衰减100倍时,跟随输出时正常的,但衰减10倍的时候跟随输出被放大了,要求10M带宽,实际仿真的时候都正常,但我搭出电路却不是那么回事了,似乎是跟随前的输入阻抗引起的,但跟随的输入阻抗很高,困惑中··· [ 本帖最 ...…

查看全部问答>

DIY一个遥控电源插座

最近想DIY一个遥控电源插座,希望大家给个建议:收集了一些资料,但感觉不太满意,如下:PH303A×2红外脉冲发射电路如下图所示,调节RP1,使其振荡频率为12kHz.红外遥控接收电路:…

查看全部问答>

定制操作系统出现ole32.dll的问题

跟着书上的步骤,用vs定制操作系统时,生成解决方案后出现这些错误,如下图: 请大侠帮忙看看是什么问题,3q…

查看全部问答>

【好书推荐】【51单片机应用开发范例大全】扫描版[PDF]

中文名:51单片机应用开发范例大全 作者:宋戈 图书分类:硬件 资源格式:PDF 版本:扫描版 出版社:人民邮电出版社 书号:9787115218322 发行时间:2010年2月 地区:大陆 语言:简体中文简介: 内容简介: 当前,单片机在各个领域的应用十分广 ...…

查看全部问答>