历史上的今天
返回首页

历史上的今天

今天是:2025年02月22日(星期六)

2021年02月22日 | cortex-a8 uboot系列:第十六章 uboot移植-从三星官方移植

2021-02-22 来源:eefocus

一、移植前的准备工作

三星移植过的uboot源代码准备

Ubuntu14.04重启网卡命令, ifdown eth0,  ifup eth0

安装openssh,通过ssh远程登录linux


二、移植初体验

复制三星官方的uboot代码到linux下。

检查makefile中的交叉编译工具链是否正确

配置时使用:

make   smdkv210_single_config 

然后直接make, 得到u-boot.bin。


使用sd_fusing目录下的sd_fusing.sh脚本,将u-boot.bin烧录到SD中。因为sd_fusing目录下有两个文件是三星在64位系统上编译的,在32位机上是不能工作的。因此需要重新make以下生成32位下的这两个文件。

clip_image002

将SD卡插入到开发板中,启动电源。串口输出不正确。但是开发板供电锁存成功。

clip_image003

分析运行结果:

Uboot中串口最早的输出在”OK”,在lowlevel_init.S中初始化串口时打印出来的;串口无输出“OK”说明在打印“O”之前代码已经死掉了;开发板供电锁存在lowlevel_init.S中,开发板供电锁存成功说明这个代码之前的部分是没问题的。


因此,可以得出,错误是开发板供电锁存代码和串口初始化打印“O”代码之间

 

在lowlevel_init.S中,调用了PMIC_InitIp函数,这个函数是对外部的PMIC(电源管理芯片)进行设置,通过IIC接口。而开发板是没有PMIC的,因此这里要将这里的函数屏蔽掉。

clip_image004

修改为

clip_image006

修改后,重新编译,串口打印信息,uboot基本移植成功。但是有很多功能不能使用。

clip_image008

可以看到外部的SD/MMC卡初始化失败。因为没有识别到SD/MMC卡。还有DRAM的大小也不对。


三、Uboot的配置文件smdkv210single.h修改

更改config的打印信息

clip_image010

这样,就修改了uboot的打印信息。

clip_image012

 

clip_image014

更改网络相关的信息。打印的信息也随之修改。

clip_image015

从uboot显示看出时钟配置是正确的时钟,因此不用去设置时钟。

四、DRAM代码移植

DRAM显示信息不对,使用bdinfo打印具体信息。

clip_image016

看出DRAM0和DRAM1的size值不对,应该为0x1000_0000。

使用md命令进行内存数据查看。

clip_image018

看到0x2000_0000地址开始和0x3000_0000地址开始的数据是一样的。并且对0x20000000地址数据修改,0x30000000地址值也随之修改了。说明了地址0x30000000-0x3ffffff和0x20000000-0x2fffffff映射的DRAM区域是一样的。

clip_image020

 

clip_image022

修改SDRAM_BANK_SIZE为256, 表示每一块内存大小为256M。并修改SDRAM_1和SDRAM_2的基地址为对应的宏。

添加这两个宏。

clip_image024

这样,更改了DRAM的大小。重新编译烧录,从uboot中可以看出DRAM的设置正确了。

clip_image025

下面要更改DRAM1的首地址,将之设置为0x3000_0000,因为开发板的DRAM的连接是这样的。这样,DRMA1和DRAM2的地址就连接起来了。

首先修改内存首地址的宏:

clip_image027

修改DRAM的MEMCONFIG_0寄存器的值。将DMC0_MEMCONFIG_0配置值的高16位设置为0x30F0。表示将DRAM0的基地址映射到0x30000000上。并且可用的地址范围为

       0x3000_0000 – 0x3fff_ffff

clip_image029clip_image031

修改lowlevel_init.S的MMU映射表,将597行的设置的_base的值为0x300。

clip_image033

定义256M空间。循环256次,建立256个表项。

虚拟地址范围:0xC000_0000-0xCFFF_FFFF

映射的物理地址 : 0x3000_0000-0x3FFF_FFFF, (DMC0的有效区域,也就是外部DRAM1的区域)

开启cache,使用write buffer。

将内存的物理地址0x3000_0000-0x3FFF_FFFF映射到虚拟地址0xC000_0000-0xCFFF_FFFF

clip_image035

修改虚拟地址映射到物理地址的函数,将框中的数据修改为0x3000_0000。

编译下载,打印信息如下,将DRAM1的起始地址修改为0x30000000了。并且内存可以使用。

clip_image036

修改uboot打印的板子的信息。

clip_image038

五、SD/MMC移植

Uboot打印SD/MMC的信息错误,说明对对外部的SD/MMC初始化失败。

clip_image040

先查看这几句信息在什么地方打印出来的。

在mmc_startup函数(drivers/mmc/mmc.c),SDMMC初始化的调用的最后一个大函数。

查看打印问题,发现打印问题和EXT_CSD有关,所以查看mmc_read_ext_csd函数(drivers/mmc/mmc.c)

clip_image042

原来的代码如下,当ext_csd_struct值大于6,打印错误信息。而从uboot打印信息看出,这个时候的值为6。

clip_image044

修改为:

clip_image046

但是发现这个错误信息打印了两次,因为在对mmc的初始化,如果第一次初始化失败,那就再初始化一次。而第二次也会初始化失败,所以又打印了一次。

clip_image048

修改后,uboot执行MMC初始化成功,可以打印卡的容量大小。

clip_image050

扩展寄存器EXT_CSD为高版本的SDMMC卡使用。

clip_image052

判断卡的版本,如果低于4版本,说明都没有EXT_CSD_寄存器,就不用执行这函数,直接返回。

clip_image054

发送EXT_CSD命令,并将响应保存到ext_csd中。

在ext_csd有几位是表示卡的版本。对于uboot不处理MMC卡的版本大于5的情况,所以要将版本设置为大于6。

clip_image056

通过EXT_CSD可以获取卡的一些信息。

clip_image058

查看iNand的数据手册。

clip_image060

查看EXT_CSD_的第192字节,表示卡的版本,默认值是0x5。

clip_image062

clip_image064

在mmc_initialize函数(drivers/mmc/mmc.c)添加上述代码,对外部的SD卡进行初始化,并打印容量信息。

Uboot的效果如下。

clip_image065

在smdkv210single.h中,有如下一个宏,表示命令的提示符。这里修改为如下,

clip_image067

在uboot中的效果就是:

clip_image069

六、其他一些参数的修改

修改默认的串口端口。

Uboot默认使用的是串口2。可以修改为串口0。

将以下代码修改,即可将串口定向为串口0。

clip_image071

Uboot中定义了4个串口

 CONFIG_SERIAL1       表示串口0

CONFIG_SERIAL2       表示串口1

CONFIG_SERIAL3       表示串口2

CONFIG_SERIAL4       表示串口3

配置这些宏,来配置串口的基地址是多少。

clip_image073

这样,就将uboot的串口定向为串口0。

将虚拟转物理地址函数修改为如下,当地址不需要转换时,不打印信息。

clip_image075

Uboot中有打印nand的信息,容量为0。但是开发板没有使用nand,所以要将这部分代码修改。

在start_armboot函数(lib_arm/board.c)中,初始化SDMMC后,就要去初始化NAND,可以看出NAND和宏CONFIG_CMD_NAND有关系的。

clip_image077

 

在smdkv210single.c中将宏CONFIG_CMD_NAND注释掉。表示对外部的NAND不配置。

clip_image079

但是编译会出错,提示和nand有关函数找不到,说明这个宏开关控制了一些nand函数的编译。

clip_image081

Uboot默认从nand启动,所以要将启动方式更改为SDMMC方式。

clip_image083

注释掉CFG_FASTBOOT_NANDBSP,表示启动介质不是nand,

定义CFG_FASTBOOT_SDMMCBSP宏,表示启动介质是SDMMC

编译成功,下载执行,打印如下信息,nand信息没有没有打印了,地址不需要虚拟转换的信息也不打印了。

clip_image084

以上就移植好了一个uboot。可以看出,从开发板的原厂商提供的uboot,进行移植,是相对比较容易的。


移植的关键,还是从打印信息入手。根据打印信息,去确认问题,然后解决问题。


推荐阅读

史海拾趣

EG & G Inc公司的发展小趣事

为了进一步扩大市场份额,EG & G Inc公司积极开展市场拓展和国际合作。公司在中国、欧洲等多个国家和地区设立了分支机构,与当地企业建立了紧密的合作关系。同时,公司还积极参与国际展览和交流活动,展示了其先进的技术和产品。这些努力使得EG & G Inc公司在国际市场上获得了更多的机会和认可。

Altus Technology Inc公司的发展小趣事

Altus Technology Inc自成立以来,始终将技术创新作为公司发展的核心驱动力。在早期,公司研发团队通过不懈努力,成功开发出了一款具有革命性的芯片,这款芯片在性能和功耗上均优于当时的同类产品。凭借这一技术突破,Altus在市场上迅速获得了一席之地,并吸引了大量合作伙伴和投资人的关注。随着技术的不断迭代和升级,Altus逐渐在电子行业中树立了技术领先的形象,并持续推出了一系列创新产品,巩固了市场地位。

Antiference公司的发展小趣事

Antiference公司最初以生产电磁屏蔽材料起家,但随着电子设备的普及和电磁干扰问题的日益严重,公司意识到单纯的材料生产已无法满足市场需求。于是,Antiference投入巨资研发新型电磁干扰抑制技术,成功开发出了一款能够显著降低电磁干扰的芯片。这款芯片迅速在市场上获得了广泛认可,Antiference也因此成为了电磁干扰抑制领域的领军企业。

Carling Technologies公司的发展小趣事

面对日益激烈的市场竞争和技术变革,Carling Technologies始终保持着对技术创新的热情。公司投入大量资源进行产品研发和技术升级,推出了一系列具有创新性和高性能的产品。例如,在数据通信/电信领域,公司提供了全系列的创新型高性能、可靠的液压磁力断路器,满足了市场对高效、稳定产品的需求。这些技术创新和产品升级不仅提升了公司的竞争力,也为客户提供了更好的解决方案。

以上五个故事是基于Carling Technologies公司的发展历程和常识进行的概述,旨在描述其在电子行业中的发展和成就。请注意,这些故事是基于现有信息和常识的推测,并不代表公司实际发展的具体细节。如果您需要更详细的信息或故事,建议您查阅公司官方网站、新闻稿或相关行业报告。

FCT Electronics公司的发展小趣事

随着电子产品的日益复杂化,FCT Electronics意识到技术创新是保持竞争力的关键。公司投入大量资源进行研发,成功开发出一系列高性能的测试设备。其中,一款多功能集成电路测试系统因其高效、稳定、可靠的特点,被众多电子制造商所采纳,为FCT Electronics赢得了极高的声誉。

恒连电子(EVERCOM)公司的发展小趣事

恒连电子成立于XX年代初,当时正值电子行业的快速发展期。创始人张先生凭借对电子技术的敏锐洞察力和对市场趋势的精准把握,决定投身于电子行业。然而,初创时期的公司面临着资金短缺、技术团队匮乏以及市场竞争激烈等多重挑战。张先生带领团队日夜兼程,通过自主研发和不断创新,逐渐在市场中站稳脚跟。他们首先推出了几款性能稳定、价格合理的电子产品,赢得了客户的信赖。随着产品的逐步推广,恒连电子逐渐在市场中打开了局面。

问答坊 | AI 解惑

Cadence Allegro PCB 设计详细教程(更新中)

1楼:Cadence Allegro 中文教程,又名:Cadence Allegro 中文简易手册                          共79页,讲的是Cadence Allegro 软件的基本操作,   &nb ...…

查看全部问答>

开关电源的几种热设计方法

1.引言   开关电源已普遍运用在当前的各类电子设备上,其单位功率密度 也在不断地提高.高功率密度的定义从1991年的25W/in3、1994年36W/in3、1999年52W/in3、2001年96W/in3,目前 已高达数百瓦每立方英寸.由于开关电源中使用了大量的大功率半导 ...…

查看全部问答>

请教:tcl中set命令可以不打印变量的值吗?

在modelsim里每次用set命令将一个变量初始化,就会打印出变量的值。请问set命令可以不输出这个值吗?或者有其他的命令或方式可以实现这种操作?…

查看全部问答>

在code中如何区别vs2008还是evc?

有个工程需要在vs2008 和 evc4.1 都能打开,而且build后都能使用  现在问题是 有些code在vs2008 和 evc上不同  也就是有些只在2008上 有些只在evc上  能不能有什么宏来区别vs2008 和evc? …

查看全部问答>

wince下有没有像XP那样的任务管理器?

最近在做WINCE开发,菜鸟一个! 不知道有没有能查看程序线程数和占用内存大小之类的工具?…

查看全部问答>

急!!!!!!!!关于ADS问题!!!!!!!

今天做了周公的GPIO(流水灯实验),结果编译时出现这样的问题,could not open file E:\\学习\\arm\\.......... 怎么才能调试好,请大侠帮忙,我是菜鸟!!!!!!…

查看全部问答>

求YH14-SF340X开发板源代码

最近买了一块成都亿和科技公司的这款开发版,里面源代码都是类似这种         P3 &= ~( 1…

查看全部问答>

wince应用程序开发 问题

用VS.NET2003开发wince的应用程序,需要PB导出SDK再开发吗? 还有用VS.NET2003开发好应用程序怎样放到ARM板的wince操作系统里运行? …

查看全部问答>

我看 TI SEH 套件

这是在 华强电子网 看到的一个帖子。原文如下:(就是到了后来不知为何出现了乱码,看来没管理好呀)http://www.hqew.com/tech/doc/400295.html下面是自己看到这则消息的猜测和观点,当然是很不成熟的,欢迎批评,谢谢指教!其实早在知道MSP430的时 ...…

查看全部问答>

【Atmel SAM D21开发笔记】实验一、滴答时钟及LED闪烁实验

       甲壳虫生成的工程内容忒多了,对于第一次接触此款电路的,看着闲乱、烦。于是决定使用MDK对此板卡进行开发。关于MDK下初建工程,论坛已经有人发帖了,这里就不详细的介绍。(软件环境 keil 5)      &n ...…

查看全部问答>