嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit  g6 A# s; b4 H% ~5 C
核心板2:DDR2 256M Byte   NAND FLASH 8G bit; d4 k5 z" Z7 l% y* d% H
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?  S2 U: {# d$ h. [8 G' l

. l0 x3 |3 z- n0 ~2 H' h1 R, G% [  G是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
& N3 y4 \% B8 d8 t8 B2 i# D: i' J

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
+ s. P  a8 b5 ]2 d: K/*
2 F. x  m& O$ m4 B+ z* Check memory range for valid RAM. A simple memory test determines; I+ D: \9 R6 {- c1 l, m
* the actually available RAM size between addresses `base' and
2 k' A5 E7 l0 C, k* `base + maxsize'.
. G9 A- `+ O6 C' a*/
3 G5 n! a3 H, Blong get_ram_size(long *base, long maxsize)3 z- u; T' e7 L& L. v
{/ u5 T; W0 T( \5 O8 d; K
        volatile long *addr;5 X( x2 a; F* O$ n# }# l
        long           save[32];: u: y: Q/ e2 W5 X
        long           cnt;; s% `$ ?9 l2 x5 N
        long           val;- s- i7 u( |/ m5 `9 Y/ ]
        long           size;
* F( ^5 Q8 ?8 ^' a) a  n' s3 B: \        int            i = 0;. |# K( B5 U- A/ `7 C8 S
# {* C! D7 Z+ W
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {" `2 G! n! ^% a. b* g
                addr = base + cnt;        /* pointer arith! */
8 E2 T0 Q0 l+ a4 y1 n1 N1 y7 U                sync ();2 h% P7 e; q# I7 Y
                save[i++] = *addr;0 K# a8 ^% U& b% o' ]
                sync ();
1 e  y) b: }& y9 h7 J+ j                *addr = ~cnt;
. d( O4 V: Y4 ~        }9 i+ I9 v) ^* v" Y8 k$ d
; K" W! `" ~7 N5 R
        addr = base;
  ~9 k, z1 u. P, Z+ [1 t8 _        sync ();/ D% k$ J/ Y4 l( _
        save = *addr;
  ~. H) B" N0 F+ z        sync ();
; C8 l, I* a0 a( f        *addr = 0;
4 x/ T2 z7 s' P" a7 `  C
* v) @( x6 o& q( F* f, `        sync ();. q+ {5 B! f: y
        if ((val = *addr) != 0) {2 ]$ W, T" ~$ D1 Y8 Q
                /* Restore the original data before leaving the function.1 s+ }& i  I* Q; E1 Z7 I' T
                 */" g6 s2 A" w, z* y; I5 S, F& T
                sync ();. M  c$ z1 ]2 F
                *addr = save;1 U) l. I0 p$ I7 I
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
. T2 E3 k7 f7 b4 t0 u# _                        addr  = base + cnt;
4 K; \1 L+ |5 W; U9 e& c4 m                        sync ();2 P% W1 v/ R% D/ m( [, K& {( w. _
                        *addr = save[--i];- {! [6 E' m$ L! V
                }9 K- S  y% S) q$ e( L$ f; t4 ?
                return (0);7 C( ?  D; ], {; |1 C. L8 t
        }  H9 Q; _! ?& U, i0 K, P

0 `6 K' U" I, @5 u8 [+ Z) A% M        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {. s) b% G, U% n8 ^
                addr = base + cnt;        /* pointer arith! */1 u2 q- L7 C8 C
                val = *addr;% ]1 q) L9 Z3 J/ H* P4 m+ Z9 d. _
                *addr = save[--i];4 R/ l1 e6 f9 e0 h5 p6 M" Z
                if (val != ~cnt) {
2 {9 R2 ^6 B  {6 L. @                        size = cnt * sizeof (long);9 G, l% s7 ~3 D6 B$ g# ^
                        /* Restore the original data before leaving the function.5 K# {8 b$ ]- i& z* g
                         *// J7 t, U3 \% c) O- p* h
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
# m5 ~  X8 G/ D9 s                                addr  = base + cnt;2 Z0 i6 ?, k+ C' k! Y, A" \
                                *addr = save[--i];
) l2 k8 @! S8 ^2 H                        }
& y! F; \  _1 e8 c% H                        return (size);1 b5 D/ a* {% G% ]3 ?$ f: t) P
                }
5 P9 Z( e# g! N; N0 R: Y        }! [( x+ ]( {. s; K
- q8 C1 O, [' G$ G
        return (maxsize);
  {9 l2 S" S6 ?+ Z}. c/ ^7 o+ r, K% z8 E
int dram_init(void)2 {; ^4 y& p7 @; c
{. [* ~7 u: B2 u3 Z! e, }  U) z
        /* dram_init must store complete ramsize in gd->ram_size */
& c' y: P3 W. V0 u& m        gd->ram_size = get_ram_size(
" u9 R3 Q( W  Y/ A* b                        (void *)CONFIG_SYS_SDRAM_BASE,2 O8 |& t3 W5 k( e$ |- |2 v6 U4 F
                        CONFIG_MAX_RAM_BANK_SIZE);5 [  }1 [4 ?/ y9 q6 F+ m
        return 0;
2 A- `( x' y4 j! z}: S2 C# s, g% r+ A' l
3 M: a  g; t$ v$ Q8 n( D, \* A
5 z! A: `# X+ a  z4 r6 c
) N5 |3 a7 j. C3 A; {
6 @6 O+ B( _  K( m
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
) o* `' n6 n' e% P- s6 A& d+ h8 C+ t- Y: u) L
" T. o/ t" g6 x6 j: {  Y$ ~9 ^% F8 h  x

1 l. C4 q5 l9 J0 s




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