嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
. ?) H; T) P- Z: R核心板2:DDR2 256M Byte   NAND FLASH 8G bit) s- ]  i4 |/ e$ p
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?) M" L7 ~, X! w# \0 |- s9 d; K" i
4 w" w0 U: q0 m$ v
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
, q; S2 T2 I( C
1 `) ~8 u; }; k) N; |6 D& ?
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
* @5 ?8 t. H" r, w/*
: v4 i4 B3 J6 m. N; X/ T9 [* Check memory range for valid RAM. A simple memory test determines- q! @% [, q: n/ b0 M
* the actually available RAM size between addresses `base' and. A. u, P: o  H+ Q. m5 U
* `base + maxsize'.
5 u* @5 |  A3 a1 F  D  J*/
* J) Y, i0 x0 g; {* D9 S. @; r5 Slong get_ram_size(long *base, long maxsize)
+ d" n9 ?) I9 a2 @{* H2 @: A0 A- i  [: |9 I4 }
        volatile long *addr;+ Z( P( ~& U! c3 d1 x; n% e& a
        long           save[32];
* m. }" T" b0 J4 x1 P' I        long           cnt;
1 J, I! e! v- K8 k; V* g- J0 O4 y        long           val;
6 W. U8 z3 t  Y- H4 @: @) W9 F        long           size;- H7 p+ S+ J! T& e
        int            i = 0;. p+ `9 a# {! j

. ?# t1 Y1 Q/ G9 ]        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
. y5 _4 ~2 a) E. I9 S                addr = base + cnt;        /* pointer arith! */
6 a. t. i; S! R                sync ();
" {/ e$ I; E; T% T; I& w6 a$ d. ?                save[i++] = *addr;
  Z; c; E  K4 x9 W# P2 J3 x1 J- k% V                sync ();
5 a! E! S' `$ G* S! u                *addr = ~cnt;
$ Q/ M+ ]# V4 x* @9 F- \+ a, J        }
+ }% g3 f2 }2 d! Q6 Y6 E- e  f, O* M- F! l8 s6 R  f' }3 |' P
        addr = base;
+ A8 F2 H0 n# Q        sync ();6 S! N2 a  K& k9 v: p5 ^
        save = *addr;% _# b$ R: V3 ~2 x8 g  h
        sync ();5 K( U& k$ t9 i* R1 a2 j* l
        *addr = 0;
7 @# E* ~' B7 p5 \6 t" X+ L; N+ n7 X! u+ Y; U# L8 o
        sync ();
( T$ u/ E2 _! [9 C; |/ d        if ((val = *addr) != 0) {, ]/ |  e( x/ ?1 M) L) x
                /* Restore the original data before leaving the function.
+ u8 g- p% g+ {8 ^4 m                 */
# |. y1 {7 y* g  Z                sync ();
3 a" w. I& B7 {0 o5 i                *addr = save;
" K2 R/ W9 }& v9 d3 D% [                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {/ h: ?& j( I+ s* X3 S! k
                        addr  = base + cnt;
- T4 T" g# R& Q( Q& T3 k- U# m                        sync ();
  e! h' a5 Z; [" Z  s+ ~                        *addr = save[--i];
9 K2 c, F7 Q+ I; w; o/ D' x                }" s8 M7 b, `# j9 B7 u% K
                return (0);( n& |$ C( l, m. R  M: D
        }
7 u* g8 @" Y8 h. ^  x1 _( u- z, q& q4 C8 i" i; g% [& r
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
6 E1 C$ I; L) |/ S+ g0 Z  G                addr = base + cnt;        /* pointer arith! */0 L, t# `7 ~: e6 j  n% X
                val = *addr;
7 P8 }6 m6 L: [. h! J                *addr = save[--i];* o) e$ U/ [; {5 o$ D
                if (val != ~cnt) {4 _; E6 H/ c0 R2 |& O7 B8 ^( B
                        size = cnt * sizeof (long);" p8 B0 X9 \- U5 W% Z& j: f' z1 Q
                        /* Restore the original data before leaving the function.3 P. H+ Y/ ?, ]" Z0 A: ?
                         */6 ~3 C/ k. r$ s  r
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
3 N/ j0 z) a, _* I' r1 }                                addr  = base + cnt;, N$ G- b, \( j4 a
                                *addr = save[--i];' |7 s2 N. }9 L8 J# X- Z6 b1 j
                        }7 O( b2 L: U. Z9 j6 e3 g
                        return (size);0 d# X9 U8 g9 k" h. H3 N# ]
                }3 N! W' S- x6 @1 W& a
        }
8 l, `9 ^3 j7 n- K1 |- n9 M+ E, h( \, a3 c
        return (maxsize);
( t$ w$ h% m/ K& K# l5 z' Q6 A}
) ^7 Z: z. ?7 }% iint dram_init(void)1 u& c" @* C& K& I5 F5 k1 \
{
' b6 `7 Y, _" ]6 O        /* dram_init must store complete ramsize in gd->ram_size */
9 G; h* {: ?+ d8 c, H& H* y5 u/ A        gd->ram_size = get_ram_size(: J" w6 k5 X5 |; e
                        (void *)CONFIG_SYS_SDRAM_BASE,* X# j. i- N0 I  Q
                        CONFIG_MAX_RAM_BANK_SIZE);
+ p/ z) b  n9 w4 n: A$ o        return 0;7 S% r% C. d5 w! R
}! j! U8 t! b1 D8 c

8 U8 g  E) z" ~. P! o
0 ], D4 z$ M  L6 a: ^; V! D8 Z' x: q/ ~3 c- P: E, ]

3 y$ u# W; R* A% b  @FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
9 W, Z% B8 {, Y; m
# [( O4 N* d4 |
3 z4 l  {+ j) N% c+ m. z/ ?

% d8 T, D5 n6 w7 A& B2 M9 ?




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