嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit2 f, i8 v. p' X( `2 `  u/ Z
核心板2:DDR2 256M Byte   NAND FLASH 8G bit
2 v5 m5 I3 F) w. E" n# h这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
7 l; {' p+ E( w  A) M
- q3 Y' Q, k% k1 l) ~是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?1 ?4 C4 P0 V& m* j* n
8 \3 _& B% j/ ]1 d

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
1 e9 t+ o8 X, \8 I, U/ {) l* o, H0 J/*
' s$ y8 m, f$ G* Check memory range for valid RAM. A simple memory test determines9 S, O2 e! f3 D7 E; G
* the actually available RAM size between addresses `base' and  _; {$ L) F) L5 h! ~
* `base + maxsize'.8 ^1 g* w5 q+ h1 L" h; K
*/
/ ]1 c" k% [$ x) ~: {8 e4 n1 k5 Dlong get_ram_size(long *base, long maxsize)
& u5 u: A1 w# u5 A0 F1 s{2 z. G- I/ U  p3 B) o
        volatile long *addr;
+ A. F9 U% c  U  ^- R        long           save[32];
2 T- G  i' n+ l. B# S, a9 M        long           cnt;0 Y6 |  L/ \, \! e' E* e1 U/ \
        long           val;- H& j1 Z* m7 Z3 y* h+ b: O2 G7 B
        long           size;
  n' m% D) a2 _6 U9 L! a        int            i = 0;
+ m# c! d' G( |. P6 u- ~* z2 E' R( m# C5 N# `3 n6 D( k7 n% \
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {: f& d: n! `% |
                addr = base + cnt;        /* pointer arith! */
# F. j. O! H$ l) C' B7 y                sync ();
3 r' L  D+ d* `; j                save[i++] = *addr;5 b- c5 j/ t5 j# _' h$ g
                sync ();3 \; p" n. C9 _; i7 \0 u
                *addr = ~cnt;
" l% j$ U% O! q1 V8 \" e        }
: C  U9 N) F9 O7 m; S0 D: }3 R  u8 S# a
        addr = base;! v, y; |# N, l
        sync ();) D8 s# `2 a' g0 K# A6 n
        save = *addr;$ L4 i2 y5 e& M3 t0 H
        sync ();: v+ b. N. p  g: \  T# z2 p! k4 @
        *addr = 0;
4 @4 q' l4 \7 ]! O8 x/ h' K5 x* e$ W9 Q( g) v+ G) a$ c
        sync ();
) l; L2 n/ X0 w' \1 i/ Y        if ((val = *addr) != 0) {
/ ?4 {5 X5 e# s5 m6 Y                /* Restore the original data before leaving the function.: Z) r/ ~# }/ B
                 */) p0 x3 m- q, ^3 |1 D, M; ~/ v
                sync ();
9 O, ^) ?8 v% e9 \8 u                *addr = save;
* ?, e- s: ]; _2 n                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {& \0 s7 s% O5 [' N' E  t2 z/ m
                        addr  = base + cnt;7 i8 L8 C& k0 `4 U: a
                        sync ();0 ~. g! X2 M) z/ w/ Y6 W
                        *addr = save[--i];
+ t- x4 O# {1 d( {                }
: B. {0 H/ ~) r' d, \3 L                return (0);
' i% S1 l3 Q  ~2 e; H3 r        }* G3 u" u* J. }. G' I: R0 B+ b9 r
- P; s: J" D+ b  k" @& S; d4 r
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {' L( y5 E" |! f9 G* T
                addr = base + cnt;        /* pointer arith! */
& k( w  N  B( ~4 M3 c( u& t6 q                val = *addr;3 H% u7 P+ N, P4 {5 E. s5 p
                *addr = save[--i];3 y; ^& H! \, u& c1 p5 b
                if (val != ~cnt) {
5 k4 @' N; ~$ \+ c$ X! m7 m! j% I* U% C                        size = cnt * sizeof (long);
3 U0 m; K5 I; y0 ^1 F  P5 _                        /* Restore the original data before leaving the function.8 l, L. {' }! f7 B
                         */
, O& f4 }2 {9 a; E8 [, T8 u6 ?                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {0 F' f% M- g* E, y" k, ^" X' z
                                addr  = base + cnt;: F$ j, `! A" F( |
                                *addr = save[--i];5 _% l2 \* F( t, k! i: P
                        }, P2 u$ B2 Q' {3 o/ P
                        return (size);
4 j8 ?4 M" p" r6 \9 N                }' l( N% m/ J; [8 G+ v5 m
        }/ {0 u$ B: q9 H, p4 X* t! R- j

. \* D8 ~, h$ z0 y( x; K) H% R# W        return (maxsize);
0 C/ M3 L. {9 C) ~6 \}
) C3 M, E1 v" j1 C' d& F" A/ iint dram_init(void); J: n9 `$ Y) B, c8 Y
{2 J" y/ a  k  J
        /* dram_init must store complete ramsize in gd->ram_size */5 T/ Y9 t5 c9 v2 C# P/ X  p
        gd->ram_size = get_ram_size(
+ c& \. `" h8 U! f  b% e8 Z                        (void *)CONFIG_SYS_SDRAM_BASE,
. c/ \  d- v5 i4 [6 \; j                        CONFIG_MAX_RAM_BANK_SIZE);
; W4 m& W# ^: q( ]% `        return 0;
" [3 X, |3 P) M}
- {- R. `) _0 ?( O
% |( n# e* g* g5 u$ W
& g' Q& B$ \# U* K7 Q# f
- L  Y( y+ \0 y+ X
  h. F0 t0 s* DFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
8 W& T  p& a$ U- d; Z
5 y2 R8 F5 k% B& e* m8 S5 w
2 G: [! n2 Y, E; b6 q- Y$ n% w
( M) p& X: V% L& J) @9 E





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