单龙芯3A3000-7A1000PMON研究学习-(30)撸起袖子干-再来一杯代码11-内存初始化3-mc_init
这部分留给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相关推荐
- 单龙芯3A3000-7A1000PMON研究学习-(19)撸起袖子干-再来一杯代码3
1.start.S包含一个独立的pcitlb.S文件 ########################################## PRINTSTR("NO TLB cach ...
- 单龙芯3A3000-7A1000PMON研究学习-(14)撸起袖子干-分析代码前的准备工作2
1.我细细回想一下,感觉要准备的东西很多. 比如体系结构,汇编指令,地址映射,外设.... 然而,光体系结构就复杂到要用n页(官方的)pdf才能说清楚(其实不一定能说清楚,可能还得慢慢去琢磨).这里还 ...
- come type6 定义_COMe-B6101龙芯3A3000 COM Express Type6模块
COMe-B6101是一款以龙芯3A多核处理器和AMD RS780E SB710芯片组为核心,高可靠性和高效能的主板模块.COMe-B6101 内部集成ATI M72-based图像引擎,支持双屏显示 ...
- 单龙芯3A3000-7A1000PMON研究学习-(16)撸起袖子干-分析代码前的准备工作3-寄存器
1.这篇还是稍微介绍一下cpu相关的寄存器. 手册里面说到的寄存器分两种,一种是cpu使用的(汇编中用来存放数据的),另一种是外部设备寄存器(一般用于配置功能,或者读写外部设备数据用的.),在手册中都 ...
- 龙梦拿下3万片大单 龙芯电脑年底量产无悬疑
10月9日,龙芯有关人士通过搜狐博客透露,"龙梦电脑已经有人拿到货,批量生产在11月15日以后,因为量产的芯片11月15日才到."这与龙梦科技此前关于"龙芯电脑年底量产& ...
- 单龙芯3A3000-7A1000PMON研究学习-(8)撸起袖子干-make tgt=rom初步分析(a)
1.make tgt=rom 开始编译了. 在zloader.3a3000_7a目录下的Makefile.inc,指定了我们要的目标. tgt = rom. 所以就是执行73行的rom这个目标. 这里 ...
- 单龙芯3A3000-7A1000PMON研究学习-(11)撸起袖子干-make tgt=rom的编译过程
1. 今天来分析一下makefile,看看如何编译出执行文件pmon的. 先贴几张图,makefile的内容,这是一些依赖关系 图一 图二 图三 图四 图五 2.图一解释 rom这个目标又三个依赖,c ...
- 单龙芯3A3000-7A1000PMON研究学习-(12)撸起袖子干-分析代码前的准备工作1
1.make的过程我说了个大概,大家可以参考一下前面的文章.现在准备分析代码吧,其实这个准备工作内容应该蛮多的.可能后面还要补充. 2.首先找到关键的bin文件啊,就是可以最终下载到flash,能启动 ...
- 走进龙芯3A3000(四)安装XFCE4
我想要安装KDE 我想要qtwebengine的MIPS64实现.曾经读过千里孤坟的<KDE综览>,就深深喜欢上了KDE,当时的版本还是KDE3.后来KDE4发布,千里孤坟又写了<K ...
- Linux内核4.10在龙芯3A3000笔记本上的移植
http://ask.loongnix.org/?/article/66 http://ask.loongnix.org/?/article/67 http://ask.loongnix.org/?/ ...
最新文章
- TVM在ARM GPU上优化移动深度学习
- pandas使用read_csv读取数据使用skiprows参数跳过指定的数据行但保留表头、pandas使用to_csv函数将dataframe保存为gzip压缩文件
- hr2000 光谱Matlab,HR4000 HR2000 HR2000+ 光纤光谱仪 CG HC-1光栅 消除高阶衍射滤光片-广州标旗...
- python 程序流程控制结构-【笔记】《python语言程序设计》——程序的控制结构...
- Bootstrap Paginator分页插件+ajax
- Java并发编程—AQS原理分析
- 1spring注解:@Configuration,@Bean,@ComponentScan(),@Scope
- 学生用计算机说明方法,15.文中多处运用了作比较的说明方法.请任选一例.说说运用这种方法的作用. 例子: 作用:...
- ZOJ 1057 Undercut(简单模拟)
- 文档打开后服务器报警,MetaTrader 4客户段的秘密:警报系统
- 洗衣机的维修和电动机
- kali 如何使用word_如何学习并玩好kali?
- 基于HyperVID数据集训练自己的车型识别系统
- Java毕设项目银行贷款管理系统计算机(附源码+系统+数据库+LW)
- 软件测试工程师简历项目经验怎么写?
- python爬虫爬网页源码保存到本地_python爬虫网页图片并保存到本地
- Android 侧滑抽屉菜单
- Android系统基础介绍
- 维生素C对免疫力有什么影响?
- 首发于 monitor 写文章 重修微积分2——收敛 精选 zy han zy han 重修微积分2——收敛 精选 已有 12780 次阅读 2015-3-30 07:58 |个人分类:科普|
热门文章
- vue学习笔记二:HBuilder X框架搭建
- 机器人主流编程语言盘点 及优缺点分析
- Git与GitHub的了解与运用
- 方法重写和方法重载的区别
- FID - Web特征数据来了
- 利用官方预训练模型快速计算Inception Score和FID
- 金融反欺诈的底层逻辑
- 华为手机像素密度排行_「屏幕像素密度」(全解析)屏幕尺寸,分辨率,像素,PPI之间到底什么关系? - seo实验室...
- 智能陈桥五笔7.8试用编号是多少_学霸的学习方法,听多少都不嫌多
- DayDayUp:此刻,可以坐在家里,来一次,说走就走的【VR虚拟旅行】1000多个国内外景区免费看!