嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
# R' N: t. `) r5 c6 o核心板2:DDR2 256M Byte   NAND FLASH 8G bit
5 a: U8 c4 N6 S1 M* p) o6 |这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?  ~) {$ d0 F( Y/ x+ A' O4 Q" l4 T

+ a4 ?- x/ z3 W$ f( g. d是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?) E- X, G# ?  {' M4 t  |

. r% N/ Q1 K) x- i1 }% x
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:, r/ |$ m% u+ O2 `) |$ g
/*
4 X& N8 @$ {2 b: J0 j" E* Check memory range for valid RAM. A simple memory test determines
( I# b# a7 Q" m  i4 J* the actually available RAM size between addresses `base' and
5 A* l4 }7 C! |0 R9 n9 y* `base + maxsize'.' f2 M; r/ ?3 [( _- o; l$ o
*/; F, q. \8 _" ?9 D: h6 }; m
long get_ram_size(long *base, long maxsize)
0 i; E; d: U* a{  k" c- s4 l( F; V
        volatile long *addr;
. c: Y2 g  ?7 z. e( |0 E4 x        long           save[32];
' Z( I4 e1 O! o) d$ K) J0 L! ^        long           cnt;+ ~; j, G# V3 D" E% W! o
        long           val;
1 J: @6 Y& _; w5 T- u' l        long           size;
' J0 x% l+ y+ x$ X* }        int            i = 0;
# c. E  I2 p0 I+ t, b" k* ~. g
+ b& y/ q- U. c$ ?! [9 Q6 @  B        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {( O  ^. w1 e! H* {4 m% V
                addr = base + cnt;        /* pointer arith! */; N5 i! T' \) N  `; m
                sync ();! I* l: O9 v, {' g& x
                save[i++] = *addr;( a1 @2 f$ L4 v
                sync ();
& z' |0 h1 P( i  t2 S7 J                *addr = ~cnt;0 |; c3 X. b0 t6 X
        }
+ K  N; ^+ T  ]% U+ R# z6 N: c6 [0 k& x, X: G! J  E" z2 \
        addr = base;
( Q- }- V3 r+ A        sync ();
+ \9 [4 q% |% `1 X6 f* F6 W        save = *addr;* w3 h- t, A  `8 j3 R( D
        sync ();
7 j1 J5 c/ c+ m" g. c; D/ z        *addr = 0;
8 I0 T' _  R1 u' L5 c5 L3 g" `3 {8 a/ ~4 U  Y5 J+ G# w- k
        sync ();/ ^/ Z9 L! a. X, x3 T1 M' Z2 o
        if ((val = *addr) != 0) {! Z+ S5 q# d% ~( A) Y6 s
                /* Restore the original data before leaving the function.7 u0 |' \  l! q/ G& J# d
                 */
+ i2 t* m1 {. U- p& z1 a9 z                sync ();
% g& q0 ?( Q1 y+ V                *addr = save;
, ?( Z9 z. O4 r0 S4 q" x                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {  G8 [# P- F& c
                        addr  = base + cnt;2 k' I' [- h* X* ?% K2 W
                        sync ();$ C4 I9 [7 l- ^1 a! n  T
                        *addr = save[--i];
- g/ |7 o' `# Q/ X/ d                }
5 J+ e/ }0 N1 Q8 ^                return (0);  r9 ^0 r3 E4 P* j7 j% S) K
        }+ I! M4 P5 W- D+ T

+ |) _: n  g9 f) d$ G6 n        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {2 L& [+ R+ x8 s
                addr = base + cnt;        /* pointer arith! */
% N5 M+ f3 g# K4 Y3 a! c                val = *addr;& `% e, x' K1 g. ~3 `
                *addr = save[--i];
: V# q' a' m) y' a5 x; p                if (val != ~cnt) {) ^* j! c; J9 s6 r
                        size = cnt * sizeof (long);
; c5 ~, ~/ v4 R+ n+ p/ z" i+ @                        /* Restore the original data before leaving the function.# q& M# i7 Y# q2 n, L1 ^
                         */
# k  y; y$ a' u& o- v. ~                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {+ E5 b9 I5 r; F$ o+ D
                                addr  = base + cnt;
$ n5 t0 e5 |! {                                *addr = save[--i];
$ F1 P4 J) p; J1 d* A" [) Y0 i                        }
. t- U' C  n  Z- J  Y. J: k( O4 ^                        return (size);+ u9 w& c7 y3 G' d  ^7 u
                }
1 w% H5 u' x4 b  K        }
  {. g, `5 Y2 h. s4 ^* n/ b2 T
+ {  V; c9 A8 ^        return (maxsize);
. a$ z+ i$ C8 s+ L+ Y* v( E}
! l9 G) q  R% m: s& \int dram_init(void)
# v. D8 \9 a. W/ C{
' g7 t3 `$ a* n& X# y1 ]; F; X        /* dram_init must store complete ramsize in gd->ram_size */
& @" |% Z: J0 f. v$ @        gd->ram_size = get_ram_size() o+ a5 I/ m* p& W3 Q4 Y+ c! v
                        (void *)CONFIG_SYS_SDRAM_BASE,
: N& s( c) B7 `% ]                        CONFIG_MAX_RAM_BANK_SIZE);- I6 ~# V1 d5 s3 r) k
        return 0;7 j1 L% y: r& x; u+ W
}8 H) u- b/ q1 F+ u

: d7 k# S) i! [4 D  U, s* Q+ L9 n/ {; M% J

3 x% t9 O* @% L* c- J0 J) g
( ?9 R2 r' Z+ w/ H* hFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!+ [% i  S4 {6 p
5 L5 W6 Q2 r6 f8 H, V: \# `
& ?. f$ Q5 j, a$ Y* ?
4 J* h& @2 V) P( b9 r





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