嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
/ k8 T9 s8 |' e+ X核心板2:DDR2 256M Byte   NAND FLASH 8G bit- Z4 z  d. d# @% Q
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
1 J! }' I  `! H, z' R1 w. h! O
; D  K0 l; H8 m. j是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?5 s! b$ ]  _; H. O* I

2 |: |: e8 w! U
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
, d$ H. T, i1 p9 `( R/*
& C  S6 E  ?2 y6 o+ R% m* Check memory range for valid RAM. A simple memory test determines, c& G' o: Q& q$ k: a- F" n
* the actually available RAM size between addresses `base' and: ]& p: u7 |% I9 t$ u. S
* `base + maxsize'.
4 f1 V# V6 j1 c: \2 S! R: a*/
. K6 e2 N8 G* g# ?, ]8 {4 A" J# `7 Rlong get_ram_size(long *base, long maxsize)
) R; `7 V8 b1 K& r6 c{
, A  ?- K) X6 S, W# `1 w1 Q        volatile long *addr;: h) f. s4 p9 H8 p" r
        long           save[32];
% h0 q+ a/ T& _( n' W$ S4 C/ u# N1 G3 z        long           cnt;
, }8 v6 U# }$ v0 y2 s( |& R% t        long           val;/ x6 c! t1 e, c0 B8 k7 R
        long           size;+ ]3 ~2 a! @; y2 Y/ A& p. l
        int            i = 0;6 M: x9 N6 k* |$ z
! F+ c7 j9 B% d6 \8 _
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {' o2 Q! @! ?) Z2 Y' `. H6 P3 D
                addr = base + cnt;        /* pointer arith! */0 V; k4 s1 e5 O
                sync ();
: _+ d& ?, Z. b2 O* P                save[i++] = *addr;. R/ v. m2 n5 ~
                sync ();6 k4 O9 |4 l8 ?
                *addr = ~cnt;
2 r$ y  A4 o  D" W3 @% `        }( I" r+ `- Z4 i2 C- d
+ o0 R7 k4 L( ?- x- C
        addr = base;3 f, F: T. x8 W0 {3 f+ |
        sync ();/ b/ k/ h1 F: u! {" v6 [" y
        save = *addr;! k0 m! U5 V- b' f4 H2 b1 B& h
        sync ();
, l- M5 ~8 I: z; e        *addr = 0;
. b8 O# _, G5 C$ p: Q, K1 f
" x0 M8 o' M  K2 L/ w, o7 c        sync ();
$ I0 r& q- ]: l! V4 [* Z        if ((val = *addr) != 0) {' r( \0 {* ~+ t1 e" T6 `
                /* Restore the original data before leaving the function.# K8 _  \0 {8 Q' S  U; X8 M
                 */( z4 R1 g( {5 K1 e/ d7 w
                sync ();
+ A  D1 b) Z: P9 C. m' o                *addr = save;- S0 d5 }4 f7 t0 G
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {1 \! A! k- b, v
                        addr  = base + cnt;
2 I5 ]- w; j, b% ]                        sync ();  M2 x9 e" U. y7 ~
                        *addr = save[--i];
' v8 B2 n; f# I: E" F" L                }
( H% q8 U  M2 n: l4 v' ~                return (0);
/ s- f  D& S: H        }
1 X- U2 ]' u/ \  ~4 r
* {. b" n: x2 V! a        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
: A& n# o; h5 C3 e" V2 `                addr = base + cnt;        /* pointer arith! */8 I# ^( L. j& R; [2 ?9 `
                val = *addr;9 N3 y7 X$ ]# v. ]' V( w
                *addr = save[--i];
1 |& C& `! N  R2 e9 o                if (val != ~cnt) {
+ Z: @7 f7 }3 D( J- Y                        size = cnt * sizeof (long);7 o4 }( j' p* R0 \% x; @' z/ |
                        /* Restore the original data before leaving the function.
( `& ]% w5 w$ Y( `) e, D                         */
8 [' [2 z# |4 a  D                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {3 Q; u9 ]7 o  H% Q; [! u/ D
                                addr  = base + cnt;$ ^  R0 k. A5 l9 W
                                *addr = save[--i];
  i- ^' w- ^0 I+ B8 f+ Q7 h. f                        }2 u  ?! I* R( N9 ]9 G" H! N
                        return (size);+ a2 L* _: Y) K2 G0 X
                }
4 ?% @- G+ p% O' L1 y. R        }$ C: u1 n7 g5 c4 K4 T/ Z

2 A  {) N  I! k  r1 K) y        return (maxsize);8 [4 u, w% j  R+ S
}- y! H: G, f* O' y2 u
int dram_init(void)
% O* T! @, h- D# ?{4 w3 u5 p; J! f8 H% V, i& X
        /* dram_init must store complete ramsize in gd->ram_size */% {8 F* H1 ?  h, O1 w
        gd->ram_size = get_ram_size(
* C4 _# f: F) h, S; Y                        (void *)CONFIG_SYS_SDRAM_BASE,- d0 [4 n# ]/ B1 E
                        CONFIG_MAX_RAM_BANK_SIZE);7 s5 I8 y' p& X( s' r" Z9 E/ R' a" D
        return 0;
. Q6 ]1 E, p. O# w9 Y}
1 _0 W, L+ Y+ `, Z3 r% [) U, ?5 G/ x+ h: y$ e6 C; p

% T  }9 ?$ f" I/ K1 U; i0 C+ r: I& j+ F! J. L

( n: ?5 d, O- b, TFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!9 U/ ^9 @4 E; X- A% z
) V- u2 B5 s! }; ?: H% _! q

$ S! D: A2 O) a5 E' C& ^0 T- m
/ {5 n4 ?0 c) g" l





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