基于龙芯2K1000移植uboot之DDR

  • 移植环境
  • 开始移植
  • 额外说明

移植环境

CPU:LS2K1000
DDR:SCB13H8G162BF-13KI
编译环境:Ubuntu16.04+gcc-4.9.3-64-gnu
GCC来源:GCC
uboot来源:uboot
工具:龙芯的EJTAG调试工具。
硬件平台采用了,紫光双片1GB DDR3组成的内存。

开始移植

原理图如下:

自己设计的DDR,代码八成是跑步起来的。肯定要做DDR的移植,这里我们就需要借助龙芯的EJTAG来进行程序烧录和调试。首先进行CPU的ID读取,确保CPU能正常工作。读出来如下图所示,就可以进行UBOOT的烧写了,这里的前提是UBOOT能正常烧录并启动。
注意:上电后必须要按power键才能读到到CPU的ID,power键所接引脚为ACPI_PWRBTNn。

在对代码熟悉之后,可以看到DDR相关的初始化都在汇编阶段
这里面我们只需关注文件:board/loongson/ls2k/lowlevel_init.S,对于DDR具体的初始化流程请自行补课。

  1. 内存参数
dli     s1, DDR_S1

那么这个参数的含义是什么呢?
在board/loongson/mm/ddr_config_define.h文件中的87行开始看宏定义,这里我就直接贴上我的理解:

bit 含义
S1[31:30] 颗粒类型:2’b10 代表 DDR2,2’b11 代表 DDR3
S1[29] 是否包含 ECC 颗粒:1’b1 代表包含,1’b0 代表不包含
S1[28] DIMM 类型:1’b1 代表 RDIMM,1’b0 代表 UDIMM
S1[27] DIMM 数据宽度:1’b1 代表 32 位,1’b0 代表 64 位
S1[26:24] 行地址位数:设置为实际的行地址位数与 16 的差值
S1[23 BANK 数量:1’b1 代表 8 个 BANK,1’b0 代表 4 个 BANK
S1[22] ADDR MIRROR:1’b1 代表使能,1’b0 代表不使能
S1[21:20] 列地址位数:设置为 12与实际的列地址位数的差值
S1[19:16] CS_MAP:对应的 CS 是否连接内存条,分别为 CS3、CS2、CS1 、 CS0
S1[15] 颗粒的数据宽度:1’b1 代表 x16 颗粒,1’b0 代表 x8 颗粒
S1[14:8] 总的内存容量:该值以 512M 为单位
S1[7:4] 保留
S1[3: 2] 内存通道: 2’b00 表示两个通道, 2’b01:仅使用 MC0, 2’b10 :仅使用 MC1
S1[1:0] 节点号

好了,知道DDR_S1参数的含义了,那我们找到原先的定义并加以修改即可。
原先的S1参数定义在:board/loongson/ls2k/config.mk

PLATFORM_CPPFLAGS +=-DDDR3_DIMM -DLSMC_2 -DLOONGSON_2K  -DDIMM_ID=0x54 -DDDR_PARAM_018="0x2020202016100000" -DBEEP_GPIO=0 -DDDR_S1=0xc0911004 -DNO_AUTO_TRFC #-DRESERVED_COREMASK=2 -DDISABLE_HARD_LEVELING

查阅DDR手册,关于SCB13H8G162BF-13KI内存颗粒的参数:
64M words x 16 bits x 8 banks &
Two 512Mbit x 8 dies stacked (x16)
Row address: A0 to A15
Column address: A0 to A9

bit 含义 bit 含义
S1[31:30] DDR3:2’b11 S1[21:20] 列地址10位,差值为2:2’b10
S1[29] 不包含:1’b0 S1[19:16] CS0:4’b0001
S1[28] 无:1’b0 S1[15] 数据宽度16:1’b1
S1[27] 64 位:1’b0 S1[14:8] 2GB:7’b0000100
S1[26:24] 行地址16位,差值为0:3’b000 S1[7:4] 保留:4’b0000
S1[23] 8 个 BANK:1’b1 S1[3: 2] 仅使用 MC0:2’b01
S1[22] 不使能:1’b0 S1[1:0] 节点号为0:2’b00

其实只需要改上面红色部分,其余位为2K1000芯片架构特性,不用改。所以最后的DDR_S1为0xc0a18404。

  1. 其他相关参数修改
    添加参数:CONFIG_DDR_32BIT,这个主要是因为我们的板子上只用了2个16数据宽度的DDR组成的32位数据宽度。
    这里顺便将board/loongson/ls2k/config.mk中的DDR参数提取到include/configs/ls2k.h文件中,最后如下:
/* ls2k ddr配置  2片1G DDR*/
#define DDR3_DIMM
#define LSMC_2
#define DDR_PARAM_018  0x3535353516100000
#define DDR_FREQ DDR_CLOCK_RATE/1000000
#define DDR_S1 0xc0a18404
#define CONFIG_DDR_32BIT
#define ARB_LEVEL

3.将board/loongson/ls2k/lowlevel_init.S代码中下面一行注释掉,因为我们板子上需要使用DDR_A15这个管脚:

//#define  DISABLE_DDR_A15

4.将board/loongson/ls2k/loongson_mc2_param.S拷贝一份为loongson_mc2_param-ddr32bit.S,并在loongson_mc2_param-ddr32bit.S中添加以下代码:

#ifdef CONFIG_DDR_32BIT
#define _DDR_PARAM_1c0(x) 0x3030c80c03042003
#define _DDR_PARAM_1f0(x) 0x000801e4ff050101
#define _DDR_PARAM_210(x) 0x0008010e00030006
#elif defined(CONFIG_DDR_16BIT)
#define _DDR_PARAM_1c0(x) 0x3030c80c03042003
#define _DDR_PARAM_1f0(x) 0x000801e4ff030101
#define _DDR_PARAM_210(x) 0x0008010d00030006
#else
//#define _DDR_PARAM_1f0(x) 0x000801e4ff000101
//#define _DDR_PARAM_210(x) 0x0008010f00030006
#define _DDR_PARAM_1c0(x) x
#define _DDR_PARAM_1f0(x) x
#define _DDR_PARAM_210(x) x
#endif#ifdef DDR_CLOCK_MASK
#define _DDR_PARAM_140(x) 0x0003000001ff0100|DDR_CLOCK_MASK
#elif !defined(DDR_PARAM_140)
#define _DDR_PARAM_140(x) x
#else
#define _DDR_PARAM_140(x) DDR_PARAM_140
#endif

编译,烧写后看启动log如下:

msize = 0x00000004
1f7c210700103f49
The uncache data is:
00000000:  5555555500000000
00000008:  aaaaaaaa3018b02b
00000010:  3333333355555555
00000018:  ccccccccaaaaaaaa
00000020:  7777777700000000
00000028:  88888888053c2a47
00000030:  1111111177777777
00000038:  eeeeeeee88888888

好了,到这里,至少数据的高32位正确了。

但是这个问题一直没有调试思路,看了几天,发现第2步中,多添加了一个参数ARB_LEVEL。改为如下即可,uboot就可以跑起来了:

/* ls2k ddr配置  2片1G DDR*/
#define DDR3_DIMM
#define LSMC_2
#define DDR_PARAM_018  0x3535353516100000
#define DDR_FREQ DDR_CLOCK_RATE/1000000
#define DDR_S1 0xc0a18404
#define CONFIG_DDR_32BIT
//#define ARB_LEVEL

调试记录参见:源码改动

额外说明

AUTO_DDR_CONFIG //自动探测内存的开关,当板卡使用内存条时需要打开此选项,颗粒需要关闭
DDR_RESET_REVERT //如内存RESET管脚接了反向器需要关闭此宏
这个DDR_RESET_REVERT参数也比较重要,这个是根据DDR RESET管脚外部电路上是加了反相器,决定是否使能。我这里加了如下图所示:
具体追下源码board/loongson/ls2k/loongson_mc2_param-ddr32bit.S:

#ifdef DDR_RESET_REVERT
#define DDR_PARAM_150 0x00000000f0020000   //reset pad
#endif
...
MC0_DDR3_CTRL_0x150: .dword DDR_PARAM(150, 0x00020000f0020000)

也就是未定义DDR_RESET_REVERT时,程序默认是开启反相模式。这种模式下,复位信号引脚在进行内存实际控制的时候,有效电平与一般的控制模式相反。

基于龙芯2K1000移植uboot之DDR相关推荐

  1. 基于龙芯2K1000移植uboot之NAND

    基于龙芯2K1000移植uboot之NAND 移植环境 开始移植 利用原生驱动(不成功) 利用PMON驱动移植(成功) 移植环境 CPU:LS2K1000 NAND:MT29F16G08 编译环境:U ...

  2. 基于龙芯2K1000平台CL1606AD760-8驱动调试总结

    历经两周终于将设计的AD采集板驱动起来,并且读取电流值成功,唯不是一个突破!由硬件设计再到驱动,一步步设计改变:到设备树添加驱动并加载,总结主要分为两方面,一个驱动调试和硬件调试.细节如下: 驱动调试 ...

  3. 基于龙芯 2K1000 的嵌入式 Linux 系统移植和驱动程序设计(二)

    第 3 章 嵌入式软件系统移植 本课题中嵌入式系统正常工作的前提是嵌入式软件系统完整且能正常工作, 以便为之后的软件开发提供一个能够正常工作的平台.引导程序 PMON 需要完成 内核引导,嵌入式 Li ...

  4. 基于龙芯2K1000适配WIFI模块(型号:Intel 8265NGW)

    硬件平台:龙芯2K1000 evb开发板 + Intel 8265NGW 开发环境:Ubuntu16.04+gcc-4.9.3-64-gnu 平台环境1:PMON+linux3.10+loongnix ...

  5. 基于龙芯2K1000的3U CPCI主板

    产品图片 技术信息 处理器与系统 CPU 龙芯LS2K1000 内存 板载4片 DDR3内存颗粒,总容量2GB BIOS 龙芯PMON PICMG标准 PICMG 2.0 CompactPCI R3. ...

  6. 编译移植龙芯2K1000平台下的qt-5.13

    编译移植龙芯2K1000平台下的qt-5.13 本文记录对龙芯2K进行qt5.13.1版本的移植. 本文中对于tslib的安装不做讲解,使用了QT4进行核心板开发的童鞋一般情况下,应该已经安装好了ts ...

  7. 龙芯2K1000开发板资料1.2版更新了

    叮,今日更新已送达. 本次指南更新新增了pmon下操作GPIO章节和pmon下Ejtag使用章节,感兴趣的快来看看吧~ 更新重点 1.新增了9.6 pmon下操作GPIO章节 2.新增了9.7 pmo ...

  8. 迅为龙芯2K1000开发板国产处理器操作系统

    1.硬件配置 国产龙芯处理器,双核64位系统,板载2GDDR3内存,流畅运行Busybox.Buildroot.Loognix.QT5.12 系统! 2.接口全 板载4路USB HOST.2路千兆以太 ...

  9. 龙芯2K1000运行linux,龙芯2K1000支持补丁有望在Linux 5.13进入内核

    出品 | OSCHINA 文 | 局长 Linux Kernel 的 commit 信息显示,针对龙芯 2K1000 芯片的内核支持有望在 Linux Kernel 5.13 中被合并入主线. 龙芯 ...

最新文章

  1. jquery遍历json与数组方法总结each()
  2. Linux之文件压缩与打包
  3. 【Python】推荐20个好用到爆的Pandas函数方法
  4. 最短Hamilton路径(状压dp)
  5. angular js 使用pdf.js_排名靠前的几个JS框架发展趋势和前景
  6. 支持字典_手把手教你学Python之字典
  7. Spring源码:ApplicationContextInitializer
  8. 【论文】最新图学习推荐系统综述 | Graph Learning Approaches to Recommender
  9. 只出现一次的数字 (桶排序和位运算)
  10. Windows 微软雅黑(Microsoft YaHei)+ Monaco 字体整合方案
  11. 计算机服务怎么打开flash,快速讲解Win10自带的浏览器如何开启Adobe Flash?
  12. python人脸检测与微信小程序_微信小程序人脸识别功能
  13. 计算机中函数的括号怎么输,Excel函数中括号的使用
  14. 用计算机在作文格中打单字字,二年级信息技术第3—12课教案
  15. Python之win7环境下安装python3
  16. 【论文翻译】异构网络的影响与相似性
  17. 笔记整理--Linux守护进程
  18. 家里WiFi信号差的问题你碰到过吗?WiFi Mesh路由或许能够解决
  19. mac虚拟机开发android,安卓手机原来也能安装 Windows和macOS 系统?!
  20. 革文B2B行业洞察:中国气凝胶市场分析、竞争格局和发展趋势

热门文章

  1. 用了10年开源工具,换了Smartbi后,3分钟搞定一份报表
  2. 如何使用Keil uVision2软件调试单片机程序
  3. 互联网公司的名称来由,知道真相的我眼泪笑出来!
  4. html 像素 视频教程,canvas像素点操作之视频绿幕抠图
  5. python安装失败了_为什么python安装失败
  6. 流水账记一下这一年多
  7. 感动世界的50首歌和他们背后的故事2
  8. 进入页面输入框自动获取焦点
  9. 小米 红米 Redmi note11 4G 5G 手机解锁BL 秒BL解锁 教程 跳过168小时 selenes evergo线刷机包下载
  10. C++中的模板(templates)