嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit5 `6 |1 s0 n$ N7 o# X
核心板2:DDR2 256M Byte   NAND FLASH 8G bit
( T& d1 u+ m! n$ ?% y2 y, N. ]这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?0 D" `7 z$ b' N" ~

6 s0 D* O) [' T2 I+ S+ `! V/ R6 x' a是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
: M+ a& g6 F+ l* v# Z9 F% y5 B; P1 y* E, A* Z; v; x4 z

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
# O' E6 Q9 G5 [% ]1 d  J) v$ o2 s  S. v/*+ n2 a$ D9 c" f% ?2 T  j% z* V
* Check memory range for valid RAM. A simple memory test determines! S. j) k- L+ J3 w$ X* E
* the actually available RAM size between addresses `base' and
2 z/ f9 ?: T& e" }1 `" p7 x* `base + maxsize'.& Y# k$ p& t8 ~) l( t
*/
; j" @5 [1 g+ S! plong get_ram_size(long *base, long maxsize)8 {+ B; Y( V8 k
{6 n  a3 N1 ]% W" f9 ?+ y
        volatile long *addr;
, `/ b8 t2 E: Q) H% c        long           save[32];5 y/ q2 A, o/ a. W) d+ S# b  m
        long           cnt;
1 o1 b7 u* K: J! t# A, X: t        long           val;
3 c/ T; E0 A1 F+ O0 D9 U9 g        long           size;: E0 Y* x8 T: T" Q- B( b
        int            i = 0;) D* X9 }7 |1 r# U4 f
; J7 Y9 h& D8 i5 x
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {% s9 b% w" ^3 Q3 i) C; X
                addr = base + cnt;        /* pointer arith! */
& `6 }( @( `* q7 S( i                sync ();6 n0 v' g" I; h" ?# C1 p$ e5 U
                save[i++] = *addr;
& Q% ^% b1 C9 P. A4 Q                sync ();
  e# K; y0 v* L  j7 M3 ?                *addr = ~cnt;$ A$ i0 V% D; H
        }
5 a4 O1 x  c7 O1 E, c' ^9 r
% D* e/ R& y% `& A  F+ ~) y. G' n        addr = base;! a  H! i1 v- s
        sync ();; s! U" d) a: a
        save = *addr;
( e( ^* ?0 c; g+ ^' p: e9 H        sync ();; }- g( F) ?: [" T! F
        *addr = 0;
  L. ~# X( p) M2 K  S- p. T$ g( ]
        sync ();- L5 o4 B7 h4 [% w6 e# C  `
        if ((val = *addr) != 0) {) ]  L: ~. e! ]6 g) h
                /* Restore the original data before leaving the function.
+ Q7 ?. }. |* j% M9 V3 @- m                 */. J( f4 L5 O9 q) U$ `& c
                sync ();
, P7 D, ^+ A0 H1 q1 f' p/ x2 Z3 G                *addr = save;" v/ ?5 T0 V4 f
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {* [* p. r) ^& H: _, M; d5 E
                        addr  = base + cnt;- ^% ]9 I. U$ G, K( {3 V1 R' V; W
                        sync ();1 s8 `& S- l5 ]* r5 }- Z: B
                        *addr = save[--i];
7 b# Z, h$ B8 M" a( r                }/ l- ~. L) L4 l! D1 {
                return (0);, t! a  `$ b2 v8 Z5 x
        }4 f/ q, k: P8 E# `- |
( N1 i% z! {1 w" p# ]& O
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
) f3 X  s; B6 t0 K                addr = base + cnt;        /* pointer arith! */2 H: B  {. ^/ B8 h, \1 X& I
                val = *addr;
2 H! @, c- y0 L: M                *addr = save[--i];+ F+ e7 A% P# f7 }5 C7 v
                if (val != ~cnt) {
4 D' V3 G' I" B+ k  f& ]7 F                        size = cnt * sizeof (long);
7 Q7 z7 Z) D2 w                        /* Restore the original data before leaving the function.1 ~6 L2 N( v" M4 [
                         */
; n2 d8 m1 t, s* k4 _                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {0 M! P) T# Q! h
                                addr  = base + cnt;
7 g2 B+ x7 B4 H1 T, {+ P                                *addr = save[--i];  a& ^9 q3 p* h! G6 F
                        }
4 w% i# r# m3 L! o, m5 Z( U                        return (size);
8 U6 L2 D! t7 r! ~$ b) E, b                }; c0 }9 N) E5 U, c
        }7 \; g2 u# ?" j
# R5 R5 C9 w# Z9 Y' L* k
        return (maxsize);
/ z& r7 j* O$ |1 I( e- t4 y) k}% `& w5 t& }0 a# |4 @( K) g
int dram_init(void)* W$ n) r8 C' `/ i- w1 q: T
{
  [% J/ B: a, L5 x; T        /* dram_init must store complete ramsize in gd->ram_size */
0 _) I8 A" |3 n9 ?3 M6 d5 I        gd->ram_size = get_ram_size() @8 |2 W5 d( b% L. d
                        (void *)CONFIG_SYS_SDRAM_BASE,
; _# S+ Q; C! C" W                        CONFIG_MAX_RAM_BANK_SIZE);: X* q9 Q$ u1 q+ X: o. t9 f/ E% L
        return 0;
3 o0 q5 e( L8 J2 W9 |& \}
( n- K) f3 Z) z0 H: H! Y! \3 c! k! m! R3 z+ ^# @$ G" I  _( s/ n

8 D# z) A) T3 N1 I3 m! i: B) o) `0 w' r
7 d! E* J( z, h- W6 p. [0 q
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!. r& S# \' i- O; b4 W
4 o  p# w9 W7 P! C# L: }

: h; ]! w% \" n

( x/ [1 J- _8 m' p4 K6 c- [& O8 ]




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