嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit( K" ^( [. W! G. ]2 l+ u' q
核心板2:DDR2 256M Byte   NAND FLASH 8G bit5 ~/ f0 W4 p9 }5 N" D7 K+ ], j
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?5 D  ]* O' V/ y

# G/ t. H; `8 p是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
" I( Z; \% I$ b  z: @1 U3 F, ?4 B' w

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:0 u! r1 x7 `! O7 s: @  S
/*
: P4 S$ j8 \" D- f4 F& F* Check memory range for valid RAM. A simple memory test determines: \# v. J& M6 t6 W, o, }- ?
* the actually available RAM size between addresses `base' and
* |* L& ]- ]) n) h: i* `base + maxsize'.
5 V- E) R  b+ E3 Z0 N( L2 }" U*/# U0 D. M( S3 b9 z$ V
long get_ram_size(long *base, long maxsize)8 j; l9 J! H* _, G8 O2 C
{" f1 b3 M0 ^8 f
        volatile long *addr;
9 v  z+ z1 D4 J2 U* ]7 M        long           save[32];
, R- R8 Z  W9 w, o        long           cnt;
4 y' |2 R. o9 q6 z        long           val;/ w) k. E. X' F
        long           size;
$ b4 `2 q1 h0 @: J' Z% k+ }        int            i = 0;
$ p: I# X7 F" `. ^" u- F/ Y9 h/ e) f/ y
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {/ Z; y& l) W* l1 |( h9 H
                addr = base + cnt;        /* pointer arith! */
- R- _1 g  v' A                sync ();2 E! g' O* s% C7 {& P
                save[i++] = *addr;5 N6 s9 B2 K0 ?
                sync ();) L7 c8 I8 J! a# E9 C, ~
                *addr = ~cnt;
) ?1 a$ ~" Y) o9 X        }$ D- j  ~2 c2 [+ y/ V9 r

, I7 n7 ], @! J0 W/ g        addr = base;
0 W( q3 f" `- f, r5 i        sync ();
5 X% K3 t# q7 a2 e- {0 v) }        save = *addr;; z5 g1 I$ @$ p
        sync ();
9 J* r. c& s- i; K8 U( W4 {        *addr = 0;
# ^' G8 L* x# u- T& N; H7 M2 R
' _) ~, k" C# V6 b$ d  Y4 ?        sync ();
6 e: N( C+ X: `# [        if ((val = *addr) != 0) {
. ]7 n# z7 g3 g4 B( I8 v! C+ K                /* Restore the original data before leaving the function.
* ]# S" y, o8 e, U6 M                 */
. N0 y) X! {5 [# ?1 L/ O6 W# V                sync ();
  E6 b$ o1 Z# _9 y' @                *addr = save;
9 N  f& N4 x  ^! [' K8 S                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
6 D) w! P+ Z; S4 Y; K, u                        addr  = base + cnt;
; K3 H% ^! q! J3 `  t& R1 ?* p                        sync ();
) [, \4 Y/ m* y( ~& a                        *addr = save[--i];" \  Q1 H; s/ B, T1 F; ?
                }
+ B' u/ Y; @3 L! a1 k/ W8 E; I8 D6 H                return (0);
, o$ V/ e( z& Z4 B, @        }8 D* I+ z* w. A$ r7 E( z
1 m+ C/ U& E5 |, \
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {8 y- x" Z. T- n0 x9 Z* r
                addr = base + cnt;        /* pointer arith! */
5 b1 N1 q6 ~/ P6 T- D                val = *addr;
& y( N, C% ~1 q                *addr = save[--i];/ m5 \4 @4 b% ^8 H& ]( z
                if (val != ~cnt) {
7 t3 L8 d  x  B                        size = cnt * sizeof (long);
: F  f0 P3 e" U3 F7 X" W                        /* Restore the original data before leaving the function.6 W% g& i9 F" I3 U0 V6 q* Z
                         */
$ l% ~; t- @( W2 }) ?* I                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {% H( J9 ^2 _+ y+ U0 ]; ~9 I8 [
                                addr  = base + cnt;, i8 x4 x: Q: I0 Z( M
                                *addr = save[--i];
+ p+ M2 s+ D. Q; k$ }' l- N                        }
, n8 Q* `' ~/ b1 H: J9 \* E6 G                        return (size);
  K: f+ T$ n" F7 x) I                }
' W" T- D1 w% o" R# |8 i. d' Y        }% S6 L- E8 z: F3 `5 E5 g/ ?
' n3 h$ V5 i# |, L3 }5 L; |
        return (maxsize);1 B* i2 g+ L# V* f
}
  d8 A$ c2 G. S3 B6 J- kint dram_init(void)
+ P/ b# n7 ^' Y. Y9 o# J# J{# n" }' Y" |4 [3 K% d
        /* dram_init must store complete ramsize in gd->ram_size */) d: ?0 @5 }6 b8 D8 N  l! S, I
        gd->ram_size = get_ram_size(/ @) G' c+ X% T% `
                        (void *)CONFIG_SYS_SDRAM_BASE,
& m$ r2 H9 G3 h" Y/ A/ U) c                        CONFIG_MAX_RAM_BANK_SIZE);! g( O+ ^/ w6 u! w! [: S) a8 `
        return 0;5 _+ p, B, v( B7 ~# G
}" u" Y4 t$ M+ J& Z' A

' y: I* H$ W1 W! ?" o- [8 N- N$ l$ e6 K' p  \1 V
& E4 f+ I: S" r! i4 g
2 X' }" N5 u: ]1 R* l& z" z
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!- o0 w2 p; {% r7 a

0 M# R( E/ h1 M9 M9 O/ c' l5 w- s; p

5 q* ]; Y3 H2 b8 U




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