免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: r91987

[BootLoader] uboot的一个问题 [复制链接]

论坛徽章:
0
发表于 2011-08-20 22:38 |显示全部楼层
回复  rqzrqh


    非常感谢你!

source insight的确没有包含.s文件,但是我通过windows下搜索(文 ...
r91987 发表于 2011-08-19 23:52


也许有会有比较隐蔽的a=b的方式初始化哦。
例如定义一个2元数组  每一对都是地址+初始值组成,那么在初始化地方就可以使用for循环 *addr = val的方式赋值,
仅是猜测,没弄过smd24xx

论坛徽章:
0
发表于 2011-08-21 00:17 |显示全部楼层
本帖最后由 crifan 于 2011-08-21 10:51 编辑

回复 1# r91987


“在u-boot \include\configs下的smdk6410.h,定义了很多宏,比如:
#define DMC1_CHIP0_CFG                0x150FC”

单单是为了找到你说说的这个smdk6410.h,就费了半天的时间。
我手上有最新的2011.06的uboot,都没有找到你所说的这个文件。
而另外去搜DMC1_CHIP0_CFG,也是找了好久,才找到,原来是在
S3c6400.h (arch\arm\include\asm\arch-s3c64xx)
中的定义:
#define DMC1_CHIP0_CFG 0x150F8  /* 0x5000_0000~0x57ff_ffff (128 MiB) */
==>>麻烦以后问问题之前,把问题说清楚,不要让回答问题的人,去浪费这么多时间在猜你的东西。

“这个明显是某个寄存器(有关dram的,从宏的命名可以看出)的配置值。但我想知道,为什么要设定这样的值:0x150FC?这个值的意义在哪里?”
关于为何设置这样的值,后面再说。
这个值,是给 对应的控制寄存器设置的值,所以对应含义,肯定要去看对应的数据手册了。

“如果能够找到这个宏对应的具体寄存器,那么可以通过查看pdf手册得到具体的意义,但是如何找到对应的寄存器呢?”
源码。通过源码找,会找到的。

“我通过source insight查找了这个宏,在整个文件夹中只出现了:
---- DMC1_CHIP0_CFG Matches (7 in 4 files) ----
Mdirac3.h (d:\uboot1.1.16_256m-for36---v1.01\include):#define DMC1_CHIP0_CFG                        0x140fc                //0x4000_0000 ~ 0x43ff_ffff ( 64MB)
Smdk6400.h (d:\uboot1.1.16_256m-for36---v1.01\include\configs):#define DMC1_CHIP0_CFG                0x150F8                //0x4000_0000 ~ 0x43ff_ffff (64MB)
Smdk6410.h (d:\uboot1.1.16_256m-for36---v1.01\include\configs)://#define DMC1_CHIP0_CFG              0x150F8
Smdk6410.h (d:\uboot1.1.16_256m-for36---v1.01\include\configs):#define DMC1_CHIP0_CFG                0x150F0
Smdk6410.h (d:\uboot1.1.16_256m-for36---v1.01\include\configs):#define DMC1_CHIP0_CFG                0x150FC
Smdk6430.h (d:\uboot1.1.16_256m-for36---v1.01\include\configs):#define DMC1_CHIP0_CFG                0x150F8
Smdk6430.h (d:\uboot1.1.16_256m-for36---v1.01\include\configs):#define DMC1_CHIP0_CFG                0x150FC

为何只有定义而没有引用呢???uboot究竟在哪里配置各个寄存器?”

花了点时间,找到了。
是在
cpu_init.S (arch\arm\cpu\arm1176\s3c64xx)
中的:

  1. /* DMC1 base address 0x7e001000 */
  2. ldr r0, =ELFIN_DMC1_BASE
  3. 。。。
  4. ldr r1, =DMC1_CHIP0_CFG
  5. str r1, [r0, #INDEX_DMC_CHIP_0_CFG]
复制代码

所以,其含义是:
将宏DMC1_CHIP0_CFG的值,赋值给寄存器,该寄存器地址是ELFIN_DMC1_BASE  + INDEX_DMC_CHIP_0_CFG
此两宏,对应在
S3c6400.h (arch\arm\include\asm\arch-s3c64xx)
中:

  1. #define ELFIN_DMC1_BASE  0x7e001000
  2. 。。。
  3. #define INDEX_DMC_CHIP_0_CFG 0x200

复制代码

ELFIN_DMC1_BASE  + INDEX_DMC_CHIP_0_CFG= 0x7e001000+0x200=0x7E001200
然后去s3c6410的寄存器:
http://www.hhcn.com/chinese/files/s3c6400_rev15.pdf
中,找到对应的寄存器:
P1_chip_0_cfg 0x7E001200
对应的定义为:
chip_n_cfg_register.jpg
但是关于具体的含义,网上找了一些资料,也还是没有搞懂,所以没法给你解释。。。。

【关于source insight】
多说一句,关于source insight,是好用,但是有些细节,的确有点问题。
此处就是默认的SI,没有把.S或.s的汇编文件,加入到工程中,需要我们手动设置。
解决办法,参考:
Source Insight中的文件过滤器
http://hi.baidu.com/serial_story/blog/item/d00ccf1f973e5df0e0fe0b9b.html

论坛徽章:
0
发表于 2011-08-21 02:31 |显示全部楼层
本帖最后由 crifan 于 2011-08-21 03:02 编辑

关于RBC还是CBR,还是没有完全搞懂,只是看懂了一点点。

这里:
http://topic.csdn.net/u/20101016/15/1ef008c1-ccc2-4243-948e-5ee1300d2ab5.html
找到同样的配置,但是关于其含义,其注释写的更清楚点:
  1. ; CHIP Configuration Register
  2. ; BRC_RBC[16], Addr_match[15:8], Addr_Mask[7:0]
  3. ; BRC_RBC: 1'b0 (Row-Bank-Column), 1'b1 (Bank-Row-Column)
  4. ; Addr_match: AXI_addr[31:24], Ex) 0x5000_0000, Set 0x50
  5. ; Addr_Mask : AXI_addr[31:24], Ex) 0x57ff_ffff, Set 0xF8
  6. DMC1_CHIP0_CFG EQU ((1<<16)+(0x50<<8)+(0xF8<<0)) ; BRC (Linear Address Mapping)
  7. ;DMC1_CHIP0_CFG EQU ((0<<16)+(0x50<<8)+(0xF8<<0)) ; RBC (4K Unit Permute)
  8. ;DMC1_CHIP0_CFG EQU 0x150F8
复制代码

关于源代码中的SDRAM的配置:
  1. /*-----------------------------------------------------------------------
  2. * Physical Memory Map
  3. */
  4. #define DMC1_MEM_CFG 0x00010012 /* burst 4, 13-bit row, 10-bit col */
  5. #define DMC1_MEM_CFG2 0xB45
  6. #define DMC1_CHIP0_CFG 0x150F8 /* 0x5000_0000~0x57ff_ffff (128 MiB) */
  7. #define DMC_DDR_32_CFG 0x0 /* 32bit, DDR */
复制代码

可以看出是BRC的配置。
从:/* burst 4, 13-bit row, 10-bit col */可以看出,一共是25位,其中2位bank,13为row,10位column,
所以:
BRC,Bank-Row-Column,对应的地址的各个bit位的含义就是:BB RRRRRRRRRRRRR CCCCCCCCCC
RBC,Row-Bank-Column,对应的地址的各个bit位的含义就是:RRRRRRRRRRRRR BB CCCCCCCCCC

即,对于同一个32位的地址,这个数字来说,根据BRC还是RBC,内部被翻译成对应的含义,对应着哪个bank,row,colunm,那是明显不一样的。

关于RBC还是BRC,这里有解释:
http://www.nxp.com/documents/application_note/AN10935.pdf
即Bank-Row-Column (BRC)被称作low-power mapping,
Row-Bank-Column (RBC)被称作performance mapping
但是至于为何这种叫法,实在是没有搞懂。。。

只是简单的推断,上述代码中,#define DMC1_MEM_CFG2 0xB45对应的bit[10:8]=011b 对应的是Mobile DDR SDRAM,所以,此处用low-power mapping的BRC。
至于为何,还是没有彻底搞懂啊。。。

(注:常见的内存电压是3.5V或2.5V,low-power的电压是1.8V,低电压的内存多用于电池供电的移动设备中)


关于BRC,RBC等内在的区别,找到一个解释,供参考(偶看的也不是很明白。。。):
http://www.freepatentsonline.com/y2009/0319718.html

Common address mapping schemes are “Bank, Row, Column (B-R-C)”, “Row, Bank, Column (R-B-C)” and “Bank, Row Low, Column Low, Row High, Column High (B-RL-CL-RH-CH)”. It is known that SDRAM power consumption and access latency are strongly affected by whether an access occurs to an activated row or to a row which is not activated. The mapping scheme chosen determines how efficiently a particular type of access pattern takes advantage of activated rows in the SDRAM.
The B-R-C is the most commonly used address mapping scheme. When used for masters with strong temporal and spatial access locality for low order address bits it gives good average memory latency, memory bandwidth and memory device power consumption. Using this scheme each bank of memory controlled by a memory controller can in principle be allocated to a different master and the master transactions can then be performed independently of one another, without, for example, inefficiencies arising due to two masters accessing the same memory bank with different access patterns.
The R-B-C mapping scheme effectively allows a longer row length which is useful for systems that stream large runs of sequentially addressed data. The R-B-C scheme requires that adjacent bank use the R-B-C scheme to prevent aliasing. For a four bank memory device complexity is minmised when the R-B-C scheme is used in banks 0 to 1, 2 to 3 or banks 0 to 3 for a region of memory.
The B-RL-CL-RH-CH mapping scheme has a shorter row and column length. This scheme is used for graphics applications such as MPEG video, graphics or digital signal processing, where data on the video lines above and below the current video line need to be accessed together, e.g. for decoding together as a macroblock.

低功耗的SDRAM,之所以用BRC,主要是Bank是地址最高位,这样映射出来的地址,正好是线性地址,最高位的不同组合,对应着不同的Bank。
而低功耗的SDRAM,有个特性,可以使得在低功耗或睡眠的时候,只有某个bank在工作,而其他bank都关闭,比如
共有4个bank,睡眠的时候,把内存数据都集中到bank0上,而让bank1,2,3都关闭,以求更省电。
对应的解释,这里也有:
http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0269a/BIHBHJCE.html
Low-power SDRAM provides a facility for selecting which memory banks to refresh in self-refresh mode. The memory banks that are not refreshed lose their data. When using this feature it is beneficial to use the bank, row, column (BRC) address-mapping scheme in the MPMC, so that a linear area of memory is not mapped over multiple SDRAM memory banks.

总之,看不太透彻的话,就记住一点就行了:
如果是功耗相对低的,1.8V的低电压,low-power的SDRAM,然后就选BRC;
如果是高性能的(当然功耗相对高些),3.3V或2.5V的的正常电压的SDRAM,就选RBC。

论坛徽章:
0
发表于 2011-08-21 19:54 |显示全部楼层

关于寄存器CHIP_N_CFG REGISTER=0x7E001200的值,如何设置,对应什么含义,下面是我的理解和分析:

Reserved

BRC_RBC

Address match

Address mask

[31:17]

[16]

[15:8]

[7:0]

0x150F8

0

1

0x50

0xF8

其中

(1)bit16=1,对应着1 = Bank-Row-Column organization,即BRC,含义上面已经说了,此处不多解释。

(2)bit15:8]=0x50,此值,决定了,AXI的地址值中的bit[31:24],

(3)bit[7:0]=0xF8,此值,用于mask AXI的地址值中的bit[31:24];

以上(2)和(3)是组合起来,才能看懂意思的。

此处我的理解是:

用一个普通的地址,来举例:

比如我的SDRAM的某个地址值是0x51000000

那么,对于AXI,即ARM的总线上的SDRAM的地址,其最高的8为,即bit[31:24]到底是什么值,是由S3C6400的数据手册中的地址映射Address Map决定的:

0x50000000 addr.jpg

由此地址映射可见,SDRAM,是由DRAM Control 1,对应着宏定义DMC1_CHIP0_CFG中的DMC1。

然后此SDRAM的地址的取值范围,实际上可以是0x50000000-0x6FFFFFFF,所以,对应着bit[31:24]即最高8位,可以是0x50-0x6F的,而具体是哪个地址的范围,就是由上面的“Address match”决定的,此处Address match=0x50,说明此处配置的SDRAM的最高位的地址,是0x50开始的,而剩下的SDRAM的地址取指范围,注释中写的是“0x5000_0000~0x57ff_ffff (128 MiB)”,可以看到是0x58000000之下,到0x50000000,都是属于此SDRAM的空间范围,而高于0x58000000的值,就是无效的了,因此,需要有个Address mask,去将一个AXI总线上的SDRAM的地址,通过mask而得知有效的地址范围,然后再去和match比较,

举例,地址0x51000000,bit[31:24]是0x51,将0x51去mask处理,即0x51 &0xF8=0x50,是和我们之前配置的address match的0x50一样,由此得知,此地址值是SDRAM的,而且是有效的值,是在其取值范围内,没有超过最大范围(0x58000000).

而举个反例,比如0x59000000,不在0x50000000-0x57FFFFFF之间,超过了范围,那么此时0x59&0xF8=0x0x58说明此地址不是属于SDRAM的有效地址(实际上是超过了SDRAM的最大地址的值)。

由此,反过来再去看为何要这么设置,其实就是0x50决定了你的地址范围是0x50开头的那种地址0x5XXX XXXX,而剩下的XXX XXXX这段空间范围到底是多少,那么就得根据你的SDRAM的大小,此处是128MB=2^27=800 0000,所以,设置为

0x5000 0000 + 800 0000 = 0x5800 0000,而8 = 1000b,mask为0xF8,使得bit[2:0]这三位,都被mask掉,才能算出对应的有效地址。

【总结】

根据是Low-power还是正常电压的SDRAM,决定是RBC还是BRC;

根据自己选择0x50开始还是0x60开始是你SDRAM地址,去设置address match的值

根据自己的SDRAM的大小,算出高位的值,然后推算对应的address mask的值。

论坛徽章:
0
发表于 2011-10-16 23:10
回复 14# crifan


    大哥您太牛逼了,关于6410 P1_chip_0_cfg寄存器的配置以及Addr_match和Addr_Mask的资料我找了一天,终于在您这找到了,终于弄明白了!


   特此登陆表示感谢!

论坛徽章:
2
天秤座
日期:2013-08-20 16:44:51狮子座
日期:2014-04-09 17:53:48
发表于 2013-03-04 16:44 |显示全部楼层
这个问题很有深度,至今还百思不得其解

论坛徽章:
0
发表于 2013-03-06 10:21 |显示全部楼层


crifan  的解答很到位,学习了!

论坛徽章:
0
发表于 2014-03-13 11:30 |显示全部楼层
crifan回答的超赞,学习了,楼主哪里去了?也不来谢谢人家
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP