嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit) _& Z) K; w( M" Z
核心板2:DDR2 256M Byte   NAND FLASH 8G bit1 P2 J) s) _% ]" y9 }0 i
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?/ x9 ?! y- f# C2 @$ o# p1 Y1 o1 P

' @: V' j6 g" X( V) \% Z是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
: H6 u  ?: [+ M( p* S5 ^- j+ l( ^/ p6 _% b

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:, O9 @% [  E/ ~0 V; L
/*
6 z" D) Q4 D- K- t. A( D* Check memory range for valid RAM. A simple memory test determines
- K, H5 a* I+ g% D  K9 r0 n* the actually available RAM size between addresses `base' and
/ ^' E2 y/ {" A* `base + maxsize'.
* X; p7 ?7 `8 R2 s0 U1 |8 O! w% E*/& Q: W3 t. n, X' z
long get_ram_size(long *base, long maxsize)
* _! P4 _" x. L) s  y{
6 o$ [& c# z2 a$ A7 d0 K! V        volatile long *addr;3 S0 X" O& P5 l4 A# \( [. p* ^4 v2 _  [# @
        long           save[32];
* t, [+ S& M: u        long           cnt;8 |  M, H/ }' }
        long           val;
* @+ v+ w  K$ r: O' k+ j; \* `: Y8 \        long           size;
& }" ^& l# d9 W9 d        int            i = 0;
' _8 V+ c9 h+ P! ]2 w7 [2 j4 o$ y" \: W  u/ H
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {: M; l5 N2 Z+ V0 B1 B( ]
                addr = base + cnt;        /* pointer arith! */
7 A  Y/ p. I5 b7 q                sync ();3 }- B5 ]$ r4 a: i; ?$ |, v
                save[i++] = *addr;
2 \" F% G4 T: ]! N3 n. y                sync ();
1 e. i5 i; K9 G                *addr = ~cnt;
0 b* K! n- i' M# {$ G+ L& ?        }( \8 \) O6 j7 l/ N
( V5 ]& ]/ M& F5 W5 D) {
        addr = base;2 o7 f$ l1 [- n" m2 n6 b
        sync ();
/ w! r$ `* D, a# ^        save = *addr;
9 y  l4 a% J/ F1 H$ E6 k        sync ();0 b( e9 Z4 p$ N0 z) z% s) f
        *addr = 0;7 ^+ R) _! g) l
7 O( t/ E  ]' |8 k9 u$ O5 C
        sync ();, U$ [  g1 K, }5 @
        if ((val = *addr) != 0) {2 y" ]) j6 A6 ^
                /* Restore the original data before leaving the function.& f' p; [. q& r) p5 W2 m) f$ k  |% V
                 */3 v9 G3 @! N9 N; F
                sync ();* X$ B( c2 }9 ^$ K
                *addr = save;9 H) d, o! ~* j+ D+ C2 |0 G7 g
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
6 l* s% Y# R! O* k5 w                        addr  = base + cnt;% P& k. S- k: n4 i2 g6 w
                        sync ();- a) x$ ^' x3 w% L/ p6 S+ g8 J
                        *addr = save[--i];+ R# Z. g9 }, I3 w6 I! @
                }5 h" N2 r6 ]# K0 d0 C) M! D
                return (0);8 g2 ]5 g  Y' `2 ?- \- I: d; u. H
        }3 Y/ Y7 g% Y9 G3 a. S
4 N, E; i) a$ P! t' v
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {7 z. M4 @/ W7 O
                addr = base + cnt;        /* pointer arith! */
- J# i& @8 H2 {: U$ W                val = *addr;, O+ ?* I7 K! ~7 [  W+ t
                *addr = save[--i];
  _, u) G$ ]  g                if (val != ~cnt) {. j: Q/ U6 Z8 Q& a2 i+ K% H
                        size = cnt * sizeof (long);/ d) p' l8 J/ h( ~
                        /* Restore the original data before leaving the function.
/ o. y; S2 c2 ]$ K7 ^                         */1 W' B) B/ u7 z( T- h$ {
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
$ U6 z7 h* b8 K, B# s                                addr  = base + cnt;
' x! `2 E3 H5 E0 L                                *addr = save[--i];6 ?( N$ e) \; Q5 x0 M& Y* o4 J
                        }
* q6 p! E6 G( L: P$ q                        return (size);+ \+ y8 J; ]+ r# f; \! E
                }! [9 A- |1 e: W  L- }
        }
) _3 C4 e7 }2 O' o2 x6 n  J9 h0 Z% G) f; W7 \. r1 A  D
        return (maxsize);" _& P# t' @0 d9 [# P; g# Q* I
}
( a( f  }% q1 ~! lint dram_init(void)
, |3 }+ H! X/ W$ B6 Q4 z  k/ R{/ \+ f! i0 v7 b0 W
        /* dram_init must store complete ramsize in gd->ram_size */
+ N) |: |' }; c  u1 d        gd->ram_size = get_ram_size(% a) d/ B/ G. d' e
                        (void *)CONFIG_SYS_SDRAM_BASE,
# {* ?/ I' R7 {7 J3 x; H5 Y! @                        CONFIG_MAX_RAM_BANK_SIZE);8 N( `9 [' S7 A
        return 0;
: Z1 I$ }, Z3 z  }3 ~* m, o}! q9 g5 ]3 t6 g/ z! I! K

8 i) @6 C4 g5 N4 l) |  S$ D5 C6 `" D2 r- k* J1 v
, u$ z% Q% j% h( B' y4 W7 i

# e9 T& W  {4 [0 G0 {FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!* N6 h! s  x/ K; F) L) d' e$ C6 }

. y) Y' K+ M) x2 s! L: n
0 |$ x, B8 @$ H

$ x, G8 t$ s( ]* a4 C8 s




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