嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
( |4 N5 `6 p; J2 ?4 H$ |: x核心板2:DDR2 256M Byte   NAND FLASH 8G bit
9 I% L7 ~* ~, l, f+ J' |" n( Y. h# y这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
: a8 L1 G) Z' Q; m! _* M0 Y8 q: H9 {8 {- C6 P" w7 b
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
2 O4 m! b4 W1 m* S0 x, c6 V5 s2 P
. U5 y7 _: u5 l8 a: y% l
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
1 S  e1 o, R* N# `# }) _/*
6 q7 `" s/ \9 m* Check memory range for valid RAM. A simple memory test determines0 W: Y, ?# D0 `- X1 W
* the actually available RAM size between addresses `base' and
. V; ^% G& Y) E% k# }$ R8 W. X* `base + maxsize'.
6 \: M) K9 X8 Q; Z$ G3 ~2 a! s*/
- u9 t" L% w6 l2 S4 p- e8 Flong get_ram_size(long *base, long maxsize)+ P, x4 B+ v# G5 |) t* l8 [
{4 p+ e/ M+ m+ l9 n' _( R
        volatile long *addr;
9 h3 Z1 u( d' W3 p8 S9 V# |        long           save[32];( X& D  [  M7 Y' n% O" a$ U
        long           cnt;, Y# ~9 K  I* D
        long           val;
' r2 T8 T- Y0 e) F        long           size;
9 M1 @/ D! F9 p2 Z        int            i = 0;
. z* V+ _7 d  Z* l3 X# _+ L( i  I+ a$ _5 N* Q  O- t3 f
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
( }% j1 K1 R( l                addr = base + cnt;        /* pointer arith! */1 ?, _+ W5 L) C
                sync ();+ f- P  n8 a9 O: v+ ^
                save[i++] = *addr;
( f4 m9 t- g% y6 m) B) f$ P                sync ();- V+ f* o3 ^4 E% a8 R
                *addr = ~cnt;
" ^6 x( G6 K' v4 b  a+ \% j1 a        }8 C9 n5 A" p# ~- f0 V1 D1 T' F) N) G
7 w+ R- X( h& a( i) a0 c7 d, s
        addr = base;
3 d! k7 Z% i- H$ o7 F/ }        sync ();0 C- k  e+ f& c! X, a
        save = *addr;5 b4 p+ E# y, L' V/ e: L% ~
        sync ();
& M1 D8 l" U- C        *addr = 0;. _+ a4 C% |" }" X7 P# j" y
' }" ^5 {, V( ~! ]  P+ ~- Y
        sync ();2 D2 V# p2 A# \' o6 B+ b) w& L
        if ((val = *addr) != 0) {
  H3 s) l* G3 w. g. a- m' L0 z                /* Restore the original data before leaving the function.
- f4 t/ R/ f$ q                 */
9 s  t6 ]& V9 p. m5 E- F                sync ();1 |% n" l/ `. [# [& V5 q9 V( J9 y
                *addr = save;" y, W( {3 }) d1 [
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
2 I5 W3 m0 d3 P7 }# A/ f2 @                        addr  = base + cnt;
' Z: d( \$ [/ ~3 m7 e                        sync ();8 H( m& |% V# m! G( ^! Z/ r
                        *addr = save[--i];7 l" |, m6 @0 b
                }
2 w+ |) |5 y0 p  x; t                return (0);- u' F3 ?7 s7 h6 J. k8 g
        }
9 @+ B# o- a; R% N* j: D% \" T- d' O9 `, Z
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {; ], l6 [. S' F! m5 b
                addr = base + cnt;        /* pointer arith! */
( t% S* y: r$ T/ K5 Y1 n                val = *addr;+ ~- H: f' M0 a8 @
                *addr = save[--i];* v1 j4 [0 z$ N
                if (val != ~cnt) {6 ]1 s/ t' W$ D: ^% A3 O' z
                        size = cnt * sizeof (long);
# C( _& n9 o9 z* m0 ~5 ^! w; X. l                        /* Restore the original data before leaving the function.
, t6 ?* J0 D" ^                         */
+ g' e$ s5 k! C2 w0 m+ l% `  X$ s4 P                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {) u! T1 _: x: h( g* ?: e
                                addr  = base + cnt;7 }. r; i& J) i, O( X/ X
                                *addr = save[--i];
6 Z2 Y+ r! p! Q, T0 K                        }1 G* d, r1 z3 M5 B& m9 O
                        return (size);  |8 g5 d; o$ y# Z# m: Y
                }; @; r4 Q" C. j( Q  R- a" N2 \( D
        }) h: K/ I) c# z% o2 L) A5 v' F% M
# [; i. J5 q9 y4 b; m" j
        return (maxsize);$ s5 f* j: O5 A% }9 v( H
}0 Y. m( o( X& S) I4 `$ N
int dram_init(void)5 r" K) D! w! ]: w/ b& ^" f
{' b0 h$ l% z8 L
        /* dram_init must store complete ramsize in gd->ram_size */6 v* b* a: n5 w
        gd->ram_size = get_ram_size(
, {, s- j. d" |- O) S6 i                        (void *)CONFIG_SYS_SDRAM_BASE,  F3 K& ~& b$ C
                        CONFIG_MAX_RAM_BANK_SIZE);/ n- Z5 I& U4 `. o8 ?
        return 0;0 d& a' P: }+ a1 v4 U& D
}  H3 `0 a9 R4 a( g5 {) u( l

' Q2 c: h# j. A% V' i5 M+ B% z$ [0 O; c# U4 V* W8 T4 N) t/ }
. G7 J: i1 L. J$ l( x# X

5 D+ h3 V: w8 `6 S, u( u" O% _6 vFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!' F+ u9 G' C" P* M
; n, D/ r0 \: o0 j( S' _" `1 i
) [9 b' w) p) D5 o7 O/ F$ U

- h+ a- ?$ E* f9 L. ^2 D




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