TL138 uboot是怎么区分配置两款核心板的 - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 4238|回复: 1
打印 上一主题 下一主题

TL138 uboot是怎么区分配置两款核心板的

[复制链接]

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
楼主
发表于 2014-9-11 18:55:41 | 显示全部楼层
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
: }6 p% U( H2 a0 c2 f/*
0 S. S5 Y8 U' H; S. K* Check memory range for valid RAM. A simple memory test determines
$ o" A( u4 y1 L) Q* the actually available RAM size between addresses `base' and
. ^1 Q0 Q! u! i) {; i6 X* `base + maxsize'.3 k  p  @; r' q/ h+ Y
*/
3 i' e1 r, F: ?- plong get_ram_size(long *base, long maxsize)
  G. l- U( \2 B/ i* S. v{
$ R* r+ `( m" F; H3 b        volatile long *addr;8 b1 d9 N+ B/ o6 E
        long           save[32];0 |) V3 M* R9 [  x: T8 M
        long           cnt;
1 C" y" b' a+ V2 Z        long           val;
5 ]/ l3 R0 E+ T& `1 r/ M        long           size;
- ]$ P; f. R2 {7 G. x9 O        int            i = 0;3 r5 K7 L% d+ I# O

: ^1 P" [* C, f7 I- X9 B" L; _; j        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
8 f5 g3 k: ~# n% ?% H5 u( ~                addr = base + cnt;        /* pointer arith! */
; P) h. M: {, v$ M$ v' c6 ]                sync ();
( U) ~) X$ V) w+ P4 o" C4 k                save[i++] = *addr;
/ n' L3 }0 ?6 T; L- x9 x' X                sync ();
% g. |8 [$ e  l% {6 F                *addr = ~cnt;* q1 z6 v2 v: }
        }
# ?9 R: r2 C7 \0 E# O
: Y- Y5 D4 D& d/ M! j; w7 E        addr = base;
" \/ R, u, P9 H! P0 g. z4 `        sync ();
& @' f4 ^8 |) ]+ H# ^0 ~0 g        save = *addr;
0 U: t) _0 ]4 r! f7 _' Q$ h: f  B        sync ();  N( Z5 k, l$ x& o4 Y! V
        *addr = 0;4 u, T: z. s* Q. Z' w  g' A# h2 t

" E( X7 C- {: b; @$ u        sync ();
- _8 D8 u) s( I! |6 J        if ((val = *addr) != 0) {
7 R, t  s5 ]# _9 G/ I+ s1 ]8 D                /* Restore the original data before leaving the function.
$ _6 s! }$ [1 E4 Z) h4 t8 h                 */+ }1 [6 ?0 ~: p0 w
                sync ();, b- \/ @8 [4 t  S( R% e. ]
                *addr = save;' u/ h' ?' c8 Q
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {! ?$ }% ~: d3 X# x
                        addr  = base + cnt;# O0 C* X) {: U( H, K! b
                        sync ();; Z6 _1 M: [* ?2 E
                        *addr = save[--i];( K7 t$ q9 ^: u# F  E# r" @( Z3 l' _
                }
5 Q& w+ R" ~8 i, E. g                return (0);
7 G5 K# O9 x8 W        }  V7 h, t8 H- u- O

. ~) Q% }% R. L6 \. P* I9 ^        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {* o' D$ w  ~* M
                addr = base + cnt;        /* pointer arith! */
+ U. B9 a3 Z/ O$ Y. e                val = *addr;1 P/ `/ V. X" G" \
                *addr = save[--i];$ {; {; b/ Q9 Z
                if (val != ~cnt) {
2 Q: W6 J7 s2 t, \7 L; U+ ]9 |                        size = cnt * sizeof (long);
: r9 K+ ~9 |! l1 m+ B- Q- u                        /* Restore the original data before leaving the function.' c" U/ P7 D$ c4 |2 k6 k) D
                         */" h7 E/ X( Z& }. z: o8 |; z
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
' R* O* w3 ?7 d* l                                addr  = base + cnt;
+ |  t' |& @3 b9 s9 O! P                                *addr = save[--i];. b- q8 h/ g. M: v2 P/ b
                        }- w0 U0 m8 \; W; g8 m" N
                        return (size);- Y8 C5 L+ q- M8 ?4 [8 b
                }$ ^2 }4 n- l  b9 I1 ?- l6 J, T
        }$ O6 v# S1 ]1 `  J+ a
- H1 m$ c5 L& u3 H
        return (maxsize);( |- G, l! {$ S4 r6 Y
}& Y; Q1 w2 X/ ~4 J% `
int dram_init(void)
% H6 _8 y- Q' I/ W. M: J) u{
) }9 `8 L# e9 B" h        /* dram_init must store complete ramsize in gd->ram_size */2 j# [+ m7 k2 K; p
        gd->ram_size = get_ram_size(5 b- I3 }# Y9 J+ k* O; a- O* Z
                        (void *)CONFIG_SYS_SDRAM_BASE,
9 y5 s5 c) y9 W' S: h                        CONFIG_MAX_RAM_BANK_SIZE);
+ H4 f0 R5 d; l) U) n        return 0;3 v& |6 \( G4 Z, M) H; A
}9 O3 o; I) p2 g- x6 @/ c: k

6 R% R9 z6 `6 x# p- d5 |: X/ r, b8 F# i$ [: i

5 Z1 G, W7 `3 V" F% z( X8 g
. F! o5 x) O9 _# a& B3 U( AFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
) W2 j3 s" i: S
! ^% d! Q4 o! q& D6 D- o) i- h: H
' x9 y$ a0 O" A& v1 Z) z

4 N% i4 _+ ]" L# y* F5 {' q
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|嵌入式开发者社区 ( 粤ICP备15055271号

GMT+8, 2024-5-29 15:12 , Processed in 0.037001 second(s), 22 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

快速回复 返回顶部 返回列表