【Uboot学习随笔-基于tiny6410和uboot-2010.09】之-----启用MMU

UBOOT移植------smdk6410配置文件分析 在分析start.s之前先分析下配置文件吧 阅读详情

随笔中记录的都是笔者学习Uboot过程中遇到的一些问题和解决方法,主要是将解决问题的过程和一些小经验、小技巧记录了下来。现在把一些感觉有点价值的内容搬到博客中供读者参考。

 

-----------------12.23-----------------

 

20:47


根据刚才说的,我在Makefile里直接设置RAM_TEXT为0xce000000,这样就可以启用MMU。(参见:http://blog.youkuaiyun.com/newthinker_wei/article/details/8424275)
但实际操作时又出现问题:

common/libcommon.a(cmd_ext2.o): In function `do_ext2load':
/public_desk/temp/uboot/u-boot-2010.09/common/cmd_ext2.c:191: undefined reference to `get_partition_info'
fs/ext2/libext2fs.a(dev.o): In function `ext2fs_set_blk_dev':
/public_desk/temp/uboot/u-boot-2010.09/fs/ext2/dev.c:45: undefined reference to `get_partition_info'
make: *** [u-boot] Error 1

第一反应就是,可能由于我将RAM_TEXT设为高端地址开起了CONFIG_ENABLE_MMU这个宏后,影响了其他的一些宏定义,导致有些库没有被编译。看看哪些地方涉及到了CONFIG_ENABLE_MMU这个宏吧,于是在源码目录下搜索包含CONFIG_ENABLE_MMU的文件,找到了五六个这样的文件,依次打开看看,找找其中跟CONFIG_ENABLE_MMU相关的部分。在 include/configs/smdk6400.h 中,发现有以下几行可能会对编译产生些影响,其他地方出现的CONFIG_ENABLE_MMU对编译结果的影响并不大:

#if !defined(CONFIG_ENABLE_MMU)
#define CONFIG_CMD_USB                  1
#define CONFIG_USB_S3C64XX
#define CONFIG_SYS_USB_OHCI_REGS_BASE           0x74300000
#define CONFIG_SYS_USB_OHCI_SLOT_NAME           "s3c6400"
#define CONFIG_SYS_USB_OHCI_MAX_ROOT_PORTS      3
#define CONFIG_SYS_USB_OHCI_CPU_INIT            1
#define CONFIG_USB_STORAGE      1
#define CONFIG_USB_OHCI_NEW             1
#endif

这里发现如果使能了MMU,那么USB相关的一系列宏将被屏蔽掉。这个影响应该比较大,但是到底怎么影响编译结果了?再回头看看make时的出错信息,发现出现的两个错误都是提示获取分区信息的函数找不到了,而且都跟ext2文件相关,但USB的设置会影响文件系统部分吗?个人感觉这个关联度应该不大啊,于是开始怀疑除了USB这块儿可能还有其他地方出问题。但没有使用MMU的时候可以正确编译,而现在跟刚才比就是多设置了一个使能MMU而已,根据刚才搜索出来的几个文件MMU的设置除了USB外貌似没有影响其他部分阿,难道还有些小地方我没注意到?uboot这么庞大的代码树让人看了就觉得头痛,去分析它下面的细节就更加纠结。进行到这里时我已感觉有点力不从心,脑子里特别乱,而且也快没耐心再分析下去了。

歇一会儿,继续研究。

根据出错提示可以知道get_partition_info这个函数找不到了,于是在snavigator环境中进入cmd_ext2.c找到get_partition_info,跳到定义处,发现这个函数的定义在 disk/part.c 文件中。进入disk子目录,打开此目录下的Makefile,找到出现part.o的地方,发现这样几句:
COBJS-y += part.o
COBJS-$(CONFIG_MAC_PARTITION)   += part_mac.o
COBJS-$(CONFIG_DOS_PARTITION)   += part_dos.o
看来part.o是无条件生成的,所以不可能是缺少哪个宏定义而没有编译part.c。但出错提示却说part.o里的一个函数找不到了,于是问题应该出在part.c本身,看这个源文件内部是否有什么条件编译不能满足。进入part.c,细看一下,果然发现这个文件大部分内容都有这个编译条件:

#if (defined(CONFIG_CMD_IDE) || \
     defined(CONFIG_CMD_MG_DISK) || \
     defined(CONFIG_CMD_SATA) || \
     defined(CONFIG_CMD_SCSI) || \
     defined(CONFIG_CMD_USB) || \
     defined(CONFIG_MMC)  || \
     defined(CONFIG_SYSTEMACE) )

刚才make时提示所缺的get_partition_info也受这个条件约束。终于有点眉目,而且更加令人兴奋的是这里也出现了CONFIG_CMD_USB,回头看看刚才的 include/configs/smdk6400.h 文件,发现如果使能了MMU,那么USB这个宏将被屏蔽。不过这还不够,因为只有当上面括号里所有的宏都没有被定义时,才可以确定part.o文件中的内容没有被编译。这些宏看起来都是跟硬盘、SD卡相关的,嵌入式一般没人用硬盘,SD卡倒有可能用。不乱猜了,直接回到smdk6400.h文件中看一下。依次搜索上面的宏,果然都没有出现!(USB宏出现了,不过被屏蔽了,哈哈)。看来确实是这里出的问题,刚才发现的被屏蔽掉的USB相关宏就通过这里影响了编译结果!
找到问题根源所在,下面就是解决问题了。通过错误提示可以看出,有两个解决方案。第一个方案就是把part.c中的条件编译改成无条件编译,这样get_partition_info函数就有了;第二个方案就是把用到part.o中函数的模块都去掉。我用的是第二个方案,因为用不到ext2文件系统。part.c文件中用条件编译,也是告诉我们,当括号里那几个宏都没有出现时,part.o中的函数是用不到的(当不用硬盘不用SD卡时,ext2确实也没什么用,NADN上一般都是用的yaffs2)。

动手前重新看看出错信息
common/libcommon.a(cmd_ext2.o): In function `do_ext2load':
/public_desk/temp/uboot/u-boot-2010.09/common/cmd_ext2.c:191: undefined reference to `get_partition_info'
fs/ext2/libext2fs.a(dev.o): In function `ext2fs_set_blk_dev':
/public_desk/temp/uboot/u-boot-2010.09/fs/ext2/dev.c:45: undefined reference to `get_partition_info'
make: *** [u-boot] Error 1

对于第一个错误,需要将libcommon.a库中的cmd_ext2.o模块去掉。于是进入common子目录,打开其中的Makefile,找到这一行:
COBJS-$(CONFIG_CMD_EXT2) += cmd_ext2.o
可见,cmd_ext2.o模块的编译与否,取决于CONFIG_CMD_EXT2这个宏的值。所以我们只需去掉这个宏即可。再次进入smdk6400.h文件,找到"#define CONFIG_CMD_EXT2",将其注释掉。(重新make smdk6400_config后 include/autoconf.mk 中就不存在CONFIG_CMD_EXT2的定义了)。当然这一步也可直接在 common/Makefile 中将cmd_ext2.o去掉,但感觉这样不好,因为这样的话uboot中就多了一个垃圾宏(CONFIG_CMD_EXT2)。

对于第二个错误,我们直接不要libext2fs.a这个库了。进入顶层Makefile,去掉LIBS中的"libext2fs.a"即可 。

这样再次编译就可以通过了。但是编译通过后,下载到开发板上无法运行。猜想可能是u-boot中没有进行内存映射,但依稀记得start.S文件中好像有关于mmu_table的定义,难道是内存映射表设置的有问题?如果uboot自己设置页表的话,那它肯定需要知道实际物理内存的起始地址和对应的虚拟起始地址(uboot一般都是线性映射),也就是说肯定有相应的宏定义。重新打开start.S文件,注意到了这行:
_TEXT_PHY_BASE:
        .word   CONFIG_SYS_PHY_UBOOT_BASE
这里用到一个CONFIG_SYS_PHY_UBOOT_BASE宏,再结合前面的标号_TEXT_PHY_BASE,不难猜到这个就是指物理内存的起始地址。追踪一下这个宏定义,start.S开头是:
#include <config.h>
#include <version.h>
#ifdef CONFIG_ENABLE_MMU
#include <asm/proc/domain.h>
#endif
那这个宏定义肯定就在上面包含进来的这几个文件中了(还有这几个文件包含的其他文件),一个一个找吧。一般这些平台相关的宏定义都在与开发板同名的头文件中,于是就先找 smdk6400.h (虽然我用的是tiny6410,但我移植Uboot没有再新建tiny6410相关目录,因为那样的话命名带来的问题就要改一大堆东西),果然找到了,都在这里:

/* base address for uboot */
#define CONFIG_SYS_PHY_UBOOT_BASE       (CONFIG_SYS_SDRAM_BASE + 0x07e00000)
/* total memory available to uboot */
……
……
#ifdef CONFIG_ENABLE_MMU
#define CONFIG_SYS_MAPPED_RAM_BASE      0xc0000000
#define CONFIG_BOOTCOMMAND      "nand read 0xc0018000 0x60000 0x1c0000;" \
                                "bootm 0xc0018000"
#else
#define CONFIG_SYS_MAPPED_RAM_BASE      CONFIG_SYS_SDRAM_BASE
#define CONFIG_BOOTCOMMAND      "nand read 0x50018000 0x60000 0x1c0000;" \
                                "bootm 0x50018000"
#endif
/* NAND U-Boot load and start address */
#define CONFIG_SYS_UBOOT_BASE           (CONFIG_SYS_MAPPED_RAM_BASE + 0x07e00000)
……
……
……
#define CONFIG_SYS_SDRAM_BASE   0x50000000
……

好了,物理内存起始地址(0x50000000)、对应的虚拟起始地址(0xc0000000)、Uboot的起始位置都有了,看样子uboot里确实将页表按照这些宏设置好了?看了下这些地址的设置,跟我的开发板一样(主要是内存起始地址0x50000000没错就行),那为什么不能运行呢?难道是把IO、寄存器也映射到其他地址了?

后来直接 arm-linux-objdump -d u-boot,  仔细看了看U-boot的反汇编,发现虽然在start.S文件中有mmu_table的定义,但u-boot中只是指定了这个页表的地址,而没有真正实现这个页表。推断依据:

反汇编中
  c7e00188 <_mmu_table_base>:
  c7e00188:       c7e28000        .word   0xc7e28000
这两行对应start.S文件中的:
#ifdef CONFIG_ENABLE_MMU
_mmu_table_base:
        .word mmu_table
#endif
如果Uboot确实实现了这个页表,那么在反汇编文件的其他地方肯定还会出现 _mmu_table_base、c7e28000、c7e00188 这样的字眼,但是搜索后发现其他地方并未出现这些标号和数字。


所以要想使用MMU可能还要自己花功夫设置页表。
我开发板带的编译好的内核需要放在0xc0000000地址处才能正常bootm,以前一直是用开发版带的Uboot,这次想用自己的Uboot引导一下那个内核,发现问题还真不少,衰。


 

 

u-boot中实现USB键盘支持的编程方式 我们通过在u-boot配置文件中启用USB功能、实现USB键盘驱动程序、配置启动脚本等步骤,实现了USB键盘在u-boot环境下的支持。在u-boot中实现USB键盘支持是一个常见的需求,它可以使我们在u-boot环境下使用USB键盘进行交互。本文将介绍如何在u-boot中实现USB键盘支持,并提供相应的源代码示例。完成编译和烧录后,我们可以通过连接USB键盘并启动u-boot来测试USB键盘支持是否正常。为了在u-boot启动时自动初始化USB键盘支持,我们需要在启动脚本中添加相应的配置。 阅读详情

相关推荐

Uboot_for_Tiny6410_移植步骤详解

1)掌握U-boot剪裁编写 2)掌握交叉编译环境的配置 3)掌握u-boot的移植

[Linux 底层]U-boot ksz9031网络驱动调试

ksz9031的介绍可以回归一下datasheet的介绍,一款很优秀的千兆以太网; 【Datasheet】PHY KSZ9031千兆网络芯片解读 系统版本:Ubuntu18.04-64 编译器版本:gcc version 7.4.0 (Ubuntu/Linaro 7.4.0-1ubuntu1~18.04.1) uboot版本:2018.07 -linux4sam_6.0 板子型号:at91sama5d3x-xplained MCU型号:sama5d36 关注微信公众号,回复“ksz9031驱动”,免费下

weixin_43771853的博客 4196

Tiny6410刷机指南

Tiny6410刷机指南

基于tiny6410开发板移植官方uboot详解

目录 前言 编译环境准备 移植的uboot目标版本选择 tiny6410开发板相关目录建立 uboot工程代码修改 uboot-spl代码修改

eric_rain的博客 846

TINY6410 uboot移植手册

tiny6410的uboot移植手册,学习uboot移植可以参考,已经验证过可行

PCB设计必看:铜皮厚度与载流量的黄金比例(附实用对照表)

本文深入探讨了PCB设计中铜皮厚度与载流量的关键关系,提供了实用的对照表和设计技巧。通过分析基础原理、标准选择策略及常见误区,帮助工程师优化PCB设计,确保电路板的可靠性和安全性。特别适用于需要处理大电流或高频应用的电子设计场景。

milk8的博客 511

Tiny6410烧入uboot,linux内核,文件系统

好久没有玩tiny6410了,今天拿出来试试。之前学习一直是跟着视频学习的。今天自己动手来做一下。 首先我将光盘linux目录下的linux-2.6.38-20150708.tgz rootfs_rtm_6410.tgz u-boot-mini6410-20111018.tar.gz 拷贝到我的UBUNTU系统中。使用tools目录下的SD-Flasher.exe将一张8G的sd卡制作为启动...

weixin_30522095的博客 185

基于java实现的弹幕视频网站

开发语言:Java框架:ssm技术:JSPJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包:Maven3.3.9系统展示弹幕视频网站,在弹幕视频网站可以查看首页、视频信息、商品信息、论坛信息、我的、跳转到后台、购物车、客服等内容前台首页界面图登录,通过登录填写账号、密码等信息进行登录操作登录界面图视频信息界面图。

DC5621的博客 1332

tiny6410编译u-boot

1.可以从这里http://ftp.denx.de/pub/u-boot/下载最新的u-boot. 2.解压后进入u-boot源码根目录 #make clean 3.根据开发板的配置进入移植(移植是件大事,怎么能随随便便说出来呢,好吧,其实我也不会) 可以参考这篇文章http://wenku.baidu.com/link?url=-lXgMxyW52xSxwpEJuo19TrR0AZ961

Growth 1835

头歌平台 操作系统课堂练习2.3:系统调用

使用 gdb 调试内核,跟踪到 main 函数入口的方法与之前实训一样。系统运行时,执行的前 3 个系统调用的编号和名字分别是什么?系统运行时,执行的前 3 个系统调用的编号和名字分别是什么?本关卡使用版本 1 内核进行分析,版本 1 内核文件存放在。为了完成本关任务,你需要:跟踪系统调用的发生。此时,系统调用号存放在寄存器 eax 中。

lazbuyaotoutu的博客 2万+

从封装到先进封装:一文讲透Chiplet、2.5D/3D堆叠与系统集成

封装是芯片产业链中连接硅片与电路板的桥梁,承担物理保护、电气连接、散热与机械支撑等核心任务。传统封装从DIP、QFP发展到BGA,通过提升引脚密度满足早期性能需求。随着摩尔定律放缓,单纯缩小晶体管尺寸难以为继,先进封装应运而生,其核心理念从“封装单颗芯片”转向“系统级高密度集成”。扇出型封装、2.5D硅中介层、3D堆叠、Chiplet和系统级封装等技术,通过微米级互连和垂直堆叠,大幅提升I/O密度与带宽,成为AI芯片、HBM存储、高性能计算等领域的关键支撑。本文梳理先进封装的技术演进、分层架构与工程难点,帮

weixin_29185167的博客 367

【Uboot学习随笔-基于tiny6410和uboot-2010.09】之-----TEXT_BASE

随笔中记录的都是笔者学习Uboot过程中遇到的一些问题和解决方法,主要是将解决问题的过程和一些小经验、小技巧记录了下来。现在把一些感觉有点价值的内容搬到博客中供读者参考。   -----------------12.23----------------- 19:55 追踪UBoot中 TEXT_BASE 的定义: 1.Makefile的 smdk6400_config 目标下有一句:

NewThinker_wei 的专栏 4090

MicroPython ubluetooth 库详细介绍

MicroPython的ubluetooth库为蓝牙通信提供了强大的支持,使得开发者能够在MicroPython环境下轻松实现蓝牙设备之间的通信。其中ubluetooth库为MicroPython提供了强大的蓝牙通信功能,使得开发者能够轻松地在各种支持MicroPython的硬件平台上实现蓝牙设备之间的通信。它提供了一系列的函数和类,用于实现蓝牙设备的扫描、连接、数据传输等功能。- 上述代码中,首先创建了一个蓝牙服务和一个特征,然后可以通过read和write函数读取和写入特征值。# 处理连接成功事件。

m0_46311182的博客 1761

uboot-2010-03移植到tiny6410(1)

一、s3c6410启动流程要移植uboot到tiny6410,首先需要弄清楚tiny6410的启动流程,下面是三星官方文档给出的启动流程图 从流程图中可以看到需要4步: 1、上电后先运行IROM里面的代码,芯片厂商固定好,进行硬件初始化,包括系统时钟初始化,D-TCM初始化等,这部分叫BL0。 2、iRom在初始化完后会把外部启动设备(nand flash、sd卡等)中的bootloader的

BeyMax的博客 1030

CentOS 环境 sngrep 安装及使用

在呼叫中心类应用开发过程中,经常需要对 SIP 信令抓包,分析排查问题。通常抓包的工具非常多样,如 Wireshark、tcpdump、ngrep 等都是可选项,但是针对 SIP 信令的抓包,sngrep 则更为好用。因为 sngrep 不仅提供了图形界面,还会将一通会话的 SIP 信令关联汇总,非常直观执行以下命令下载 的相关依赖库 1.2 添加 sngrep 的源并导入 执行下面的命令新增一个源仓库配置文件 然后在该文件中写入以下配置内容 执行命令导入源仓库的公钥 1.3 安装 sngrep

谈谈1974 8145

ChatGPT Plus完整开通指南:从账号注册到稳定使用全流程

自然语言处理(NLP)技术通过深度学习模型实现对人类语言的理解与生成,其核心原理是基于Transformer架构的大规模预训练。GPT-4作为当前最先进的生成式AI模型,在代码编写、文档分析等场景展现出显著的技术价值。在实际应用中,稳定的网络环境和合规的支付方式是确保AI助手持续服务的关键因素。针对ChatGPT Plus的开通,需要系统性地解决账号验证、虚拟信用卡支付等工程实践问题,才能实现工作流的高效整合。

weixin_34239592的博客 427

基于6410的u-boot移植

基于6410的u-boot移植(一)   2011-07-04 19:49:41|  分类: bsp |  标签: |字号大中小 订阅 由于Uboot2011.06对S3C6410有了很好的支持,所以采用Uboot2011.06版本。 一、             移植环境 主 机:VMWare-ubuntu 开发板:ok6410—512M nandflash,K

xiao229404041的专栏 1515

【自动驾驶轨迹规划之hybrid A*算法】

本文参考论文:https://ai.stanford.edu/~ddolgov/papers/dolgov_gpp_stair08.pdf 这篇文章是基于经典A*算法与reeds-shepp曲线的,不清楚的读者请参考【自动驾驶轨迹规划5之A*算法】_无意2121的博客-优快云博客【自动驾驶轨迹规划之dubins曲线与reeds-shepp曲线】_无意2121的博客-优快云博客 目录 1 hybrid A* 算法创新点 1.1 搜索方式 1.2 车辆运动学模型 1.3 reeds-shepp曲

weixin_65089713的博客 1万+

6410Uboot移植之两种内核启动方式

启动方式之tftp引导内核和nfs根文件系统 baudrate=115200 bootargs=noinitrd root=/dev/nfs rw nfsroot=192.168.1.189:/opt/Real6410/rootfs ip=192.168.1.190:192.168.1.189:192.168.1.1:255.255.255.0 console=ttySAC0,115200 i

451

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

基于uboot及TFTP通信向开发板烧写程序的详细分析

最近接触了Tiny6410及TQ2440开发板,这里吐槽一下,这两种开发板算是小有名气了,尤其是TQ,太过垃圾了,裸机程序都没有,开发板,最值钱的恰恰就是教程,教程越详细越好。Tiny6410开发板略微好一些,但是仍然不够详细,Tiny6410的烧写程序工具是Minitool软件,不过这个软件不太稳定,可能是我的系统是win7的缘故吧,反正就是shi活无法连接成功(USB驱动已装),只能使用ubo

猪哥的专栏 2994

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

tiny6410的linux操作系统实验开发

---恢复内容开始--- 1。前期由于2440 的4.3寸屏太小。后来修改程序准备在tiny6410增强版的S70屏上用。但是前期移植再用yaffs的文件系统,但是6410是(MLC)的磁盘,根本就不支持yaffs文件系统,只好做成initramfa的文件系统。 2.出现的问题:   1》由于我的应用程序都是动态编译的,所以文件系统需要动态链接库。   2》我之前移植的motion,tsl...

weixin_34275734的博客 174

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

uboot2016.11分析8 - uboot的默认环境变量

【版权申明】未经博主同意,谢绝转载!(请尊重原创,博主保留追究权) uboot的默认环境变量    在uboot阶段输入命令printenv, 可以查看到uboot的默认环境变量. arch=arm baudrate=115200 board=xxxxxx board_name=xxxxxx bootargs=mem=512M console=ttyAMA0,115200 rootwait r...

手中沙的博客 627

USB主机控制器驱动——OHCI分析

首先,整个驱动框架的开始,是基于 platform 平台总线的。 struct platform_device s3c_device_usb = { .name = "s3c2410-ohci", .id = -1, .num_resources = ARRAY_SIZE(s3c_usb_resource), .resource = s3c_usb_resource,

漫不经心 1万+

uboot分析:uboot的启动过程分析

uboot分析:uboot的启动过程分析 目录 1. U-Boot启动过程概述 2. U-Boot启动代码具体分析 2.1 第一阶段(/ubootcpu/s5pc11x/start.S) 2.2 第二阶段(/uboot/lib_arm/board.c->start_armboot) 正文 (注:本文参考资料:朱有鹏嵌入式课程。本文为个人学习记录,如有错误,欢迎指正。) 回到顶部 1. U-Boot启动过程概述 U-Boot的启动过程分为两个阶段。 第一阶段

wza64217936的博客 1524

最新uboot的Kbuild系统 3 .config的生成

前面的工作产生了一个conf 关键点是由conf产生.config的过程 最后是通过执行 scripts/kconfig/conf  --defconfig=arch/../configs/rpi_defconfig Kconfig 生成的 Kconfig包含了当前目录中可以进行的一些配置信息。 rpi_defconfig包含了默认的配置信息。 conf根据rpi_defc

groundhappy的专栏 2718
上一篇: 【GCC-ARM裸机开发随笔】----之lds链接脚本分析
下一篇: Qt工具知多少
NewThinker_wei
博客等级 码龄14年 521粉丝 51原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值