嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit5 Y7 v6 Y* _0 g8 O
核心板2:DDR2 256M Byte   NAND FLASH 8G bit
% B$ {' ~* Z9 e0 u! Y这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
( c# ?, R$ t; {5 b' F. |! E1 M3 U$ e7 V
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
) G% l% Y5 z+ @& U9 \- x# Z! A. S9 G/ L

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:9 ^2 y) H1 a0 S2 d+ L
/*" ]0 \, a1 w8 D* [1 l* |" }
* Check memory range for valid RAM. A simple memory test determines
1 ?. x) Z- D& s* the actually available RAM size between addresses `base' and
1 B% Q  ^+ B  S- S( E* `base + maxsize'.
. ?5 O( q" l/ z5 r* j' K8 a7 B# G*/! x7 q# C6 {; D2 L; J- A
long get_ram_size(long *base, long maxsize)
* Q' C0 K  F& e0 V" H{3 X" u4 U& T0 a2 C9 T& a
        volatile long *addr;
0 E' b6 k2 g% K, E' {1 D0 f( g        long           save[32];
9 Z. c5 s9 F! K% c2 D* I5 Y        long           cnt;
4 }2 c( @. o" U4 g* }9 @        long           val;/ O+ k* _, n% ]; v
        long           size;# S  s! X  P" Z2 N7 ^
        int            i = 0;
' n& r3 v9 E5 H2 J( L- O" p+ t& b& K# j+ W$ n
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {( K8 ^, P8 U- |$ r2 l
                addr = base + cnt;        /* pointer arith! */! N2 B0 V7 @7 y' m, I# z2 m
                sync ();
5 \! `8 @; q. ~4 z' X                save[i++] = *addr;5 Y1 |7 R/ |: X
                sync ();
8 w0 [( D+ L' T% V- z. s; R/ c                *addr = ~cnt;
: q1 a9 D. C' M        }
$ n. Z/ d1 u3 Z! F. y) @
: q% D8 ^: I' X& P: Q8 ^7 G        addr = base;
: E/ p) T" P: Y. J+ m& Y+ Q5 ]        sync ();4 ]% I( E8 ]* v5 F3 [! D
        save = *addr;
# O; s% N- c3 e# @2 _        sync ();8 x- w0 }" d5 ~2 W" x6 a
        *addr = 0;* U5 L! b0 u6 C1 z. k5 R
. }* f5 Q  X/ h4 c  C
        sync ();
3 H& K6 f, L* Z. ^$ l        if ((val = *addr) != 0) {
% D, X3 o* Q6 }: w1 b$ K                /* Restore the original data before leaving the function.
$ X) p3 w4 Y) f! H; I7 n                 */
2 q' Y  J4 @, L" k) W3 m0 G# s) B                sync ();
, M8 j7 I1 j5 [3 g- E                *addr = save;# H1 i' I/ X; Z0 x$ Z" }4 ?% R: p
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
. x* M( c7 ?. P+ \                        addr  = base + cnt;# y4 S8 V/ v5 O
                        sync ();/ y6 Z. n" s6 K! G& D/ T/ h
                        *addr = save[--i];, C4 I- _% q0 S- G; l! w2 P0 ^, P5 Z
                }. F3 y) u  E5 y8 b  n+ E
                return (0);
/ S* f+ H1 j6 p- d7 y( Q        }6 c, r! f9 m6 A( R" Q+ g

' n% E/ t2 \3 @; m        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {, B# k, n- P& ^+ h4 D
                addr = base + cnt;        /* pointer arith! */5 Z4 U3 X7 i2 ]6 r* i6 F' _
                val = *addr;) P1 V5 G9 }/ H
                *addr = save[--i];. X- y5 E5 P% V0 z* h
                if (val != ~cnt) {, m% F$ o/ `% Y6 ?, z9 M
                        size = cnt * sizeof (long);
( n5 @9 T) u2 p9 A7 Z, [                        /* Restore the original data before leaving the function.
3 z9 M( R% G) C+ c; F                         */
6 Y3 w' n3 {  V1 ?                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
9 B; ?- B- R' F" u5 S0 D4 F                                addr  = base + cnt;
2 t* n' D1 I7 q                                *addr = save[--i];' K: u7 y8 w- R( H
                        }5 {: S5 i1 M( @& Z# l, [, R9 K" x% G
                        return (size);2 I7 H- S1 e3 s& Q4 i- }
                }9 B8 T/ D7 h4 L5 k$ Y1 m& h
        }& ?' b' A4 b- R- S- x; {

0 t3 u) E0 s6 I        return (maxsize);' n0 e9 ?0 R2 C9 J  y9 Z
}7 L3 U5 o' b: I1 k+ V& A
int dram_init(void)4 G  A  E2 Z  ^4 X+ C- M( H
{5 w: n' x& v* t
        /* dram_init must store complete ramsize in gd->ram_size */
; ]7 `. M+ f! b0 N: k        gd->ram_size = get_ram_size(
; `7 g% `) t) b8 M4 }% o                        (void *)CONFIG_SYS_SDRAM_BASE,4 _, `& [) y5 L( @: q- w
                        CONFIG_MAX_RAM_BANK_SIZE);9 G6 Q( Q9 w, v8 o6 r5 E
        return 0;
  l1 ~2 Y* z# ]# Z) c: s$ D7 x}, r9 G/ l1 z( l0 X$ w

4 U" x7 X9 {" L* H. Z+ b
1 d' k# Z* W6 g% F% E% j; Z( m. W/ s  H- z
# N0 W! \8 T) ], [1 J% i9 B( S0 @
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
" V& B8 G. h, ^: _, E& f1 o% D  u3 N% Q& {  P. s2 @5 t
0 X: c9 u+ _) N/ k& f+ {; n7 U

, U2 {9 W4 |- c. m




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