嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
8 X$ A. F1 j2 E; ~核心板2:DDR2 256M Byte   NAND FLASH 8G bit/ [- p6 F- a8 e" n
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
% ~6 Q+ [5 v  k, U$ N* ]0 e) K" }6 Q) m/ c- }
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
) c, R' h" ?/ W5 Y0 n$ X2 w0 n. v! {9 o/ h8 r

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
& x( W3 P) ^; v. f3 G! t/*
/ W. d$ i3 _, I( m2 p* Check memory range for valid RAM. A simple memory test determines* t. S$ l3 z0 w. r7 v
* the actually available RAM size between addresses `base' and
5 R5 A: @. V# o: q( p% G* `base + maxsize'.
  ]8 |4 c' R( ]0 G) _*/
% k. S/ m( ]! h9 \. c+ Llong get_ram_size(long *base, long maxsize)
' K" Q4 \, a7 D. b, |' |{" J! @+ `3 x: y# |9 ]
        volatile long *addr;8 A/ \) v- e# w9 m* f
        long           save[32];' F2 c% R; _0 _) h/ l
        long           cnt;
  A, ]: A+ q$ G  Z3 s% [" I        long           val;0 U6 R* a+ B7 W6 |8 u  N% ^0 V
        long           size;4 }$ a1 G1 V8 q+ H- L
        int            i = 0;
; N# [3 [- g$ k' w
& g+ I& a6 D+ F7 }        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {8 K9 w: Z& C# M
                addr = base + cnt;        /* pointer arith! */
* l) Q% l: e' z! k                sync ();
) [0 b# R9 l! Z" z% d# I, y( o* W                save[i++] = *addr;; G* j4 B% @. [
                sync ();
: p, D3 z) ~& H0 Z& z6 G% I$ Z                *addr = ~cnt;, u! z# C" i5 Q) q; J7 U* \; ?
        }
# {3 y6 G+ y8 ~7 Q: ~" x
8 d, B/ o6 u3 |( z  N8 ~        addr = base;
' C, u1 @: ^* i- D        sync ();
1 p3 J" P* }4 x# J* K- S        save = *addr;
  s$ q3 H, N' L: a9 \4 p        sync ();# J2 w, n% z* J& s9 K8 F' L# f
        *addr = 0;5 T& y) L& I1 N. ?. z8 Q) O

; N, ]6 b+ X& }: ]. A8 ~        sync ();3 N9 @3 H5 X5 ?- T; H. U
        if ((val = *addr) != 0) {
7 s- [5 t  y% m/ g% O4 o                /* Restore the original data before leaving the function.
# [+ X' R# {; Y* S8 L) D* C                 */0 _1 r4 _- N- q6 M2 m
                sync ();
% k1 J8 i' S2 M7 w* o                *addr = save;( {( j1 r3 s: \- M7 h# ~! o
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {2 ]1 w! f. O8 l0 T  n: b2 ]) T
                        addr  = base + cnt;
+ H% g: J3 b$ o  x- U) A                        sync ();8 A. B9 w) z2 |7 \/ O0 v' z
                        *addr = save[--i];
( w$ y5 `( B1 _                }/ [. ?# _' B0 b9 T
                return (0);
4 f( Z  [2 V. R' h        }
0 d: K- @2 j5 O( [$ l6 s& D
9 y! V. G. Q3 J        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
! o4 U- P4 E- B& i( H: g$ W                addr = base + cnt;        /* pointer arith! */' ~+ T$ f" m$ l
                val = *addr;" c) G) J7 V/ p1 N) _. u
                *addr = save[--i];
- H2 ?( k, n5 F$ A                if (val != ~cnt) {4 b7 H7 Y8 W% \9 R) j& F3 s
                        size = cnt * sizeof (long);$ E& A: L: O0 V6 O. x; L3 t7 L- n( _
                        /* Restore the original data before leaving the function.
9 A, q+ S6 [, c; A. J+ h: Y                         */
% v3 f2 S" J: w* F$ m% s  ?                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
" Q# Y$ K1 R; X                                addr  = base + cnt;7 E% V6 @  K0 z: G
                                *addr = save[--i];
  d2 q5 _& E" e" Q3 M- E% \                        }
: h2 Y/ {/ B3 G) `7 l; F, S                        return (size);
2 b& S6 H9 p4 n3 R                }
- V3 k5 A7 Q% _: T        }% x) ~: Z& q0 R: y1 B0 ]
' S3 [; f2 z% j, m/ t5 s! X) W, }
        return (maxsize);
' |5 r# j" {* }( u9 ^. f. j}+ F' Z# `: K( M2 d! q. i/ t
int dram_init(void)
( J0 Q. w8 N3 j{, ?: W8 F8 R4 E) C6 D
        /* dram_init must store complete ramsize in gd->ram_size */
5 K( e; g; x, \" H$ z0 F! G        gd->ram_size = get_ram_size(: U( `' ~* k( O. r7 ^
                        (void *)CONFIG_SYS_SDRAM_BASE,, j( n( ?- W+ G2 L
                        CONFIG_MAX_RAM_BANK_SIZE);" O+ w" N3 z& `: a/ J) x  f2 ^( Q
        return 0;
) b$ O* m2 A5 H" s8 S6 }4 l}  ?- V- n  k8 S2 ?* B4 z5 O

* d! \5 D$ D. g3 w( s/ S. w9 k2 W/ O: K. s, X

5 O* Z; ]  v+ U* ]* x  o6 ~. Y5 x8 d/ }+ @3 X0 K' L* l
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
# S0 b/ g3 r5 Y6 p3 _8 F
* h2 m& P( i& v0 j& g3 a
& d) Z# t  I8 b  [& G3 c
  Y1 c# |; F+ ^





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