linux内核ddr初始化,X-007-UBOOT-DDR的初始化(Bubblegum-96平台)

X-007-UBOOT-DDR的初始化(Bubblegum-96平台)

作者:wowo 发布于:2016-7-21 22:47

分类:X Project

1. 前言

到目前为止,“X Project”在Bubblegum-96平台上的代码,都是运行在SRAM中。由于SRAM的size很小(最多也就96KB),如果要做更多的事情,就必须把DDR跑起来。不过,关于Bubblegum-96平台的DDR driver,我和codingbelief同学折腾了很久,试图找出一个最佳的方法,给大家呈现出DDR driver的开发方法和开发步骤。最终,受限于“资源”的短缺,还是失败了。

根据Bubblegum-96公开的资料,只知道它包含了一个2GB的、单bank的LPDDR,除此之外,找不到任何技术有关的细节,如LPDDR的datasheet、S900 DDR controller的说明、DDR时钟的配置等等。没有这些东西,我们根本无法完成DDR的配置,更不用说以此介绍、分析DDR driver了。

但是,虽然困难重重,“X Project”还是要进行下去,既然常规方法走不通,我们就采用一些非常规的手段,无论如何,还是能把DDR成功的初始化起来的。由于是非常规手段,当然就无法开源,也无法给大家讲解了。

因此,本文关于DDR的技术细节不多,主要目的是结合DDR的初始化,进一步介绍嵌入式linux开发的基本过程,包括如下知识点:

嵌入式Linux的启动过程。

u-boot SPL的使用场景。

u-boot启动过程中DDR初始化的流程。

2. Bubblegum-96的启动过程

由于RAM资源的短缺,嵌入式系统的启动过程是相当繁琐的,以Bubblegum-96为例:

CPU启动时,只有96KB的SRAM可用。

CPU启动时,ROM code只会从外部存储介质中(NAND、MMC、SD等)拷贝并执行2KB的代码。

首先与上面两个条件,Bubblegum-96的启动代码必须具备如下的特点。

1)软件从外部存储介质加载并执行的时候

a)第一个被执行的image,必须小于2KB(我们暂时称它为SPL,Secondary Program Loader)。

b)SPL在有限的size中,必须完成两个事情:初始化DDR;将后续的启动代码(如u-boot)从存储介质中copy到DDR中执行。

c)u-boot在DDR中运行(不再受限于系统资源),进行必要的初始化之后,将linux kernel copy到DDR中并执行。

d)linux kernel执行,并加载rootfs。

2)固件更新的时候(这里提供一种方案,将借助Android的fastboot,不唯一)

a)第一个被执行的image(SPL),必须小于SRAM的size(根据经验,Bubblegum-96平台,要小于70KB)。

b)通过ROM code的DFU程序,将SPL上传到SRAM并执行。

c)SPL初始化DDR,并将控制权重新交给ROM code的DFU程序。

d)通过ROM code的DFU程序,将u-boot(size不再受限)上传到DDR并执行。

e)u-boot中启动fastboot服务,通过fastboot协议,更新固件。

本文将基于“X Project”前面的成果,介绍通过将SPL上传到SRAM并执行、初始化DDR,然后再把u-boot上传到DDR并执行的过程。

3. 初始化过程介绍

3.1 编写DDR driver,正确初始化DDR

由于非技术的原因,这里无法多说,感兴趣的同学,可以在资料充足的情况下,在自己的板子上尝试。最终的结果,就是导出一个类似于xxx_ddr_init()的接口,该接口会被SPL调用。

3.2 在SPL的初始化代码中,调用DDR的init接口,初始化DDR,然后将控制权交回给ROM code

基于“X-003-UBOOT-基于Bubblegum-96平台的u-boot移植说明”的成果,我们已经可以在SPL的board_init_f接口中点亮一盏LED灯,现在要做的,就是调用DDR的初始化接口,如下:

void board_init_f(ulong bootflag)

{

bubblegum_early_debug(1);

#ifdef HAS_DDR_SOURCE_CODE

s900_ddr_init();

#endif

reboot_to_adfu();

}

注1:这里之所以要加一个宏定义,是因为源代码中没有DDR的source code,避免编译错误而已。

DDR初始化完成后,需要把控制权交回给ROM code的DFU程序,这可要费一番心思,如下:

static void reboot_to_adfu(void)

{

void (*call_adfu)(void);

//call_adfu = (void (*)(void))0xffff5a00;

call_adfu = (void (*)(void))0xffff0400;

call_adfu();

while (1);

}

我这里用了一个比较笨的方法,直接跳转到S900 ROM code的起始地址了,大家可以根据自己平台的实际情况,自行处理。

以上SPL并没有source code提供,我把编译出来的bin文件共享出来了,可参考:

3.3 修改u-boot的代码,完善dram_init接口,告诉u-boot当前DDR的size

int dram_init(void)

{

printf("dram_init\n");

bubblegum_early_debug(11);

/* no need do dram init in here, we have done it in SPL */

gd->ram_size = 2 * 1024 * 1024 * 1024;    /* 2GB, TODO */

printf("dram_init OK\n");

return 0;

}

由于SPL已经完成了DDR初始化,这里什么事情都不需要做,只要通过gd->ram_size告知u-boot DDR的size(这里是2GB)即可。当然,这里的赋值有点粗暴,后续再完善吧。

3.4 修改u-boot的配置项,将u-boot编译到DDR中,从DDR执行

改动如下:

-#define CONFIG_SYS_TEXT_BASE CONFIG_SPL_TEXT_BASE

-#define CONFIG_SYS_INIT_SP_ADDR CONFIG_SPL_STACK

+#define CONFIG_SYS_TEXT_BASE 0x11000000

+#define CONFIG_SYS_INIT_SP_ADDR (CONFIG_SYS_SDRAM_BASE + 0x7ff00)

/* Some commands use this as the default load address, TODO */

-#define CONFIG_SYS_LOAD_ADDR (CONFIG_SYS_SDRAM_BASE)

+#define CONFIG_SYS_LOAD_ADDR (CONFIG_SYS_SDRAM_BASE + 0x7ffc0)

S900 DDR的地址映射是从0x0开始的,我们随便找一个地址(这里是0x11000000)。编译生成新的bin文件后,进行简单的测试,具体如下。

以上可参考如下patch:

4. 测试

在build目录编译完成后,按照如下的步骤执行:

1)按住Bubblegum-96的ADFU键,使板子进入DFU模式

2)按住Bubblegum-96的ADFU键不松开,将splboot.bin(就是我们的SPL image)上传到SRAM并执行

sudo ../tools/dfu/dfu bubblegum 0xe406b200 ../tools/actions/splboot.bin 1

3)执行完毕后,会重新进入DFU模式,进入后,可以松开ADFU按键。

4)将u-boot上传到DDR并执行(注意上传位置和CONFIG_SYS_TEXT_BASE 一致)

sudo ../tools/dfu/dfu bubblegum 0x11000000 out/u-boot/u-boot-dtb.bin 1

5)检查串口打印,执行成功。

原创文章,转发请注明出处。蜗窝科技,www.wowotech.net。c6a6308114f401be7df747ae46f2b4db.png

评论:

ary

2016-08-07 20:06

我觉得wowo可以考虑先在一个成熟的开源板子上做一遍移植,一是通用的板子大家都能买到,另外就是开源板子硬件公开程度更高,资料更全,移植更方便

2016-08-07 20:27

@ary:多谢提议,其实不用太在意板子,大家可以用不同的板子,思路一样就可以了。

另外不成熟的板子,会遇到一些问题,有问题也是学习的过程。

现在有同学在tiny210上面移植了(比较成熟了),可以参看:

http://www.wowotech.net/forum/viewtopic.php?id=52

2016-07-25 19:39

wowo:

Bubblegum-96这个板子你们是买的还是?

2016-07-26 08:52

@pingchangxin:我们手上的是厂家送的。

发表评论:

昵称

邮件地址 (选填)

个人主页 (选填)

d4e3789769c8ad44c7e403863bfc3822.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/442224.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux message日志只有4k,linux命令查看日志

首先介绍几个日志查看种常用的简单命令:1、tailtail 命令可用于查看文件的内容,有一个常用的参数 -f 常用于查阅正在改变的日志文件。tail -f filename 会把 filename 文件里的最尾部的内容显示在屏幕上,并且不断刷新,只要 filena…

linux emule 编译 wx-config --libs,LeezPi-RK3399_Android9编译说明

# LeezPi-RK3399_Android9固件编译[TOC]## 准备工作编译 Android 对机器的配置要求较高:* 64 位 CPU* 16GB 物理内存交换内存* 30GB 空闲的磁盘空间用于构建,源码树另外占用大约 25GB官方推荐 Ubuntu 14.04 操作系统,经测试,Ubunt…

linux 4.4内核特性,Linux Kernel 4.4.19 LTS长期支持版发布

原标题:Linux Kernel 4.4.19 LTS长期支持版发布摘要:近日,内核开发者Greg Kroah-Hartman公布了长期支持的Linux 4.4 Kernel系列第19个维护版本的细节。Linux 4.4是目前最新的LTS内核分支,被Arch Linux, Solus和Ubuntu Linux等众多…

linux 软件源 概念,Linux 软件源介绍

陈科肇1.软件源简介软件源是Linux系统免费的应用程序安装仓库,很多的应用软件都会这收录到这个仓库里面,按类型分则有:1).软件仓库:各类软件的二进制包和源代码2).ISO镜像:发行版的ISO文件软件源可以是网络服务器&…

linux 设备 major 253,redhat5.5测试环境中使用udev配置raw设备

在redhat 5中,是通过udev来管理raw设备的。 那么udev如何知道raw设备, 就是通过MAJOR和 MINOR。 如果我们只写:ACTION"add", KERNEL"sda", RUN"/bin/raw /dev/raw/raw1 %N"那么Udev就无法识别出raw设备&#x…

linux系统如何拨号上网连接,教你在Linux下如何使用ADSL拨号上网

教你在Linux下如何使用ADSL拨号上网发布时间:2007-10-29 10:22:09来源:红联作者:demon一、如果是新手刚开始使用Linxu的话,可用图形界面:办法:直接在网络里建立新的拨号连接即可二、使用文本模式的话:如果存在文件 /usr/sbin/pppd…

linux git diff patch,拿到git patch要怎麼用一般patch指令merge?

如果你的codebase工作環境沒有使用git作管理, 你要怎麼做從git產生的patch呢?首先要先知道diff 與 patch 的關係, 傳統的linux裡面, .patch檔案是透過diff產生的Diff 和 Patch 的簡易操作使用筆記:(參考: Tsung’s Blog)diff -Naur file1 file2 > project.patch # Diff 產生…

c语言汇编混编,c语言与汇编混编写法

R13 (stack pointer)R14 (Link Register)R15 (program counter)c语言中内嵌汇编的规则:内嵌汇编器与armasm的区别:访问全局变量:unsigned char LDRB/ STRBunsigned short LDRH/STRHunsigned int LDR/…

c语言中entern int x y,关于extern和int main()的结构有关问题

关于extern和int main()的结构问题本帖最后由 hashcat 于 2015-09-20 12:34:50 编辑这是c实现md5加密的代码,报错部分是两处extern,其实也就是两处extern需要改动,但是试了半天,没搞懂要怎么改...#include #include #define MD5_R…

关于c语言的英文论文,C语言论文外文翻译.doc

C语言论文外文翻译C语言论文外文翻译ASP.NET Technique1. Building ASP.NET PagesASP.NET and the .NET FrameworkASP.NET is part of Microsofts overall .NET framework, which contains a vast set of programming classes designed to satisfy any conceivable programming…

用C语言创建多个用户,实现支持多用户在线的FTP程序(C/S)

1 importjson2 importos3 importshelve4 importstruct5 importsubprocess67 from conf importsettings8 from lib importcommon91011 classHandlerRequest:12 """处理用户请求."""13 max_packet_size 819214 encoding utf-81516 struct_fmt i…

android 代理 wifi热点,android wifi热点默认网关

原贴:https://blog.csdn.net/jingzitakk66/article/details/89146696项目需求,android端创建热点,电脑端连接此热点后用socket实现数据传输,PC端获取网卡时无法判断多网卡情况下哪个IP为需要的IP,所以搜了下&#xff0…

android实现电话功能实验报告,安卓开发实验报告-20210407005833.docx-原创力文档

文档编制序号:[KKIDT-LLE0828-LLETD298-POI08]文档编制序号:[KKIDT-LLE0828-LLETD298-POI08]安卓开发实验报告安卓开发实验报告目录页面跳转长按图标抖动以及显示删除页面跳转功能:通过点击button实现2个activity之间的跳转。1.设置监听器监听…

android matrix 缩放,android – 如何获取任意矩阵的缩放值?

图像按矩阵缩放:Matrix matrix new Matrix();matrix.postScale(...);matrix.postTranslate(...);matrix.postRotate(...);...我希望缩放的图像不会小于原始图像的一半,因此总变焦不应小于0.5.但是怎么做呢?我试图获取矩阵的第一个值来检查:f…

买iphone不买android,为何宁可用4年前的苹果6s,也不买两三千的安卓呢?理由很真实...

在这个信息时代,几乎每个人都离不开手机,手机渗入到了我们生活的方方面面,不管是社交聊天、还是影音娱乐,甚至是办公出行,没有手机,很多人都会寸步难行。全球的智能手机市场竞争处于白热化的阶段&#xff0…

android 仿ios timepicker,android:TimePicker仿照IOS時間選擇器,可自定義選擇器

背景:項目要求寫一個選擇器:不僅僅是單純的時間,還包括自定義部分.搜了很久,搜出來只用一個自定義view.java類,再簡單封裝下的選擇器:貼下源碼:public class PickerView extends View{public static final String TAG "PickerView";/*** text之間間距和minTextSize之…

html5画图作品,8款最佳HTML5绘图工具

HTML5无疑是当前最受宠的一项技术,今天推荐8款HTML5绘图工具,同样惊艳你的眼球!这些绘图工具大多数是用HTML5画布(Canvas)实现的,部分辅以Javascript。对每一个web设计者来说,制图和草绘是他们工作中最喜欢的一件事情了。草绘和制…

vivoiqooz1鸿蒙系统,iQOOZ1评测:vivo新一代性价比神机

【手机中国评测】如果说2019是5G发展的元年,那么2020就是5G技术和终端奋起发力的一年。纵观目前市面上的5G机型我们不难发现,“涨价”已经成为了2020年的新关键词。技术成本的提升,让5G手机似乎失去了我们传统意义上的性价比。但这世间从来不…

html在表格添加下拉按钮,Bootstrap-table 使用说明--如何在表格td里增加一个按钮

如何在表格td里增加一个按钮:如何在列表操作列区域添加按钮初始化表格table.bootstrapTable --》columns 增加:{field: operate, title: __(Operate), table: table,buttons: [{name: detail, text: 详情, title: 详情, icon: fa fa-list, classname: bt…