这部分留给mc_init(这可能是个大话题。)

1. 这个函数被调用了两次,参数t3分别是0和1

mc_init:move    t7, ra     //保存返回值,可能中间要调用其他函数syncnopnopnopnop//t0 = 0x900000003ff00000  两个偏移都是0x10??,配置了同一个窗口??GET_NODE_ID_a0;    //a0=0;s1也传过来了,参数OFFSET,BASE,MASK,MMAPXBAR_CONFIG_NODE_a0(0x10, \0x0000000000000000, \0xfffffffff0000000, \0x00000000000000f0)beqz    t3, 1f     //第一次进来的时候等于0,第二次等于1nopGET_NODE_ID_a0;XBAR_CONFIG_NODE_a0(0x10, \0x0000000000000000, \0xfffffffff0000000, \0x00000000000000f1)
1:syncnopnopnopnop

t7 保存了返回值。

a0 = 0.

t0 = 0x900000003ff00000

1.1 展开宏定义,这个已经见过多次了

#define XBAR_CONFIG_NODE_a0(OFFSET, BASE, MASK, MMAP) \daddiu  v0, t0, OFFSET;       \dli     v1, BASE;             \or      v1, v1, a0;           \sd      v1, 0x00(v0);         \dli     v1, MASK;             \sd      v1, 0x40(v0);         \dli     v1, MMAP;             \sd      v1, 0x80(v0);

这里配置0x900000003ff00010,是CPU_WIN2的配置

BASE = 0;

MASK= 0xffff,ffff,f000,0000;

MMAP = 0xf0.   允许映射,指向DDR0控制器,范围0~0xfff,ffff    (256M)

第一次调用的时候,跳到标号1.

第二次调用的时候。执行下面的语句

配置0x900000003ff00010,是CPU_WIN2的配置,把前面的配置给覆盖了。

BASE = 0;

MASK= 0xffff,ffff,f000,0000;

MMAP = 0xf1.   允许映射,指向DDR1控制器,范围0~0xfff,ffff    (256M)

2.继续看代码,有一个跳转

    TTYDBG("\r\nEnable register space of MEMORY\r\n")bal     enable_mc_conf_space       //1167行。禁止MCnop

3. 进入enable_mc_conf_space函数

//for 3A8
LEAF(enable_mc_conf_space)
/*********************
pre-condition::t2: chip configure register addresst3: MC select
*********************/lw      a2, 0x0(t2)li      v1, 0x1beqz    t3, 1f    //t3等于0,则跳转nopsll     v1, v1, 5  //t3等于1时,左移5位
1:sll     v1, v1, DDR_CONFIG_DISABLE_OFFSET    //8not     v1, v1        //按位取反and     a2, a2, v1    //t3=0,[8]清零mc0禁止 t3=1,[13]清零mc1禁止sw      a2, 0x0(t2)syncjr      ranop
END(enable_mc_conf_space)

t2 = 0x900000001fe00180

在初始化的时候,先禁止对应的MC控制器??还是使能??

4. 设置t8 = 0x9000,0000,0ff0,0000

    GET_NODE_ID_a0;dli     t8, DDR_MC_CONFIG_BASE    //0x9000,0000,0ff0,0000or      t8, t8, a0

a0 = 0;

5. 识别DDR类型

    GET_SDRAM_TYPE           //a1=3,DDR3dli     t1, 0x2beq     t1, a1, 2f     //不相等,不跳转nopdli     t1, 0x3beq     t1, a1, 3f      //ddr3,跳128行nop//not DDR2 and not DDR3, errorsPRINTSTR("\r\n!!! ERROR: NOT recognized DDR SDRAM TYPE. !!!\r\n");b       3fnop

6. 准备DDR内存配置参数

3:  //DDR3          //--------------------------------执行这GET_DIMM_TYPE   //dimm buffer register: NO  a1 = 0;bnez    a1, 1fnop//UDIMMdla     a2, ddr3_reg_data     //ddr3_reg_data是个数组,loongson_mc2_param.S(start.S中1818包含)beqz    t3, 21f               //第一次t3等于0,跳转,第二次不跳转nopdla     a2, ddr3_reg_data_mc1   //其实与ddr3_reg_data数据一样
21:

7. 调用函数ddr2_config

    b       4f   //注意参数 a2     跳到183行nop
4:bal     ddr2_config      //lsmc_config_param.Snop

8. 在另一个S文件中。这个文件在开始的时候被包含进来。

support lsmc(3A8, 3B5~)
    input param:
    a2: mc param address
    t7(option ARB_LEVEL)--do arb level, 0--not level; 1--do level;
    t8: input, Memory Controller config register base
    t3: controller select
        0: MC0
        1: MC1

看一眼注释吧。

a2 已经有了,t8前面已经有了,t3也没问题。t7似乎没用到,反正是0。

9. 将配置信息写入到寄存器,一共写了180个寄存器(64位)

ddr2_config:daddu   a2, a2, s0    //a2是数组的地址,+s0得到的应该是在rom的绝对地址dli     t1, DDR_PARAM_NUM     //ddr_param_define.h  t1 = 180daddiu  v0, t8, 0x0          t8 = 0x9000,0000,0ff0,0000
//write param registers
1:ld      a1, 0x0(a2)     //加载数组中第一个双字(8个字节)sd      a1, 0x0(v0)     //写入到配置寄存器daddiu  t1, t1, -1       daddiu  a2, a2, 0x8     //数组的指针后移8个字节daddiu  v0, v0, 0x8     //寄存器的指针同步后移8个字节bnez    t1, 1b         //t1不等于0,继续循环,应该是循环180次nop

10.设置刷新周期

set_tREFI:   //设置刷新周期dli     t1, DDR_FREQ   //DDR_FREQ = 533  频率divu    t1, t1, 10     //除以10 t1 = 53dli       a2, 78dmulou    a2, a2, t1    //乘法,a2 = 78*53 = 4134 = 0x1026
#ifndef TEMP_EXTREME      //没定义dsrl a2, a2, 8     //右移8位,a2 = 0x10
#elsedsrl   a2, a2, 9
#endif
//  daddu   a2, a2, 1dli        t1, 0x1c8   or      t1, t1, t8   //t1 = 0x9000,0000,0ff0,01c8sb        a2, 0x3(t1)  //写寄存器1个字节,0x9000,0000,0ff0,01cb

寄存器0x0ff0,01cb,没有相关说明。寄存器就是这个。

11.设置RFC

#ifndef  NO_AUTO_TRFC //没定义
set_tRFC:GET_MC0_MEMSIZE    //a1 = 16beqz    t3, 1f     //t3 第一次为0,跳转,第二次为1,不跳转nopGET_MC1_MEMSIZE    //第二次的时候,a1=16
1:move  t1, a1     //t1 = 16GET_MC_CS_MAP     //a1=3beqz    t3, 1f    //t3 第一次为0,跳转,第二次为1,不跳转nopGET_MC1_CS_MAP    //a1=3
1:dli   t5, 0x4   //t5 = 4dli      a2, 0x0   //a2 = 0
cal_memsize:           //计算内存大小dsubu    t5, t5, 1    //t5-1beqz t5, 1f      //等于0,跳转nopand       t4, a1, 0x1   //t4 = 1dsrl a1, a1, 0x1   //a1 右移1位beqz t4, cal_memsize //等于0 则跳转nopdaddu   a2, a2, 1    //a2 += 1b       cal_memsizenop
1:divu  a2, t1, a2   //a2=16/2 = 8GET_SDRAM_WIDTH    //a1 = 1   16bits宽度beqz    t3, 1f     //t3 第一次为0,跳转,第二次为1,不跳转nopGET_MC1_SDRAM_WIDTH   //a1 = 1   16bits宽度
1:dli     t5, 0x2   //t5 = 2beqz    a1, x8    //a1等于0则跳转,这不跳转nopdli     t5, 0x1   //t5 = 1
x8:divu a2, a2, t5  //a2 = 8/1 = 8dli     t1, 0x1      blt        a2, t1, 21f   //a2小于1则跳转dli     t5, 0x9       //t5 = 9dli      t1, 0x2      blt        a2, t1, 21f   //a2小于2则跳转dli     t5, 0xb       //t5 = 0xb dli       t1, 0x4       blt       a2, t1, 21f   //a2小于4则跳转dli     t5, 0x10     //t5 = 0x10  dli      t1, 0x8      blt        a2, t1, 21f   //a2小于8则跳转dli     t5, 0x1adli     t1, 0x10blt     a2, t1, 21f    //a2小于16则跳转dli       t5, 0x23       //t5 = 0x23PRINTSTR("\r\n memsize wrong \r\n")b       2fnop
21:dli      t1, DDR_FREQ     //DDR_FREQ =533dmulou t5, t5, t1       //t5 = 0x23 *533 divu t5, t5, 100      //t5 = t5/100 = 186 =0xBAdli        t1, 0x1c8     or        t1, t1, t8sb        t5, 0x2(t1)     //写寄存器0x1ca2:
#endif

12. 设置偏移位0x210的寄存器[9:8],被清零

//for UDIMM 4cs,open 2T modeGET_DIMM_TYPE     //a1 = 0bnez    a1, 1f    //不等于0则跳转nop//UDIMMGET_MC_CS_MAP    //a1 = 3dli     a2, 0xfbne     a1, a2, 1f   //不相等则跳转,不相等nop//add cmd_timing ,trddata and tphy_wrlat by oneld      a2, CMD_TIMING(t8)dli     a1, 0x1dsll    a1, a1, CMD_TIMING_OFFSETdaddu   a2, a2, a1sd      a2, CMD_TIMING(t8)ld      a2, TRDDATA(t8)dli     a1, 0x1dsll    a1, a1, TRDDATA_OFFSETdaddu   a2, a2, a1sd      a2, TRDDATA(t8)ld      a2, TPHY_WRLAT(t8)dli     a1, 0x1dsll    a1, a1, TPHY_WRLAT_OFFSETdaddu   a2, a2, a1sd      a2, TPHY_WRLAT(t8)
1://for UDIMM 4cs,open 2T modeGET_DIMM_TYPE         //a1 = 0bnez    a1, 1f        //不等于0则跳转,不跳转nop//UDIMMGET_MC_CS_MAP         //a1= 3dli     a2, 0xfbne     a1, a2, 1f    //不相等则跳转,不相等,怎么是重复的??? nop//add cmd_timing ,trddata and tphy_wrlat by oneld      a2, CMD_TIMING(t8)dli     a1, 0x1dsll    a1, a1, CMD_TIMING_OFFSETdaddu   a2, a2, a1sd      a2, CMD_TIMING(t8)ld      a2, TRDDATA(t8)dli     a1, 0x1dsll    a1, a1, TRDDATA_OFFSETdaddu   a2, a2, a1sd      a2, TRDDATA(t8)ld      a2, TPHY_WRLAT(t8)dli     a1, 0x1dsll    a1, a1, TPHY_WRLAT_OFFSETdaddu   a2, a2, a1sd      a2, TPHY_WRLAT(t8)1://rewrite eight_bank_mode//rewrite pm_bank_diff_0 and pm_bankld      a2, EIGHT_BANK_MODE_ADDR(t8)   //0x210dli     a1, 0x3dsll    a1, a1, EIGHT_BANK_MODE_OFFSET   //3<<8not     a1, a1                   //0xffff,ffff,ffff,fcffand     a2, a2, a1               //[9:8]被清零GET_EIGHT_BANK                //a1 =1  8bankxor     a1, a1, 0x1           //a1 = 0dsll    a1, a1, EIGHT_BANK_MODE_OFFSET //a1 = 0or      a2, a2, a1             //[8]sd      a2, EIGHT_BANK_MODE_ADDR(t8)  //[9:8]被清零

13.0x168寄存器

    //for version 3, pm_bank not used, changed to cs_resynclw      a2, 0x0(t8)dli     a1, 0x3beq     a2, a1, 1f   //等于3则跳转。不知道是否跳转?nop//rewrite pm_bankld      a2, BANK_NUM_ADDR(t8)   //0x168dli     a1, 0x7dsll    a1, a1, BANK_NUM_OFFSET  //24not     a1, a1                //a1 = 0xf8ff,ffffand     a2, a2, a1           //清零[26:24]dli     v0, 0x7GET_EIGHT_BANK            //a1 = 1xor     a1, a1, 0x1       //a1 = 0dsrl    a1, v0, a1        //a1 = 7 dsll    a1, a1, BANK_NUM_OFFSET  //7<<24or      a2, a2, a1               //[26:24] = 7sd      a2, BANK_NUM_ADDR(t8)    //写入0x168

14.暂停休息。。。。。后面有时间再看吧。。。真的太长了。

单龙芯3A3000-7A1000PMON研究学习-(30)撸起袖子干-再来一杯代码11-内存初始化3-mc_init相关推荐

  1. 单龙芯3A3000-7A1000PMON研究学习-(19)撸起袖子干-再来一杯代码3

    1.start.S包含一个独立的pcitlb.S文件 ##########################################     PRINTSTR("NO TLB cach ...

  2. 单龙芯3A3000-7A1000PMON研究学习-(14)撸起袖子干-分析代码前的准备工作2

    1.我细细回想一下,感觉要准备的东西很多. 比如体系结构,汇编指令,地址映射,外设.... 然而,光体系结构就复杂到要用n页(官方的)pdf才能说清楚(其实不一定能说清楚,可能还得慢慢去琢磨).这里还 ...

  3. come type6 定义_COMe-B6101龙芯3A3000 COM Express Type6模块

    COMe-B6101是一款以龙芯3A多核处理器和AMD RS780E SB710芯片组为核心,高可靠性和高效能的主板模块.COMe-B6101 内部集成ATI M72-based图像引擎,支持双屏显示 ...

  4. 单龙芯3A3000-7A1000PMON研究学习-(16)撸起袖子干-分析代码前的准备工作3-寄存器

    1.这篇还是稍微介绍一下cpu相关的寄存器. 手册里面说到的寄存器分两种,一种是cpu使用的(汇编中用来存放数据的),另一种是外部设备寄存器(一般用于配置功能,或者读写外部设备数据用的.),在手册中都 ...

  5. 龙梦拿下3万片大单 龙芯电脑年底量产无悬疑

    10月9日,龙芯有关人士通过搜狐博客透露,"龙梦电脑已经有人拿到货,批量生产在11月15日以后,因为量产的芯片11月15日才到."这与龙梦科技此前关于"龙芯电脑年底量产& ...

  6. 单龙芯3A3000-7A1000PMON研究学习-(8)撸起袖子干-make tgt=rom初步分析(a)

    1.make tgt=rom 开始编译了. 在zloader.3a3000_7a目录下的Makefile.inc,指定了我们要的目标. tgt = rom. 所以就是执行73行的rom这个目标. 这里 ...

  7. 单龙芯3A3000-7A1000PMON研究学习-(11)撸起袖子干-make tgt=rom的编译过程

    1. 今天来分析一下makefile,看看如何编译出执行文件pmon的. 先贴几张图,makefile的内容,这是一些依赖关系 图一 图二 图三 图四 图五 2.图一解释 rom这个目标又三个依赖,c ...

  8. 单龙芯3A3000-7A1000PMON研究学习-(12)撸起袖子干-分析代码前的准备工作1

    1.make的过程我说了个大概,大家可以参考一下前面的文章.现在准备分析代码吧,其实这个准备工作内容应该蛮多的.可能后面还要补充. 2.首先找到关键的bin文件啊,就是可以最终下载到flash,能启动 ...

  9. 走进龙芯3A3000(四)安装XFCE4

    我想要安装KDE 我想要qtwebengine的MIPS64实现.曾经读过千里孤坟的<KDE综览>,就深深喜欢上了KDE,当时的版本还是KDE3.后来KDE4发布,千里孤坟又写了<K ...

  10. Linux内核4.10在龙芯3A3000笔记本上的移植

    http://ask.loongnix.org/?/article/66 http://ask.loongnix.org/?/article/67 http://ask.loongnix.org/?/ ...

最新文章

  1. TVM在ARM GPU上优化移动深度学习
  2. pandas使用read_csv读取数据使用skiprows参数跳过指定的数据行但保留表头、pandas使用to_csv函数将dataframe保存为gzip压缩文件
  3. hr2000 光谱Matlab,HR4000 HR2000 HR2000+ 光纤光谱仪 CG HC-1光栅 消除高阶衍射滤光片-广州标旗...
  4. python 程序流程控制结构-【笔记】《python语言程序设计》——程序的控制结构...
  5. Bootstrap Paginator分页插件+ajax
  6. Java并发编程—AQS原理分析
  7. 1spring注解:@Configuration,@Bean,@ComponentScan(),@Scope
  8. 学生用计算机说明方法,15.文中多处运用了作比较的说明方法.请任选一例.说说运用这种方法的作用. 例子: 作用:...
  9. ZOJ 1057 Undercut(简单模拟)
  10. 文档打开后服务器报警,MetaTrader 4客户段的秘密:警报系统
  11. 洗衣机的维修和电动机
  12. kali 如何使用word_如何学习并玩好kali?
  13. 基于HyperVID数据集训练自己的车型识别系统
  14. Java毕设项目银行贷款管理系统计算机(附源码+系统+数据库+LW)
  15. 软件测试工程师简历项目经验怎么写?
  16. python爬虫爬网页源码保存到本地_python爬虫网页图片并保存到本地
  17. Android 侧滑抽屉菜单
  18. Android系统基础介绍
  19. 维生素C对免疫力有什么影响?
  20. 首发于 monitor 写文章 重修微积分2——收敛 精选 zy han zy han 重修微积分2——收敛 精选 已有 12780 次阅读 2015-3-30 07:58 |个人分类:科普|

热门文章

  1. vue学习笔记二:HBuilder X框架搭建
  2. 机器人主流编程语言盘点 及优缺点分析
  3. Git与GitHub的了解与运用
  4. 方法重写和方法重载的区别
  5. FID - Web特征数据来了
  6. 利用官方预训练模型快速计算Inception Score和FID
  7. 金融反欺诈的底层逻辑
  8. 华为手机像素密度排行_「屏幕像素密度」(全解析)屏幕尺寸,分辨率,像素,PPI之间到底什么关系? - seo实验室...
  9. 智能陈桥五笔7.8试用编号是多少_学霸的学习方法,听多少都不嫌多
  10. DayDayUp:此刻,可以坐在家里,来一次,说走就走的【VR虚拟旅行】1000多个国内外景区免费看!