嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
1 R) H) F. |1 b* H核心板2:DDR2 256M Byte   NAND FLASH 8G bit
0 k& `- p+ Y/ f0 I( y这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?2 T7 {8 ^) r* z$ r# `

( F6 G7 B( l# U; m是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
2 V0 w, e# }& H
' b, g* `0 ?. \+ j- c& r# M
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:9 u( M% Q5 t. m2 V9 ~7 M% b
/*5 z3 y5 ~- `0 g9 X
* Check memory range for valid RAM. A simple memory test determines- ?# W- ]% {# u6 c+ K+ C% e0 c
* the actually available RAM size between addresses `base' and5 l/ l2 k( P0 s. }( k
* `base + maxsize'.
4 g3 T% a5 O: x8 r% _0 H/ s3 Z*/$ _9 C) _$ ~! i! r
long get_ram_size(long *base, long maxsize)# m7 N3 C" k# G7 c, T$ l) w
{
# ~( X2 p; x# E" b8 {+ n8 n' _        volatile long *addr;
" t$ A( V% ], o1 h3 e7 ]        long           save[32];
# y1 ]" H3 I: Y9 x        long           cnt;
, i" b& k: S7 z* T7 J        long           val;
0 L" K. G# J/ Y        long           size;+ }% r5 w  G: q
        int            i = 0;
2 o6 y7 r  Y9 T; L' ~4 [/ r$ I3 q1 h
4 W$ T5 T) N  G! \8 n/ N% M* W        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {! \' N, B3 I  N4 O. ?( Z
                addr = base + cnt;        /* pointer arith! */
5 O5 M) ~* M* r% \1 b& E  K0 A                sync ();
- a( `# h9 b0 ]2 |- o- S1 Y5 b: R9 e; R                save[i++] = *addr;4 U- m. k5 Q8 v  Q4 X% e- k
                sync ();
8 O) }2 R. A: r9 X: X                *addr = ~cnt;
8 k6 l+ G& Y7 q3 s$ @3 ^        }
# q/ u2 p& A# O. ]0 r2 m2 [* l# M
* s, Z1 S  F3 W- K        addr = base;
; W  l$ t. y* i6 _6 I        sync ();
8 T: R* Y# o: ?# Q8 O( X1 x* ]        save = *addr;
2 h+ t9 U: V( ]3 ^. s/ Z        sync ();! g2 s" U* B- m
        *addr = 0;% B) I! s! T: o) C+ E2 `5 f

2 D! \5 {) S7 p        sync ();3 P2 g7 }* k' J; h- Y3 K3 R
        if ((val = *addr) != 0) {: s# `5 o6 x3 s. J
                /* Restore the original data before leaving the function.
7 |' ^) J; j' S& r! J9 |                 */
' _1 y: }. R$ f* J& x) r. u# P                sync ();
# l, [; @+ c- j( u7 N( r' l/ G                *addr = save;
# \0 h6 A; |9 b) y$ j                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {4 B5 ]$ Q1 f( X  ]
                        addr  = base + cnt;
* d4 Z3 G5 M: E7 z' C1 }3 ^                        sync ();
1 }5 J7 x1 T2 e- m* J6 }" X9 f0 a                        *addr = save[--i];$ H8 w0 [# ^* i
                }
$ p) R  P9 S7 \! t8 I                return (0);) \& Y0 }9 [; C' @3 |5 r8 H
        }
$ g0 _5 S$ {* Z8 B8 l: ?, A- h& y/ D$ I$ d5 C
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
0 d  E6 _# v$ y0 m6 m  ?                addr = base + cnt;        /* pointer arith! */
- `2 z/ M2 u# @/ d/ O                val = *addr;
1 z  @( Y. ]* x/ C3 u$ T                *addr = save[--i];
1 n! N6 K/ g$ `5 s8 @$ r' t$ _                if (val != ~cnt) {9 K0 G8 m. n5 b" _* W
                        size = cnt * sizeof (long);
6 n# k$ k% o' {+ c/ z& y  h                        /* Restore the original data before leaving the function.
# [' ~; J8 C/ p                         */
* l6 ?3 J; F/ [: I6 ^9 m7 Z% a                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {- |1 l, k0 j- I# O% c* V( y% A
                                addr  = base + cnt;6 S$ D3 O+ o* M$ a, I) A9 ~
                                *addr = save[--i];
  b# I/ V: k7 ^! r* [                        }+ p/ g* `) c0 s' F0 r6 h
                        return (size);
6 e( S8 D% j- B8 ]! L# w( j4 t                }
7 m5 Y. X" S2 X        }# j6 v; _; U3 }+ I, [- T

3 c) b& c) C( d+ ~! g! I0 f        return (maxsize);
/ Q& Z3 u( O& r" U6 O}7 I* e3 E# p: C) L7 T
int dram_init(void)
3 n$ N+ K" t& m+ Y{
' t; G1 ], P) q, z$ m$ [, X0 O" s( j0 [        /* dram_init must store complete ramsize in gd->ram_size */
$ }, B1 P9 P: S0 @" P( A        gd->ram_size = get_ram_size(
) o6 \: ^  K3 V7 F4 }- G7 W9 r                        (void *)CONFIG_SYS_SDRAM_BASE,! h! j# X( y6 [8 t
                        CONFIG_MAX_RAM_BANK_SIZE);1 K" V  o/ R- r$ W, t
        return 0;
' j# \" J# a' u- `5 T}
, E& b( y# S  \$ j/ Y% F% ^2 ]5 C( J; Z& ^: ?

0 R; D* `( v6 r4 ]
7 z1 m2 V9 h) e7 K; c( g6 C% A. J6 r, f/ |3 S- l
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!: h: _7 ~+ e5 s9 D0 b7 U

9 }& u  E  b0 q6 Q3 e
2 c  J3 v+ f- @7 t" y

. y/ U5 L1 h* H# h1 ^




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