嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
0 A3 _% @* F8 ?核心板2:DDR2 256M Byte   NAND FLASH 8G bit: T- J" ~9 \1 v
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?% w( ^, ]' B  q$ G* v, Y# b+ `4 N, L

* h5 V: [5 ]8 A+ u8 W) V是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?# Q/ A8 x5 {! ?/ \

/ p6 k  V; C9 ]" H4 n
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:, J4 I9 r  P1 t2 M9 b. d
/*
! h0 U" v- E) C! i, f; h) e; h" l* Check memory range for valid RAM. A simple memory test determines
8 y+ l* N4 A3 b* the actually available RAM size between addresses `base' and- m- O- h6 z' N& m1 g
* `base + maxsize'.
* I6 U5 i. w+ h9 q( K+ \2 h! S*/) e1 s1 M; U3 M' L8 R9 d1 p
long get_ram_size(long *base, long maxsize)8 m+ V+ m3 Y7 [1 ?+ C  I
{1 }. x' p. c+ x* W9 ^
        volatile long *addr;
( E7 q$ C$ e) G8 @        long           save[32];( e, q+ v, @$ @" l, K, i% }
        long           cnt;$ m6 W* t( J6 l' Z
        long           val;
& I- i- {3 }3 T: i8 |        long           size;
  G2 R; D, L7 M% w9 Y9 [        int            i = 0;
2 Q" [2 v6 _+ k2 N9 |! ^1 q, z4 b- y
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
( p/ K' E8 k! Z, O2 ^3 g                addr = base + cnt;        /* pointer arith! */
6 m1 E- e! s9 J1 r7 l; D& D4 j                sync ();6 d5 h0 a4 {9 W9 k- z- Z
                save[i++] = *addr;$ G5 j6 m) i5 B2 [
                sync ();
6 z3 W4 ]0 r2 S# M& x- C! i                *addr = ~cnt;
8 f1 J& y0 m7 B1 U) o( ~5 n        }! z' Y4 r! U3 R8 S' V7 \
3 ]5 {6 d  k5 [1 N3 N2 n
        addr = base;
) g  ?* ^1 v, v$ t        sync ();. v# A. P0 f" i
        save = *addr;
/ E9 ?! @0 C: ?& V0 e: C        sync ();3 @" j# _! a; i9 A
        *addr = 0;- d* R2 j9 N0 o* y: ~& ~

7 v$ V0 H8 p# ?+ I7 o0 o        sync ();1 s* N* T. g( H
        if ((val = *addr) != 0) {# P% W$ T* Q  L* S- g; E
                /* Restore the original data before leaving the function.1 l/ H  G, |# n4 V7 N3 I
                 */
) k& @/ w) H5 V" r                sync ();
) \( a, _, U- t1 c3 x# ], G$ m                *addr = save;
) N$ d3 `! [, @                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {4 R$ x' \/ F1 d% ?# g
                        addr  = base + cnt;
2 U$ K! D6 w: e& l( m" X! G  A                        sync ();
5 I9 g! M3 y! q! t% [, g5 A                        *addr = save[--i];3 ^# R4 c0 S, G9 W) M
                }
: u) u0 [  d- r% W                return (0);& @0 d9 [6 Z' X' z) b( }
        }
) A, \0 |$ Y* X; E  Y
$ I1 n; q8 u% v# ?1 t( v& l        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
/ b! ^/ S. f2 f( e6 R1 c. O9 B5 `3 T                addr = base + cnt;        /* pointer arith! */: G: N$ f" p9 V6 z6 n6 [- Z
                val = *addr;
' p  R& u: E" m; h0 @                *addr = save[--i];( B8 }: x8 K0 `' Y7 i& f
                if (val != ~cnt) {* l/ k8 g% Q  F) P4 I7 g- q# p5 B
                        size = cnt * sizeof (long);6 @, w+ k6 L: ?% Q1 r
                        /* Restore the original data before leaving the function.
, y9 S, B; \& j                         */
# C! t6 |3 |2 v1 i4 s6 C                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
% e* ?/ b) I/ h1 I" X3 ]                                addr  = base + cnt;
% Y- t# [1 f2 ]3 v" c                                *addr = save[--i];- O- x( w% q$ H- a( [
                        }
+ H% ^& z' ~- K+ J* B                        return (size);/ a- W5 m* T: E" d. ~6 Z+ r  `
                }" k. X1 r2 Q4 n. n8 f2 H* U) y
        }
! ?3 [( }$ C& K$ s( X  s9 Q" o9 L  U* I5 Q4 Y4 o. W
        return (maxsize);3 o) w9 e9 o5 h+ w
}
: z1 s& ^: G2 ]+ r, uint dram_init(void)/ Y( w4 L. p( M4 R# r3 E! A
{" A( S! X" u" d3 t5 @7 W
        /* dram_init must store complete ramsize in gd->ram_size */
% R6 ?" A. A- r) F7 E        gd->ram_size = get_ram_size(
; h, y3 _0 d" n* n3 d, _                        (void *)CONFIG_SYS_SDRAM_BASE,8 u% s3 J  I! u: D  g1 R
                        CONFIG_MAX_RAM_BANK_SIZE);
: K9 P  j8 z, L+ x+ L* W        return 0;
* j4 v9 c4 Q, S}! s. h6 L+ ^9 e: F9 j
. l- V# `: q0 L2 Y! ]) c
  V1 a/ N: Z4 x! Z
# L# E% G/ e4 W+ I2 \3 U
! O. \5 @& ~( N) T
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
1 s" W' P( |5 r) x+ w) g0 z
; g) }( i9 K3 I" F1 }5 \! M& R5 M
9 x7 o9 X/ T3 c+ T
$ F! n; C* i/ j# M% }5 S





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