嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
6 s% y8 k2 ?( t$ B$ q% E核心板2:DDR2 256M Byte   NAND FLASH 8G bit
& m) J, M4 W! F. F, m  R7 n这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?2 v/ Y/ G. x1 z& W( [
3 T6 B$ O0 A* R8 F, {$ d+ w+ E. @
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
' R9 m' z7 Z3 I+ i8 @* |# P1 I3 ?: n: h+ O$ \

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
$ T& O+ T1 F0 ^3 L/*
4 |3 F  O2 D5 ]' r& t7 B( w* Check memory range for valid RAM. A simple memory test determines5 `, x" b, L7 [
* the actually available RAM size between addresses `base' and
* _7 u5 a$ ]7 v1 d1 _# C/ F* `base + maxsize'.
. F2 \8 ^! `# Z) q; X# G*/2 L+ T( V" m$ t: K
long get_ram_size(long *base, long maxsize). m/ U; ^# e: `
{
1 Y# Z% S+ N. _" B) S, m0 O) j" m, t        volatile long *addr;
7 K/ W) X- k5 q2 ~9 W( o7 M        long           save[32];" ]9 }' g& @$ ]
        long           cnt;; o3 z1 J, k* `% I1 D/ u
        long           val;
  q0 w! w2 J- w# R8 _        long           size;+ W1 {! [/ c# h; n0 L
        int            i = 0;
8 _& L; Y" c. D. C
: J0 T- o1 V2 S7 k        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {% }. q/ C" c% }, t$ {+ w
                addr = base + cnt;        /* pointer arith! */
/ j$ b3 _* H. K8 o/ U8 y                sync ();
. P4 b( m6 _# X2 s                save[i++] = *addr;
; x/ ]1 _/ Q5 |, d: x4 B6 Z, g                sync ();
+ }7 U$ B4 R0 e: c" K9 \                *addr = ~cnt;
/ R& \- ~/ O- r! g% h        }7 b2 E& s8 H* z1 Z

  W0 [0 G+ m. Z( i" R2 L6 U        addr = base;# l9 s' g- e3 ]4 B3 o# T  A
        sync ();
8 x/ M  H) Z$ j        save = *addr;
0 g! M/ ]5 E6 y6 ]  u        sync ();& J5 a+ Y. v& V0 N
        *addr = 0;4 i, M0 Z/ t" S5 Q
% _0 t- E8 P+ d  L6 d& s5 H3 |: a1 }
        sync ();/ a" V! Z( C' d7 h9 c5 M3 N
        if ((val = *addr) != 0) {
' N  Q$ J$ V% ?, I5 ~6 ~/ }& F                /* Restore the original data before leaving the function.) h" j% \' S  \) _
                 */& p4 b$ a) O% R, V# w
                sync ();- g5 }/ @2 g' o3 q1 u& \
                *addr = save;# U9 N3 G3 G7 w- m
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
$ g- @8 s3 N, B$ U* T/ F                        addr  = base + cnt;
: \; f% c3 v/ Y5 u: g' K                        sync ();1 D) Y0 L1 Q: o
                        *addr = save[--i];" }% W3 {% b1 H2 @
                }
9 `+ ^$ M' ~9 ~6 V                return (0);
9 j4 k/ ?' Z" C9 u9 a        }
+ ^  ?* t2 B8 h9 F: z2 [$ l8 x5 x- G* [8 _1 p1 A% s
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {' v/ N# q4 E3 s; k
                addr = base + cnt;        /* pointer arith! */
* R8 T4 c2 H* |8 U0 E                val = *addr;: H' H: h: r+ x/ @. y2 C7 O1 O: D
                *addr = save[--i];
9 W5 z2 _0 k  t5 Z/ O                if (val != ~cnt) {# K, X' C& a# ]
                        size = cnt * sizeof (long);
1 z- M6 @, u' \% @1 e8 h4 j                        /* Restore the original data before leaving the function.& h# Q* a/ F$ M) j
                         */6 I+ E( R4 A, S! W4 ?$ a, G9 W
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
( w0 q8 o$ H" d/ C9 X3 ?% J7 h                                addr  = base + cnt;
4 W1 Z8 a& D( C& b. J                                *addr = save[--i];& n2 E6 r, }" R! `2 z7 Q6 H$ R
                        }5 g# ?- E5 E; R3 R5 G
                        return (size);
. E0 ~* A0 e' Z0 S. v                }
( V: H( _  o, J        }
8 _' Z$ Z( R. Z* T/ ?8 d& S: Y- \
0 g+ n, B* h! z4 m        return (maxsize);
  f; ^; c; L) U& R}
: O% F7 O& J8 o# Vint dram_init(void)% f2 j4 W4 \! _/ t9 R
{) c/ _6 Q  z/ C5 n
        /* dram_init must store complete ramsize in gd->ram_size */
9 [$ o+ f. u, Q' p3 k' l; @) E$ C        gd->ram_size = get_ram_size(
8 x: _# D3 A* u2 |) G2 r) X                        (void *)CONFIG_SYS_SDRAM_BASE,6 C! a( N5 N% j' V  E$ @
                        CONFIG_MAX_RAM_BANK_SIZE);0 w! z; C. A5 |5 ]
        return 0;9 s6 m& N2 C4 X9 j6 X% a2 ]8 N
}3 @* m/ k; W: i2 @$ W

/ n% \) O  p, m( M3 j0 m0 X# C. x
! y4 f! G6 [- k$ @9 r! v
: T6 u: ], ~. `- I: O) f+ n1 N' h+ x. k9 X( z
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!: v4 ]; [4 k8 }" `& x
2 ~5 s+ D) s6 _! @

0 Q$ K/ w( K* `8 G" V1 s
. R4 E3 O+ U) F  b/ j





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