嵌入式开发者社区

标题: TL138 uboot是怎么区分配置两款核心板的 [打印本页]

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit' H. i: p' M# {2 W& o4 v
核心板2:DDR2 256M Byte   NAND FLASH 8G bit* m) C4 E& I& Y2 @# h/ W
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?0 h. T/ Q$ I2 L1 T0 V
2 N" S0 @: e3 [
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?9 d) z4 c. b5 A+ S# K' e

6 x7 K' g' t$ T0 W; @9 [6 B
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
  I  |8 Z$ d- \) H5 D1 S/*, o( C: l3 ^- b9 e5 O' d
* Check memory range for valid RAM. A simple memory test determines
0 b; m4 }  g4 t- G9 z8 Q) i6 _; p* the actually available RAM size between addresses `base' and
& c( C( d0 B5 |; G# k, B3 l* `base + maxsize'.
" d  t9 @) }9 `/ S# a. ]  m*/2 B, C; Y/ ~1 V; D1 k  W2 S9 a
long get_ram_size(long *base, long maxsize)
; t/ Q& v% ]" m0 x- Q& x1 ]{
) x0 O7 g. z" c' K0 r1 g) t        volatile long *addr;; E; |" I& i: N: S; i: X% m
        long           save[32];; S% V  D2 p) b  t: F/ a
        long           cnt;, d- `6 S& \% O) w; [
        long           val;. ?$ A0 U$ h! e
        long           size;
4 Z( H+ e' y8 M3 E        int            i = 0;
: o: s; O5 V# J/ g' N6 J& k- z8 O  R- S0 o2 i# ~5 L0 a0 {
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
# y/ P3 R: ]) C) ?! C" m* ]                addr = base + cnt;        /* pointer arith! */1 w# [  N0 f% k/ v% \
                sync ();- P+ V5 ?" M2 t8 s9 W
                save[i++] = *addr;0 y/ a+ \# d9 F! M/ \# z4 @
                sync ();4 x- i- V5 ~! ]2 ~7 i% e& F
                *addr = ~cnt;. }; @7 I; M* h; a* m2 c" [) ~
        }
, O8 A* E& F; ?( W& S* J, C$ W- z
        addr = base;, ]8 ~; K7 E; F5 P& ^3 I+ f# c
        sync ();
# Y6 X, Z  a5 |        save = *addr;" W/ J: o( }- F: b8 \
        sync ();& p- u4 n2 d& X
        *addr = 0;8 J& G* g+ B; f. e7 O9 n
8 e; d% P3 r9 T+ \' _* |4 ~
        sync ();5 [9 i* A: E' e
        if ((val = *addr) != 0) {( E7 Z3 h* e: ]
                /* Restore the original data before leaving the function.
* f9 p  J) \" p+ _9 Q) n3 Z- Q# v                 */
2 `% F2 d1 a4 e& K2 {, \                sync ();
" g9 e# L1 i) B                *addr = save;3 \% a% W& r! o# I7 x
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
6 N5 ]- j1 j7 z0 M2 o/ S/ o: Y                        addr  = base + cnt;
% M3 n% N: j- g* \                        sync ();: Y9 T  Y% v' o) }9 e
                        *addr = save[--i];
6 P5 y0 x% F( j0 k                }+ w- [  d/ O0 N6 A3 a
                return (0);1 _, l4 ~$ o# w0 e
        }
& i  Y9 N9 @) D5 L4 v9 U# a& }2 S! L9 i' h5 h* @' o
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {* U# W- {4 T3 f+ Q8 _* [, R: n
                addr = base + cnt;        /* pointer arith! */2 B. z6 k: A6 t" m7 l
                val = *addr;2 I5 |9 C5 w, X. n: _0 e
                *addr = save[--i];
0 B% z1 _' H  F8 Q) r: D+ l                if (val != ~cnt) {; u4 U. |% G( D# ?# m5 i, @
                        size = cnt * sizeof (long);
2 k8 n! a- b% j# [! {$ |                        /* Restore the original data before leaving the function.
6 T7 W8 ~3 ?$ p  }8 d+ Q' F# y& _                         */4 m6 u( c* k, ~) r
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {" B' A# m+ e- V  Z1 h! p8 L7 @
                                addr  = base + cnt;6 y3 S% B) s4 l. p0 T/ a& E
                                *addr = save[--i];- J; G# C; O+ @' r
                        }
" k  Q/ l* U9 J0 j  c1 v" y                        return (size);5 E; n. z2 y% l/ }# J5 S
                }+ O" D$ K; j2 B1 d8 Z
        }
# H3 o# {3 s7 L: B" @' Y( J. l8 p3 `! Y2 X# [- F) h. G/ i: W" k' }
        return (maxsize);
/ N' \0 \+ B5 I: U/ _& Q, ?: K}3 e$ z& O8 l8 b$ `8 S/ `$ B
int dram_init(void)
% Z3 ^- F5 O3 G8 C+ e& d{' `2 w- [! z" y5 T
        /* dram_init must store complete ramsize in gd->ram_size */  P: l# u0 o+ p, I* y6 w. E
        gd->ram_size = get_ram_size(, u1 L! C8 n' H
                        (void *)CONFIG_SYS_SDRAM_BASE,
" Y- R* a: N4 l1 [, [3 m                        CONFIG_MAX_RAM_BANK_SIZE);! J! m  ?9 o  f' Z9 P
        return 0;8 A: x8 H3 h7 G0 Q
}
' X1 T) h2 L# z
% d6 {! N! J5 b9 e+ u4 E8 {. b! B5 Z% _6 t. @& k$ r

8 r* z: ^3 i) v! }5 V3 {1 V) K- i8 L' u3 X
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
+ x: E: l, ]9 w& a3 t) J/ m1 M# M5 U  d% ^+ u" q( p
, A4 D; S, s  @( U. ]; G1 D8 J* p

; ~" p6 K1 y1 M! I. @




欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) Powered by Discuz! X3.4