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。

评论:

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:我们手上的是厂家送的。

发表评论:

昵称

邮件地址 (选填)

个人主页 (选填)

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

  1. Linux内核深入理解系统调用(1):初始化-入口-处理-退出

    Linux内核深入理解系统调用(1):初始化-入口-处理-退出 rtoax 2021年3月 1. Linux 内核系统调用简介 这次提交为 linux内核解密 添加一个新的章节,从标题就可以知道, 这 ...

  2. uboot启动Linux内核(一):uboot启动流程

    1. uboot介绍:    uboot是bootloader的一种,是Linux内核的引导启动程序.会初始化嵌入式平台上的一些外设(比如:ddr等),把Linux内核镜像从flash中加载到内存,在 ...

  3. linux内核跳转到文件系统,Uboot到Kernel到文件系统(Cortex_A9)移植详细文档

    处理器:Exynos4412  Cortex_A9 四核 一: 4412 uboot 目录: uboot基本配置编译 make xxx_config 编译结果如上图. Uboot启动第一阶段分析: 1 ...

  4. linux内核那些事之pg_data_t、zone结构初始化

    free_area_init 继续接着<linux内核那些事之ZONE>,分析内核物理内存初始化过程,zone_sizes_init()在开始阶段主要负责对各个类型zone 大小进行计算, ...

  5. uboot加载linux内核加载那些内容,uBoot和Linux内核中涉及到的几个地址参数的理解...

    uBoot和Linux内核中涉及到的几个地址参数的理解 ************************************************* arch/arm/Makefile //内核 ...

  6. USB总线-Linux内核USB3.0设备控制器之dwc3 gadget驱动初始化过程分析(五)

    1.概述 USB设备控制器(UDC)驱动的框图如下图所示,由三部分组成.第一部分是UDC驱动核心层,在drivers/usb/gadget/udc/core.c文件中实现,该层是一个兼容层,将USB ...

  7. 【学习笔记】编译Linux内核(下)---KConfig、Makefile详解以及ARM平台Linux内核的编译

    本文主要介绍Linxu2.6的内核配置系统. 如果你浏览一下源代码目录,就可以发现源码目录及其子目录中有很多的KConfig文件和Makefile文件.这些文件什么作用呢?正是这些文件组成了Linux ...

  8. 编译arm linux内核,编译Linux内核(下)---KConfig、Makefile详解以及ARM平台Linux内核的编译...

    转载自:http://blog.csdn.net/newthinker_wei/article/details/8022696 本文主要介绍Linxu2.6的内核配置系统. 如果你浏览一下源代码目录, ...

  9. 裸板烧写linux内核,嵌入式 hi3518c裸板uboot烧写、kernel烧写、fs烧写小结

    1.在uboot中我可以添加自己的命令,添加的方法是找到一个uboot的命令,然后模仿着去增加属于自己的命令代码以及实现函数就可以 2.记住在使用printf进行调试的时候,在遇到指针或者字符串的时候 ...

  10. linux内核radeon gpu源码解析3 —— Radeon初始化

    解析DRM代码,以从底层介绍显卡驱动的初始化过程,显卡类型是AMD的radeon r600以后的系列显卡.基本的过程就是驱动载入,硬件初始化,设置硬件独立的模块(如内存管理器),设置显示(分辨率等). ...

最新文章

  1. 智源深度 | NLP 面临的三大真实挑战(含视频)
  2. python 命令行参数-Python处理命令行参数
  3. 实现正则表达式的*和?匹配
  4. 计算机网络基础教程---强烈推荐!来自锐捷官方网站
  5. 【百度地图API】发布静态图API啦!只需一个网址,即可展示定制百度地图!
  6. php 获取指定时间 次日,PHP时间判断语句
  7. bread是可数还是不可数_英语语法丨可数名词和不可数名词讲解(上),学英语必学...
  8. 关于依赖倒置,控制反转和依赖注入的趣谈
  9. java的基本数据类型有什么特点_【Java】常用数据类型及其特点(万物都是变量)...
  10. 机械硬盘的改进想法:一臂多头
  11. ServerVariables 变量
  12. 【Java】Java_18 方法
  13. Tomcat发布项目时,更改浏览器地址栏图标
  14. 大数据推荐系统算法(3) 用户画像
  15. 35岁老年程序员的绝地翻身之路
  16. 【信息通信与软件工程国际会议】2022年第二届信息通信与软件工程国际会议
  17. 吉大计算机暑期学校,2014年大学生暑期学校活动第三轮通知
  18. gpu云服务器运行游戏_显卡云主机-游戏安卓模拟器GPU独立显卡云服务器
  19. 满足石油管道的测量设备
  20. we8iso8859p1 java_jdbc连oracle数据库,输出到页面上是乱码,请问怎么解决?

热门文章

  1. 1359C. Mixing Water
  2. 小米路由器怎么连接无盘服务器,播放器+服务器的方法瞬间玩转小米路由方法图文介绍...
  3. linux远程虚拟桌面,2020-07-23 Linux 远程连接虚拟桌面
  4. java webservice用户验证_使用java webservice的.net4.0 web app需要Usernametoken身份验证
  5. WINCE6开机进度条
  6. 在 WinCe 平台读写 ini 文件
  7. 可以让你少奋斗十年的工作经验
  8. SpringMVC遇到的问题——GET http://localhost/spring_mvc_war_exploded/js/jquery-3.3.1.js net::ERR_ABORTED 404
  9. 东北师范大学计算机科学与技术录取分数线,东北师范大学计算机科学与技术专业2015年在河南理科高考录取最低分数线...
  10. 【转】QGridLayout 详解