嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit# S% a; ?* y  V
核心板2:DDR2 256M Byte   NAND FLASH 8G bit
! ]. S2 a; [& k/ t0 C% @这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
2 _# P3 M! A* S6 @! o3 Y" a) v
6 o2 h- _0 L2 v9 n' V. c8 @是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
: O) c- k* @- {/ f8 e/ w- h- w' ^1 e+ O2 h- A4 e1 N3 {+ @

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
: O4 S5 ~6 L/ D6 N9 F/*
% [4 Y; t: X0 F( N0 E* N7 N* Check memory range for valid RAM. A simple memory test determines0 k3 l6 o/ x( A4 |9 T3 U3 \9 s
* the actually available RAM size between addresses `base' and. r0 i& w8 H) Q7 x2 \/ l
* `base + maxsize'.
2 {5 z# u. ]% `9 r7 }4 G8 d, W*/; K, b6 H$ Z5 \
long get_ram_size(long *base, long maxsize)3 p: p+ m$ w! P8 L6 C/ I
{! P% y, c. v/ `
        volatile long *addr;
6 a' m; b# H7 [6 d        long           save[32];) j4 |5 k% B; [' \8 p+ V
        long           cnt;
$ R% r% ^8 Y& R" I- F0 h" s* {        long           val;: R6 B' H7 ^, H$ s0 s6 }9 k
        long           size;
1 {: V# |5 w4 w, ~6 S        int            i = 0;9 Y' z8 O( p2 @7 u9 q- }
4 i/ m4 C3 u1 X8 ?
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
) i4 H# F& D) }( N# N                addr = base + cnt;        /* pointer arith! */" r. j3 _$ _9 A' K! q% g* Z
                sync ();# e6 q3 H8 ^: Q/ f
                save[i++] = *addr;- l- e0 Q. ]8 o" d( Z
                sync ();
8 A) m7 j2 E! m+ }) B8 \$ ?                *addr = ~cnt;! B6 F& K2 ^6 R, A
        }
. Q6 F" r; K, t6 t% n+ m. l9 A1 ^9 x3 K
        addr = base;. E: p4 }( w( [! f- t
        sync ();
' _; d; i' F2 `  O7 V% \# K8 A        save = *addr;
6 E* G8 ?' B/ H0 v" K  _        sync ();. \4 _% T9 s$ D! K5 A
        *addr = 0;4 A1 B: {6 ?7 @4 Y

9 P( }6 m% N( r9 Q9 b* f! Q$ Z, K: |' E        sync ();
' R4 D) n) h) @  L3 C2 M8 D$ n+ n* j        if ((val = *addr) != 0) {
, C# Y' n# c. H$ Q7 [' D) `8 p6 s                /* Restore the original data before leaving the function.
# \5 g' s! o7 o& |# k8 A0 g( a  U% H                 */
, l& F4 s' y. D$ k1 K                sync ();2 b# G/ D( b" x% X, x  L* t
                *addr = save;
: b5 u, C( m6 f% Q/ b. Y                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
' r. C$ _& @9 {# |' Z& F5 p9 W) m+ c                        addr  = base + cnt;
8 ]* p9 B: T" k                        sync ();
+ ]0 T" r3 @7 |3 j" K. e4 q* k                        *addr = save[--i];
& j, e  O9 L: v" U4 j" o                }  t. y7 P+ X  m% ^9 |
                return (0);4 n* X+ w7 A' D$ P) ~% B9 k3 H% I$ ?
        }
5 L4 c" z4 O6 u$ V/ u: q! J, q2 B( {, g0 O* `8 H
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {& B' Z% O: k; \2 K3 l7 Z7 m# f
                addr = base + cnt;        /* pointer arith! */* A, z% ^* K% J
                val = *addr;
4 u1 x) H: y8 w3 `4 C" L                *addr = save[--i];) k! J; }2 J! u4 J. s3 E
                if (val != ~cnt) {/ j. f5 G! B' G$ d5 N
                        size = cnt * sizeof (long);$ C' [( |2 c1 @  n6 a9 G
                        /* Restore the original data before leaving the function.$ m8 m* C& d/ C5 T' `5 J9 O
                         */
9 \' v# A. @, `; H( M; b                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
7 P. [! ^2 \; w                                addr  = base + cnt;) v. w: d3 t, U% o- q5 H5 H
                                *addr = save[--i];
; W  F( @0 n/ h9 X1 Q6 T                        }
, Y+ Z5 h3 D. f/ o$ Q                        return (size);3 W- P/ S- A; K/ T" Y
                }
5 d1 f0 J+ }2 i3 {, u3 x        }6 g1 Y( [, c1 ]) W) {8 p

6 c1 [2 N# O6 E$ X* z; D& @        return (maxsize);
5 ^" z+ j" A, R3 U1 X) M}
5 b- d# e, R; I+ T& J, |int dram_init(void)$ v  s4 w  O: a* ]0 m( Z
{
& q1 ]& O- q! \, h' w% N        /* dram_init must store complete ramsize in gd->ram_size */: l- a) O& J0 d! R" [* E2 C. W+ }
        gd->ram_size = get_ram_size(. d4 c) S: F  w7 K
                        (void *)CONFIG_SYS_SDRAM_BASE,
" b3 x8 i/ B% ^                        CONFIG_MAX_RAM_BANK_SIZE);
8 X# g7 L* {, B' y% w        return 0;
$ C# ?9 J/ B7 M5 S7 ?5 W" z}0 w' ]" A7 N: T! e4 S! ~
; C4 v" w* X) G" t- ?
3 k9 I0 E6 }" k9 X" [! i* ~1 A/ }/ L
6 Z: F. G% H* i
* h7 A, E. o# n
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
" J& ]4 M( f* W1 e  ~6 }( ]! C/ @% A, a
" U7 D+ X. `* a8 v" l& L1 I, \) ?$ S
0 |/ W  Q1 ]- t+ a- I; Z





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