嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit+ F. t) l% h4 }6 ?$ u9 d& Q
核心板2:DDR2 256M Byte   NAND FLASH 8G bit8 P9 i+ m; t) X( P
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
% ]% j$ t2 r' O9 H
1 B" K6 u0 X' r2 ^! [) `是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
, @2 S3 Q& O. T4 _9 {; T% U7 u! l2 L4 z/ z: y8 t

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
3 v5 A( G3 J" }/*5 D; S6 c# X: m, i, c" b7 B
* Check memory range for valid RAM. A simple memory test determines
* J9 g8 c) {6 E( G+ t. e* the actually available RAM size between addresses `base' and
; O: o4 q6 X4 S* `base + maxsize'.
" Q6 Z1 ~& q3 E) Z: s3 I*/1 x! V* K) N1 {
long get_ram_size(long *base, long maxsize)
3 Q8 b% i1 o3 H) A# v, M* ]{, X& Z; b. r! Q9 h& ?
        volatile long *addr;
- L& e1 e$ f/ x7 Q* M        long           save[32];
, _3 i: b( o% M1 a5 v0 A        long           cnt;
5 }$ R7 L. d& P+ f" I% H        long           val;7 s1 }  N& `( l
        long           size;
/ D& ]6 w, N# U3 P        int            i = 0;
# e0 d" E1 i1 T1 m4 ^" l9 ]* z! X
" q8 @* J; k; i6 L3 }  v        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
3 }# R3 T0 K4 i                addr = base + cnt;        /* pointer arith! */
  D% z/ j4 g* s# x4 H4 F                sync ();% a) L: l- Y( A3 I
                save[i++] = *addr;+ P8 J+ n/ r; U3 v  ?
                sync ();
/ C3 u5 [9 h4 N' C$ }                *addr = ~cnt;
& f$ Y. n1 x9 _  N  V        }2 m5 G. F( f2 G* I* ~  x/ `5 ^; K6 ~8 b
0 S  ~& {4 s  a( o3 z
        addr = base;
; q0 [' @+ j& D3 F; t$ _) E* }) B        sync ();9 [; j* S  Q* H0 \& F6 {9 n
        save = *addr;
8 A% A( M- u6 j9 C. J- w        sync ();
' l$ e) f4 B' \        *addr = 0;4 ^& k- Z5 V0 W+ ~

3 l/ p, |- C+ f. Z& F& Q        sync ();5 b' I& g& [8 `! o7 L
        if ((val = *addr) != 0) {
' h& x, K& K' R                /* Restore the original data before leaving the function.2 v0 j/ [4 x' U* [
                 */
8 @+ t! D4 L$ I( Y7 |+ V                sync ();6 H1 N$ k5 G  P- {/ }; f! y( E0 |- X0 `5 L
                *addr = save;9 U6 t6 X0 s1 p* N7 I
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {' M" k; ~% R( P* {
                        addr  = base + cnt;) _/ ?! z" V  I/ Q
                        sync ();
9 R; I; g7 R( ~) w0 U: S) D                        *addr = save[--i];
9 w( H" W# y' v- K                }
3 K% G# S5 b% t/ D4 E7 h                return (0);
$ |7 h$ d1 }* N7 r        }
( Y0 N8 e. G5 B  Q$ q% G% a5 S+ c- U2 R+ W
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {/ g$ S7 L. ^. h; d( e- M
                addr = base + cnt;        /* pointer arith! */9 V) g$ n6 m5 s
                val = *addr;
- i" G5 \5 r3 ?" b) S6 N% _; T4 n                *addr = save[--i];
( j1 u" B0 r5 e                if (val != ~cnt) {
9 }9 Y: a+ q+ c4 c                        size = cnt * sizeof (long);$ b$ ^3 l& `! _- q
                        /* Restore the original data before leaving the function.5 f7 N& @& Z. j! P0 E; f+ W
                         */1 ~( g) G' k4 q1 x/ e5 v5 G
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {$ Q; }( \% i- a+ o' h
                                addr  = base + cnt;
. `/ D$ b( Z1 D                                *addr = save[--i];
7 |. s, e1 A4 h5 Z0 j3 T                        }
6 E$ y3 E5 V9 n7 j                        return (size);, p& I) D; Q. e1 U6 Y7 W0 {
                }
$ W  r& T- O0 e. b        }
, u" A' z3 L) Y& R3 y7 p! A% ]. j( A- @/ q
        return (maxsize);
0 b! \; e# `0 S' O; {}2 _" O  e+ H! `! t% g: w
int dram_init(void)
4 I# q2 U% v2 S{6 @- [7 w: p6 b9 q
        /* dram_init must store complete ramsize in gd->ram_size */6 N& p4 f% c, H; Y
        gd->ram_size = get_ram_size(0 l# S- g' v3 Z- ^6 {. Z7 J* k$ H
                        (void *)CONFIG_SYS_SDRAM_BASE,% _* I5 v# S. a* g0 F# ^1 h7 [' V
                        CONFIG_MAX_RAM_BANK_SIZE);
) X' s( ?; L3 @+ f        return 0;+ R0 g- U* w/ r) Q' }
}
1 A9 b- @( X: S) g2 ?5 ?8 u7 Q/ S# j: K
, T; q  f+ c  D$ q/ f' p

: `# o* D. D/ G" L% _6 ?" x! O* M8 g0 a
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!! U6 E# I- d. p) H3 L! J: H, O

7 j. J0 F. `4 f1 L( M" d% L$ T  Y$ v" E: i8 Q4 @
2 `+ h" S9 N. ^) f





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