嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
# d' Q: M+ k6 m2 c8 i核心板2:DDR2 256M Byte   NAND FLASH 8G bit
8 w- b$ h! g' ]7 k5 c4 ^这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
+ i' A' X% S; w2 {' P1 [5 t, [4 c/ O  f! J. d
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
9 @4 d4 Z  i: X
$ p' v" i" C6 T6 b/ Y' x
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:; x) k: c7 D( i" I" l, h( f9 T
/*
6 G! [" D4 y+ B1 J! t$ q3 w( R  Z* Check memory range for valid RAM. A simple memory test determines
5 H) F/ j" b, Q. A; w4 N1 b* the actually available RAM size between addresses `base' and
, e+ `) l$ w3 l& ]+ m* `base + maxsize'.
4 B: j5 Q. h! c+ Y% C*/8 T2 G( t* Q2 X( |5 l
long get_ram_size(long *base, long maxsize)" k+ O# V9 x! J1 g, }) W  v8 D
{; E3 f, ^8 @  s: z8 _4 E3 n
        volatile long *addr;
" p* a/ }" Q* T! a7 |* _1 v        long           save[32];  x9 T' e; x4 e" G; o
        long           cnt;9 a4 C& {0 S2 x2 N
        long           val;# i) |" K6 ], Y! ]/ P" K& q
        long           size;
# [% V% s" v% B7 N, ~        int            i = 0;) ?; r: I0 N1 g( J

  \7 `! }' U2 b4 G        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {7 k  x, T) x/ t! h
                addr = base + cnt;        /* pointer arith! */8 A7 c; ~# s6 N3 D( x
                sync ();
7 v+ l/ N# N% h  X# ]# j                save[i++] = *addr;6 z/ Y0 I9 ~  Y/ D1 n- m% V
                sync ();
! Q+ f7 j( |- b" t4 Y" |7 w! J                *addr = ~cnt;
1 Q( c0 n  b3 `        }) X' \. F. a+ p+ i& M' c( {
  ~/ j1 t7 R! ]6 H$ d7 V
        addr = base;
3 U0 r$ m# ~  s  ]        sync ();2 d' G( u5 V: N* _5 v" f6 r8 k
        save = *addr;
1 @+ \4 l/ a( ?. z: X+ t        sync ();
, f( @9 D" U1 O" v* N4 N* c/ O        *addr = 0;/ j! |$ D2 g8 B7 g6 g/ g
( n/ f! W+ U  C2 C& P& u( F
        sync ();
. }8 x- |9 r, ^% p  n, f4 t8 K        if ((val = *addr) != 0) {
7 j' ^/ O, f* m% ~8 {% Q3 E                /* Restore the original data before leaving the function.
; ^6 N5 Y5 \( C$ d# e                 */
: \9 e$ F2 r1 n7 r                sync ();  G$ |$ a- y1 f9 e3 k( X
                *addr = save;
& d$ Y5 O; R3 V. {5 [                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {2 {- Z0 h& D; X0 A
                        addr  = base + cnt;
8 h0 U0 u. k% H. n' h9 F' \                        sync ();, z+ O7 @1 b4 ], b7 c: G2 l
                        *addr = save[--i];
. A! [" \' R9 |' o% R: a8 F                }
# i6 S2 _0 T/ L                return (0);+ s; f% r0 x# g& _0 E$ ?# b' q
        }2 i' n7 Q& u5 \. s5 U
* w2 ~  I% v+ p3 n- A
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {- g& g$ F7 W/ d: p% |) u1 y" l
                addr = base + cnt;        /* pointer arith! */
% K; e3 j8 X. C- ]' s! l                val = *addr;
- `8 B8 u; A* ?0 f; z2 Z0 u                *addr = save[--i];
0 o  f7 z) `. M* Q+ x                if (val != ~cnt) {
' f9 H2 s. M2 l. D% H2 w: `                        size = cnt * sizeof (long);- S: |+ Z+ }0 Q3 o8 A0 k+ V
                        /* Restore the original data before leaving the function.1 S9 L( O! |7 D- g4 U0 u
                         */  K2 b& {& V: o6 S: D4 K3 K
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {2 ?0 w% a7 @" c4 J4 D4 |
                                addr  = base + cnt;, h) U( \+ X! a/ E# E
                                *addr = save[--i];! V: l9 g& P, _9 A3 x) E
                        }( s2 m! Y+ ~& U' U6 d
                        return (size);; p0 ?7 q6 X% g" K" g% X
                }1 {( @3 n3 C( [% M+ l
        }
! [+ Q+ q4 X0 F, J+ j- a" i9 Z/ g& ^/ H; U6 {
        return (maxsize);
8 D$ o0 k; t) P" \1 {5 C}
( x" k+ Y4 e- ^0 Jint dram_init(void), G0 G8 K+ X4 U0 E9 i! `* Z* `
{, ?& w7 s+ i) [% Y1 {
        /* dram_init must store complete ramsize in gd->ram_size */
8 |: v6 P& @3 g        gd->ram_size = get_ram_size(
6 O8 I( v! `6 A& a& p                        (void *)CONFIG_SYS_SDRAM_BASE,. f/ F# [' g+ h& r( N
                        CONFIG_MAX_RAM_BANK_SIZE);" I) W7 @2 H, Y& E# L
        return 0;
2 H( j6 o- F) R' e1 t! n* m/ |$ `}! ^1 X: q) Y* t8 W6 W" c0 p* ]

/ q1 W, K$ \; u3 R
2 _1 X# H1 l9 s/ l- K; {
3 |. T9 \7 n0 X6 Y( @4 f! A; j4 N! U3 x# ^! u  m
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!1 R! @0 z' z5 F6 U/ p3 ~9 e- @
. A5 B$ t* m2 X' Q+ k; G

  g, C6 P) a0 Z( |9 S) `

. ~  s* P: H5 E6 X




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